diff --git a/src/intel/vulkan/anv_android.c b/src/intel/vulkan/anv_android.c index dedca480e48..76954d0304c 100644 --- a/src/intel/vulkan/anv_android.c +++ b/src/intel/vulkan/anv_android.c @@ -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) diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 0c42716d3e8..148e7204499 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -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); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index b9cc13f2191..180d1a2ddd8 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -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 */