From c3347511ed8c23cccadaff39d829a7c52340ad8c 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: (cherry picked from commit 02f94c33066eff9e5de2077230affab1a1f3d063) --- .pick_status.json | 2 +- src/intel/vulkan/anv_wsi.c | 26 +++++++++++++++++--------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index e4d250998da..14bc7b8ab3d 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2326,7 +2326,7 @@ "description": "anv: don't wait for completion of work on vkQueuePresent()", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "829699ba632b2b78e4de372baf42ae01095158a7" }, diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c index cbe5bb02914..ff1a3117cb4 100644 --- a/src/intel/vulkan/anv_wsi.c +++ b/src/intel/vulkan/anv_wsi.c @@ -304,11 +304,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; @@ -321,18 +326,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);