From b9617bc6218c932e5f504405b6acf157d5b2a3c1 Mon Sep 17 00:00:00 2001 From: Pavel Asyutchenko Date: Thu, 30 Sep 2021 22:34:40 +0300 Subject: [PATCH] lavapipe: Fix vkWaitForFences for initially-signalled fences 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 Reviewed-by: Dave Airlie Part-of: --- src/gallium/frontends/lavapipe/lvp_device.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index 3761532..b82bb82 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -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; } -- 2.7.4