diff options
author | Zack Rusin <[email protected]> | 2010-06-16 15:56:17 -0400 |
---|---|---|
committer | Zack Rusin <[email protected]> | 2010-06-16 15:56:17 -0400 |
commit | 638a80bc075a4b58123cb9ba03993bd8bfd024cd (patch) | |
tree | c6191da1f420050f897793d58ec93022262d47ac | |
parent | 509ff13d068eea38fc5e8be52beb55ad7cfdf92f (diff) |
draw: make sure we correctly iterate over output buffers on stream out
we kept overwriting the first attribute of a vertex in a single-stream-
out-buffer case
-rw-r--r-- | src/gallium/auxiliary/draw/draw_pt_so_emit.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pt_so_emit.c b/src/gallium/auxiliary/draw/draw_pt_so_emit.c index 1877afbc3f7..720c105ea1c 100644 --- a/src/gallium/auxiliary/draw/draw_pt_so_emit.c +++ b/src/gallium/auxiliary/draw/draw_pt_so_emit.c @@ -124,14 +124,15 @@ static void so_emit_prim(struct pt_so_emit *so, for (i = 0; i < num_vertices; ++i) { const float (*input)[4]; + unsigned total_written_compos = 0; /*debug_printf("%d) vertex index = %d (prim idx = %d)\n", i, indices[i], prim_idx);*/ input = (const float (*)[4])( (const char *)input_ptr + (indices[i] * input_vertex_stride)); for (slot = 0; slot < state->num_outputs; ++slot) { unsigned idx = state->register_index[slot]; unsigned writemask = state->register_mask[slot]; - unsigned compo; unsigned written_compos = 0; + unsigned compo; buffer = (float**)&so->buffers[state->output_buffer[slot]]; @@ -157,11 +158,16 @@ static void so_emit_prim(struct pt_so_emit *so, input[idx][2], input[idx][3]); #endif - if (!so->single_buffer) - *buffer += written_compos; + *buffer += written_compos; + total_written_compos += written_compos; + } + if (so->single_buffer) { + unsigned stride = state->stride - + sizeof(float) * total_written_compos; + + debug_assert(stride >= 0); + *buffer = (float*) (((char*)*buffer) + stride); } - if (so->single_buffer) - *buffer = (float*) (((char*)*buffer) + state->stride); } so->emitted_vertices += num_vertices; ++so->emitted_primitives; |