Mesa (master): draw: make sure we correctly iterate over output buffers on stream out

Zack Rusin zack at kemper.freedesktop.org
Wed Jun 16 12:57:12 PDT 2010


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

Author: Zack Rusin <zackr at vmware.com>
Date:   Wed Jun 16 15:56:17 2010 -0400

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

---

 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 1877afb..720c105 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;



More information about the mesa-commit mailing list