mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 21:50:12 +01:00
anv: support multi-planar format in add_all_surfaces_explicit_layout
Add initial multi-planar format support on the images with modifiers: - With aux usage, - Format plane count must be 1. - Memory plane count must be 2. - Without aux usage, - Each format plane must map to a distinct memory plane. For the other cases, currently there is no way to properly map memory planes to format planes and aux planes due to the lack of defined ABI for external multi-planar images. This patch doesn't include some potentially supported cases like all format planes mapping to a single memory plane, additional refactoring is needed to workaround explicit base offset + ANV_OFFSET_IMPLICIT. Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org> Reviewed-by: Chad Versace <chad@kiwitree.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11281>
This commit is contained in:
parent
345a4e9871
commit
ec70092d55
1 changed files with 55 additions and 43 deletions
|
|
@ -1087,8 +1087,8 @@ add_all_surfaces_explicit_layout(
|
|||
{
|
||||
const struct intel_device_info *devinfo = &device->info;
|
||||
const uint32_t mod_plane_count = drm_info->drmFormatModifierPlaneCount;
|
||||
const struct isl_drm_modifier_info *isl_mod_info =
|
||||
isl_drm_modifier_get_info(drm_info->drmFormatModifier);
|
||||
const bool mod_has_aux =
|
||||
isl_drm_modifier_has_aux(drm_info->drmFormatModifier);
|
||||
VkResult result;
|
||||
|
||||
/* About valid usage in the Vulkan spec:
|
||||
|
|
@ -1102,20 +1102,27 @@ add_all_surfaces_explicit_layout(
|
|||
* Most validation of plane layout occurs in add_surface().
|
||||
*/
|
||||
|
||||
/* We support a restricted set of images with modifiers. */
|
||||
assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
assert(image->n_planes == 1);
|
||||
|
||||
if (isl_mod_info->aux_usage == ISL_AUX_USAGE_NONE)
|
||||
assert(mod_plane_count == 1);
|
||||
/* We support a restricted set of images with modifiers.
|
||||
*
|
||||
* With aux usage,
|
||||
* - Format plane count must be 1.
|
||||
* - Memory plane count must be 2.
|
||||
* Without aux usage,
|
||||
* - Each format plane must map to a distint memory plane.
|
||||
*
|
||||
* For the other cases, currently there is no way to properly map memory
|
||||
* planes to format planes and aux planes due to the lack of defined ABI
|
||||
* for external multi-planar images.
|
||||
*/
|
||||
if (image->n_planes == 1)
|
||||
assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
else
|
||||
assert(mod_plane_count == 2);
|
||||
assert(!(image->aspects & ~VK_IMAGE_ASPECT_PLANES_BITS_ANV));
|
||||
|
||||
const uint32_t plane = anv_image_aspect_to_plane(image->aspects,
|
||||
VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
const struct anv_format_plane format_plane =
|
||||
anv_get_format_plane(devinfo, image->vk_format, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
image->tiling);
|
||||
if (mod_has_aux)
|
||||
assert(image->n_planes == 1 && mod_plane_count == 2);
|
||||
else
|
||||
assert(image->n_planes == mod_plane_count);
|
||||
|
||||
/* Reject special values in the app-provided plane layouts. */
|
||||
for (uint32_t i = 0; i < mod_plane_count; ++i) {
|
||||
|
|
@ -1135,39 +1142,44 @@ add_all_surfaces_explicit_layout(
|
|||
}
|
||||
}
|
||||
|
||||
const VkSubresourceLayout *primary_layout = &drm_info->pPlaneLayouts[0];
|
||||
result = add_primary_surface(device, image, plane,
|
||||
format_plane,
|
||||
primary_layout->offset,
|
||||
primary_layout->rowPitch,
|
||||
isl_tiling_flags,
|
||||
isl_extra_usage_flags);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
u_foreach_bit(b, image->aspects) {
|
||||
const VkImageAspectFlagBits aspect = 1 << b;
|
||||
const uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect);
|
||||
const struct anv_format_plane format_plane =
|
||||
anv_get_format_plane(devinfo, image->vk_format, aspect, image->tiling);
|
||||
const VkSubresourceLayout *primary_layout = &drm_info->pPlaneLayouts[plane];
|
||||
|
||||
if (isl_mod_info->aux_usage == ISL_AUX_USAGE_NONE) {
|
||||
/* Even though the modifier does not support aux, try to create
|
||||
* a driver-private aux to improve performance.
|
||||
*/
|
||||
result = add_aux_surface_if_supported(device, image, plane,
|
||||
format_plane,
|
||||
format_list_info,
|
||||
ANV_OFFSET_IMPLICIT, 0,
|
||||
isl_extra_usage_flags);
|
||||
result = add_primary_surface(device, image, plane,
|
||||
format_plane,
|
||||
primary_layout->offset,
|
||||
primary_layout->rowPitch,
|
||||
isl_tiling_flags,
|
||||
isl_extra_usage_flags);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
} else {
|
||||
assert(mod_plane_count == 2);
|
||||
|
||||
const VkSubresourceLayout *aux_layout = &drm_info->pPlaneLayouts[1];
|
||||
result = add_aux_surface_if_supported(device, image, plane,
|
||||
format_plane,
|
||||
format_list_info,
|
||||
aux_layout->offset,
|
||||
aux_layout->rowPitch,
|
||||
isl_extra_usage_flags);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
if (!mod_has_aux) {
|
||||
/* Even though the modifier does not support aux, try to create
|
||||
* a driver-private aux to improve performance.
|
||||
*/
|
||||
result = add_aux_surface_if_supported(device, image, plane,
|
||||
format_plane,
|
||||
format_list_info,
|
||||
ANV_OFFSET_IMPLICIT, 0,
|
||||
isl_extra_usage_flags);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
} else {
|
||||
const VkSubresourceLayout *aux_layout = &drm_info->pPlaneLayouts[1];
|
||||
result = add_aux_surface_if_supported(device, image, plane,
|
||||
format_plane,
|
||||
format_list_info,
|
||||
aux_layout->offset,
|
||||
aux_layout->rowPitch,
|
||||
isl_extra_usage_flags);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return VK_SUCCESS;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue