lavapipe: Fix vkWaitForFences for initially-signalled fences
authorPavel Asyutchenko <sventeam@yandex.ru>
Thu, 30 Sep 2021 19:34:40 +0000 (22:34 +0300)
committerDave Airlie <airlied@redhat.com>
Wed, 6 Oct 2021 05:11:04 +0000 (15:11 +1000)
Fences with VK_FENCE_CREATE_SIGNALED_BIT are created with
signalled=true and timeline=0, waiting on them without
submitting first returned VK_TIMEOUT instead of VK_SUCCESS.

Signed-off-by: Pavel Asyutchenko <sventeam@yandex.ru>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13128>

src/gallium/frontends/lavapipe/lvp_device.c

index 3761532..b82bb82 100644 (file)
@@ -2089,7 +2089,7 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_WaitForFences(
          struct lvp_fence *f = lvp_fence_from_handle(pFences[i]);
 
          /* this is an unsubmitted fence: immediately bail out */
-         if (!f->timeline)
+         if (!f->timeline && !f->signalled)
             return VK_TIMEOUT;
          if (!fence || f->timeline > fence->timeline)
             fence = f;
@@ -2098,6 +2098,8 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_WaitForFences(
       /* find lowest timeline id */
       for (unsigned i = 0; i < fenceCount; i++) {
          struct lvp_fence *f = lvp_fence_from_handle(pFences[i]);
+         if (f->signalled)
+            return VK_SUCCESS;
          if (f->timeline && (!fence || f->timeline < fence->timeline))
             fence = f;
       }