anv: don't wait for completion of work on vkQueuePresent()
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Mon, 22 Feb 2021 16:41:24 +0000 (18:41 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 22 Feb 2021 21:43:05 +0000 (21:43 +0000)
Another mistake which is that we don't use the right wait API.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Fixes: 829699ba632b2b ("anv: implement shareable timeline semaphores")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/4276
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9188>

src/intel/vulkan/anv_wsi.c

index 39d2e5b..0b29d7e 100644 (file)
@@ -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);