venus: fix view format for ahb image
There's below AHB VU on the image view: VUID-VkImageViewCreateInfo-image-02399 If image has an external format, format must be VK_FORMAT_UNDEFINED This is well hidden and completely missed from the original venus ahb implementation. Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16159>
This commit is contained in:
@@ -157,6 +157,12 @@ vn_image_deferred_info_init(struct vn_image *img,
|
|||||||
memcpy(&info->stencil, src, sizeof(info->stencil));
|
memcpy(&info->stencil, src, sizeof(info->stencil));
|
||||||
pnext = &info->stencil;
|
pnext = &info->stencil;
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -570,9 +576,21 @@ vn_CreateImageView(VkDevice device,
|
|||||||
VkImageView *pView)
|
VkImageView *pView)
|
||||||
{
|
{
|
||||||
struct vn_device *dev = vn_device_from_handle(device);
|
struct vn_device *dev = vn_device_from_handle(device);
|
||||||
|
struct vn_image *img = vn_image_from_handle(pCreateInfo->image);
|
||||||
const VkAllocationCallbacks *alloc =
|
const VkAllocationCallbacks *alloc =
|
||||||
pAllocator ? pAllocator : &dev->base.base.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 =
|
struct vn_image_view *view =
|
||||||
vk_zalloc(alloc, sizeof(*view), VN_DEFAULT_ALIGN,
|
vk_zalloc(alloc, sizeof(*view), VN_DEFAULT_ALIGN,
|
||||||
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
|
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
|
||||||
@@ -580,7 +598,7 @@ vn_CreateImageView(VkDevice device,
|
|||||||
return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
|
return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||||
|
|
||||||
vn_object_base_init(&view->base, VK_OBJECT_TYPE_IMAGE_VIEW, &dev->base);
|
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);
|
VkImageView view_handle = vn_image_view_to_handle(view);
|
||||||
vn_async_vkCreateImageView(dev->instance, device, pCreateInfo, NULL,
|
vn_async_vkCreateImageView(dev->instance, device, pCreateInfo, NULL,
|
||||||
|
@@ -28,6 +28,10 @@ struct vn_image_create_deferred_info {
|
|||||||
VkImageFormatListCreateInfo list;
|
VkImageFormatListCreateInfo list;
|
||||||
VkImageStencilUsageCreateInfo stencil;
|
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 */
|
/* track whether vn_image_init_deferred succeeds */
|
||||||
bool initialized;
|
bool initialized;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user