[Mesa-dev] [PATCH v2 24/32] vulkan/wsi: Move prime blitting into queue_present

Jason Ekstrand jason at jlekstrand.net
Wed Nov 29 00:28:36 UTC 2017


This lets us save a QueueSubmit and it also makes prime a lot less
X11-specific.  Also, it means we can only wait on the semaphores once
instead of on every blit.
---
 src/vulkan/wsi/wsi_common.c         | 41 +++++++++++++------------------------
 src/vulkan/wsi/wsi_common.h         |  5 ++---
 src/vulkan/wsi/wsi_common_private.h |  7 -------
 src/vulkan/wsi/wsi_common_wayland.c |  3 ---
 src/vulkan/wsi/wsi_common_x11.c     | 25 +++-------------------
 5 files changed, 19 insertions(+), 62 deletions(-)

diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
index ea4920c..d420e48 100644
--- a/src/vulkan/wsi/wsi_common.c
+++ b/src/vulkan/wsi/wsi_common.c
@@ -84,6 +84,7 @@ wsi_swapchain_init(const struct wsi_device *wsi,
    chain->wsi = wsi;
    chain->device = device;
    chain->alloc = *pAllocator;
+   chain->use_prime_blit = false;
 
    chain->cmd_pools =
       vk_zalloc(pAllocator, sizeof(VkCommandPool) * wsi->queue_family_count, 8,
@@ -484,30 +485,6 @@ wsi_destroy_image(const struct wsi_swapchain *chain,
 }
 
 VkResult
-wsi_prime_image_blit_to_linear(const struct wsi_swapchain *chain,
-                               struct wsi_image *image,
-                               VkQueue queue,
-                               uint32_t waitSemaphoreCount,
-                               const VkSemaphore *pWaitSemaphores)
-{
-   uint32_t queue_family = chain->wsi->queue_get_family_index(queue);
-
-   VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
-   const VkSubmitInfo submit_info = {
-      .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
-      .pNext = NULL,
-      .waitSemaphoreCount = waitSemaphoreCount,
-      .pWaitSemaphores = pWaitSemaphores,
-      .pWaitDstStageMask = &stage_flags,
-      .commandBufferCount = 1,
-      .pCommandBuffers = &image->prime.blit_cmd_buffers[queue_family],
-      .signalSemaphoreCount = 0,
-      .pSignalSemaphores = NULL,
-   };
-   return chain->wsi->QueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
-}
-
-VkResult
 wsi_common_get_images(VkSwapchainKHR _swapchain,
                       uint32_t *pSwapchainImageCount,
                       VkImage *pSwapchainImages)
@@ -559,6 +536,7 @@ wsi_common_queue_present(const struct wsi_device *wsi,
          .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
          .pNext = NULL,
       };
+
       VkPipelineStageFlags *stage_flags = NULL;
       if (i == 0) {
          /* We only need/want to wait on semaphores once.  After that, we're
@@ -582,6 +560,18 @@ wsi_common_queue_present(const struct wsi_device *wsi,
 
          submit_info.pWaitDstStageMask = stage_flags;
       }
+
+      if (swapchain->use_prime_blit) {
+         /* If we are using prime blits, we need to perform the blit now.  The
+          * command buffer is attached to the image.
+          */
+         struct wsi_image *image =
+            swapchain->get_wsi_image(swapchain, pPresentInfo->pImageIndices[i]);
+         submit_info.commandBufferCount = 1;
+         submit_info.pCommandBuffers =
+            &image->prime.blit_cmd_buffers[queue_family_index];
+      }
+
       result = wsi->QueueSubmit(queue, 1, &submit_info, swapchain->fences[0]);
       vk_free(&swapchain->alloc, stage_flags);
       if (result != VK_SUCCESS)
@@ -592,9 +582,6 @@ wsi_common_queue_present(const struct wsi_device *wsi,
          region = &regions->pRegions[i];
 
       result = swapchain->queue_present(swapchain,
-                                        queue,
-                                        pPresentInfo->waitSemaphoreCount,
-                                        pPresentInfo->pWaitSemaphores,
                                         pPresentInfo->pImageIndices[i],
                                         region);
       if (result != VK_SUCCESS)
diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
index 892e708..9ff28e7 100644
--- a/src/vulkan/wsi/wsi_common.h
+++ b/src/vulkan/wsi/wsi_common.h
@@ -59,6 +59,8 @@ struct wsi_swapchain {
    VkPresentModeKHR present_mode;
    uint32_t image_count;
 
+   bool use_prime_blit;
+
    /* Command pools, one per queue family */
    VkCommandPool *cmd_pools;
 
@@ -70,9 +72,6 @@ struct wsi_swapchain {
                                   uint64_t timeout, VkSemaphore semaphore,
                                   uint32_t *image_index);
    VkResult (*queue_present)(struct wsi_swapchain *swap_chain,
-                             VkQueue queue,
-                             uint32_t waitSemaphoreCount,
-                             const VkSemaphore *pWaitSemaphores,
                              uint32_t image_index,
                              const VkPresentRegionKHR *damage);
 };
diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h
index ff8ca2a..28abf6c 100644
--- a/src/vulkan/wsi/wsi_common_private.h
+++ b/src/vulkan/wsi/wsi_common_private.h
@@ -64,11 +64,4 @@ void
 wsi_destroy_image(const struct wsi_swapchain *chain,
                   struct wsi_image *image);
 
-VkResult
-wsi_prime_image_blit_to_linear(const struct wsi_swapchain *chain,
-                               struct wsi_image *image,
-                               VkQueue queue,
-                               uint32_t waitSemaphoreCount,
-                               const VkSemaphore *pWaitSemaphores);
-
 #endif /* WSI_COMMON_PRIVATE_H */
diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
index bf60a9b..fed2e8f 100644
--- a/src/vulkan/wsi/wsi_common_wayland.c
+++ b/src/vulkan/wsi/wsi_common_wayland.c
@@ -644,9 +644,6 @@ static const struct wl_callback_listener frame_listener = {
 
 static VkResult
 wsi_wl_swapchain_queue_present(struct wsi_swapchain *wsi_chain,
-                               VkQueue queue,
-                               uint32_t waitSemaphoreCount,
-                               const VkSemaphore *pWaitSemaphores,
                                uint32_t image_index,
                                const VkPresentRegionKHR *damage)
 {
diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
index 8860d8e..04ce810 100644
--- a/src/vulkan/wsi/wsi_common_x11.c
+++ b/src/vulkan/wsi/wsi_common_x11.c
@@ -625,8 +625,6 @@ struct x11_image {
 struct x11_swapchain {
    struct wsi_swapchain                        base;
 
-   bool                                         use_prime_blit;
-
    xcb_connection_t *                           conn;
    xcb_window_t                                 window;
    xcb_gc_t                                     gc;
@@ -862,24 +860,10 @@ x11_acquire_next_image(struct wsi_swapchain *anv_chain,
 
 static VkResult
 x11_queue_present(struct wsi_swapchain *anv_chain,
-                  VkQueue queue,
-                  uint32_t waitSemaphoreCount,
-                  const VkSemaphore *pWaitSemaphores,
                   uint32_t image_index,
                   const VkPresentRegionKHR *damage)
 {
    struct x11_swapchain *chain = (struct x11_swapchain *)anv_chain;
-   VkResult result;
-
-   if (chain->use_prime_blit) {
-      result = wsi_prime_image_blit_to_linear(&chain->base,
-                                              &chain->images[image_index].base,
-                                              queue,
-                                              waitSemaphoreCount,
-                                              pWaitSemaphores);
-      if (result != VK_SUCCESS)
-         return result;
-   }
 
    if (chain->threaded) {
       wsi_queue_push(&chain->present_queue, image_index);
@@ -947,7 +931,7 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain,
    VkResult result;
    uint32_t bpp = 32;
 
-   if (chain->use_prime_blit) {
+   if (chain->base.use_prime_blit) {
       result = wsi_create_prime_image(&chain->base, pCreateInfo, &image->base);
    } else {
       result = wsi_create_native_image(&chain->base, pCreateInfo, &image->base);
@@ -1104,11 +1088,8 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
    chain->threaded = false;
    chain->status = VK_SUCCESS;
 
-
-   chain->use_prime_blit = false;
-   if (!wsi_x11_check_dri3_compatible(conn, local_fd)) {
-       chain->use_prime_blit = true;
-   }
+   if (!wsi_x11_check_dri3_compatible(conn, local_fd))
+       chain->base.use_prime_blit = true;
 
    chain->event_id = xcb_generate_id(chain->conn);
    xcb_present_select_input(chain->conn, chain->event_id, chain->window,
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list