From 999d5098b487c0cd25d532bc0fb739a70de5b68d Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 13 Mar 2025 11:44:02 +0100 Subject: [PATCH] radv/virtio: support vpipe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tested-by: Dmitry Osipenko Acked-by: Rob Clark Acked-by: Marek Olšák Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_device.c | 2 +- src/amd/vulkan/radv_physical_device.c | 7 ++++++- src/amd/vulkan/radv_radeon_winsys.h | 2 ++ src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c | 12 +++++++++++- src/amd/vulkan/winsys/null/radv_null_winsys.c | 9 +++++++++ src/amd/vulkan/winsys/null/radv_null_winsys.h | 2 ++ 6 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 3b621de9451..0a827d7eea4 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -1184,7 +1184,7 @@ radv_CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCr device->rt_handles = _mesa_hash_table_create(NULL, _mesa_hash_u32, _mesa_key_u32_equal); device->ws = pdev->ws; - vk_device_set_drm_fd(&device->vk, device->ws->get_fd(device->ws)); + device->vk.sync = device->ws->get_sync_provider(device->ws); /* With update after bind we can't attach bo's to the command buffer * from the descriptor set anymore, so we have to use a global BO list. diff --git a/src/amd/vulkan/radv_physical_device.c b/src/amd/vulkan/radv_physical_device.c index db7e828d08a..615570682bd 100644 --- a/src/amd/vulkan/radv_physical_device.c +++ b/src/amd/vulkan/radv_physical_device.c @@ -2101,7 +2101,12 @@ radv_physical_device_try_create(struct radv_instance *instance, drmDevicePtr drm } if (!strcmp(version->name, "amdgpu")) { - /* nothing to do. */ +#ifdef HAVE_AMDGPU_VIRTIO + if (debug_get_bool_option("AMD_FORCE_VPIPE", false)) { + is_virtio = true; + fd = -1; + } +#endif } else #ifdef HAVE_AMDGPU_VIRTIO if (!strcmp(version->name, "virtio_gpu")) { diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h index ab2ab689323..c6db4ba0c8a 100644 --- a/src/amd/vulkan/radv_radeon_winsys.h +++ b/src/amd/vulkan/radv_radeon_winsys.h @@ -317,6 +317,8 @@ struct radeon_winsys { int (*get_fd)(struct radeon_winsys *ws); const struct vk_sync_type *const *(*get_sync_types)(struct radeon_winsys *ws); + + struct util_sync_provider *(*get_sync_provider)(struct radeon_winsys *ws); }; static inline uint64_t diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c index a2ebb948e9d..525c2f0bda7 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c @@ -170,6 +170,15 @@ radv_amdgpu_winsys_get_sync_types(struct radeon_winsys *rws) return ws->sync_types; } +static struct util_sync_provider * +radv_amdgpu_winsys_get_sync_provider(struct radeon_winsys *rws) +{ + struct radv_amdgpu_winsys *ws = (struct radv_amdgpu_winsys *)rws; + struct util_sync_provider *p = ac_drm_device_get_sync_provider(ws->dev); + /* vk_device owns the provider, so we need to clone it. */ + return p->clone(p); +} + VkResult radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags, bool reserve_vmid, bool is_virtio, struct radeon_winsys **winsys) @@ -274,7 +283,7 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags, } int num_sync_types = 0; - ws->syncobj_sync_type = vk_drm_syncobj_get_type(ws->fd); + ws->syncobj_sync_type = vk_drm_syncobj_get_type_from_provider(ac_drm_device_get_sync_provider(dev)); if (ws->syncobj_sync_type.features) { /* multi wait is always supported */ ws->syncobj_sync_type.features |= VK_SYNC_FEATURE_GPU_MULTI_WAIT; @@ -309,6 +318,7 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags, ws->base.destroy = radv_amdgpu_winsys_destroy; ws->base.get_fd = radv_amdgpu_winsys_get_fd; ws->base.get_sync_types = radv_amdgpu_winsys_get_sync_types; + ws->base.get_sync_provider = radv_amdgpu_winsys_get_sync_provider; radv_amdgpu_bo_init_functions(ws); radv_amdgpu_cs_init_functions(ws); diff --git a/src/amd/vulkan/winsys/null/radv_null_winsys.c b/src/amd/vulkan/winsys/null/radv_null_winsys.c index 4ffa76a0bcc..6f8c93bc4d9 100644 --- a/src/amd/vulkan/winsys/null/radv_null_winsys.c +++ b/src/amd/vulkan/winsys/null/radv_null_winsys.c @@ -10,6 +10,7 @@ #include "radv_null_winsys_public.h" #include "util/u_string.h" +#include "util/u_sync_provider.h" #include "radv_null_bo.h" #include "radv_null_cs.h" #include "vk_sync_dummy.h" @@ -189,6 +190,12 @@ radv_null_winsys_get_sync_types(struct radeon_winsys *rws) return radv_null_winsys(rws)->sync_types; } +static struct util_sync_provider * +radv_null_winsys_get_sync_provider(struct radeon_winsys *rws) +{ + return radv_null_winsys(rws)->sync_provider; +} + struct radeon_winsys * radv_null_winsys_create() { @@ -202,11 +209,13 @@ radv_null_winsys_create() ws->base.query_info = radv_null_winsys_query_info; ws->base.get_fd = radv_null_winsys_get_fd; ws->base.get_sync_types = radv_null_winsys_get_sync_types; + ws->base.get_sync_provider = radv_null_winsys_get_sync_provider; ws->base.get_chip_name = radv_null_winsys_get_chip_name; radv_null_bo_init_functions(ws); radv_null_cs_init_functions(ws); ws->sync_types[0] = &vk_sync_dummy_type; ws->sync_types[1] = NULL; + ws->sync_provider = util_sync_provider_drm(-1); return &ws->base; } diff --git a/src/amd/vulkan/winsys/null/radv_null_winsys.h b/src/amd/vulkan/winsys/null/radv_null_winsys.h index 015a3e9f60d..878685d9557 100644 --- a/src/amd/vulkan/winsys/null/radv_null_winsys.h +++ b/src/amd/vulkan/winsys/null/radv_null_winsys.h @@ -16,10 +16,12 @@ #include "radv_radeon_winsys.h" struct vk_sync_type; +struct util_sync_provider; struct radv_null_winsys { struct radeon_winsys base; const struct vk_sync_type *sync_types[2]; + struct util_sync_provider *sync_provider; }; static inline struct radv_null_winsys *