Mesa (master): gallium/tgsi_exec: Simplify GS output vertex count tracking.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jan 5 10:22:50 UTC 2021


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

Author: Eric Anholt <eric at anholt.net>
Date:   Tue Dec 22 13:02:20 2020 -0800

gallium/tgsi_exec: Simplify GS output vertex count tracking.

We had this strange 5-dword-per-stream storage for the single dword
current vertex count, due to copy and paste.  We can make much cleaner
code by just having a 4-element array in the machine.

Reviewed-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8283>

---

 src/gallium/auxiliary/draw/draw_gs.c   | 26 ++-----------------
 src/gallium/auxiliary/tgsi/tgsi_exec.c | 46 +++++++++-------------------------
 src/gallium/auxiliary/tgsi/tgsi_exec.h | 21 ++++++----------
 3 files changed, 21 insertions(+), 72 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c
index 3e087b9c923..940e3b1d4b6 100644
--- a/src/gallium/auxiliary/draw/draw_gs.c
+++ b/src/gallium/auxiliary/draw/draw_gs.c
@@ -218,30 +218,8 @@ static void tgsi_gs_run(struct draw_geometry_shader *shader,
    /* run interpreter */
    tgsi_exec_machine_run(machine, 0);
 
-   for (i = 0; i < 4; i++) {
-      int prim_i;
-      int prim_c;
-      switch (i) {
-      case 0:
-         prim_i = TGSI_EXEC_TEMP_PRIMITIVE_I;
-         prim_c = TGSI_EXEC_TEMP_PRIMITIVE_C;
-         break;
-      case 1:
-         prim_i = TGSI_EXEC_TEMP_PRIMITIVE_S1_I;
-         prim_c = TGSI_EXEC_TEMP_PRIMITIVE_S1_C;
-         break;
-      case 2:
-         prim_i = TGSI_EXEC_TEMP_PRIMITIVE_S2_I;
-         prim_c = TGSI_EXEC_TEMP_PRIMITIVE_S2_C;
-         break;
-      case 3:
-         prim_i = TGSI_EXEC_TEMP_PRIMITIVE_S3_I;
-         prim_c = TGSI_EXEC_TEMP_PRIMITIVE_S3_C;
-         break;
-      };
-
-      out_prims[i] = machine->Temps[prim_i].xyzw[prim_c].u[0];
-   }
+   for (i = 0; i < 4; i++)
+      out_prims[i] = machine->OutputPrimCount[i];
 }
 
 #ifdef LLVM_AVAILABLE
diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index 9237aa303de..1db19914451 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -976,26 +976,6 @@ enum tgsi_exec_datatype {
  */
 #define TEMP_KILMASK_I     TGSI_EXEC_TEMP_KILMASK_I
 #define TEMP_KILMASK_C     TGSI_EXEC_TEMP_KILMASK_C
-#define TEMP_OUTPUT_I      TGSI_EXEC_TEMP_OUTPUT_I
-#define TEMP_OUTPUT_C      TGSI_EXEC_TEMP_OUTPUT_C
-#define TEMP_PRIMITIVE_I   TGSI_EXEC_TEMP_PRIMITIVE_I
-#define TEMP_PRIMITIVE_C   TGSI_EXEC_TEMP_PRIMITIVE_C
-#define TEMP_PRIMITIVE_S1_I   TGSI_EXEC_TEMP_PRIMITIVE_S1_I
-#define TEMP_PRIMITIVE_S1_C   TGSI_EXEC_TEMP_PRIMITIVE_S1_C
-#define TEMP_PRIMITIVE_S2_I   TGSI_EXEC_TEMP_PRIMITIVE_S2_I
-#define TEMP_PRIMITIVE_S2_C   TGSI_EXEC_TEMP_PRIMITIVE_S2_C
-#define TEMP_PRIMITIVE_S3_I   TGSI_EXEC_TEMP_PRIMITIVE_S3_I
-#define TEMP_PRIMITIVE_S3_C   TGSI_EXEC_TEMP_PRIMITIVE_S3_C
-
-static const struct {
-   int idx;
-   int chan;
-} temp_prim_idxs[] = {
-   { TEMP_PRIMITIVE_I, TEMP_PRIMITIVE_C },
-   { TEMP_PRIMITIVE_S1_I, TEMP_PRIMITIVE_S1_C },
-   { TEMP_PRIMITIVE_S2_I, TEMP_PRIMITIVE_S2_C },
-   { TEMP_PRIMITIVE_S3_I, TEMP_PRIMITIVE_S3_C },
-};
 
 /** The execution mask depends on the conditional mask and the loop mask */
 #define UPDATE_EXEC_MASK(MACH) \
@@ -1889,8 +1869,7 @@ store_dest_dstret(struct tgsi_exec_machine *mach,
       break;
 
    case TGSI_FILE_OUTPUT:
-      index = mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0]
-         + reg->Register.Index;
+      index = mach->OutputVertexOffset + reg->Register.Index;
       dst = &mach->Outputs[offset + index].xyzw[chan_index];
 #if 0
       debug_printf("NumOutputs = %d, TEMP_O_C/I = %d, redindex = %d\n",
@@ -2049,7 +2028,7 @@ emit_vertex(struct tgsi_exec_machine *mach,
 {
    union tgsi_exec_channel r[1];
    unsigned stream_id;
-   unsigned *prim_count;
+   unsigned prim_count;
    /* FIXME: check for exec mask correctly
    unsigned i;
    for (i = 0; i < TGSI_QUAD_SIZE; ++i) {
@@ -2057,15 +2036,15 @@ emit_vertex(struct tgsi_exec_machine *mach,
    */
    IFETCH(&r[0], 0, TGSI_CHAN_X);
    stream_id = r[0].u[0];
-   prim_count = &mach->Temps[temp_prim_idxs[stream_id].idx].xyzw[temp_prim_idxs[stream_id].chan].u[0];
+   prim_count = mach->OutputPrimCount[stream_id];
    if (mach->ExecMask) {
-      if (mach->Primitives[stream_id][*prim_count] >= mach->MaxOutputVertices)
+      if (mach->Primitives[stream_id][prim_count] >= mach->MaxOutputVertices)
          return;
 
-      if (mach->Primitives[stream_id][*prim_count] == 0)
-         mach->PrimitiveOffsets[stream_id][*prim_count] = mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0];
-      mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0] += mach->NumOutputs;
-      mach->Primitives[stream_id][*prim_count]++;
+      if (mach->Primitives[stream_id][prim_count] == 0)
+         mach->PrimitiveOffsets[stream_id][prim_count] = mach->OutputVertexOffset;
+      mach->OutputVertexOffset += mach->NumOutputs;
+      mach->Primitives[stream_id][prim_count]++;
    }
 }
 
@@ -2085,7 +2064,7 @@ emit_primitive(struct tgsi_exec_machine *mach,
       IFETCH(&r[0], 0, TGSI_CHAN_X);
       stream_id = r[0].u[0];
    }
-   prim_count = &mach->Temps[temp_prim_idxs[stream_id].idx].xyzw[temp_prim_idxs[stream_id].chan].u[0];
+   prim_count = &mach->OutputPrimCount[stream_id];
    if (mach->ExecMask) {
       ++(*prim_count);
       debug_assert((*prim_count * mach->NumOutputs) < mach->MaxGeometryShaderOutputs);
@@ -2097,8 +2076,7 @@ static void
 conditional_emit_primitive(struct tgsi_exec_machine *mach)
 {
    if (PIPE_SHADER_GEOMETRY == mach->ShaderType) {
-      int emitted_verts =
-         mach->Primitives[0][mach->Temps[temp_prim_idxs[0].idx].xyzw[temp_prim_idxs[0].chan].u[0]];
+      int emitted_verts = mach->Primitives[0][mach->OutputPrimCount[0]];
       if (emitted_verts) {
          emit_primitive(mach, NULL);
       }
@@ -6254,11 +6232,11 @@ tgsi_exec_machine_setup_masks(struct tgsi_exec_machine *mach)
    uint default_mask = 0xf;
 
    mach->Temps[TEMP_KILMASK_I].xyzw[TEMP_KILMASK_C].u[0] = 0;
-   mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0] = 0;
+   mach->OutputVertexOffset = 0;
 
    if (mach->ShaderType == PIPE_SHADER_GEOMETRY) {
       for (unsigned i = 0; i < TGSI_MAX_VERTEX_STREAMS; i++) {
-         mach->Temps[temp_prim_idxs[i].idx].xyzw[temp_prim_idxs[i].chan].u[0] = 0;
+         mach->OutputPrimCount[i] = 0;
          mach->Primitives[i][0] = 0;
       }
       /* GS runs on a single primitive for now */
diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h b/src/gallium/auxiliary/tgsi/tgsi_exec.h
index 798538e1b7f..16f44c3736f 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
@@ -220,12 +220,6 @@ struct tgsi_sampler
 #define TGSI_EXEC_TEMP_KILMASK_I    (TGSI_EXEC_NUM_TEMPS + 0)
 #define TGSI_EXEC_TEMP_KILMASK_C    0
 
-#define TGSI_EXEC_TEMP_OUTPUT_I     (TGSI_EXEC_NUM_TEMPS + 0)
-#define TGSI_EXEC_TEMP_OUTPUT_C     1
-
-#define TGSI_EXEC_TEMP_PRIMITIVE_I  (TGSI_EXEC_NUM_TEMPS + 0)
-#define TGSI_EXEC_TEMP_PRIMITIVE_C  2
-
 /* 4 register buffer for various purposes */
 #define TGSI_EXEC_TEMP_R0           (TGSI_EXEC_NUM_TEMPS + 1)
 #define TGSI_EXEC_NUM_TEMP_R        4
@@ -233,14 +227,7 @@ struct tgsi_sampler
 #define TGSI_EXEC_TEMP_ADDR         (TGSI_EXEC_NUM_TEMPS + 5)
 #define TGSI_EXEC_NUM_ADDRS         3
 
-#define TGSI_EXEC_TEMP_PRIMITIVE_S1_I  (TGSI_EXEC_NUM_TEMPS + 8)
-#define TGSI_EXEC_TEMP_PRIMITIVE_S1_C  0
-#define TGSI_EXEC_TEMP_PRIMITIVE_S2_I  (TGSI_EXEC_NUM_TEMPS + 9)
-#define TGSI_EXEC_TEMP_PRIMITIVE_S2_C  1
-#define TGSI_EXEC_TEMP_PRIMITIVE_S3_I  (TGSI_EXEC_NUM_TEMPS + 10)
-#define TGSI_EXEC_TEMP_PRIMITIVE_S3_C  2
-
-#define TGSI_EXEC_NUM_TEMP_EXTRAS   11
+#define TGSI_EXEC_NUM_TEMP_EXTRAS   8
 
 
 
@@ -349,11 +336,17 @@ struct tgsi_exec_machine
    enum pipe_shader_type         ShaderType; /**< PIPE_SHADER_x */
 
    /* GEOMETRY processor only. */
+   /* Number of vertices emitted per emitted primitive. */
    unsigned                      *Primitives[TGSI_MAX_VERTEX_STREAMS];
+   /* Offsets in ->Outputs of the primitives' vertex output data */
    unsigned                      *PrimitiveOffsets[TGSI_MAX_VERTEX_STREAMS];
    unsigned                       NumOutputs;
    unsigned                       MaxGeometryShaderOutputs;
    unsigned                       MaxOutputVertices;
+   /* Offset in ->Outputs for the current vertex to be emitted. */
+   unsigned                       OutputVertexOffset;
+   /* Number of primitives emitted. */
+   unsigned                       OutputPrimCount[TGSI_MAX_VERTEX_STREAMS];
 
    /* FRAGMENT processor only. */
    const struct tgsi_interp_coef *InterpCoefs;



More information about the mesa-commit mailing list