gs: make sure we end primitives when finishing executing shaders
authorZack Rusin <zackr@vmware.com>
Tue, 15 Jun 2010 20:37:32 +0000 (16:37 -0400)
committerZack Rusin <zackr@vmware.com>
Tue, 15 Jun 2010 20:37:32 +0000 (16:37 -0400)
src/gallium/auxiliary/draw/draw_gs.c
src/gallium/auxiliary/draw/draw_private.h
src/gallium/auxiliary/tgsi/tgsi_exec.c

index 505622d138bb282182a89bc590541e220f42ccee..c2c08fd44205a4ff05b523d7c0530fee9ee0eaf5 100644 (file)
@@ -416,11 +416,18 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader,
    output_prims->linear = TRUE;
    output_prims->elts = NULL;
    output_prims->start = 0;
+   output_prims->count = shader->emitted_vertices;
    output_prims->prim = shader->output_primitive;
    output_prims->primitive_lengths = shader->primitive_lengths;
    output_prims->primitive_count = shader->emitted_primitives;
    output_verts->count = shader->emitted_vertices;
 
+#if 0
+   debug_printf("GS finished, prims = %d, verts = %d\n",
+                output_prims->primitive_count,
+                output_verts->count);
+#endif
+
    return shader->emitted_vertices;
 }
 
@@ -440,24 +447,3 @@ void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
                                     draw->gs.samplers);
    }
 }
-
-int draw_max_output_vertices(struct draw_context *draw,
-                             unsigned pipe_prim,
-                             unsigned count)
-{
-   unsigned alloc_count = align( count, 4 );
-
-   if (draw->gs.geometry_shader) {
-      unsigned input_primitives = u_gs_prims_for_vertices(pipe_prim,
-                                                          count);
-      /* max GS output is number of input primitives * max output
-       * vertices per each invocation */
-      unsigned gs_max_verts = input_primitives *
-                              draw->gs.geometry_shader->max_output_vertices;
-      if (gs_max_verts > count)
-         alloc_count = align(gs_max_verts, 4);
-   }
-   /*debug_printf("------- alloc count = %d (input = %d)\n",
-                  alloc_count, count);*/
-   return alloc_count;
-}
index e9c940248e6a368f897a820efc98efdddea7bca9..4584033bc2bda52c4475638ede197e6293e3f947 100644 (file)
@@ -403,9 +403,4 @@ draw_get_rasterizer_no_cull( struct draw_context *draw,
                              boolean flatshade );
 
 
-int draw_max_output_vertices(struct draw_context *draw,
-                             unsigned pipe_prim,
-                             unsigned count);
-
-
 #endif /* DRAW_PRIVATE_H */
index f66f72d257ae9d76fc49f24200bf4b650d63e3d8..2b0809b6eba1b98bf374a92261f05cc2229ce6f0 100644 (file)
@@ -1541,6 +1541,19 @@ emit_primitive(struct tgsi_exec_machine *mach)
    }
 }
 
+static void
+conditional_emit_primitive(struct tgsi_exec_machine *mach)
+{
+   if (TGSI_PROCESSOR_GEOMETRY == mach->Processor) {
+      int emitted_verts =
+         mach->Primitives[mach->Temps[TEMP_PRIMITIVE_I].xyzw[TEMP_PRIMITIVE_C].u[0]];
+      if (emitted_verts) {
+         emit_primitive(mach);
+      }
+   }
+}
+
+
 /*
  * Fetch four texture samples using STR texture coordinates.
  */
@@ -3190,6 +3203,9 @@ exec_instruction(
       break;
 
    case TGSI_OPCODE_END:
+      /* make sure we end primitives which haven't
+       * been explicitly emitted */
+      conditional_emit_primitive(mach);
       /* halt execution */
       *pc = -1;
       break;