Mesa (main): freedreno/a5xx: Try to fix drawing to z/s miplevel/layer offsets.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Nov 4 23:10:01 UTC 2021


Module: Mesa
Branch: main
Commit: b26e0cdf44089e3ccb06e287739e62a07287faf3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b26e0cdf44089e3ccb06e287739e62a07287faf3

Author: Emma Anholt <emma at anholt.net>
Date:   Wed Nov  3 12:27:21 2021 -0700

freedreno/a5xx: Try to fix drawing to z/s miplevel/layer offsets.

Terrifyingly, no testcases are fixed by this.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13668>

---

 src/gallium/drivers/freedreno/a5xx/fd5_gmem.c | 34 +++++++++++++--------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c b/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c
index 6c20f88008d..851c3233261 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c
@@ -54,7 +54,6 @@ emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs,
       enum a3xx_color_swap swap = WZYX;
       bool srgb = false, sint = false, uint = false;
       struct fd_resource *rsc = NULL;
-      struct fdl_slice *slice = NULL;
       uint32_t stride = 0;
       uint32_t size = 0;
       uint32_t base = 0;
@@ -72,7 +71,6 @@ emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs,
 
          rsc = fd_resource(psurf->texture);
 
-         slice = fd_resource_slice(rsc, psurf->u.tex.level);
          format = fd5_pipe2color(pformat);
          swap = fd5_pipe2swap(pformat);
          srgb = util_format_is_srgb(pformat);
@@ -90,7 +88,7 @@ emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs,
             base = gmem->cbuf_base[i];
          } else {
             stride = fd_resource_pitch(rsc, psurf->u.tex.level);
-            size = slice->size0;
+            size = fd_resource_layer_stride(rsc, psurf->u.tex.level);
 
             tile_mode =
                fd_resource_tile_mode(psurf->texture, psurf->u.tex.level);
@@ -147,8 +145,8 @@ emit_zs(struct fd_ringbuffer *ring, struct pipe_surface *zsbuf,
          stride = cpp * gmem->bin_w;
          size = stride * gmem->bin_h;
       } else {
-         stride = fd_resource_pitch(rsc, 0);
-         size = fd_resource_slice(rsc, 0)->size0;
+         stride = fd_resource_pitch(rsc, zsbuf->u.tex.level);
+         size = fd_resource_layer_stride(rsc, zsbuf->u.tex.level);
       }
 
       OUT_PKT4(ring, REG_A5XX_RB_DEPTH_BUFFER_INFO, 5);
@@ -157,7 +155,9 @@ emit_zs(struct fd_ringbuffer *ring, struct pipe_surface *zsbuf,
          OUT_RING(ring, gmem->zsbuf_base[0]); /* RB_DEPTH_BUFFER_BASE_LO */
          OUT_RING(ring, 0x00000000);          /* RB_DEPTH_BUFFER_BASE_HI */
       } else {
-         OUT_RELOC(ring, rsc->bo, 0, 0, 0); /* RB_DEPTH_BUFFER_BASE_LO/HI */
+         OUT_RELOC(ring, rsc->bo,
+            fd_resource_offset(rsc, zsbuf->u.tex.level, zsbuf->u.tex.first_layer),
+            0, 0); /* RB_DEPTH_BUFFER_BASE_LO/HI */
       }
       OUT_RING(ring, A5XX_RB_DEPTH_BUFFER_PITCH(stride));
       OUT_RING(ring, A5XX_RB_DEPTH_BUFFER_ARRAY_PITCH(size));
@@ -193,8 +193,8 @@ emit_zs(struct fd_ringbuffer *ring, struct pipe_surface *zsbuf,
             stride = 1 * gmem->bin_w;
             size = stride * gmem->bin_h;
          } else {
-            stride = fd_resource_pitch(rsc->stencil, 0);
-            size = fd_resource_slice(rsc->stencil, 0)->size0;
+            stride = fd_resource_pitch(rsc->stencil, zsbuf->u.tex.level);
+            size = fd_resource_layer_stride(rsc, zsbuf->u.tex.level);
          }
 
          OUT_PKT4(ring, REG_A5XX_RB_STENCIL_INFO, 5);
@@ -203,8 +203,9 @@ emit_zs(struct fd_ringbuffer *ring, struct pipe_surface *zsbuf,
             OUT_RING(ring, gmem->zsbuf_base[1]); /* RB_STENCIL_BASE_LO */
             OUT_RING(ring, 0x00000000);          /* RB_STENCIL_BASE_HI */
          } else {
-            OUT_RELOC(ring, rsc->stencil->bo, 0, 0,
-                      0); /* RB_STENCIL_BASE_LO/HI */
+            OUT_RELOC(ring, rsc->stencil->bo,
+               fd_resource_offset(rsc->stencil, zsbuf->u.tex.level, zsbuf->u.tex.first_layer),
+                      0, 0); /* RB_STENCIL_BASE_LO/HI */
          }
          OUT_RING(ring, A5XX_RB_STENCIL_PITCH(stride));
          OUT_RING(ring, A5XX_RB_STENCIL_ARRAY_PITCH(size));
@@ -489,7 +490,6 @@ emit_mem2gmem_surf(struct fd_batch *batch, uint32_t base,
       // possibly we want to flip this around gmem2mem and keep depth
       // tiled in sysmem (and fixup sampler state to assume tiled).. this
       // might be required for doing depth/stencil in bypass mode?
-      struct fdl_slice *slice = fd_resource_slice(rsc, 0);
       enum a5xx_color_fmt format =
          fd5_pipe2color(fd_gmem_restore_format(rsc->b.b.format));
 
@@ -498,9 +498,11 @@ emit_mem2gmem_surf(struct fd_batch *batch, uint32_t base,
                A5XX_RB_MRT_BUF_INFO_COLOR_FORMAT(format) |
                   A5XX_RB_MRT_BUF_INFO_COLOR_TILE_MODE(rsc->layout.tile_mode) |
                   A5XX_RB_MRT_BUF_INFO_COLOR_SWAP(WZYX));
-      OUT_RING(ring, A5XX_RB_MRT_PITCH(fd_resource_pitch(rsc, 0)));
-      OUT_RING(ring, A5XX_RB_MRT_ARRAY_PITCH(slice->size0));
-      OUT_RELOC(ring, rsc->bo, 0, 0, 0); /* BASE_LO/HI */
+      OUT_RING(ring, A5XX_RB_MRT_PITCH(fd_resource_pitch(rsc, psurf->u.tex.level)));
+      OUT_RING(ring, A5XX_RB_MRT_ARRAY_PITCH(fd_resource_layer_stride(rsc, psurf->u.tex.level)));
+      OUT_RELOC(ring, rsc->bo,
+         fd_resource_offset(rsc, psurf->u.tex.level, psurf->u.tex.first_layer),
+         0, 0); /* BASE_LO/HI */
 
       buf = BLIT_MRT0;
    }
@@ -614,7 +616,6 @@ emit_gmem2mem_surf(struct fd_batch *batch, uint32_t base,
 {
    struct fd_ringbuffer *ring = batch->gmem;
    struct fd_resource *rsc = fd_resource(psurf->texture);
-   struct fdl_slice *slice;
    bool tiled;
    uint32_t offset, pitch;
 
@@ -624,7 +625,6 @@ emit_gmem2mem_surf(struct fd_batch *batch, uint32_t base,
    if (buf == BLIT_S)
       rsc = rsc->stencil;
 
-   slice = fd_resource_slice(rsc, psurf->u.tex.level);
    offset =
       fd_resource_offset(rsc, psurf->u.tex.level, psurf->u.tex.first_layer);
    pitch = fd_resource_pitch(rsc, psurf->u.tex.level);
@@ -644,7 +644,7 @@ emit_gmem2mem_surf(struct fd_batch *batch, uint32_t base,
                      COND(tiled, A5XX_RB_RESOLVE_CNTL_3_TILED));
    OUT_RELOC(ring, rsc->bo, offset, 0, 0); /* RB_BLIT_DST_LO/HI */
    OUT_RING(ring, A5XX_RB_BLIT_DST_PITCH(pitch));
-   OUT_RING(ring, A5XX_RB_BLIT_DST_ARRAY_PITCH(slice->size0));
+   OUT_RING(ring, A5XX_RB_BLIT_DST_ARRAY_PITCH(fd_resource_layer_stride(rsc, psurf->u.tex.level)));
 
    OUT_PKT4(ring, REG_A5XX_RB_BLIT_CNTL, 1);
    OUT_RING(ring, A5XX_RB_BLIT_CNTL_BUF(buf));



More information about the mesa-commit mailing list