diff options
| author | Zack Rusin <zack@kde.org> | 2010-06-09 14:11:43 -0400 | 
|---|---|---|
| committer | Zack Rusin <zack@kde.org> | 2010-06-09 14:11:43 -0400 | 
| commit | da4185ca77395b9dddc362891d8f7bbc2fa924cd (patch) | |
| tree | cea3352e2fc36e74ad017469273c48fd2c61d0c7 | |
| parent | 26d5d4d99510148eef4fd20845b7790b4fedc355 (diff) | |
draw: make sure the buffer is big enough to fit everything emitted by the gs
| -rw-r--r-- | src/gallium/auxiliary/draw/draw_gs.c | 36 | ||||
| -rw-r--r-- | src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c | 39 | 
2 files changed, 27 insertions, 48 deletions
| diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c index 145a062e2e..15d4c5c15d 100644 --- a/src/gallium/auxiliary/draw/draw_gs.c +++ b/src/gallium/auxiliary/draw/draw_gs.c @@ -37,6 +37,7 @@  #include "util/u_math.h"  #include "util/u_memory.h" +#include "util/u_prim.h"  #define MAX_PRIM_VERTICES 6  /* fixme: move it from here */ @@ -154,35 +155,6 @@ void draw_delete_geometry_shader(struct draw_context *draw,     FREE(dgs);  } -static INLINE int num_vertices_for_prim(int prim) -{ -   switch(prim) { -   case PIPE_PRIM_POINTS: -      return 1; -   case PIPE_PRIM_LINES: -      return 2; -   case PIPE_PRIM_LINE_LOOP: -      return 2; -   case PIPE_PRIM_LINE_STRIP: -      return 2; -   case PIPE_PRIM_TRIANGLES: -      return 3; -   case PIPE_PRIM_TRIANGLE_STRIP: -      return 3; -   case PIPE_PRIM_TRIANGLE_FAN: -      return 3; -   case PIPE_PRIM_LINES_ADJACENCY: -   case PIPE_PRIM_LINE_STRIP_ADJACENCY: -      return 4; -   case PIPE_PRIM_TRIANGLES_ADJACENCY: -   case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY: -      return 6; -   default: -      assert(!"Bad geometry shader input"); -      return 0; -   } -} -  static void draw_fetch_geometry_input(struct draw_geometry_shader *shader,                                        int start_primitive,                                        int num_primitives, @@ -192,7 +164,7 @@ static void draw_fetch_geometry_input(struct draw_geometry_shader *shader,  {     struct tgsi_exec_machine *machine = shader->machine;     unsigned slot, vs_slot, k, j; -   unsigned num_vertices = num_vertices_for_prim(shader->input_primitive); +   unsigned num_vertices = u_vertices_per_prim(shader->input_primitive);     int idx = 0;     for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; slot++) { @@ -299,10 +271,12 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader,  {     struct tgsi_exec_machine *machine = shader->machine;     unsigned int i; -   unsigned num_in_vertices = num_vertices_for_prim(shader->input_primitive); +   unsigned num_in_vertices = u_vertices_per_prim(shader->input_primitive);     unsigned num_in_primitives = count/num_in_vertices;     unsigned inputs_from_vs = 0; +   if (0) debug_printf("%s count = %d\n", __FUNCTION__, count); +     shader->emitted_vertices = 0;     shader->emitted_primitives = 0; diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c index afc146c602..938b0b3c04 100644 --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c @@ -27,6 +27,7 @@  #include "util/u_math.h"  #include "util/u_memory.h" +#include "util/u_prim.h"  #include "draw/draw_context.h"  #include "draw/draw_vbuf.h"  #include "draw/draw_vertex.h" @@ -51,6 +52,24 @@ struct fetch_pipeline_middle_end {     unsigned opt;  }; +static int max_out_vertex_count( +   struct fetch_pipeline_middle_end *fpme, int count) +{ +   struct draw_context *draw = fpme->draw; +   unsigned alloc_count = align( count, 4 ); + +   if (draw->gs.geometry_shader) { +      unsigned input_primitives = count / u_vertices_per_prim(fpme->input_prim); +      /* 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); +   } + +   return alloc_count; +}  static void fetch_pipeline_prepare( struct draw_pt_middle_end *middle,                                      unsigned in_prim, @@ -140,12 +159,7 @@ static void fetch_pipeline_run( struct draw_pt_middle_end *middle,     struct draw_geometry_shader *gshader = draw->gs.geometry_shader;     unsigned opt = fpme->opt;     struct vertex_header *pipeline_verts; -   unsigned alloc_count = align( fetch_count, 4 ); - -   if (draw->gs.geometry_shader && -       draw->gs.geometry_shader->max_output_vertices > fetch_count) { -      alloc_count = align(draw->gs.geometry_shader->max_output_vertices, 4); -   } +   unsigned alloc_count = max_out_vertex_count(fpme, fetch_count);     pipeline_verts =        (struct vertex_header *)MALLOC(fpme->vertex_size * alloc_count); @@ -236,11 +250,7 @@ static void fetch_pipeline_linear_run( struct draw_pt_middle_end *middle,     struct draw_geometry_shader *geometry_shader = draw->gs.geometry_shader;     unsigned opt = fpme->opt;     struct vertex_header *pipeline_verts; -   unsigned alloc_count = align( count, 4 ); - -   if (geometry_shader && geometry_shader->max_output_vertices > count) { -      alloc_count = align(geometry_shader->max_output_vertices, 4); -   } +   unsigned alloc_count = max_out_vertex_count(fpme, count);     pipeline_verts =        (struct vertex_header *)MALLOC(fpme->vertex_size * alloc_count); @@ -329,12 +339,7 @@ static boolean fetch_pipeline_linear_run_elts( struct draw_pt_middle_end *middle     struct draw_geometry_shader *geometry_shader = draw->gs.geometry_shader;     unsigned opt = fpme->opt;     struct vertex_header *pipeline_verts; -   unsigned alloc_count = align( count, 4 ); - -   if (draw->gs.geometry_shader && -       draw->gs.geometry_shader->max_output_vertices > count) { -      alloc_count = align(draw->gs.geometry_shader->max_output_vertices, 4); -   } +   unsigned alloc_count = max_out_vertex_count(fpme, count);     pipeline_verts =        (struct vertex_header *)MALLOC(fpme->vertex_size * alloc_count); | 
