From: Dave Airlie <airl...@redhat.com>

v2 (Jason Ekstrand):
 - Better comit message
 - Rebase
 - Re-indent to follow wsi_common style
 - Drop the unneeded _swapchain from the newly added helper
 - Make the clone more true to the original (as per the rebase)
---
 src/amd/vulkan/radv_wsi.c   | 92 +++------------------------------------------
 src/vulkan/wsi/wsi_common.c | 78 ++++++++++++++++++++++++++++++++++++++
 src/vulkan/wsi/wsi_common.h | 10 +++++
 3 files changed, 93 insertions(+), 87 deletions(-)

diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c
index b576514..0d1b479 100644
--- a/src/amd/vulkan/radv_wsi.c
+++ b/src/amd/vulkan/radv_wsi.c
@@ -258,91 +258,9 @@ VkResult radv_QueuePresentKHR(
        const VkPresentInfoKHR*                  pPresentInfo)
 {
        RADV_FROM_HANDLE(radv_queue, queue, _queue);
-       VkResult result = VK_SUCCESS;
-       const VkPresentRegionsKHR *regions =
-                vk_find_struct_const(pPresentInfo->pNext, PRESENT_REGIONS_KHR);
-
-       for (uint32_t i = 0; i < pPresentInfo->swapchainCount; i++) {
-               RADV_FROM_HANDLE(wsi_swapchain, swapchain, 
pPresentInfo->pSwapchains[i]);
-               struct radeon_winsys_cs *cs;
-               const VkPresentRegionKHR *region = NULL;
-               VkResult item_result;
-               struct radv_winsys_sem_info sem_info;
-
-               item_result = radv_alloc_sem_info(&sem_info,
-                                                 
pPresentInfo->waitSemaphoreCount,
-                                                 pPresentInfo->pWaitSemaphores,
-                                                 0,
-                                                 NULL);
-               if (pPresentInfo->pResults != NULL)
-                       pPresentInfo->pResults[i] = item_result;
-               result = result == VK_SUCCESS ? item_result : result;
-               if (item_result != VK_SUCCESS) {
-                       radv_free_sem_info(&sem_info);
-                       continue;
-               }
-
-               assert(radv_device_from_handle(swapchain->device) == 
queue->device);
-               if (swapchain->fences[0] == VK_NULL_HANDLE) {
-                       item_result = 
radv_CreateFence(radv_device_to_handle(queue->device),
-                                                 &(VkFenceCreateInfo) {
-                                                         .sType = 
VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
-                                                                 .flags = 0,
-                                                                 }, 
&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) {
-                               radv_free_sem_info(&sem_info);
-                               continue;
-                       }
-               } else {
-                       radv_ResetFences(radv_device_to_handle(queue->device),
-                                        1, &swapchain->fences[0]);
-               }
-
-               cs = queue->device->empty_cs[queue->queue_family_index];
-               RADV_FROM_HANDLE(radv_fence, fence, swapchain->fences[0]);
-               struct radeon_winsys_fence *base_fence = fence->fence;
-               struct radeon_winsys_ctx *ctx = queue->hw_ctx;
-
-               queue->device->ws->cs_submit(ctx, queue->queue_idx,
-                                            &cs,
-                                            1, NULL, NULL,
-                                            &sem_info,
-                                            false, base_fence);
-               fence->submitted = true;
-
-               if (regions && regions->pRegions)
-                       region = &regions->pRegions[i];
-
-               item_result = swapchain->queue_present(swapchain,
-                                                 _queue,
-                                                 
pPresentInfo->waitSemaphoreCount,
-                                                 pPresentInfo->pWaitSemaphores,
-                                                 
pPresentInfo->pImageIndices[i],
-                                                 region);
-               /* TODO: What if one of them returns OUT_OF_DATE? */
-               if (pPresentInfo->pResults != NULL)
-                       pPresentInfo->pResults[i] = item_result;
-               result = result == VK_SUCCESS ? item_result : result;
-               if (item_result != VK_SUCCESS) {
-                       radv_free_sem_info(&sem_info);
-                       continue;
-               }
-
-               VkFence last = swapchain->fences[2];
-               swapchain->fences[2] = swapchain->fences[1];
-               swapchain->fences[1] = swapchain->fences[0];
-               swapchain->fences[0] = last;
-
-               if (last != VK_NULL_HANDLE) {
-                       radv_WaitForFences(radv_device_to_handle(queue->device),
-                                          1, &last, true, 1);
-               }
-
-               radv_free_sem_info(&sem_info);
-       }
-
-       return VK_SUCCESS;
+       return 
wsi_common_queue_present(&queue->device->physical_device->wsi_device,
+                                       radv_device_to_handle(queue->device),
+                                       _queue,
+                                       queue->queue_family_index,
+                                       pPresentInfo);
 }
diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
index b86bb90..5920359 100644
--- a/src/vulkan/wsi/wsi_common.c
+++ b/src/vulkan/wsi/wsi_common.c
@@ -23,6 +23,7 @@
 
 #include "wsi_common_private.h"
 #include "util/macros.h"
+#include "vk_util.h"
 
 void
 wsi_device_init(struct wsi_device *wsi,
@@ -50,9 +51,11 @@ wsi_device_init(struct wsi_device *wsi,
    WSI_GET_CB(CmdCopyImageToBuffer);
    WSI_GET_CB(CreateBuffer);
    WSI_GET_CB(CreateCommandPool);
+   WSI_GET_CB(CreateFence);
    WSI_GET_CB(CreateImage);
    WSI_GET_CB(DestroyBuffer);
    WSI_GET_CB(DestroyCommandPool);
+   WSI_GET_CB(DestroyFence);
    WSI_GET_CB(DestroyImage);
    WSI_GET_CB(EndCommandBuffer);
    WSI_GET_CB(FreeMemory);
@@ -61,7 +64,9 @@ wsi_device_init(struct wsi_device *wsi,
    WSI_GET_CB(GetImageMemoryRequirements);
    WSI_GET_CB(GetImageSubresourceLayout);
    WSI_GET_CB(GetMemoryFdKHR);
+   WSI_GET_CB(ResetFences);
    WSI_GET_CB(QueueSubmit);
+   WSI_GET_CB(WaitForFences);
 #undef WSI_GET_CB
 }
 
@@ -501,3 +506,76 @@ wsi_prime_image_blit_to_linear(const struct wsi_swapchain 
*chain,
    };
    return chain->wsi->QueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
 }
+
+VkResult
+wsi_common_queue_present(const struct wsi_device *wsi,
+                         VkDevice device,
+                         VkQueue queue,
+                         int queue_family_index,
+                         const VkPresentInfoKHR *pPresentInfo)
+{
+   VkResult 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;
+
+      if (swapchain->fences[0] == VK_NULL_HANDLE) {
+         const VkFenceCreateInfo fence_info = {
+            .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
+            .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;
+         }
+      } else {
+         wsi->ResetFences(device, 1, &swapchain->fences[0]);
+      }
+
+      VkSubmitInfo submit_info = {
+         .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
+         .pNext = NULL,
+         .waitSemaphoreCount = pPresentInfo->waitSemaphoreCount,
+         .pWaitSemaphores = pPresentInfo->pWaitSemaphores,
+      };
+      wsi->QueueSubmit(queue, 1, &submit_info, swapchain->fences[0]);
+
+      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;
+      }
+
+      VkFence last = swapchain->fences[2];
+      swapchain->fences[2] = swapchain->fences[1];
+      swapchain->fences[1] = swapchain->fences[0];
+      swapchain->fences[0] = last;
+
+      if (last != VK_NULL_HANDLE) {
+         wsi->WaitForFences(device, 1, &last, true, 1);
+      }
+   }
+   return VK_SUCCESS;
+}
diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
index 229d398..b47da43 100644
--- a/src/vulkan/wsi/wsi_common.h
+++ b/src/vulkan/wsi/wsi_common.h
@@ -128,9 +128,11 @@ struct wsi_device {
    WSI_CB(CmdCopyImageToBuffer);
    WSI_CB(CreateBuffer);
    WSI_CB(CreateCommandPool);
+   WSI_CB(CreateFence);
    WSI_CB(CreateImage);
    WSI_CB(DestroyBuffer);
    WSI_CB(DestroyCommandPool);
+   WSI_CB(DestroyFence);
    WSI_CB(DestroyImage);
    WSI_CB(EndCommandBuffer);
    WSI_CB(FreeMemory);
@@ -139,7 +141,9 @@ struct wsi_device {
    WSI_CB(GetImageMemoryRequirements);
    WSI_CB(GetImageSubresourceLayout);
    WSI_CB(GetMemoryFdKHR);
+   WSI_CB(ResetFences);
    WSI_CB(QueueSubmit);
+   WSI_CB(WaitForFences);
 #undef WSI_CB
 
     struct wsi_interface *                  wsi[VK_ICD_WSI_PLATFORM_MAX];
@@ -212,5 +216,11 @@ VkResult wsi_wl_init_wsi(struct wsi_device *wsi_device,
 void wsi_wl_finish_wsi(struct wsi_device *wsi_device,
                        const VkAllocationCallbacks *alloc);
 
+VkResult
+wsi_common_queue_present(const struct wsi_device *wsi,
+                         VkDevice device_h,
+                         VkQueue queue_h,
+                         int queue_family_index,
+                         const VkPresentInfoKHR *pPresentInfo);
 
 #endif
-- 
2.5.0.400.gff86faf

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to