gallium: a lot more complete implementation of stream output
[mesa.git] / src / gallium / auxiliary / draw / draw_gs.c
index 0a742cbeef311d9fa37da14cb2bb51776a8dfd26..131deed43e424b88311799266a25bbaad12d9134 100644 (file)
@@ -59,10 +59,21 @@ draw_gs_init( struct draw_context *draw )
    return TRUE;
 }
 
+void draw_gs_destroy( struct draw_context *draw )
+{
+   if (!draw->gs.machine)
+      return;
 
-void draw_gs_set_constants( struct draw_context *draw,
-                            const float (*constants)[4],
-                            unsigned size )
+   align_free(draw->gs.machine->Primitives);
+
+   tgsi_exec_machine_destroy(draw->gs.machine);
+}
+
+void
+draw_gs_set_constants(struct draw_context *draw,
+                      unsigned slot,
+                      const void *constants,
+                      unsigned size)
 {
 }
 
@@ -185,23 +196,23 @@ static void draw_fetch_geometry_input(struct draw_geometry_shader *shader,
    int idx = 0;
 
    for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; slot++) {
-      debug_printf("Slot = %d (semantic = %d)\n", slot,
-                   shader->info.input_semantic_name[slot]);
+      /*debug_printf("Slot = %d (semantic = %d)\n", slot,
+        shader->info.input_semantic_name[slot]);*/
       if (shader->info.input_semantic_name[slot] ==
-          TGSI_SEMANTIC_VERTICES) {
+          TGSI_SEMANTIC_PRIMID) {
          for (j = 0; j < num_primitives; ++j) {
-            machine->Inputs[idx].xyzw[0].f[j] = (float)num_vertices;
-            machine->Inputs[idx].xyzw[1].f[j] = (float)num_vertices;
-            machine->Inputs[idx].xyzw[2].f[j] = (float)num_vertices;
-            machine->Inputs[idx].xyzw[3].f[j] = (float)num_vertices;
+            machine->Inputs[idx].xyzw[0].f[j] = (float)start_primitive + j;
+            machine->Inputs[idx].xyzw[1].f[j] = (float)start_primitive + j;
+            machine->Inputs[idx].xyzw[2].f[j] = (float)start_primitive + j;
+            machine->Inputs[idx].xyzw[3].f[j] = (float)start_primitive + j;
          }
          ++idx;
       } else {
          for (j = 0; j < num_primitives; ++j) {
             int vidx = idx;
             const float (*prim_ptr)[4];
-            debug_printf("    %d) Prim (num_verts = %d)\n", start_primitive + j,
-                         num_vertices);
+            /*debug_printf("    %d) Prim (num_verts = %d)\n", start_primitive + j,
+              num_vertices);*/
             prim_ptr = (const float (*)[4])(
                (const char *)input_ptr +
                (j * num_vertices * input_vertex_stride));
@@ -211,7 +222,7 @@ static void draw_fetch_geometry_input(struct draw_geometry_shader *shader,
                input = (const float (*)[4])(
                   (const char *)prim_ptr + (k * input_vertex_stride));
                vidx = k * TGSI_EXEC_MAX_INPUT_ATTRIBS + slot;
-               debug_printf("\t%d)(%d) Input vert:\n", vidx, k);
+               /*debug_printf("\t%d)(%d) Input vert:\n", vidx, k);*/
 #if 1
                assert(!util_is_inf_or_nan(input[vs_slot][0]));
                assert(!util_is_inf_or_nan(input[vs_slot][1]));
@@ -282,7 +293,7 @@ draw_geometry_fetch_outputs(struct draw_geometry_shader *shader,
 void draw_geometry_shader_run(struct draw_geometry_shader *shader,
                               const float (*input)[4],
                               float (*output)[4],
-                              const float (*constants)[4],
+                              const void *constants[PIPE_MAX_CONSTANT_BUFFERS],
                               unsigned count,
                               unsigned input_stride,
                               unsigned vertex_size)
@@ -293,11 +304,12 @@ void draw_geometry_shader_run(struct draw_geometry_shader *shader,
    unsigned num_primitives = count/num_vertices;
    unsigned inputs_from_vs = 0;
 
-   machine->Consts = constants;
+   for (i = 0; i < PIPE_MAX_CONSTANT_BUFFERS; i++) {
+      machine->Consts[i] = constants[i];
+   }
 
    for (i = 0; i < shader->info.num_inputs; ++i) {
-      if (shader->info.input_semantic_name[i] != TGSI_SEMANTIC_VERTICES &&
-          shader->info.input_semantic_name[i] != TGSI_SEMANTIC_PRIMID)
+      if (shader->info.input_semantic_name[i] != TGSI_SEMANTIC_PRIMID)
          ++inputs_from_vs;
    }
 
@@ -330,10 +342,10 @@ void draw_geometry_shader_delete(struct draw_geometry_shader *shader)
 void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
                                   struct draw_context *draw)
 {
-    if (shader->machine->Tokens != shader->state.tokens) {
-       tgsi_exec_machine_bind_shader(shader->machine,
-                                     shader->state.tokens,
-                                     draw->gs.num_samplers,
-                                     draw->gs.samplers);
-    }
+   if (shader && shader->machine->Tokens != shader->state.tokens) {
+      tgsi_exec_machine_bind_shader(shader->machine,
+                                    shader->state.tokens,
+                                    draw->gs.num_samplers,
+                                    draw->gs.samplers);
+   }
 }