gallium: interface changes necessary to implement transform feedback (v5)
[mesa.git] / src / gallium / auxiliary / draw / draw_pt_so_emit.c
index 84555a73c4ee97fdf54191dddc5fcca2f52acfa8..2dc9e299f56480929390ad9b035857f18f24eba0 100644 (file)
@@ -57,6 +57,20 @@ void draw_pt_so_emit_prepare(struct pt_so_emit *emit)
 
    emit->has_so = (draw->so.state.num_outputs > 0);
 
+   /* if we have a state with outputs make sure we have
+    * buffers to output to */
+   if (emit->has_so) {
+      boolean has_valid_buffer = FALSE;
+      unsigned i;
+      for (i = 0; i < draw->so.num_buffers; ++i) {
+         if (draw->so.buffers[i]) {
+            has_valid_buffer = TRUE;
+            break;
+         }
+      }
+      emit->has_so = has_valid_buffer;
+   }
+
    if (!emit->has_so)
       return;
 
@@ -116,7 +130,7 @@ static void so_emit_prim(struct pt_so_emit *so,
    unsigned input_vertex_stride = so->input_vertex_stride;
    struct draw_context *draw = so->draw;
    const float (*input_ptr)[4];
-   const struct pipe_stream_output_state *state =
+   const struct pipe_stream_output_info *state =
       &draw->so.state;
    float **buffer = 0;
 
@@ -129,12 +143,12 @@ static void so_emit_prim(struct pt_so_emit *so,
       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 idx = state->output[slot].register_index;
+         unsigned writemask = state->output[slot].register_mask;
          unsigned written_compos = 0;
          unsigned compo;
 
-         buffer = (float**)&so->buffers[state->output_buffer[slot]];
+         buffer = (float**)&so->buffers[state->output[slot].output_buffer];
 
          /*debug_printf("\tSlot = %d, vs_slot = %d, idx = %d:\n",
            slot, vs_slot, idx);*/
@@ -204,25 +218,15 @@ static void so_tri(struct pt_so_emit *so, int i0, int i1, int i2)
 }
 
 
-#define TRIANGLE(gs,i0,i1,i2) so_tri(so,i0,i1,i2)
-#define LINE(gs,i0,i1)        so_line(so,i0,i1)
-#define POINT(gs,i0)          so_point(so,i0)
-#define FUNC so_run_linear
-#define LOCAL_VARS
+#define FUNC         so_run_linear
+#define GET_ELT(idx) (start + (idx))
 #include "draw_so_emit_tmp.h"
-#undef LOCAL_VARS
-#undef FUNC
 
 
-#define TRIANGLE(gs,i0,i1,i2) so_tri(gs,elts[i0],elts[i1],elts[i2])
-#define LINE(gs,i0,i1)        so_line(gs,elts[i0],elts[i1])
-#define POINT(gs,i0)          so_point(gs,elts[i0])
-#define FUNC so_run_elts
-#define LOCAL_VARS                         \
-   const ushort *elts = input_prims->elts;
+#define FUNC         so_run_elts
+#define LOCAL_VARS   const ushort *elts = input_prims->elts;
+#define GET_ELT(idx) (elts[start + (idx)])
 #include "draw_so_emit_tmp.h"
-#undef LOCAL_VARS
-#undef FUNC
 
 
 void draw_pt_so_emit( struct pt_so_emit *emit,
@@ -240,11 +244,12 @@ void draw_pt_so_emit( struct pt_so_emit *emit,
    emit->emitted_primitives = 0;
    emit->input_vertex_stride = input_verts->stride;
    emit->inputs = (const float (*)[4])input_verts->verts->data;
-   for (i = 0; i < draw->so.num_buffers; ++i)
+   for (i = 0; i < draw->so.num_buffers; ++i) {
       emit->buffers[i] = draw->so.buffers[i];
+   }
    emit->single_buffer = TRUE;
    for (i = 0; i < draw->so.state.num_outputs; ++i) {
-      if (draw->so.state.output_buffer[i] != 0)
+      if (draw->so.state.output[i].output_buffer != 0)
          emit->single_buffer = FALSE;
    }