[RFC v3 11/22] radv/wsi: Move image allocation into helper function

Louis-Francis Ratté-Boulianne lfrb at collabora.com
Wed Sep 27 05:28:41 UTC 2017


From: Daniel Stone <daniels at collabora.com>

Create a new helper function which handles the actual image/memory
allocations for a swapchain image, removing the bulk of
radv_wsi_image_create. This will make it easier to move linear handling
into radv in the next patch.

Signed-off-by: Daniel Stone <daniels at collabora.com>
---
 src/amd/vulkan/radv_wsi.c | 76 +++++++++++++++++++++++++++++------------------
 1 file changed, 47 insertions(+), 29 deletions(-)

diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c
index 135808461f..cd2b36a57f 100644
--- a/src/amd/vulkan/radv_wsi.c
+++ b/src/amd/vulkan/radv_wsi.c
@@ -139,19 +139,15 @@ VkResult radv_GetPhysicalDeviceSurfacePresentModesKHR(
 }
 
 static VkResult
-radv_wsi_image_create(VkDevice device_h,
-		      const VkSwapchainCreateInfoKHR *pCreateInfo,
-		      const VkAllocationCallbacks* pAllocator,
-		      bool should_export,
-		      bool linear,
-		      struct wsi_image_base *wsi_image)
+radv_wsi_image_alloc(VkDevice device_h,
+		     const VkSwapchainCreateInfoKHR *pCreateInfo,
+		     const VkAllocationCallbacks *pAllocator,
+		     bool linear,
+		     VkImage *image_h_p,
+		     VkDeviceMemory *memory_h_p)
 {
-	VkResult result = VK_SUCCESS;
-	struct radeon_surf *surface;
 	VkImage image_h;
-	struct radv_image *image;
-	int fd;
-	RADV_FROM_HANDLE(radv_device, device, device_h);
+	VkResult result;
 
 	result = radv_image_create(device_h,
 				   &(struct radv_image_create_info) {
@@ -168,7 +164,6 @@ radv_wsi_image_create(VkDevice device_h,
 						   .mipLevels = 1,
 						   .arrayLayers = 1,
 						   .samples = 1,
-						   /* FIXME: Need a way to use X tiling to allow scanout */
 						   .tiling = linear ? VK_IMAGE_TILING_LINEAR : VK_IMAGE_TILING_OPTIMAL,
 						   .usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
 						   .flags = 0,
@@ -179,10 +174,6 @@ radv_wsi_image_create(VkDevice device_h,
 	if (result != VK_SUCCESS)
 		return result;
 
-	image = radv_image_from_handle(image_h);
-
-	VkDeviceMemory memory_h;
-
 	const VkMemoryDedicatedAllocateInfoKHR ded_alloc = {
 		.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR,
 		.pNext = NULL,
@@ -190,6 +181,8 @@ radv_wsi_image_create(VkDevice device_h,
 		.image = image_h
 	};
 
+	struct radv_image *image = radv_image_from_handle(image_h);
+	VkDeviceMemory memory_h;
 	result = radv_AllocateMemory(device_h,
 				     &(VkMemoryAllocateInfo) {
 					     .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
@@ -204,21 +197,48 @@ radv_wsi_image_create(VkDevice device_h,
 
 	radv_BindImageMemory(device_h, image_h, memory_h, 0);
 
-	/*
-	 * return the fd for the image in the no copy mode,
-	 * or the fd for the linear image if a copy is required.
-	 */
+	*image_h_p = image_h;
+	*memory_h_p = memory_h;
+
+	return VK_SUCCESS;
+
+fail_create_image:
+	radv_DestroyImage(device_h, image_h, pAllocator);
+	return result;
+}
+
+
+static VkResult
+radv_wsi_image_create(VkDevice device_h,
+		      const VkSwapchainCreateInfoKHR *pCreateInfo,
+		      const VkAllocationCallbacks* pAllocator,
+		      bool should_export,
+		      bool linear,
+		      struct wsi_image_base *wsi_image)
+{
+	VkResult result = VK_SUCCESS;
+	struct radeon_surf *surface;
+	VkImage image_h;
+	VkDeviceMemory memory_h;
+	struct radv_image *image;
+
+	result = radv_wsi_image_alloc(device_h, pCreateInfo, pAllocator,
+				      linear, &image_h, &memory_h);
+	if (result != VK_SUCCESS)
+		return result;
+
+	image = radv_image_from_handle(image_h);
+	surface = &image->surface;
+
 	if (should_export) {
+		RADV_FROM_HANDLE(radv_device, device, device_h);
 		RADV_FROM_HANDLE(radv_device_memory, memory, memory_h);
-		if (!radv_get_memory_fd(device, memory, &fd))
-			goto fail_alloc_memory;
-		wsi_image->fds[0] = fd;
+		if (!radv_get_memory_fd(device, memory, &wsi_image->fds[0]))
+			goto fail_alloc;
 	} else {
 		wsi_image->fds[0] = -1;
 	}
 
-	surface = &image->surface;
-
 	wsi_image->image = image_h;
 	wsi_image->memory = memory_h;
 	wsi_image->num_planes = 1;
@@ -232,12 +252,10 @@ radv_wsi_image_create(VkDevice device_h,
 			surface->u.legacy.level[0].nblk_x * surface->bpe;
 
 	return VK_SUCCESS;
- fail_alloc_memory:
-	radv_FreeMemory(device_h, memory_h, pAllocator);
 
-fail_create_image:
+ fail_alloc:
+	radv_FreeMemory(device_h, memory_h, pAllocator);
 	radv_DestroyImage(device_h, image_h, pAllocator);
-
 	return result;
 }
 
-- 
2.13.0



More information about the xorg-devel mailing list