draw: make sure we correctly iterate over output buffers on stream out
authorZack Rusin <zackr@vmware.com>
Wed, 16 Jun 2010 19:56:17 +0000 (15:56 -0400)
committerZack Rusin <zackr@vmware.com>
Wed, 16 Jun 2010 19:56:17 +0000 (15:56 -0400)
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

index 1877afb..720c105 100644 (file)
@@ -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;