diff --git a/src/virtio/vulkan/vn_image.c b/src/virtio/vulkan/vn_image.c index 5927eedff5e..18541d8fb2c 100644 --- a/src/virtio/vulkan/vn_image.c +++ b/src/virtio/vulkan/vn_image.c @@ -523,6 +523,38 @@ vn_GetImageSubresourceLayout(VkDevice device, VkSubresourceLayout *pLayout) { struct vn_device *dev = vn_device_from_handle(device); + struct vn_image *img = vn_image_from_handle(image); + + /* override aspect mask for wsi/ahb images with tiling modifier */ + VkImageSubresource local_subresource; + if ((img->wsi.is_wsi && img->wsi.tiling_override == + VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) || + img->deferred_info) { + VkImageAspectFlags aspect = pSubresource->aspectMask; + switch (aspect) { + case VK_IMAGE_ASPECT_COLOR_BIT: + case VK_IMAGE_ASPECT_DEPTH_BIT: + case VK_IMAGE_ASPECT_STENCIL_BIT: + case VK_IMAGE_ASPECT_PLANE_0_BIT: + aspect = VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT; + break; + case VK_IMAGE_ASPECT_PLANE_1_BIT: + aspect = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT; + break; + case VK_IMAGE_ASPECT_PLANE_2_BIT: + aspect = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT; + break; + default: + break; + } + + /* only handle supported aspect override */ + if (aspect != pSubresource->aspectMask) { + local_subresource = *pSubresource; + local_subresource.aspectMask = aspect; + pSubresource = &local_subresource; + } + } /* TODO local cache */ vn_call_vkGetImageSubresourceLayout(dev->instance, device, image,