mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 15:48:36 +02:00
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:
parent
013dee3b8f
commit
8d4fb52919
1 changed files with 18 additions and 98 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue