panvk: Use vk_android deferred image helper

Switch to using the new helper.

Signed-off-by: Valentine Burley <valentine.burley@collabora.com>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40635>
This commit is contained in:
Valentine Burley 2026-03-25 11:11:31 +01:00 committed by Marge Bot
parent 013dee3b8f
commit 8d4fb52919

View file

@ -43,13 +43,6 @@ panvk_android_is_gralloc_image(const VkImageCreateInfo *pCreateInfo)
return false;
}
struct panvk_android_deferred_image {
struct panvk_image base;
VkImageCreateInfo *create_info;
bool initialized;
};
static VkResult
panvk_android_create_deferred_image(VkDevice device,
const VkImageCreateInfo *pCreateInfo,
@ -58,85 +51,19 @@ panvk_android_create_deferred_image(VkDevice device,
{
VK_FROM_HANDLE(panvk_device, dev, device);
/* collect all dynamic array infos */
uint32_t queue_family_count = 0;
uint32_t view_format_count = 0;
if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT)
queue_family_count = pCreateInfo->queueFamilyIndexCount;
const VkImageFormatListCreateInfo *raw_list =
vk_find_struct_const(pCreateInfo->pNext, IMAGE_FORMAT_LIST_CREATE_INFO);
if (raw_list)
view_format_count = raw_list->viewFormatCount;
/* Extend below when panvk supports more extensions that interact with ANB or
* AHB. e.g. VK_EXT_image_compression_control
*/
VK_MULTIALLOC(ma);
VK_MULTIALLOC_DECL(&ma, struct panvk_android_deferred_image, deferred, 1);
VK_MULTIALLOC_DECL(&ma, VkImageCreateInfo, create_info, 1);
VK_MULTIALLOC_DECL(&ma, VkImageFormatListCreateInfo, list_info, 1);
VK_MULTIALLOC_DECL(&ma, VkImageStencilUsageCreateInfo, stencil_info, 1);
VK_MULTIALLOC_DECL(&ma, uint32_t, queue_families, queue_family_count);
VK_MULTIALLOC_DECL(&ma, uint32_t, view_formats, view_format_count);
if (!vk_multialloc_zalloc2(&ma, &dev->vk.alloc, pAllocator,
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT))
struct panvk_image *img =
vk_image_create(&dev->vk, pCreateInfo, pAllocator, sizeof(*img));
if (!img)
return panvk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
vk_image_init(&dev->vk, &deferred->base.vk, pCreateInfo);
/* prepare the deferred VkImageCreateInfo chain */
*create_info = *pCreateInfo;
create_info->pNext = NULL;
/* Assign resolved AHB external format */
create_info->format = deferred->base.vk.format;
create_info->tiling = deferred->base.vk.tiling =
VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
typed_memcpy(queue_families, pCreateInfo->pQueueFamilyIndices,
pCreateInfo->queueFamilyIndexCount);
create_info->pQueueFamilyIndices = queue_families;
VkResult result = vk_android_init_deferred_image(&dev->vk, &img->vk,
pCreateInfo, pAllocator);
if (result != VK_SUCCESS) {
vk_image_destroy(&dev->vk, pAllocator, &img->vk);
return panvk_error(dev, result);
}
/* Per spec section 12.3. Images
*
* - If tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT and flags contains
* VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, then the pNext chain must include a
* VkImageFormatListCreateInfo structure with non-zero viewFormatCount.
*
* ANB and aliased ANB always chain proper format list for mutable swapchain
* image support, but AHB is allowed to mutate without an explicit format
* list due to legacy spec issue. So we chain a view format of the create
* format itself to satisfy VK_EXT_image_drm_format_modifier VUs.
*/
if (view_format_count ||
deferred->base.vk.create_flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
if (view_format_count) {
typed_memcpy(view_formats, raw_list->pViewFormats, view_format_count);
} else {
view_format_count = 1;
view_formats = &create_info->format;
}
*list_info = (VkImageFormatListCreateInfo){
.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO,
.viewFormatCount = view_format_count,
.pViewFormats = view_formats,
};
__vk_append_struct(create_info, list_info);
}
if (deferred->base.vk.stencil_usage) {
*stencil_info = (VkImageStencilUsageCreateInfo){
.sType = VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO,
.stencilUsage = deferred->base.vk.stencil_usage,
};
__vk_append_struct(create_info, stencil_info);
}
deferred->create_info = create_info;
*pImage = panvk_image_to_handle(&deferred->base);
*pImage = panvk_image_to_handle(img);
return VK_SUCCESS;
}
@ -346,9 +273,7 @@ panvk_android_get_wsi_memory(struct panvk_device *dev,
VK_FROM_HANDLE(panvk_image, img, bind_info->image);
VkResult result;
struct panvk_android_deferred_image *deferred =
container_of(img, struct panvk_android_deferred_image, base);
assert(deferred->create_info && !deferred->initialized);
assert(img->vk.android_deferred_create_info);
const VkNativeBufferANDROID *anb =
vk_find_struct_const(bind_info->pNext, NATIVE_BUFFER_ANDROID);
@ -358,14 +283,13 @@ panvk_android_get_wsi_memory(struct panvk_device *dev,
* take ANB directly instead.
*/
VkNativeBufferANDROID local_anb = *anb;
local_anb.pNext = deferred->create_info->pNext;
deferred->create_info->pNext = &local_anb;
result = panvk_android_anb_init(dev, deferred->create_info, anb,
&dev->vk.alloc, img);
local_anb.pNext = img->vk.android_deferred_create_info->pNext;
img->vk.android_deferred_create_info->pNext = &local_anb;
result = panvk_android_anb_init(dev, img->vk.android_deferred_create_info,
anb, &dev->vk.alloc, img);
if (result != VK_SUCCESS)
return result;
deferred->initialized = true;
*out_mem_handle = img->vk.anb_memory;
return VK_SUCCESS;
@ -377,9 +301,7 @@ panvk_android_ahb_image_init(struct AHardwareBuffer *ahb,
{
VkResult result;
struct panvk_android_deferred_image *deferred =
container_of(img, struct panvk_android_deferred_image, base);
assert(deferred->create_info && !deferred->initialized);
assert(img->vk.android_deferred_create_info);
VkImageDrmFormatModifierExplicitCreateInfoEXT mod_info;
VkSubresourceLayout layouts[PANVK_MAX_PLANES];
@ -387,20 +309,18 @@ panvk_android_ahb_image_init(struct AHardwareBuffer *ahb,
vk_android_get_ahb_layout(ahb, &mod_info, layouts, PANVK_MAX_PLANES);
if (result != VK_SUCCESS)
return result;
__vk_append_struct(deferred->create_info, &mod_info);
__vk_append_struct(img->vk.android_deferred_create_info, &mod_info);
VkExternalMemoryImageCreateInfo external_info = {
.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
};
__vk_append_struct(deferred->create_info, &external_info);
__vk_append_struct(img->vk.android_deferred_create_info, &external_info);
result = panvk_image_init(img, deferred->create_info);
result = panvk_image_init(img, img->vk.android_deferred_create_info);
if (result != VK_SUCCESS)
return result;
deferred->initialized = true;
return VK_SUCCESS;
}