diff --git a/src/panfrost/vulkan/panvk_android.c b/src/panfrost/vulkan/panvk_android.c index 82e30c61139..ed52211e6cd 100644 --- a/src/panfrost/vulkan/panvk_android.c +++ b/src/panfrost/vulkan/panvk_android.c @@ -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; }