Mesa (arb_geometry_shader4): gs: try to inject the num of vertices per primitive into the input

Zack Rusin zack at kemper.freedesktop.org
Fri Jul 17 03:22:22 UTC 2009


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

Author: Zack Rusin <zackr at vmware.com>
Date:   Thu Jul 16 23:26:19 2009 -0400

gs: try to inject the num of vertices per primitive into the input

---

 src/gallium/auxiliary/draw/draw_gs.c |   60 +++++++++++++++++++++-------------
 1 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c
index a09bd2b..604bf20 100644
--- a/src/gallium/auxiliary/draw/draw_gs.c
+++ b/src/gallium/auxiliary/draw/draw_gs.c
@@ -144,37 +144,44 @@ static void draw_fetch_geometry_input(struct draw_geometry_shader *shader,
                                       int start_primitive,
                                       int num_primitives,
                                       const float (*input)[4],
-                                      unsigned input_stride)
+                                      unsigned input_stride,
+                                      unsigned inputs_from_vs)
 {
    struct tgsi_exec_machine *machine = shader->machine;
-   unsigned slot, k, j;
+   unsigned slot, vs_slot, k, j;
    unsigned num_vertices = num_vertices_for_prim(shader->state.input_type);
 
    for (k = 0; k < num_primitives; ++k) {
       for (j = 0; j < num_vertices; j++) {
-         int idx = ((start_primitive + k) * num_vertices + j) * shader->info.num_inputs;
-#if 1
+         int idx = ((start_primitive + k) * num_vertices + j) * inputs_from_vs;
          debug_printf("%d) Prim, %d) Input vert:\n", start_primitive, idx);
-         for (slot = 0; slot < shader->info.num_inputs; slot++) {
-            debug_printf("\t%d: %f %f %f %f\n", slot,
-                         input[idx + slot][0],
-                         input[idx + slot][1],
-                         input[idx + slot][2],
-                         input[idx + slot][3]);
-         }
-#endif
 
-         for (slot = 0; slot < shader->info.num_inputs; slot++) {
-#if 0
-            assert(!util_is_inf_or_nan(input[idx + slot][0]));
-            assert(!util_is_inf_or_nan(input[idx + slot][1]));
-            assert(!util_is_inf_or_nan(input[idx + slot][2]));
-            assert(!util_is_inf_or_nan(input[idx + slot][3]));
+         for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; slot++) {
+            if (shader->info.input_semantic_name[slot] == TGSI_SEMANTIC_VERTICES) {
+               machine->Inputs[idx + slot].xyzw[0].f[j] = (float)num_vertices;
+               machine->Inputs[idx + slot].xyzw[1].f[j] = (float)num_vertices;
+               machine->Inputs[idx + slot].xyzw[2].f[j] = (float)num_vertices;
+               machine->Inputs[idx + slot].xyzw[3].f[j] = (float)num_vertices;
+            }
+            else {
+#if 1
+               debug_printf("\t%d: %f %f %f %f\n", slot,
+                            input[idx + vs_slot][0],
+                            input[idx + vs_slot][1],
+                            input[idx + vs_slot][2],
+                            input[idx + vs_slot][3]);
+               assert(!util_is_inf_or_nan(input[idx + vs_slot][0]));
+               assert(!util_is_inf_or_nan(input[idx + vs_slot][1]));
+               assert(!util_is_inf_or_nan(input[idx + vs_slot][2]));
+               assert(!util_is_inf_or_nan(input[idx + vs_slot][3]));
 #endif
-            machine->Inputs[idx + slot].xyzw[0].f[j] = input[idx + slot][0];
-            machine->Inputs[idx + slot].xyzw[1].f[j] = input[idx + slot][1];
-            machine->Inputs[idx + slot].xyzw[2].f[j] = input[idx + slot][2];
-            machine->Inputs[idx + slot].xyzw[3].f[j] = input[idx + slot][3];
+
+               machine->Inputs[idx + slot].xyzw[0].f[j] = input[idx + vs_slot][0];
+               machine->Inputs[idx + slot].xyzw[1].f[j] = input[idx + vs_slot][1];
+               machine->Inputs[idx + slot].xyzw[2].f[j] = input[idx + vs_slot][2];
+               machine->Inputs[idx + slot].xyzw[3].f[j] = input[idx + vs_slot][3];
+               ++vs_slot;
+            }
          }
 
          input = (const float (*)[4])((const char *)input + input_stride);
@@ -195,13 +202,20 @@ void draw_geometry_shader_run(struct draw_geometry_shader *shader,
    unsigned slot;
    unsigned num_vertices = num_vertices_for_prim(shader->state.input_type);
    unsigned num_primitives = count/num_vertices;
+   unsigned inputs_from_vs = 0;
 
    machine->Consts = constants;
 
+   for (i = 0; i < shader->info.num_inputs; ++i) {
+      if (shader->info.input_semantic_name[i] != TGSI_SEMANTIC_VERTICES &&
+          shader->info.input_semantic_name[i] != TGSI_SEMANTIC_PRIMID)
+         ++inputs_from_vs;
+   }
+
    for (i = 0; i < num_primitives; i += MAX_TGSI_PRIMITIVES) {
       unsigned int max_primitives = MIN2(MAX_TGSI_PRIMITIVES, num_primitives - i);
 
-      draw_fetch_geometry_input(shader, i, max_primitives, input, input_stride);
+      draw_fetch_geometry_input(shader, i, max_primitives, input, input_stride, inputs_from_vs);
 
       tgsi_set_exec_mask(machine,
                          1,




More information about the mesa-commit mailing list