anv/android: Fix importing hardware buffers with planar formats

Currently, we try to fetch the color aspect of the format and convert that
to an ISL format, which is then used to convert the pixel stride to bytes.
This does not work with planar formats because they don't have a color
aspect, and the planes can be of different sizes anyway, so may not have
the same byte stride. Change to calculate the stride individually for each
plane.

Signed-off-by: Chris Spencer <spencercw@gmail.com>
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24388>
This commit is contained in:
Chris Spencer
2023-07-30 09:20:52 +01:00
committed by Marge Bot
parent 203b4054f3
commit 35fddccf3f
3 changed files with 18 additions and 32 deletions
+1 -7
View File
@@ -369,13 +369,7 @@ anv_image_init_from_gralloc(struct anv_device *device,
}
anv_info.isl_tiling_flags = 1u << tiling;
enum isl_format format = anv_get_isl_format(device->info,
base_info->format,
VK_IMAGE_ASPECT_COLOR_BIT,
base_info->tiling);
assert(format != ISL_FORMAT_UNSUPPORTED);
anv_info.stride = gralloc_info->stride * (isl_format_get_layout(format)->bpb / 8);
anv_info.stride = gralloc_info->stride;
result = anv_image_init(device, image, &anv_info);
if (result != VK_SUCCESS)
+16 -24
View File
@@ -1132,19 +1132,31 @@ add_all_surfaces_implicit_layout(
const struct intel_device_info *devinfo = device->info;
VkResult result;
const struct vk_format_ycbcr_info *ycbcr_info =
vk_format_get_ycbcr_info(image->vk.format);
if (ycbcr_info)
assert(ycbcr_info->n_planes == image->n_planes);
u_foreach_bit(b, image->vk.aspects) {
VkImageAspectFlagBits aspect = 1 << b;
const uint32_t plane = anv_image_aspect_to_plane(image, aspect);
const struct anv_format_plane plane_format =
anv_get_format_plane(devinfo, image->vk.format, plane, image->vk.tiling);
enum isl_format isl_fmt = plane_format.isl_format;
assert(isl_fmt != ISL_FORMAT_UNSUPPORTED);
uint32_t plane_stride = stride * isl_format_get_layout(isl_fmt)->bpb / 8;
if (ycbcr_info)
plane_stride /= ycbcr_info->planes[plane].denominator_scales[0];
VkImageUsageFlags vk_usage = vk_image_usage(&image->vk, aspect);
isl_surf_usage_flags_t isl_usage =
choose_isl_surf_usage(image->vk.create_flags, vk_usage,
isl_extra_usage_flags, aspect);
result = add_primary_surface(device, image, plane, plane_format,
ANV_OFFSET_IMPLICIT, stride,
ANV_OFFSET_IMPLICIT, plane_stride,
isl_tiling_flags, isl_usage);
if (result != VK_SUCCESS)
return result;
@@ -1156,7 +1168,7 @@ add_all_surfaces_implicit_layout(
result = add_aux_surface_if_supported(device, image, plane, plane_format,
format_list_info,
ANV_OFFSET_IMPLICIT, stride,
ANV_OFFSET_IMPLICIT, plane_stride,
isl_extra_usage_flags);
if (result != VK_SUCCESS)
return result;
@@ -1618,28 +1630,11 @@ resolve_ahw_image(struct anv_device *device,
enum isl_tiling tiling;
result = anv_device_get_bo_tiling(device, mem->bo, &tiling);
assert(result == VK_SUCCESS);
VkImageTiling vk_tiling =
tiling == ISL_TILING_LINEAR ? VK_IMAGE_TILING_LINEAR :
VK_IMAGE_TILING_OPTIMAL;
isl_tiling_flags_t isl_tiling_flags = (1u << tiling);
/* Check format. */
VkFormat vk_format = vk_format_from_android(desc.format, desc.usage);
enum isl_format isl_fmt = anv_get_isl_format(device->info,
vk_format,
VK_IMAGE_ASPECT_COLOR_BIT,
vk_tiling);
assert(isl_fmt != ISL_FORMAT_UNSUPPORTED);
/* Handle RGB(X)->RGBA fallback. */
switch (desc.format) {
case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:
if (isl_format_is_rgb(isl_fmt))
isl_fmt = isl_format_rgb_to_rgba(isl_fmt);
break;
}
assert(vk_format != VK_FORMAT_UNDEFINED);
/* Now we are able to fill anv_image fields properly and create
* isl_surface for it.
@@ -1647,10 +1642,7 @@ resolve_ahw_image(struct anv_device *device,
vk_image_set_format(&image->vk, vk_format);
image->n_planes = anv_get_format_planes(image->vk.format);
uint32_t stride = desc.stride *
(isl_format_get_layout(isl_fmt)->bpb / 8);
result = add_all_surfaces_implicit_layout(device, image, NULL, stride,
result = add_all_surfaces_implicit_layout(device, image, NULL, desc.stride,
isl_tiling_flags,
ISL_SURF_USAGE_DISABLE_AUX_BIT);
assert(result == VK_SUCCESS);
+1 -1
View File
@@ -4456,7 +4456,7 @@ struct anv_image_create_info {
/** These flags will be added to any derived from VkImageCreateInfo. */
isl_surf_usage_flags_t isl_extra_usage_flags;
/** An opt-in stride, should be 0 for implicit layouts */
/** An opt-in stride in pixels, should be 0 for implicit layouts */
uint32_t stride;
/** Whether to allocate private binding */