Mesa (master): draw: make sure geometry shader correctly iterates the output buffer

Zack Rusin zack at kemper.freedesktop.org
Wed Jun 9 12:02:20 PDT 2010


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

Author: Zack Rusin <zack at kde.org>
Date:   Wed Jun  9 15:01:36 2010 -0400

draw: make sure geometry shader correctly iterates the output buffer

---

 src/gallium/auxiliary/draw/draw_gs.c               |   13 +++++++++----
 .../auxiliary/draw/draw_pt_fetch_shade_pipeline.c  |    3 ++-
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c
index 15d4c5c..9dd19bd 100644
--- a/src/gallium/auxiliary/draw/draw_gs.c
+++ b/src/gallium/auxiliary/draw/draw_gs.c
@@ -223,11 +223,14 @@ static void draw_fetch_geometry_input(struct draw_geometry_shader *shader,
 static INLINE void
 draw_geometry_fetch_outputs(struct draw_geometry_shader *shader,
                             int num_primitives,
-                            float (*output)[4],
+                            float (**p_output)[4],
                             unsigned vertex_size)
 {
    struct tgsi_exec_machine *machine = shader->machine;
    unsigned prim_idx, j, slot;
+   float (*output)[4];
+
+   output = *p_output;
 
    /* Unswizzle all output results.
     */
@@ -240,7 +243,7 @@ draw_geometry_fetch_outputs(struct draw_geometry_shader *shader,
          int idx = (prim_idx * num_verts_per_prim + j) *
                    shader->info.num_outputs;
 #ifdef DEBUG_OUTPUTS
-         debug_printf("%d) Output vert:\n", idx);
+         debug_printf("%d) Output vert:\n", idx / shader->info.num_outputs);
 #endif
          for (slot = 0; slot < shader->info.num_outputs; slot++) {
             output[slot][0] = machine->Outputs[idx + slot].xyzw[0].f[0];
@@ -259,6 +262,7 @@ draw_geometry_fetch_outputs(struct draw_geometry_shader *shader,
          output = (float (*)[4])((char *)output + vertex_size);
       }
    }
+   *p_output = output;
 }
 
 int draw_geometry_shader_run(struct draw_geometry_shader *shader,
@@ -274,6 +278,7 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader,
    unsigned num_in_vertices = u_vertices_per_prim(shader->input_primitive);
    unsigned num_in_primitives = count/num_in_vertices;
    unsigned inputs_from_vs = 0;
+   float (*tmp_output)[4];
 
    if (0) debug_printf("%s count = %d\n", __FUNCTION__, count);
 
@@ -288,7 +293,7 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader,
       if (shader->info.input_semantic_name[i] != TGSI_SEMANTIC_PRIMID)
          ++inputs_from_vs;
    }
-
+   tmp_output = output;
    for (i = 0; i < num_in_primitives; ++i) {
       unsigned int max_input_primitives = 1;
       /* FIXME: handle all the primitives produced by the gs, not just
@@ -311,7 +316,7 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader,
          machine->Temps[TGSI_EXEC_TEMP_PRIMITIVE_I].xyzw[TGSI_EXEC_TEMP_PRIMITIVE_C].u[0];
 
       draw_geometry_fetch_outputs(shader, out_prim_count,
-                                  output, vertex_size);
+                                  &tmp_output, vertex_size);
    }
    return shader->emitted_vertices;
 }
diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
index 938b0b3..152437c 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
@@ -67,7 +67,8 @@ static int max_out_vertex_count(
       if (gs_max_verts > count)
          alloc_count = align(gs_max_verts, 4);
    }
-
+   /*debug_printf("------- alloc count = %d (input = %d)\n",
+                  alloc_count, count);*/
    return alloc_count;
 }
 



More information about the mesa-commit mailing list