Mesa (main): panfrost: Wire up transfrom feedback sysvals

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jun 4 15:11:11 UTC 2022


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

Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date:   Fri Apr  1 17:22:05 2022 -0400

panfrost: Wire up transfrom feedback sysvals

Wire the Gallium interface for transform feedback up to the system values that
will be fed into our lowering code. This is based on our existing transform
feedback implementation for Midgard.

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

---

 src/gallium/drivers/panfrost/pan_cmdstream.c | 47 ++++++++++++++++++++++++----
 src/gallium/drivers/panfrost/pan_context.c   |  1 +
 src/gallium/drivers/panfrost/pan_context.h   |  1 +
 src/gallium/drivers/panfrost/pan_helpers.c   |  5 +++
 src/panfrost/util/pan_ir.h                   |  2 ++
 5 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c
index 3f6dd1cdcdb..2def313f71c 100644
--- a/src/gallium/drivers/panfrost/pan_cmdstream.c
+++ b/src/gallium/drivers/panfrost/pan_cmdstream.c
@@ -1253,6 +1253,12 @@ panfrost_upload_rt_conversion_sysval(struct panfrost_batch *batch,
 }
 #endif
 
+static unsigned
+panfrost_xfb_offset(unsigned stride, struct pipe_stream_output_target *target)
+{
+        return target->buffer_offset + (pan_so_target(target)->offset * stride);
+}
+
 static void
 panfrost_upload_sysvals(struct panfrost_batch *batch,
                         const struct panfrost_ptr *ptr,
@@ -1283,6 +1289,40 @@ panfrost_upload_sysvals(struct panfrost_batch *batch,
                                                     PAN_SYSVAL_ID(sysval),
                                                     &uniforms[i]);
                         break;
+
+                case PAN_SYSVAL_XFB:
+                {
+                        unsigned buf = PAN_SYSVAL_ID(sysval);
+                        struct panfrost_shader_state *vs =
+                                panfrost_get_shader_state(batch->ctx, PIPE_SHADER_VERTEX);
+                        struct pipe_stream_output_info *so = &vs->stream_output;
+                        unsigned stride = so->stride[buf] * 4;
+
+                        if (buf >= batch->ctx->streamout.num_targets) {
+                                /* Memory sink */
+                                uniforms[i].du[0] = 0x8ull << 60;
+                                break;
+                        }
+
+                        struct pipe_stream_output_target *target = batch->ctx->streamout.targets[buf];
+                        assert(target != NULL);
+
+                        struct panfrost_resource *rsrc = pan_resource(target->buffer);
+                        unsigned offset = panfrost_xfb_offset(stride, target);
+
+                        util_range_add(&rsrc->base, &rsrc->valid_buffer_range,
+                                offset, target->buffer_size - offset);
+
+                        panfrost_batch_write_rsrc(batch, rsrc, PIPE_SHADER_VERTEX);
+
+                        uniforms[i].du[0] = rsrc->image.data.bo->ptr.gpu + offset;
+                        break;
+                }
+
+                case PAN_SYSVAL_NUM_VERTICES:
+                        uniforms[i].u[0] = batch->ctx->vertex_count;
+                        break;
+
                 case PAN_SYSVAL_NUM_WORK_GROUPS:
                         for (unsigned j = 0; j < 3; j++) {
                                 batch->num_wg_sysval[j] =
@@ -2175,12 +2215,6 @@ panfrost_emit_varyings(struct panfrost_batch *batch,
         return ptr;
 }
 
-static unsigned
-panfrost_xfb_offset(unsigned stride, struct pipe_stream_output_target *target)
-{
-        return target->buffer_offset + (pan_so_target(target)->offset * stride);
-}
-
 static void
 panfrost_emit_streamout(struct panfrost_batch *batch,
                         struct mali_attribute_buffer_packed *slot,
@@ -2828,6 +2862,7 @@ panfrost_statistics_record(
                 return;
 
         ctx->tf_prims_generated += prims;
+        ctx->dirty |= PAN_DIRTY_SO;
 }
 
 static void
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index 4be9a2d6812..3efc48294d6 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -1047,6 +1047,7 @@ panfrost_set_stream_output_targets(struct pipe_context *pctx,
                 pipe_so_target_reference(&so->targets[i], NULL);
 
         so->num_targets = num_targets;
+        ctx->dirty |= PAN_DIRTY_SO;
 }
 
 struct pipe_context *
diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
index 6d482911e10..415ba5f28ed 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -71,6 +71,7 @@ enum pan_dirty_3d {
         PAN_DIRTY_OQ             = BITFIELD_BIT(9),
         PAN_DIRTY_RASTERIZER     = BITFIELD_BIT(10),
         PAN_DIRTY_POINTS         = BITFIELD_BIT(11),
+        PAN_DIRTY_SO             = BITFIELD_BIT(12),
 };
 
 enum pan_dirty_shader {
diff --git a/src/gallium/drivers/panfrost/pan_helpers.c b/src/gallium/drivers/panfrost/pan_helpers.c
index e9a02125109..e428aa43553 100644
--- a/src/gallium/drivers/panfrost/pan_helpers.c
+++ b/src/gallium/drivers/panfrost/pan_helpers.c
@@ -45,6 +45,10 @@ panfrost_analyze_sysvals(struct panfrost_shader_state *ss)
                         dirty_shader |= PAN_DIRTY_STAGE_SSBO;
                         break;
 
+                case PAN_SYSVAL_XFB:
+                        dirty |= PAN_DIRTY_SO;
+                        break;
+
                 case PAN_SYSVAL_SAMPLER:
                         dirty_shader |= PAN_DIRTY_STAGE_SAMPLER;
                         break;
@@ -57,6 +61,7 @@ panfrost_analyze_sysvals(struct panfrost_shader_state *ss)
                 case PAN_SYSVAL_LOCAL_GROUP_SIZE:
                 case PAN_SYSVAL_WORK_DIM:
                 case PAN_SYSVAL_VERTEX_INSTANCE_OFFSETS:
+                case PAN_SYSVAL_NUM_VERTICES:
                         dirty |= PAN_DIRTY_PARAMS;
                         break;
 
diff --git a/src/panfrost/util/pan_ir.h b/src/panfrost/util/pan_ir.h
index c6a0d191dee..5a910c7cdd4 100644
--- a/src/panfrost/util/pan_ir.h
+++ b/src/panfrost/util/pan_ir.h
@@ -107,6 +107,8 @@ enum {
         PAN_SYSVAL_VERTEX_INSTANCE_OFFSETS = 14,
         PAN_SYSVAL_DRAWID = 15,
         PAN_SYSVAL_BLEND_CONSTANTS = 16,
+        PAN_SYSVAL_XFB = 17,
+        PAN_SYSVAL_NUM_VERTICES = 18,
 };
 
 #define PAN_TXS_SYSVAL_ID(texidx, dim, is_array)          \



More information about the mesa-commit mailing list