[Mesa-dev] [PATCH 05/14] radv/wsi: Move image allocation into helper function
Daniel Stone
daniels at collabora.com
Fri Jul 21 13:42:08 UTC 2017
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 | 83 +++++++++++++++++++++++++++++------------------
1 file changed, 51 insertions(+), 32 deletions(-)
diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c
index 799c50dc77..258e755194 100644
--- a/src/amd/vulkan/radv_wsi.c
+++ b/src/amd/vulkan/radv_wsi.c
@@ -138,18 +138,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;
+ VkResult result;
result = radv_image_create(device_h,
&(struct radv_image_create_info) {
@@ -166,7 +163,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,
@@ -177,10 +173,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,
@@ -188,6 +180,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,
@@ -202,22 +196,49 @@ 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.
- */
- 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;
- } else {
- wsi_image->fds[0] = -1;
- }
+ *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;
+ int fd;
+
+ result = radv_wsi_image_alloc(device_h, pCreateInfo, pAllocator,
+ linear, &image_h, &memory_h);
+ if (result != VK_SUCCESS)
+ return result;
+
+ if (should_export)
+ return VK_SUCCESS;
+
+ image = radv_image_from_handle(image_h);
surface = &image->surface;
+ 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;
+
+ wsi_image->fds[0] = fd;
wsi_image->image = image_h;
wsi_image->memory = memory_h;
wsi_image->num_planes = 1;
@@ -225,12 +246,10 @@ radv_wsi_image_create(VkDevice device_h,
wsi_image->offsets[0] = image->offset;
wsi_image->row_pitches[0] = 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.2
More information about the mesa-dev
mailing list