From 02f94c33066eff9e5de2077230affab1a1f3d063 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Mon, 22 Feb 2021 18:41:24 +0200 Subject: [PATCH] anv: don't wait for completion of work on vkQueuePresent() Another mistake which is that we don't use the right wait API. Signed-off-by: Lionel Landwerlin Fixes: 829699ba632b2b ("anv: implement shareable timeline semaphores") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/4276 Reviewed-by: Jason Ekstrand Part-of: --- src/intel/vulkan/anv_wsi.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c index 39d2e5b..0b29d7e 100644 --- a/src/intel/vulkan/anv_wsi.c +++ b/src/intel/vulkan/anv_wsi.c @@ -306,11 +306,16 @@ VkResult anv_QueuePresentKHR( /* Make sure all of the dependency semaphores have materialized when * using a threaded submission. */ - uint32_t *syncobjs = vk_alloc(&device->vk.alloc, - sizeof(*syncobjs) * pPresentInfo->waitSemaphoreCount, 8, - VK_SYSTEM_ALLOCATION_SCOPE_COMMAND); + ANV_MULTIALLOC(ma); - if (!syncobjs) + uint64_t *values; + uint32_t *syncobjs; + + anv_multialloc_add(&ma, &values, pPresentInfo->waitSemaphoreCount); + anv_multialloc_add(&ma, &syncobjs, pPresentInfo->waitSemaphoreCount); + + if (!anv_multialloc_alloc(&ma, &device->vk.alloc, + VK_SYSTEM_ALLOCATION_SCOPE_COMMAND)) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); uint32_t wait_count = 0; @@ -323,18 +328,21 @@ VkResult anv_QueuePresentKHR( if (impl->type == ANV_SEMAPHORE_TYPE_DUMMY) continue; assert(impl->type == ANV_SEMAPHORE_TYPE_DRM_SYNCOBJ); - syncobjs[wait_count++] = impl->syncobj; + syncobjs[wait_count] = impl->syncobj; + values[wait_count] = 0; } int ret = 0; if (wait_count > 0) { ret = - anv_gem_syncobj_wait(device, syncobjs, wait_count, - anv_get_absolute_timeout(INT64_MAX), - true /* wait_all */); + anv_gem_syncobj_timeline_wait(device, + syncobjs, values, wait_count, + anv_get_absolute_timeout(INT64_MAX), + true /* wait_all */, + true /* wait_materialize */); } - vk_free(&device->vk.alloc, syncobjs); + vk_free(&device->vk.alloc, values); if (ret) return vk_error(VK_ERROR_DEVICE_LOST); -- 2.7.4