vulkan/wsi: Don't consider VK_SUBOPTIMAL_KHR to be an error condition
authorJason Ekstrand <jason@jlekstrand.net>
Sat, 27 Jun 2020 13:50:47 +0000 (08:50 -0500)
committerMarge Bot <eric+marge@anholt.net>
Mon, 6 Jul 2020 14:49:06 +0000 (14:49 +0000)
This was causing vkAcquireNextImageKHR to not signal the fences and
semaphores.  In the case where the semaphore was brand new, this could
cause an unsignalled syncobj to be passed into execbuffer2 which it will
reject with -EINVAL leading to VK_ERROR_DEVICE_LOST.  Thanks to Henrik
RydgĂ„rd who works on the PPSSPP project for helping me figure this out.

Fixes: ca3cfbf6f1e00 "vk: Add an initial implementation of the actual..."
Fixes: 778b51f491cfe "vulkan/wsi: Add a hooks for signaling semaphores..."
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5672>

src/vulkan/wsi/wsi_common.c

index d9906091ed9528d944cc18f9aee1a4ad68f6941b..2108f7f703fe8fc9a250e579ef2491e89e110bad 100644 (file)
@@ -1100,7 +1100,7 @@ wsi_common_acquire_next_image2(const struct wsi_device *wsi,
 
    VkResult result = swapchain->acquire_next_image(swapchain, pAcquireInfo,
                                                    pImageIndex);
-   if (result != VK_SUCCESS)
+   if (result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR)
       return result;
 
    if (wsi->set_memory_ownership) {
@@ -1124,7 +1124,7 @@ wsi_common_acquire_next_image2(const struct wsi_device *wsi,
                                    image->memory);
    }
 
-   return VK_SUCCESS;
+   return result;
 }
 
 VkResult
@@ -1226,7 +1226,7 @@ wsi_common_queue_present(const struct wsi_device *wsi,
          region = &regions->pRegions[i];
 
       result = swapchain->queue_present(swapchain, image_index, region);
-      if (result != VK_SUCCESS)
+      if (result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR)
          goto fail_present;
 
       if (wsi->set_memory_ownership) {