From e6fc63535176f01606048b441f2c411c4906c424 Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Wed, 27 Mar 2013 20:11:16 -0700 Subject: [PATCH] draw/gs: Fix memory corruption with multiple primitives MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit We were flushing with incorrect number of primitives. TGSI exec can only work with a single primitive at a time. Plus the fetching with multiple primitives on llvm paths wasn't copying the last element. Signed-off-by: Zack Rusin Reviewed-by: José Fonseca --- src/gallium/auxiliary/draw/draw_gs.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c index 9af82e2..378d158 100644 --- a/src/gallium/auxiliary/draw/draw_gs.c +++ b/src/gallium/auxiliary/draw/draw_gs.c @@ -247,8 +247,8 @@ llvm_fetch_gs_input(struct draw_geometry_shader *shader, shader->info.input_semantic_index[slot], shader->input_info); #if DEBUG_INPUTS - debug_printf("\tSlot = %d, vs_slot = %d, idx = %d:\n", - slot, vs_slot, idx); + debug_printf("\tSlot = %d, vs_slot = %d, i = %d:\n", + slot, vs_slot, i); #endif #if 0 assert(!util_is_inf_or_nan(input[vs_slot][0])); @@ -302,7 +302,7 @@ llvm_fetch_gs_outputs(struct draw_geometry_shader *shader, if (current_verts != shader->max_output_vertices) { memcpy(output_ptr + (vertex_count + current_verts) * shader->vertex_size, output_ptr + (vertex_count + shader->max_output_vertices) * shader->vertex_size, - shader->vertex_size * (total_verts - vertex_count - current_verts)); + shader->vertex_size * (total_verts - vertex_count)); } vertex_count += current_verts; } @@ -384,7 +384,8 @@ static void gs_point(struct draw_geometry_shader *shader, ++shader->in_prim_idx; ++shader->fetched_prim_count; - gs_flush(shader); + if (draw_gs_should_flush(shader)) + gs_flush(shader); } static void gs_line(struct draw_geometry_shader *shader, @@ -399,8 +400,9 @@ static void gs_line(struct draw_geometry_shader *shader, shader->fetched_prim_count); ++shader->in_prim_idx; ++shader->fetched_prim_count; - - gs_flush(shader); + + if (draw_gs_should_flush(shader)) + gs_flush(shader); } static void gs_line_adj(struct draw_geometry_shader *shader, @@ -418,7 +420,8 @@ static void gs_line_adj(struct draw_geometry_shader *shader, ++shader->in_prim_idx; ++shader->fetched_prim_count; - gs_flush(shader); + if (draw_gs_should_flush(shader)) + gs_flush(shader); } static void gs_tri(struct draw_geometry_shader *shader, @@ -435,7 +438,8 @@ static void gs_tri(struct draw_geometry_shader *shader, ++shader->in_prim_idx; ++shader->fetched_prim_count; - gs_flush(shader); + if (draw_gs_should_flush(shader)) + gs_flush(shader); } static void gs_tri_adj(struct draw_geometry_shader *shader, @@ -456,7 +460,8 @@ static void gs_tri_adj(struct draw_geometry_shader *shader, ++shader->in_prim_idx; ++shader->fetched_prim_count; - gs_flush(shader); + if (draw_gs_should_flush(shader)) + gs_flush(shader); } #define FUNC gs_run @@ -691,7 +696,7 @@ draw_create_geometry_shader(struct draw_context *draw, } else #endif { - gs->vector_length = TGSI_NUM_CHANNELS; + gs->vector_length = 1; } for (i = 0; i < gs->info.num_properties; ++i) { -- 2.7.4