[Mesa-dev] [PATCH v2 25/32] vulkan/wsi: move swapchain create/destroy to common code

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


From: Dave Airlie <airlied at redhat.com>

v2 (Jason Ekstrand):
 - Rebase
 - Alter the names of the helpers to better match the vulkan entrypoints
 - Use the helpers in anv
---
 src/amd/vulkan/radv_wsi.c   | 42 ++++++++----------------------------------
 src/intel/vulkan/anv_wsi.c  | 35 +++++------------------------------
 src/vulkan/wsi/wsi_common.c | 38 ++++++++++++++++++++++++++++++++++++++
 src/vulkan/wsi/wsi_common.h | 12 ++++++++++++
 4 files changed, 63 insertions(+), 64 deletions(-)

diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c
index ed964c5..7791162 100644
--- a/src/amd/vulkan/radv_wsi.c
+++ b/src/amd/vulkan/radv_wsi.c
@@ -164,60 +164,34 @@ VkResult radv_CreateSwapchainKHR(
 	VkSwapchainKHR*                              pSwapchain)
 {
 	RADV_FROM_HANDLE(radv_device, device, _device);
-	ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pCreateInfo->surface);
-	struct wsi_interface *iface =
-		device->physical_device->wsi_device.wsi[surface->platform];
-	struct wsi_swapchain *swapchain;
 	const VkAllocationCallbacks *alloc;
 	if (pAllocator)
 		alloc = pAllocator;
 	else
 		alloc = &device->alloc;
-	VkResult result = iface->create_swapchain(surface, _device,
-						  &device->physical_device->wsi_device,
-						  device->physical_device->local_fd,
-						  pCreateInfo,
-						  alloc,
-						  &swapchain);
-	if (result != VK_SUCCESS)
-		return result;
-
-	if (pAllocator)
-		swapchain->alloc = *pAllocator;
-	else
-		swapchain->alloc = device->alloc;
-
-	for (unsigned i = 0; i < ARRAY_SIZE(swapchain->fences); i++)
-		swapchain->fences[i] = VK_NULL_HANDLE;
-
-	*pSwapchain = wsi_swapchain_to_handle(swapchain);
 
-	return VK_SUCCESS;
+	return wsi_common_create_swapchain(&device->physical_device->wsi_device,
+					   radv_device_to_handle(device),
+					   device->physical_device->local_fd,
+					   pCreateInfo,
+					   alloc,
+					   pSwapchain);
 }
 
 void radv_DestroySwapchainKHR(
 	VkDevice                                     _device,
-	VkSwapchainKHR                               _swapchain,
+	VkSwapchainKHR                               swapchain,
 	const VkAllocationCallbacks*                 pAllocator)
 {
 	RADV_FROM_HANDLE(radv_device, device, _device);
-	RADV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain);
 	const VkAllocationCallbacks *alloc;
 
-	if (!_swapchain)
-		return;
-
 	if (pAllocator)
 		alloc = pAllocator;
 	else
 		alloc = &device->alloc;
 
-	for (unsigned i = 0; i < ARRAY_SIZE(swapchain->fences); i++) {
-		if (swapchain->fences[i] != VK_NULL_HANDLE)
-			radv_DestroyFence(_device, swapchain->fences[i], pAllocator);
-	}
-
-	swapchain->destroy(swapchain, alloc);
+	wsi_common_destroy_swapchain(_device, swapchain, alloc);
 }
 
 VkResult radv_GetSwapchainImagesKHR(
diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c
index eed378c..62368a1 100644
--- a/src/intel/vulkan/anv_wsi.c
+++ b/src/intel/vulkan/anv_wsi.c
@@ -193,57 +193,32 @@ VkResult anv_CreateSwapchainKHR(
     VkSwapchainKHR*                              pSwapchain)
 {
    ANV_FROM_HANDLE(anv_device, device, _device);
-   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pCreateInfo->surface);
-   struct wsi_interface *iface =
-      device->instance->physicalDevice.wsi_device.wsi[surface->platform];
-   struct wsi_swapchain *swapchain;
+   struct wsi_device *wsi_device = &device->instance->physicalDevice.wsi_device;
    const VkAllocationCallbacks *alloc;
 
    if (pAllocator)
      alloc = pAllocator;
    else
      alloc = &device->alloc;
-   VkResult result = iface->create_swapchain(surface, _device,
-                                             &device->instance->physicalDevice.wsi_device,
-                                             device->instance->physicalDevice.local_fd,
-                                             pCreateInfo,
-                                             alloc,
-                                             &swapchain);
-   if (result != VK_SUCCESS)
-      return result;
-
-   swapchain->alloc = *alloc;
 
-   for (unsigned i = 0; i < ARRAY_SIZE(swapchain->fences); i++)
-      swapchain->fences[i] = VK_NULL_HANDLE;
-
-   *pSwapchain = wsi_swapchain_to_handle(swapchain);
-
-   return VK_SUCCESS;
+   return wsi_common_create_swapchain(wsi_device, _device, device->fd,
+                                      pCreateInfo, alloc, pSwapchain);
 }
 
 void anv_DestroySwapchainKHR(
     VkDevice                                     _device,
-    VkSwapchainKHR                               _swapchain,
+    VkSwapchainKHR                               swapchain,
     const VkAllocationCallbacks*                 pAllocator)
 {
    ANV_FROM_HANDLE(anv_device, device, _device);
-   ANV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain);
    const VkAllocationCallbacks *alloc;
 
-   if (!swapchain)
-      return;
-
    if (pAllocator)
      alloc = pAllocator;
    else
      alloc = &device->alloc;
-   for (unsigned i = 0; i < ARRAY_SIZE(swapchain->fences); i++) {
-      if (swapchain->fences[i] != VK_NULL_HANDLE)
-         anv_DestroyFence(_device, swapchain->fences[i], pAllocator);
-   }
 
-   swapchain->destroy(swapchain, alloc);
+   wsi_common_destroy_swapchain(_device, swapchain, alloc);
 }
 
 VkResult anv_GetSwapchainImagesKHR(
diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
index d420e48..69cb71d 100644
--- a/src/vulkan/wsi/wsi_common.c
+++ b/src/vulkan/wsi/wsi_common.c
@@ -115,6 +115,9 @@ fail:
 void
 wsi_swapchain_finish(struct wsi_swapchain *chain)
 {
+   for (unsigned i = 0; i < ARRAY_SIZE(chain->fences); i++)
+      chain->wsi->DestroyFence(chain->device, chain->fences[i], &chain->alloc);
+
    for (uint32_t i = 0; i < chain->wsi->queue_family_count; i++) {
       chain->wsi->DestroyCommandPool(chain->device, chain->cmd_pools[i],
                                      &chain->alloc);
@@ -485,6 +488,41 @@ wsi_destroy_image(const struct wsi_swapchain *chain,
 }
 
 VkResult
+wsi_common_create_swapchain(struct wsi_device *wsi,
+                            VkDevice device,
+                            int fd,
+                            const VkSwapchainCreateInfoKHR *pCreateInfo,
+                            const VkAllocationCallbacks *pAllocator,
+                            VkSwapchainKHR *pSwapchain)
+{
+   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pCreateInfo->surface);
+   struct wsi_interface *iface = wsi->wsi[surface->platform];
+   struct wsi_swapchain *swapchain;
+
+   VkResult result = iface->create_swapchain(surface, device, wsi, fd,
+                                             pCreateInfo, pAllocator,
+                                             &swapchain);
+   if (result != VK_SUCCESS)
+      return result;
+
+   *pSwapchain = wsi_swapchain_to_handle(swapchain);
+
+   return VK_SUCCESS;
+}
+
+void
+wsi_common_destroy_swapchain(VkDevice device,
+                             VkSwapchainKHR _swapchain,
+                             const VkAllocationCallbacks *pAllocator)
+{
+   WSI_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain);
+   if (!swapchain)
+      return;
+
+   swapchain->destroy(swapchain, pAllocator);
+}
+
+VkResult
 wsi_common_get_images(VkSwapchainKHR _swapchain,
                       uint32_t *pSwapchainImageCount,
                       VkImage *pSwapchainImages)
diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
index 9ff28e7..6ed10b8 100644
--- a/src/vulkan/wsi/wsi_common.h
+++ b/src/vulkan/wsi/wsi_common.h
@@ -221,6 +221,18 @@ wsi_common_get_images(VkSwapchainKHR _swapchain,
                       VkImage *pSwapchainImages);
 
 VkResult
+wsi_common_create_swapchain(struct wsi_device *wsi,
+                            VkDevice device,
+                            int fd,
+                            const VkSwapchainCreateInfoKHR *pCreateInfo,
+                            const VkAllocationCallbacks *pAllocator,
+                            VkSwapchainKHR *pSwapchain);
+void
+wsi_common_destroy_swapchain(VkDevice device,
+                             VkSwapchainKHR swapchain,
+                             const VkAllocationCallbacks *pAllocator);
+
+VkResult
 wsi_common_queue_present(const struct wsi_device *wsi,
                          VkDevice device_h,
                          VkQueue queue_h,
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list