summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2014-01-20 10:57:20 -0800
committerCarl Worth <cworth@cworth.org>2014-01-27 16:15:10 -0800
commitdf62691a02f07e6fb98e48274eb917ba33c43bac (patch)
tree6b48bdc61df9ad7b23c437f0d08b514a0930b325 /src
parentfe2678accdd88df5126f5d7eae0be00cd9dd2e4d (diff)
draw: fix incorrect vertex size computation in LLVM drawing code
We were calling draw_total_vs_outputs() too early. The call to draw_pt_emit_prepare() could result in the vertex size changing. So call draw_total_vs_outputs() after draw_pt_emit_prepare(). This fix would seem to be needed for the non-LLVM code as well, but it's not obvious. Instead, I added an assertion there to try to catch this problem if it were to occur there. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=72926 Cc: 10.0 <mesa-stable@lists.freedesktop.org> Reviewed-by: José Fonseca <jfonseca@vmware.com> (cherry picked from commit ad814d04ca5d579538885a595331b5b27caefd2a) Conflicts: src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c7
-rw-r--r--src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c34
2 files changed, 30 insertions, 11 deletions
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 8fcc17048d2..2c5c4cd539c 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
@@ -72,8 +72,8 @@ static void fetch_pipeline_prepare( struct draw_pt_middle_end *middle,
const unsigned gs_out_prim = (gs ? gs->output_primitive :
u_assembled_prim(prim));
- unsigned nr = MAX2( vs->info.num_inputs,
- draw_total_vs_outputs(draw) );
+ unsigned nr_vs_outputs = draw_total_vs_outputs(draw);
+ unsigned nr = MAX2(vs->info.num_inputs, nr_vs_outputs);
if (gs) {
nr = MAX2(nr, gs->info.num_outputs + 1);
@@ -129,6 +129,9 @@ static void fetch_pipeline_prepare( struct draw_pt_middle_end *middle,
/* No need to prepare the shader.
*/
vs->prepare(vs, draw);
+
+ /* Make sure that the vertex size didn't change at any point above */
+ assert(nr_vs_outputs == draw_total_vs_outputs(draw));
}
diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
index 9f172418544..10fc548b77b 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
@@ -141,19 +141,11 @@ llvm_middle_end_prepare( struct draw_pt_middle_end *middle,
struct draw_geometry_shader *gs = draw->gs.geometry_shader;
const unsigned out_prim = gs ? gs->output_primitive :
u_assembled_prim(in_prim);
- const unsigned nr = MAX2(vs->info.num_inputs,
- draw_total_vs_outputs(draw));
+ unsigned nr;
fpme->input_prim = in_prim;
fpme->opt = opt;
- /* Always leave room for the vertex header whether we need it or
- * not. It's hard to get rid of it in particular because of the
- * viewport code in draw_pt_post_vs.c.
- */
- fpme->vertex_size = sizeof(struct vertex_header) + nr * 4 * sizeof(float);
-
-
draw_pt_post_vs_prepare( fpme->post_vs,
draw->clip_xy,
draw->clip_z,
@@ -177,6 +169,30 @@ llvm_middle_end_prepare( struct draw_pt_middle_end *middle,
*max_vertices = 4096;
}
+ /* Get the number of float[4] attributes per vertex.
+ * Note: this must be done after draw_pt_emit_prepare() since that
+ * can effect the vertex size.
+ */
+ nr = MAX2(vs->info.num_inputs, draw_total_vs_outputs(draw));
+
+ /* Always leave room for the vertex header whether we need it or
+ * not. It's hard to get rid of it in particular because of the
+ * viewport code in draw_pt_post_vs.c.
+ */
+ fpme->vertex_size = sizeof(struct vertex_header) + nr * 4 * sizeof(float);
+
+ /* Get the number of float[4] attributes per vertex.
+ * Note: this must be done after draw_pt_emit_prepare() since that
+ * can effect the vertex size.
+ */
+ nr = MAX2(vs->info.num_inputs, draw_total_vs_outputs(draw));
+
+ /* Always leave room for the vertex header whether we need it or
+ * not. It's hard to get rid of it in particular because of the
+ * viewport code in draw_pt_post_vs.c.
+ */
+ fpme->vertex_size = sizeof(struct vertex_header) + nr * 4 * sizeof(float);
+
/* return even number */
*max_vertices = *max_vertices & ~1;