}
VkResult
-anv_image_from_external(
- VkDevice device_h,
- const VkImageCreateInfo *base_info,
- const VkExternalMemoryImageCreateInfo *create_info,
- const VkAllocationCallbacks *alloc,
- VkImage *out_image_h)
-{
-#if ANDROID_API_LEVEL >= 26
- ANV_FROM_HANDLE(anv_device, device, device_h);
-
- const VkExternalFormatANDROID *ext_info =
- vk_find_struct_const(base_info->pNext, EXTERNAL_FORMAT_ANDROID);
-
- if (ext_info && ext_info->externalFormat != 0) {
- assert(base_info->format == VK_FORMAT_UNDEFINED);
- assert(base_info->imageType == VK_IMAGE_TYPE_2D);
- assert(base_info->usage == VK_IMAGE_USAGE_SAMPLED_BIT);
- assert(base_info->tiling == VK_IMAGE_TILING_OPTIMAL);
- }
-
- struct anv_image_create_info anv_info = {
- .vk_info = base_info,
- .isl_extra_usage_flags = ISL_SURF_USAGE_DISABLE_AUX_BIT,
- .external_format = true,
- };
-
- VkImage image_h;
- VkResult result = anv_image_create(device_h, &anv_info, alloc, &image_h);
- if (result != VK_SUCCESS)
- return result;
-
- *out_image_h = image_h;
-
- return VK_SUCCESS;
-#else
- return VK_ERROR_EXTENSION_NOT_PRESENT;
-#endif
-}
-
-
-VkResult
anv_image_from_gralloc(VkDevice device_h,
const VkImageCreateInfo *base_info,
const VkNativeBufferANDROID *gralloc_info,
const struct wsi_image_create_info *wsi_info =
vk_find_struct_const(pCreateInfo->pNext, WSI_IMAGE_CREATE_INFO_MESA);
+ const VkExternalFormatANDROID *ext_format =
+ vk_find_struct_const(pCreateInfo->pNext, EXTERNAL_FORMAT_ANDROID);
+
if (pCreateInfo->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
mod_explicit_info =
vk_find_struct_const(pCreateInfo->pNext,
image->drm_format_mod = isl_mod_info ? isl_mod_info->modifier :
DRM_FORMAT_MOD_INVALID;
+ if (ext_format && ext_format->externalFormat != 0)
+ image->has_android_external_format = true;
+
if (image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
image->stencil_usage = pCreateInfo->usage;
const VkImageStencilUsageCreateInfoEXT *stencil_usage_info =
};
}
- /* In case of external format, We don't know format yet,
- * so skip the rest for now.
- */
- if (create_info->external_format) {
- image->external_format = true;
+ /* In case of AHardwareBuffer import, we don't know the layout yet */
+ const VkExternalMemoryImageCreateInfo *ext_mem_info =
+ vk_find_struct_const(pCreateInfo->pNext, EXTERNAL_MEMORY_IMAGE_CREATE_INFO);
+ if (ext_mem_info && (ext_mem_info->handleTypes &
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)) {
+ image->from_ahb = true;
*pImage = anv_image_to_handle(image);
return VK_SUCCESS;
}
return anv_image_create(device,
&(struct anv_image_create_info) {
.vk_info = &local_create_info,
- .external_format = swapchain_image->external_format,
},
pAllocator,
pImage);
const VkAllocationCallbacks *pAllocator,
VkImage *pImage)
{
- const VkExternalMemoryImageCreateInfo *create_info =
- vk_find_struct_const(pCreateInfo->pNext, EXTERNAL_MEMORY_IMAGE_CREATE_INFO);
-
- if (create_info && (create_info->handleTypes &
- VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID))
- return anv_image_from_external(device, pCreateInfo, create_info,
- pAllocator, pImage);
-
- bool use_external_format = false;
- const VkExternalFormatANDROID *ext_format =
- vk_find_struct_const(pCreateInfo->pNext, EXTERNAL_FORMAT_ANDROID);
-
- /* "If externalFormat is zero, the effect is as if the
- * VkExternalFormatANDROID structure was not present. Otherwise, the image
- * will have the specified external format."
- */
- if (ext_format && ext_format->externalFormat != 0)
- use_external_format = true;
-
const VkNativeBufferANDROID *gralloc_info =
vk_find_struct_const(pCreateInfo->pNext, NATIVE_BUFFER_ANDROID);
if (gralloc_info)
return anv_image_create(device,
&(struct anv_image_create_info) {
.vk_info = pCreateInfo,
- .external_format = use_external_format,
},
pAllocator,
pImage);
switch (ext->sType) {
case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS: {
VkMemoryDedicatedRequirements *requirements = (void *)ext;
- if (image->needs_set_tiling || image->external_format) {
+ if (image->needs_set_tiling || image->from_ahb) {
/* If we need to set the tiling for external consumers, we need a
* dedicated allocation.
*
* VKSamplerYcbcrConversionInfo with a conversion object created with the same
* external format as image."
*/
- assert(!image->external_format || conv_info);
+ assert(!image->has_android_external_format || conv_info);
if (conv_info) {
ANV_FROM_HANDLE(anv_ycbcr_conversion, conversion, conv_info->conversion);
iview->vk_format = pCreateInfo->format;
/* "If image has an external format, format must be VK_FORMAT_UNDEFINED." */
- assert(!image->external_format || pCreateInfo->format == VK_FORMAT_UNDEFINED);
+ assert(!image->has_android_external_format ||
+ pCreateInfo->format == VK_FORMAT_UNDEFINED);
/* Format is undefined, this can happen when using external formats. Set
* view format from the passed conversion info.