[Mesa-dev] [PATCH 20/28] vulkan/wsi: Move get_images into common code

Jason Ekstrand jason at jlekstrand.net
Thu Nov 16 21:29:08 UTC 2017


This moves bits out of all four corners (anv, radv, x11, wayland) and
into the wsi common code.  We also switch to using an outarray to ensure
we get our return code right.
---
 src/amd/vulkan/radv_wsi.c           |  7 +++----
 src/intel/vulkan/anv_wsi.c          |  7 +++----
 src/vulkan/wsi/wsi_common.c         | 17 +++++++++++++++++
 src/vulkan/wsi/wsi_common.h         |  9 +++++++--
 src/vulkan/wsi/wsi_common_wayland.c | 28 +++++-----------------------
 src/vulkan/wsi/wsi_common_x11.c     | 29 +++++------------------------
 6 files changed, 40 insertions(+), 57 deletions(-)

diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c
index 0d1b479..ed964c5 100644
--- a/src/amd/vulkan/radv_wsi.c
+++ b/src/amd/vulkan/radv_wsi.c
@@ -222,13 +222,12 @@ void radv_DestroySwapchainKHR(
 
 VkResult radv_GetSwapchainImagesKHR(
 	VkDevice                                     device,
-	VkSwapchainKHR                               _swapchain,
+	VkSwapchainKHR                               swapchain,
 	uint32_t*                                    pSwapchainImageCount,
 	VkImage*                                     pSwapchainImages)
 {
-	RADV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain);
-
-	return swapchain->get_images(swapchain, pSwapchainImageCount,
+	return wsi_common_get_images(swapchain,
+				     pSwapchainImageCount,
 				     pSwapchainImages);
 }
 
diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c
index 975ad18..eed378c 100644
--- a/src/intel/vulkan/anv_wsi.c
+++ b/src/intel/vulkan/anv_wsi.c
@@ -248,13 +248,12 @@ void anv_DestroySwapchainKHR(
 
 VkResult anv_GetSwapchainImagesKHR(
     VkDevice                                     device,
-    VkSwapchainKHR                               _swapchain,
+    VkSwapchainKHR                               swapchain,
     uint32_t*                                    pSwapchainImageCount,
     VkImage*                                     pSwapchainImages)
 {
-   ANV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain);
-
-   return swapchain->get_images(swapchain, pSwapchainImageCount,
+   return wsi_common_get_images(swapchain,
+                                pSwapchainImageCount,
                                 pSwapchainImages);
 }
 
diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
index 09528d7..35e49be 100644
--- a/src/vulkan/wsi/wsi_common.c
+++ b/src/vulkan/wsi/wsi_common.c
@@ -499,6 +499,23 @@ wsi_prime_image_blit_to_linear(const struct wsi_swapchain *chain,
 }
 
 VkResult
+wsi_common_get_images(VkSwapchainKHR _swapchain,
+                      uint32_t *pSwapchainImageCount,
+                      VkImage *pSwapchainImages)
+{
+   WSI_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain);
+   VK_OUTARRAY_MAKE(images, pSwapchainImages, pSwapchainImageCount);
+
+   for (uint32_t i = 0; i < swapchain->image_count; i++) {
+      vk_outarray_append(&images, image) {
+         *image = swapchain->get_wsi_image(swapchain, i)->image;
+      }
+   }
+
+   return vk_outarray_status(&images);
+}
+
+VkResult
 wsi_common_queue_present(const struct wsi_device *wsi,
                          VkDevice device,
                          VkQueue queue,
diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
index 4ce1579..ffd79c7 100644
--- a/src/vulkan/wsi/wsi_common.h
+++ b/src/vulkan/wsi/wsi_common.h
@@ -56,8 +56,8 @@ struct wsi_swapchain {
 
    VkResult (*destroy)(struct wsi_swapchain *swapchain,
                        const VkAllocationCallbacks *pAllocator);
-   VkResult (*get_images)(struct wsi_swapchain *swapchain,
-                          uint32_t *pCount, VkImage *pSwapchainImages);
+   struct wsi_image *(*get_wsi_image)(struct wsi_swapchain *swapchain,
+                                      uint32_t image_index);
    VkResult (*acquire_next_image)(struct wsi_swapchain *swap_chain,
                                   uint64_t timeout, VkSemaphore semaphore,
                                   uint32_t *image_index);
@@ -209,6 +209,11 @@ void wsi_wl_finish_wsi(struct wsi_device *wsi_device,
                        const VkAllocationCallbacks *alloc);
 
 VkResult
+wsi_common_get_images(VkSwapchainKHR _swapchain,
+                      uint32_t *pSwapchainImageCount,
+                      VkImage *pSwapchainImages);
+
+VkResult
 wsi_common_queue_present(const struct wsi_device *wsi,
                          VkDevice device_h,
                          VkQueue queue_h,
diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
index 22c01b2..bf60a9b 100644
--- a/src/vulkan/wsi/wsi_common_wayland.c
+++ b/src/vulkan/wsi/wsi_common_wayland.c
@@ -582,30 +582,12 @@ struct wsi_wl_swapchain {
    struct wsi_wl_image                          images[0];
 };
 
-static VkResult
-wsi_wl_swapchain_get_images(struct wsi_swapchain *wsi_chain,
-                            uint32_t *pCount, VkImage *pSwapchainImages)
+static struct wsi_image *
+wsi_wl_swapchain_get_wsi_image(struct wsi_swapchain *wsi_chain,
+                               uint32_t image_index)
 {
    struct wsi_wl_swapchain *chain = (struct wsi_wl_swapchain *)wsi_chain;
-   uint32_t ret_count;
-   VkResult result;
-
-   if (pSwapchainImages == NULL) {
-      *pCount = chain->base.image_count;
-      return VK_SUCCESS;
-   }
-
-   result = VK_SUCCESS;
-   ret_count = chain->base.image_count;
-   if (chain->base.image_count > *pCount) {
-     ret_count = *pCount;
-     result = VK_INCOMPLETE;
-   }
-
-   for (uint32_t i = 0; i < ret_count; i++)
-      pSwapchainImages[i] = chain->images[i].base.image;
-
-   return result;
+   return &chain->images[image_index].base;
 }
 
 static VkResult
@@ -832,7 +814,7 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
                       VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR;
 
    chain->base.destroy = wsi_wl_swapchain_destroy;
-   chain->base.get_images = wsi_wl_swapchain_get_images;
+   chain->base.get_wsi_image = wsi_wl_swapchain_get_wsi_image;
    chain->base.acquire_next_image = wsi_wl_swapchain_acquire_next_image;
    chain->base.queue_present = wsi_wl_swapchain_queue_present;
    chain->base.present_mode = pCreateInfo->presentMode;
diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
index 68cb035..8860d8e 100644
--- a/src/vulkan/wsi/wsi_common_x11.c
+++ b/src/vulkan/wsi/wsi_common_x11.c
@@ -648,30 +648,11 @@ struct x11_swapchain {
    struct x11_image                             images[0];
 };
 
-static VkResult
-x11_get_images(struct wsi_swapchain *anv_chain,
-               uint32_t* pCount, VkImage *pSwapchainImages)
+static struct wsi_image *
+x11_get_wsi_image(struct wsi_swapchain *wsi_chain, uint32_t image_index)
 {
-   struct x11_swapchain *chain = (struct x11_swapchain *)anv_chain;
-   uint32_t ret_count;
-   VkResult result;
-
-   if (pSwapchainImages == NULL) {
-      *pCount = chain->base.image_count;
-      return VK_SUCCESS;
-   }
-
-   result = VK_SUCCESS;
-   ret_count = chain->base.image_count;
-   if (chain->base.image_count > *pCount) {
-     ret_count = *pCount;
-     result = VK_INCOMPLETE;
-   }
-
-   for (uint32_t i = 0; i < ret_count; i++)
-      pSwapchainImages[i] = chain->images[i].base.image;
-
-   return result;
+   struct x11_swapchain *chain = (struct x11_swapchain *)wsi_chain;
+   return &chain->images[image_index].base;
 }
 
 static VkResult
@@ -1109,7 +1090,7 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
       goto fail_alloc;
 
    chain->base.destroy = x11_swapchain_destroy;
-   chain->base.get_images = x11_get_images;
+   chain->base.get_wsi_image = x11_get_wsi_image;
    chain->base.acquire_next_image = x11_acquire_next_image;
    chain->base.queue_present = x11_queue_present;
    chain->base.present_mode = pCreateInfo->presentMode;
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list