Mesa (main): panfrost: Add helpers to set batch masks

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 7 15:24:28 UTC 2022


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

Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date:   Thu Apr  7 10:40:44 2022 -0400

panfrost: Add helpers to set batch masks

This logic is not device specific and will be used for both Bifrost and Valhall.

Signed-off-by: Alyssa Rosenzweig <alyssa at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15795>

---

 src/gallium/drivers/panfrost/pan_context.h |  6 ++++
 src/gallium/drivers/panfrost/pan_helpers.c | 50 ++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+)

diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
index 4f58e4456a1..db3d8bff117 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -418,4 +418,10 @@ panfrost_clean_state_3d(struct panfrost_context *ctx)
         }
 }
 
+void
+panfrost_set_batch_masks_blend(struct panfrost_batch *batch);
+
+void
+panfrost_set_batch_masks_zs(struct panfrost_batch *batch);
+
 #endif
diff --git a/src/gallium/drivers/panfrost/pan_helpers.c b/src/gallium/drivers/panfrost/pan_helpers.c
index 69331d06795..90fc64058eb 100644
--- a/src/gallium/drivers/panfrost/pan_helpers.c
+++ b/src/gallium/drivers/panfrost/pan_helpers.c
@@ -169,3 +169,53 @@ pan_assign_vertex_buffer(struct pan_vertex_buffer *buffers,
         return idx;
 }
 
+/*
+ * Helper to add a PIPE_CLEAR_* to batch->draws and batch->resolve together,
+ * meaning that we draw to a given target. Adding to only one mask does not
+ * generally make sense, except for clears which add to batch->clear and
+ * batch->resolve together.
+ */
+static void
+panfrost_draw_target(struct panfrost_batch *batch, unsigned target)
+{
+        batch->draws |= target;
+        batch->resolve |= target;
+}
+
+/*
+ * Draw time helper to set batch->{read, draws, resolve} based on current blend
+ * and depth-stencil state. To be called when blend or depth/stencil dirty state
+ * respectively changes.
+ */
+void
+panfrost_set_batch_masks_blend(struct panfrost_batch *batch)
+{
+        struct panfrost_context *ctx = batch->ctx;
+        struct panfrost_blend_state *blend = ctx->blend;
+
+        for (unsigned i = 0; i < batch->key.nr_cbufs; ++i) {
+                if (!blend->info[i].no_colour && batch->key.cbufs[i])
+                        panfrost_draw_target(batch, PIPE_CLEAR_COLOR0 << i);
+        }
+}
+
+void
+panfrost_set_batch_masks_zs(struct panfrost_batch *batch)
+{
+        struct panfrost_context *ctx = batch->ctx;
+        struct pipe_depth_stencil_alpha_state *zsa = (void *) ctx->depth_stencil;
+
+        /* Assume depth is read (TODO: perf) */
+        if (zsa->depth_enabled)
+                batch->read |= PIPE_CLEAR_DEPTH;
+
+        if (zsa->depth_writemask)
+                panfrost_draw_target(batch, PIPE_CLEAR_DEPTH);
+
+        if (zsa->stencil[0].enabled) {
+                panfrost_draw_target(batch, PIPE_CLEAR_STENCIL);
+
+                /* Assume stencil is read (TODO: perf) */
+                batch->read |= PIPE_CLEAR_STENCIL;
+        }
+}



More information about the mesa-commit mailing list