From: Daniel Stone <dani...@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 <dani...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev