diff --git a/src/virtio/vulkan/vn_image.c b/src/virtio/vulkan/vn_image.c index 18541d8fb2c..44b23c5d1a7 100644 --- a/src/virtio/vulkan/vn_image.c +++ b/src/virtio/vulkan/vn_image.c @@ -157,6 +157,12 @@ vn_image_deferred_info_init(struct vn_image *img, memcpy(&info->stencil, src, sizeof(info->stencil)); pnext = &info->stencil; break; + case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID: + /* we should have translated the external format */ + assert(create_info->format != VK_FORMAT_UNDEFINED); + info->from_external_format = + ((const VkExternalFormatANDROID *)src)->externalFormat; + break; default: break; } @@ -570,9 +576,21 @@ vn_CreateImageView(VkDevice device, VkImageView *pView) { struct vn_device *dev = vn_device_from_handle(device); + struct vn_image *img = vn_image_from_handle(pCreateInfo->image); const VkAllocationCallbacks *alloc = pAllocator ? pAllocator : &dev->base.base.alloc; + VkImageViewCreateInfo local_info; + if (img->deferred_info && img->deferred_info->from_external_format) { + assert(pCreateInfo->format == VK_FORMAT_UNDEFINED); + + local_info = *pCreateInfo; + local_info.format = img->deferred_info->create.format; + pCreateInfo = &local_info; + + assert(pCreateInfo->format != VK_FORMAT_UNDEFINED); + } + struct vn_image_view *view = vk_zalloc(alloc, sizeof(*view), VN_DEFAULT_ALIGN, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); @@ -580,7 +598,7 @@ vn_CreateImageView(VkDevice device, return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY); vn_object_base_init(&view->base, VK_OBJECT_TYPE_IMAGE_VIEW, &dev->base); - view->image = vn_image_from_handle(pCreateInfo->image); + view->image = img; VkImageView view_handle = vn_image_view_to_handle(view); vn_async_vkCreateImageView(dev->instance, device, pCreateInfo, NULL, diff --git a/src/virtio/vulkan/vn_image.h b/src/virtio/vulkan/vn_image.h index 935272dc53a..59dd33728a7 100644 --- a/src/virtio/vulkan/vn_image.h +++ b/src/virtio/vulkan/vn_image.h @@ -28,6 +28,10 @@ struct vn_image_create_deferred_info { VkImageFormatListCreateInfo list; VkImageStencilUsageCreateInfo stencil; + /* True if VkImageCreateInfo::format is translated from a non-zero + * VkExternalFormatANDROID::externalFormat for the AHB image. + */ + bool from_external_format; /* track whether vn_image_init_deferred succeeds */ bool initialized; };