Mesa (master): panfrost: Rework buffers in SFBD

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Nov 20 07:49:36 UTC 2019


Module: Mesa
Branch: master
Commit: 409f6c40ca524262e5c626996b2fb874c1085595
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=409f6c40ca524262e5c626996b2fb874c1085595

Author: Tomeu Vizoso <tomeu.vizoso at collabora.com>
Date:   Mon Nov 18 09:59:17 2019 +0100

panfrost: Rework buffers in SFBD

Support cases such as depth-only renders and only set stencil buffers
when needed, to match the blob's behaviour.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso at collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>

---

 src/gallium/drivers/panfrost/pan_sfbd.c | 79 ++++++++++++++++-----------------
 1 file changed, 39 insertions(+), 40 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_sfbd.c b/src/gallium/drivers/panfrost/pan_sfbd.c
index 3fe462ee37d..9bbc875d98a 100644
--- a/src/gallium/drivers/panfrost/pan_sfbd.c
+++ b/src/gallium/drivers/panfrost/pan_sfbd.c
@@ -158,43 +158,40 @@ panfrost_sfbd_set_zsbuf(
         struct pipe_surface *surf)
 {
         struct panfrost_resource *rsrc = pan_resource(surf->texture);
+        struct panfrost_context *ctx = pan_context(surf->context);
 
         unsigned level = surf->u.tex.level;
         assert(surf->u.tex.first_layer == 0);
 
-        if (rsrc->layout == PAN_LINEAR) {
-                if (panfrost_is_z24s8_variant(surf->format)) {
+        if (rsrc->layout != PAN_LINEAR)
+                unreachable("Invalid render layout.");
 
-                        fb->depth_buffer = rsrc->bo->gpu + rsrc->slices[level].offset;
-                        fb->depth_stride = rsrc->slices[level].stride;
+        fb->depth_buffer = rsrc->bo->gpu + rsrc->slices[level].offset;
+        fb->depth_stride = rsrc->slices[level].stride;
 
-                        fb->stencil_buffer = rsrc->bo->gpu + rsrc->slices[level].offset;
-                        fb->stencil_stride = rsrc->slices[level].stride;
+        /* No stencil? Job done. */
+        if (!ctx->depth_stencil || !ctx->depth_stencil->stencil[0].enabled)
+                return;
 
-                } else if (surf->format == PIPE_FORMAT_Z32_UNORM ||
-                           surf->format == PIPE_FORMAT_Z32_FLOAT) {
+        if (panfrost_is_z24s8_variant(surf->format)) {
 
-                        fb->depth_buffer = rsrc->bo->gpu + rsrc->slices[level].offset;
-                        fb->depth_stride = rsrc->slices[level].stride;
+                /* Stencil data is interleaved with depth */
+                fb->stencil_buffer = fb->depth_buffer;
+                fb->stencil_stride = fb->depth_stride;
+        } else if (surf->format == PIPE_FORMAT_Z32_UNORM ||
+                   surf->format == PIPE_FORMAT_Z32_FLOAT) {
 
-                } else if (surf->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT) {
+                /* No stencil, nothing to do */
+        } else if (surf->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT) {
 
-                        fb->depth_buffer = rsrc->bo->gpu + rsrc->slices[level].offset;
-                        fb->depth_stride = rsrc->slices[level].stride;
+                /* Stencil data in separate buffer */
+                struct panfrost_resource *stencil = rsrc->separate_stencil;
+                struct panfrost_slice stencil_slice = stencil->slices[level];
 
-                        struct panfrost_resource *stencil = rsrc->separate_stencil;
-                        struct panfrost_slice stencil_slice = stencil->slices[level];
-
-                        fb->stencil_buffer = stencil->bo->gpu + stencil_slice.offset;
-                        fb->stencil_stride = stencil_slice.stride;
-                } else {
-                        fprintf(stderr, "Unsupported depth/stencil format\n");
-                        assert(0);
-                }
-        } else {
-                fprintf(stderr, "Invalid render layout\n");
-                assert(0);
-        }
+                fb->stencil_buffer = stencil->bo->gpu + stencil_slice.offset;
+                fb->stencil_stride = stencil_slice.stride;
+        } else
+                unreachable("Unsupported depth/stencil format.");
 }
 
 /* Creates an SFBD for the FRAGMENT section of the bound framebuffer */
@@ -207,8 +204,22 @@ panfrost_sfbd_fragment(struct panfrost_batch *batch, bool has_draws)
         panfrost_sfbd_clear(batch, &fb);
 
         /* SFBD does not support MRT natively; sanity check */
-        assert(batch->key.nr_cbufs == 1);
-        panfrost_sfbd_set_cbuf(&fb, batch->key.cbufs[0]);
+        assert(batch->key.nr_cbufs <= 1);
+        if (batch->key.nr_cbufs) {
+                struct pipe_surface *surf = batch->key.cbufs[0];
+                struct panfrost_resource *rsrc = pan_resource(surf->texture);
+                struct panfrost_bo *bo = rsrc->bo;
+
+                panfrost_sfbd_set_cbuf(&fb, surf);
+
+                if (rsrc->checksummed) {
+                        unsigned level = surf->u.tex.level;
+                        struct panfrost_slice *slice = &rsrc->slices[level];
+
+                        fb.checksum_stride = slice->checksum_stride;
+                        fb.checksum = bo->gpu + slice->checksum_offset;
+                }
+        }
 
         if (batch->key.zsbuf)
                 panfrost_sfbd_set_zsbuf(&fb, batch->key.zsbuf);
@@ -218,17 +229,5 @@ panfrost_sfbd_fragment(struct panfrost_batch *batch, bool has_draws)
                 fb.format.unk2 |= MALI_SFBD_FORMAT_MSAA_B;
         }
 
-        struct pipe_surface *surf = batch->key.cbufs[0];
-        struct panfrost_resource *rsrc = pan_resource(surf->texture);
-        struct panfrost_bo *bo = rsrc->bo;
-
-        if (rsrc->checksummed) {
-                unsigned level = surf->u.tex.level;
-                struct panfrost_slice *slice = &rsrc->slices[level];
-
-                fb.checksum_stride = slice->checksum_stride;
-                fb.checksum = bo->gpu + slice->checksum_offset;
-        }
-
         return panfrost_upload_transient(batch, &fb, sizeof(fb)) | MALI_SFBD;
 }




More information about the mesa-commit mailing list