From 9e61e72e9f6bac51034d1fe635cb28dc07690501 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Mon, 4 Aug 2025 12:59:14 -0700 Subject: [PATCH] vk/runtime: Set GPU_MULTI_WAIT on the drm syncobj type. DRM syncobjs always let you wait repeatedly on them, so we can set the flag in the core instead of having each driver override it once they try to enable the emulated timeline semaphores. Part-of: --- src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c | 3 --- src/broadcom/vulkan/v3dv_device.c | 5 ----- src/panfrost/vulkan/panvk_physical_device.c | 5 ----- src/vulkan/runtime/vk_drm_syncobj.c | 1 + src/vulkan/runtime/vk_sync.h | 2 +- 5 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c index 8adecbdfaae..222c96d06ec 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c @@ -300,9 +300,6 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags, 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; - if (!ws->info.has_timeline_syncobj && ws->syncobj_sync_type.features & VK_SYNC_FEATURE_TIMELINE) { /* Disable timeline feature if it was disabled in the driver. */ assert(is_virtio); diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 481540a4eb7..75bd3ed5b9b 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -1382,11 +1382,6 @@ create_physical_device(struct v3dv_instance *instance, */ device->drm_syncobj_type.features &= ~VK_SYNC_FEATURE_TIMELINE; - /* Multiwait is required for emulated timeline semaphores and is supported - * by the v3d kernel interface. - */ - device->drm_syncobj_type.features |= VK_SYNC_FEATURE_GPU_MULTI_WAIT; - device->sync_timeline_type = vk_sync_timeline_get_type(&device->drm_syncobj_type); diff --git a/src/panfrost/vulkan/panvk_physical_device.c b/src/panfrost/vulkan/panvk_physical_device.c index 44f4196675b..b1bed6a08bb 100644 --- a/src/panfrost/vulkan/panvk_physical_device.c +++ b/src/panfrost/vulkan/panvk_physical_device.c @@ -205,11 +205,6 @@ get_device_sync_types(struct panvk_physical_device *device, */ device->drm_syncobj_type.features &= ~VK_SYNC_FEATURE_TIMELINE; - /* vk_sync_timeline requires VK_SYNC_FEATURE_GPU_MULTI_WAIT. Panfrost - * waits on the underlying dma-fences and supports the feature. - */ - device->drm_syncobj_type.features |= VK_SYNC_FEATURE_GPU_MULTI_WAIT; - device->sync_timeline_type = vk_sync_timeline_get_type(&device->drm_syncobj_type); device->sync_types[sync_type_count++] = &device->sync_timeline_type.sync; diff --git a/src/vulkan/runtime/vk_drm_syncobj.c b/src/vulkan/runtime/vk_drm_syncobj.c index d0fd0309670..d7a693d9040 100644 --- a/src/vulkan/runtime/vk_drm_syncobj.c +++ b/src/vulkan/runtime/vk_drm_syncobj.c @@ -403,6 +403,7 @@ vk_drm_syncobj_get_type_from_provider(struct util_sync_provider *sync) .size = sizeof(struct vk_drm_syncobj), .features = VK_SYNC_FEATURE_BINARY | VK_SYNC_FEATURE_GPU_WAIT | + VK_SYNC_FEATURE_GPU_MULTI_WAIT | VK_SYNC_FEATURE_CPU_RESET | VK_SYNC_FEATURE_CPU_SIGNAL | VK_SYNC_FEATURE_WAIT_PENDING, diff --git a/src/vulkan/runtime/vk_sync.h b/src/vulkan/runtime/vk_sync.h index 15d85dc9253..291954226c4 100644 --- a/src/vulkan/runtime/vk_sync.h +++ b/src/vulkan/runtime/vk_sync.h @@ -80,7 +80,7 @@ enum vk_sync_features { /** Set if this sync supports GPU waits */ VK_SYNC_FEATURE_GPU_WAIT = (1 << 2), - /** Set if a sync type supports multiple GPU waits on one signal state + /** Set if a non-timeline sync type supports multiple GPU waits on one signal state * * The Vulkan spec for VkSemaphore requires GPU wait and signal operations * to have a one-to-one relationship. This formally described by saying