vulkan/wsi: Refactor result handling in queue_present
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 16 Nov 2017 16:59:21 +0000 (08:59 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 4 Dec 2017 18:04:19 +0000 (10:04 -0800)
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Chad Versace <chadversary@chromium.org>
src/vulkan/wsi/wsi_common.c

index 5920359c631cb663ec6ec454a1aa2f23d2b2cfe0..f149846e454066635855495ddf65f7d64d068f41 100644 (file)
@@ -514,14 +514,14 @@ wsi_common_queue_present(const struct wsi_device *wsi,
                          int queue_family_index,
                          const VkPresentInfoKHR *pPresentInfo)
 {
-   VkResult result = VK_SUCCESS;
+   VkResult final_result = VK_SUCCESS;
 
    const VkPresentRegionsKHR *regions =
       vk_find_struct_const(pPresentInfo->pNext, PRESENT_REGIONS_KHR);
 
    for (uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) {
       WSI_FROM_HANDLE(wsi_swapchain, swapchain, pPresentInfo->pSwapchains[i]);
-      VkResult item_result;
+      VkResult result;
 
       if (swapchain->fences[0] == VK_NULL_HANDLE) {
          const VkFenceCreateInfo fence_info = {
@@ -529,15 +529,11 @@ wsi_common_queue_present(const struct wsi_device *wsi,
             .pNext = NULL,
             .flags = 0,
          };
-         item_result = wsi->CreateFence(device, &fence_info,
-                                        &swapchain->alloc,
-                                        &swapchain->fences[0]);
-         if (pPresentInfo->pResults != NULL)
-            pPresentInfo->pResults[i] = item_result;
-         result = result == VK_SUCCESS ? item_result : result;
-         if (item_result != VK_SUCCESS) {
-            continue;
-         }
+         result = wsi->CreateFence(device, &fence_info,
+                                   &swapchain->alloc,
+                                   &swapchain->fences[0]);
+         if (result != VK_SUCCESS)
+            goto fail_present;
       } else {
          wsi->ResetFences(device, 1, &swapchain->fences[0]);
       }
@@ -548,25 +544,22 @@ wsi_common_queue_present(const struct wsi_device *wsi,
          .waitSemaphoreCount = pPresentInfo->waitSemaphoreCount,
          .pWaitSemaphores = pPresentInfo->pWaitSemaphores,
       };
-      wsi->QueueSubmit(queue, 1, &submit_info, swapchain->fences[0]);
+      result = wsi->QueueSubmit(queue, 1, &submit_info, swapchain->fences[0]);
+      if (result != VK_SUCCESS)
+         goto fail_present;
 
       const VkPresentRegionKHR *region = NULL;
       if (regions && regions->pRegions)
          region = &regions->pRegions[i];
 
-      item_result = swapchain->queue_present(swapchain,
-                                             queue,
-                                             pPresentInfo->waitSemaphoreCount,
-                                             pPresentInfo->pWaitSemaphores,
-                                             pPresentInfo->pImageIndices[i],
-                                             region);
-
-      if (pPresentInfo->pResults != NULL)
-         pPresentInfo->pResults[i] = item_result;
-      result = result == VK_SUCCESS ? item_result : result;
-      if (item_result != VK_SUCCESS) {
-         continue;
-      }
+      result = swapchain->queue_present(swapchain,
+                                        queue,
+                                        pPresentInfo->waitSemaphoreCount,
+                                        pPresentInfo->pWaitSemaphores,
+                                        pPresentInfo->pImageIndices[i],
+                                        region);
+      if (result != VK_SUCCESS)
+         goto fail_present;
 
       VkFence last = swapchain->fences[2];
       swapchain->fences[2] = swapchain->fences[1];
@@ -576,6 +569,15 @@ wsi_common_queue_present(const struct wsi_device *wsi,
       if (last != VK_NULL_HANDLE) {
          wsi->WaitForFences(device, 1, &last, true, 1);
       }
+
+   fail_present:
+      if (pPresentInfo->pResults != NULL)
+         pPresentInfo->pResults[i] = result;
+
+      /* Let the final result be our first unsuccessful result */
+      if (final_result == VK_SUCCESS)
+         final_result = result;
    }
-   return VK_SUCCESS;
+
+   return final_result;
 }