panfrost: Fix multiplanar YUV texture descriptor emission on v9+
Multiplanar YUV textures require two surface descriptors, and the base address calculation should be moved inside the for loop, otherwise we always take the base address of the first plane. Fixes:144f9324a3
("panfrost: prepare v9+ to support YUV sampling") Cc: stable Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26425> (cherry picked from commit93e9bfcfd5
)
This commit is contained in:

committed by
Eric Engestrom

parent
d6711f9e2d
commit
ae6c9315a8
@@ -514,7 +514,7 @@
|
||||
"description": "panfrost: Fix multiplanar YUV texture descriptor emission on v9+",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": "144f9324a3747748191513c0a1a596171f193a82",
|
||||
"notes": null
|
||||
|
@@ -540,15 +540,8 @@ panfrost_emit_surface(const struct pan_image_view *iview, unsigned level,
|
||||
unsigned layer, unsigned face, unsigned sample,
|
||||
enum pipe_format format, void **payload)
|
||||
{
|
||||
const struct pan_image *base_image = pan_image_view_get_plane(iview, 0);
|
||||
ASSERTED const struct util_format_description *desc =
|
||||
util_format_description(format);
|
||||
mali_ptr base = base_image->data.bo->ptr.gpu + base_image->data.offset;
|
||||
|
||||
if (iview->buf.size) {
|
||||
assert(iview->dim == MALI_TEXTURE_DIMENSION_1D);
|
||||
base += iview->buf.offset;
|
||||
}
|
||||
|
||||
const struct pan_image_layout *layouts[MAX_IMAGE_PLANES] = {0};
|
||||
mali_ptr plane_ptrs[MAX_IMAGE_PLANES] = {0};
|
||||
@@ -556,12 +549,21 @@ panfrost_emit_surface(const struct pan_image_view *iview, unsigned level,
|
||||
int32_t surface_strides[MAX_IMAGE_PLANES] = {0};
|
||||
|
||||
for (int i = 0; i < MAX_IMAGE_PLANES; i++) {
|
||||
if (!pan_image_view_get_plane(iview, i)) {
|
||||
const struct pan_image *base_image = pan_image_view_get_plane(iview, i);
|
||||
|
||||
if (!base_image) {
|
||||
/* Every texture should have at least one plane. */
|
||||
assert(i > 0);
|
||||
break;
|
||||
}
|
||||
|
||||
mali_ptr base = base_image->data.bo->ptr.gpu + base_image->data.offset;
|
||||
|
||||
if (iview->buf.size) {
|
||||
assert(iview->dim == MALI_TEXTURE_DIMENSION_1D);
|
||||
base += iview->buf.offset;
|
||||
}
|
||||
|
||||
layouts[i] = &pan_image_view_get_plane(iview, i)->layout;
|
||||
|
||||
/* v4 does not support compression */
|
||||
@@ -742,6 +744,11 @@ GENX(panfrost_new_texture)(const struct panfrost_device *dev,
|
||||
array_size /= 6;
|
||||
}
|
||||
|
||||
/* Multiplanar YUV textures require 2 surface descriptors. */
|
||||
if (panfrost_is_yuv(desc->layout) && PAN_ARCH >= 9 &&
|
||||
pan_image_view_get_plane(iview, 1) != NULL)
|
||||
array_size *= 2;
|
||||
|
||||
unsigned width;
|
||||
|
||||
if (iview->buf.size) {
|
||||
|
Reference in New Issue
Block a user