panfrost: Fix multiplanar YUV texture descriptor emission on v9+
authorBoris Brezillon <boris.brezillon@collabora.com>
Wed, 29 Nov 2023 17:53:54 +0000 (18:53 +0100)
committerEric Engestrom <eric@engestrom.ch>
Tue, 5 Dec 2023 14:34:03 +0000 (14:34 +0000)
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: 144f9324a374 ("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 commit 93e9bfcfd512858ccace258f1436bd0485a53b84)

.pick_status.json
src/panfrost/lib/pan_texture.c

index 37bd4428ff1dfebc9ac3af75ded83003684ee1e7..9452d8c40f28717c20c30bbcd55665c5befa566e 100644 (file)
         "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
index 31240832debcb5b254d7f79c33be5d1a38e7e957..66e6a4f5e7c0bbd23b2e4e244802b629f9df3818 100644 (file)
@@ -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) {