From: Bas Nieuwenhuizen Date: Sun, 28 Nov 2021 15:38:06 +0000 (+0100) Subject: radv: Set horizontal sync types. X-Git-Tag: upstream/22.3.5~14401 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=31da5c41b6b29dbdd15828d5b33972ad5bf1b62d;p=platform%2Fupstream%2Fmesa.git radv: Set horizontal sync types. We basically use 2 types for amdgpu: 1) syncobj. This supports both binary & timeline and autodetects all the features. 2) emulated timelines if (1) doesn't detect timeline syncobj support. Note that one has to put these in order of preference so that the common CreateFence/CreateSemaphore functions decide on the right type. Reviewed-by: Jason Ekstrand Reviewed-by: Samuel Pitoiset Part-of: --- diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 79313bd..acc64f4 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -663,6 +663,8 @@ radv_physical_device_try_create(struct radv_instance *instance, drmDevicePtr drm goto fail_base; } + device->vk.supported_sync_types = device->ws->get_sync_types(device->ws); + #ifndef _WIN32 if (drm_device && instance->vk.enabled_extensions.KHR_display) { master_fd = open(drm_device->nodes[DRM_NODE_PRIMARY], O_RDWR | O_CLOEXEC); diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h index b7a281c..2e07fd4 100644 --- a/src/amd/vulkan/radv_radeon_winsys.h +++ b/src/amd/vulkan/radv_radeon_winsys.h @@ -42,6 +42,7 @@ struct radeon_info; struct ac_surf_info; struct radeon_surf; +struct vk_sync_type; enum radeon_bo_domain { /* bitfield */ RADEON_DOMAIN_GTT = 2, @@ -314,6 +315,8 @@ struct radeon_winsys { int (*import_syncobj_from_sync_file)(struct radeon_winsys *ws, uint32_t syncobj, int fd); int (*get_fd)(struct radeon_winsys *ws); + + const struct vk_sync_type *const *(*get_sync_types)(struct radeon_winsys *ws); }; static inline void diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c index 538576d..2f8d04e 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c @@ -36,6 +36,7 @@ #include "radv_amdgpu_surface.h" #include "radv_amdgpu_winsys_public.h" #include "radv_debug.h" +#include "vk_drm_syncobj.h" #include "xf86drm.h" static bool @@ -187,6 +188,13 @@ radv_amdgpu_winsys_get_fd(struct radeon_winsys *rws) return amdgpu_device_get_fd(ws->dev); } +static const struct vk_sync_type *const * +radv_amdgpu_winsys_get_sync_types(struct radeon_winsys *rws) +{ + struct radv_amdgpu_winsys *ws = (struct radv_amdgpu_winsys *)rws; + return ws->sync_types; +} + struct radeon_winsys * radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags, bool reserve_vmid) { @@ -239,6 +247,19 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags, if (r) goto vmid_fail; } + int num_sync_types = 0; + + ws->syncobj_sync_type = vk_drm_syncobj_get_type(amdgpu_device_get_fd(ws->dev)); + if (ws->syncobj_sync_type.features) { + ws->sync_types[num_sync_types++] = &ws->syncobj_sync_type; + if (!(ws->syncobj_sync_type.features & VK_SYNC_FEATURE_TIMELINE)) { + ws->emulated_timeline_sync_type = vk_sync_timeline_get_type(&ws->syncobj_sync_type); + ws->sync_types[num_sync_types++] = &ws->emulated_timeline_sync_type.sync; + } + } + + ws->sync_types[num_sync_types++] = NULL; + assert(num_sync_types <= ARRAY_SIZE(ws->sync_types)); ws->perftest = perftest_flags; ws->zero_all_vram_allocs = debug_flags & RADV_DEBUG_ZERO_VRAM; @@ -252,6 +273,7 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags, ws->base.get_chip_name = radv_amdgpu_winsys_get_chip_name; 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; radv_amdgpu_bo_init_functions(ws); radv_amdgpu_cs_init_functions(ws); radv_amdgpu_surface_init_functions(ws); diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h index 06ca905..b40a75d 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h @@ -35,6 +35,9 @@ #include "ac_gpu_info.h" #include "radv_radeon_winsys.h" +#include "vk_sync.h" +#include "vk_sync_timeline.h" + struct radv_amdgpu_winsys { struct radeon_winsys base; amdgpu_device_handle dev; @@ -71,6 +74,10 @@ struct radv_amdgpu_winsys { struct u_rwlock log_bo_list_lock; struct list_head log_bo_list; + const struct vk_sync_type *sync_types[3]; + struct vk_sync_type syncobj_sync_type; + struct vk_sync_timeline_type emulated_timeline_sync_type; + uint32_t refcount; }; diff --git a/src/amd/vulkan/winsys/null/radv_null_winsys.c b/src/amd/vulkan/winsys/null/radv_null_winsys.c index bcac352..d93f1ea 100644 --- a/src/amd/vulkan/winsys/null/radv_null_winsys.c +++ b/src/amd/vulkan/winsys/null/radv_null_winsys.c @@ -29,6 +29,7 @@ #include "util/u_string.h" #include "radv_null_bo.h" #include "radv_null_cs.h" +#include "vk_sync_dummy.h" /* Hardcode some GPU info that are needed for the driver or for some tools. */ static const struct { @@ -163,6 +164,12 @@ radv_null_winsys_get_fd(struct radeon_winsys *rws) return -1; } +static const struct vk_sync_type *const * +radv_null_winsys_get_sync_types(struct radeon_winsys *rws) +{ + return radv_null_winsys(rws)->sync_types; +} + struct radeon_winsys * radv_null_winsys_create() { @@ -175,8 +182,11 @@ radv_null_winsys_create() ws->base.destroy = radv_null_winsys_destroy; 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; 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; 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 c29b6ce..dae869c 100644 --- a/src/amd/vulkan/winsys/null/radv_null_winsys.h +++ b/src/amd/vulkan/winsys/null/radv_null_winsys.h @@ -32,8 +32,11 @@ #include "ac_gpu_info.h" #include "radv_radeon_winsys.h" +struct vk_sync_type; + struct radv_null_winsys { struct radeon_winsys base; + const struct vk_sync_type *sync_types[2]; }; static inline struct radv_null_winsys *