panfrost: Only tag AFBC addresses when sampling
authorTomeu Vizoso <tomeu.vizoso@collabora.com>
Fri, 28 Jun 2019 07:17:55 +0000 (09:17 +0200)
committerTomeu Vizoso <tomeu.vizoso@collabora.com>
Fri, 28 Jun 2019 13:40:52 +0000 (15:40 +0200)
Rendering to AFBC was broken, as the HW will complaint loudly if we pass
a tagged pointer in bifrost_render_target.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Fixes: 3609b50a6443 ("panfrost: Merge AFBC slab with BO backing")
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/pan_context.c
src/gallium/drivers/panfrost/pan_resource.c

index 967d7116c249fc6260f150336230c8507d9f6110..be800ca6ce1cc74a063370e887bb7c6b1a780d2e 100644 (file)
@@ -834,6 +834,11 @@ panfrost_upload_tex(
         unsigned first_layer = pview->u.tex.first_layer;
         unsigned last_layer = pview->u.tex.last_layer;
 
+        /* Lower-bit is set when sampling from colour AFBC */
+        bool is_afbc = rsrc->bo->layout == PAN_AFBC;
+        bool is_zs = rsrc->base.bind & PIPE_BIND_DEPTH_STENCIL;
+        unsigned afbc_bit = (is_afbc && !is_zs) ? 1 : 0;
+
         /* Inject the addresses in, interleaving mip levels, cube faces, and
          * strides in that order */
 
@@ -841,8 +846,9 @@ panfrost_upload_tex(
 
         for (unsigned l = first_level; l <= last_level; ++l) {
                 for (unsigned f = first_layer; f <= last_layer; ++f) {
+
                         view->hw.payload[idx++] =
-                                panfrost_get_texture_address(rsrc, l, f);
+                                panfrost_get_texture_address(rsrc, l, f) + afbc_bit;
 
                         if (has_manual_stride) {
                                 view->hw.payload[idx++] =
index c5bda809320621a63d371f2907e53ff66436776e..8db7e45af1b619030084ff349410d6456c510eef 100644 (file)
@@ -756,12 +756,7 @@ panfrost_get_texture_address(
         unsigned level_offset = rsrc->bo->slices[level].offset;
         unsigned face_offset = face * rsrc->bo->cubemap_stride;
 
-        /* Lower-bit is set when sampling from colour AFBC */
-        bool is_afbc = rsrc->bo->layout == PAN_AFBC;
-        bool is_zs = rsrc->base.bind & PIPE_BIND_DEPTH_STENCIL;
-        unsigned afbc_bit = (is_afbc && !is_zs) ? 1 : 0;
-
-        return rsrc->bo->gpu + level_offset + face_offset + afbc_bit;
+        return rsrc->bo->gpu + level_offset + face_offset;
 }
 
 static void