aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/draw/draw_gs.c
diff options
context:
space:
mode:
authorZack Rusin <[email protected]>2010-06-09 15:01:36 -0400
committerZack Rusin <[email protected]>2010-06-09 15:02:08 -0400
commit1d11eac93f408053a0807783b434624a6dfcb3fb (patch)
tree86d62ce69a016bc5d49445e6b4327bfb4ac4fd35 /src/gallium/auxiliary/draw/draw_gs.c
parentf571a569a03edc66ecd76d67f10db0a4bb600a40 (diff)
draw: make sure geometry shader correctly iterates the output buffer
Diffstat (limited to 'src/gallium/auxiliary/draw/draw_gs.c')
-rw-r--r--src/gallium/auxiliary/draw/draw_gs.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c
index 15d4c5c15d2..9dd19bdc36a 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;
}