Mesa (master): panfrost: Reload depth/stencil when they are read

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Dec 11 10:03:50 UTC 2020


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

Author: Boris Brezillon <boris.brezillon at collabora.com>
Date:   Fri Nov 27 20:51:18 2020 +0100

panfrost: Reload depth/stencil when they are read

Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7922>

---

 src/gallium/drivers/panfrost/pan_cmdstream.c |  6 ++++++
 src/gallium/drivers/panfrost/pan_job.c       | 12 ++++++------
 src/gallium/drivers/panfrost/pan_job.h       |  3 +++
 3 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c
index b72bf291156..996aba903f8 100644
--- a/src/gallium/drivers/panfrost/pan_cmdstream.c
+++ b/src/gallium/drivers/panfrost/pan_cmdstream.c
@@ -604,6 +604,12 @@ panfrost_emit_frag_shader_meta(struct panfrost_batch *batch)
         else
                 batch->draws |= PIPE_CLEAR_COLOR0;
 
+        if (ctx->depth_stencil->base.depth.enabled)
+                batch->read |= PIPE_CLEAR_DEPTH;
+
+        if (ctx->depth_stencil->base.stencil[0].enabled)
+                batch->read |= PIPE_CLEAR_STENCIL;
+
         return xfer.gpu;
 }
 
diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c
index dedf66d11d6..dc5436a5454 100644
--- a/src/gallium/drivers/panfrost/pan_job.c
+++ b/src/gallium/drivers/panfrost/pan_job.c
@@ -893,17 +893,17 @@ panfrost_batch_draw_wallpaper(struct panfrost_batch *batch)
         /* Assume combined. If either depth or stencil is written, they will
          * both be written so we need to be careful for reloading */
 
-        unsigned draws = batch->draws;
+        unsigned reload = batch->draws | batch->read;
 
-        if (draws & PIPE_CLEAR_DEPTHSTENCIL)
-                draws |= PIPE_CLEAR_DEPTHSTENCIL;
+        if (reload & PIPE_CLEAR_DEPTHSTENCIL)
+                reload |= PIPE_CLEAR_DEPTHSTENCIL;
 
         /* Mask of buffers which need reload since they are not cleared and
          * they are drawn. (If they are cleared, reload is useless; if they are
-         * not drawn and also not cleared, we can generally omit the attachment
-         * at the framebuffer descriptor level */
+         * not drawn or read and also not cleared, we can generally omit the
+         * attachment at the framebuffer descriptor level */
 
-        unsigned reload = ~batch->clear & draws;
+        reload &= ~batch->clear;
 
         for (unsigned i = 0; i < batch->key.nr_cbufs; ++i) {
                 if (reload & (PIPE_CLEAR_COLOR0 << i)) 
diff --git a/src/gallium/drivers/panfrost/pan_job.h b/src/gallium/drivers/panfrost/pan_job.h
index 6a905ee062d..bdd9d121471 100644
--- a/src/gallium/drivers/panfrost/pan_job.h
+++ b/src/gallium/drivers/panfrost/pan_job.h
@@ -64,6 +64,9 @@ struct panfrost_batch {
         /* Buffers drawn */
         unsigned draws;
 
+        /* Buffers read */
+        unsigned read;
+
         /* Packed clear values, indexed by both render target as well as word.
          * Essentially, a single pixel is packed, with some padding to bring it
          * up to a 32-bit interval; that pixel is then duplicated over to fill



More information about the mesa-commit mailing list