summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Scheidegger <[email protected]>2013-01-29 08:39:09 -0800
committerRoland Scheidegger <[email protected]>2013-01-29 08:40:52 -0800
commit0eb588a37cc0427fd5c6a1ed2b212ed5d68f4dab (patch)
treeae53d37a9ae0ce46717757f4c7714548224c4c72
parent845130951f9f62a1baba9ae9ea2b234e83ac5c94 (diff)
draw: fix draw_llvm_variant_key struct padding to avoid recompiles
The struct padding got broken by c789b981b244333cfc903bcd1e2fefc010500013. This caused serious performance regression because part of the key was uninitialized and hence the shader always recompiled (at least on release builds...). While here also fix key size calculation when the number of samplers and the number of sampler views are different. v2: add comment Reviewed-by: Jose Fonseca <[email protected]> Reviewed-by: Brian Paul <[email protected]>
-rw-r--r--src/gallium/auxiliary/draw/draw_llvm.c3
-rw-r--r--src/gallium/auxiliary/draw/draw_llvm.h7
-rw-r--r--src/gallium/auxiliary/draw/draw_vs_llvm.c5
3 files changed, 11 insertions, 4 deletions
diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c
index afb10a6a33a..dc83f805a0f 100644
--- a/src/gallium/auxiliary/draw/draw_llvm.c
+++ b/src/gallium/auxiliary/draw/draw_llvm.c
@@ -1378,7 +1378,8 @@ draw_llvm_make_variant_key(struct draw_llvm *llvm, char *store)
key->clip_halfz = !llvm->draw->rasterizer->gl_rasterization_rules;
key->need_edgeflags = (llvm->draw->vs.edgeflag_output ? TRUE : FALSE);
key->ucp_enable = llvm->draw->rasterizer->clip_plane_enable;
- key->pad = 0;
+ key->pad1 = 0;
+ key->pad2 = 0;
/* All variants of this shader will have the same value for
* nr_samplers. Not yet trying to compact away holes in the
diff --git a/src/gallium/auxiliary/draw/draw_llvm.h b/src/gallium/auxiliary/draw/draw_llvm.h
index a6648573aa5..17ca3047594 100644
--- a/src/gallium/auxiliary/draw/draw_llvm.h
+++ b/src/gallium/auxiliary/draw/draw_llvm.h
@@ -206,8 +206,13 @@ struct draw_llvm_variant_key
unsigned clip_halfz:1;
unsigned bypass_viewport:1;
unsigned need_edgeflags:1;
+ /*
+ * it is important there are no holes in this struct
+ * (and all padding gets zeroed).
+ */
+ unsigned pad1:1;
unsigned ucp_enable:PIPE_MAX_CLIP_PLANES;
- unsigned pad:33-PIPE_MAX_CLIP_PLANES;
+ unsigned pad2:32-PIPE_MAX_CLIP_PLANES;
/* Variable number of vertex elements:
*/
diff --git a/src/gallium/auxiliary/draw/draw_vs_llvm.c b/src/gallium/auxiliary/draw/draw_vs_llvm.c
index 3e46f8c2cf3..ac3999efc68 100644
--- a/src/gallium/auxiliary/draw/draw_vs_llvm.c
+++ b/src/gallium/auxiliary/draw/draw_vs_llvm.c
@@ -100,8 +100,9 @@ draw_create_vs_llvm(struct draw_context *draw,
vs->variant_key_size =
draw_llvm_variant_key_size(
- vs->base.info.file_max[TGSI_FILE_INPUT]+1,
- vs->base.info.file_max[TGSI_FILE_SAMPLER]+1);
+ vs->base.info.file_max[TGSI_FILE_INPUT]+1,
+ MAX2(vs->base.info.file_max[TGSI_FILE_SAMPLER]+1,
+ vs->base.info.file_max[TGSI_FILE_SAMPLER_VIEW]+1));
vs->base.state.stream_output = state->stream_output;
vs->base.draw = draw;