summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJordan Justen <jordan.l.justen@intel.com>2013-02-12 16:12:31 -0800
committerJordan Justen <jordan.l.justen@intel.com>2013-02-23 16:20:28 -0800
commit0486d503209cf375ae77456336742774b12eda02 (patch)
tree1ae4e1a579c20371bd2e0314fc7ca38ca729392b
parentf6487e8911399ee62fffd54035c9459256043f9d (diff)
glsl: Remove VS output varyings which are optimized out of the FS
Previously when an input varying was optimized out of the FS we would still retain it as an output of the VS. We now build a hash of live FS input varyings rather than looking in the FS symbol table. (The FS symbol table will still contain the optimized out varyings.) Signed-off-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Paul Berry <stereotype441@gmail.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
-rw-r--r--src/glsl/link_varyings.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
index b1317c8322b..616933dfd3d 100644
--- a/src/glsl/link_varyings.cpp
+++ b/src/glsl/link_varyings.cpp
@@ -964,6 +964,8 @@ assign_varying_locations(struct gl_context *ctx,
varying_matches matches(ctx->Const.DisableVaryingPacking);
hash_table *tfeedback_candidates
= hash_table_ctor(0, hash_table_string_hash, hash_table_string_compare);
+ hash_table *consumer_inputs
+ = hash_table_ctor(0, hash_table_string_hash, hash_table_string_compare);
/* Operate in a total of three passes.
*
@@ -976,6 +978,18 @@ assign_varying_locations(struct gl_context *ctx,
* not being inputs. This lets the optimizer eliminate them.
*/
+ if (consumer) {
+ foreach_list(node, consumer->ir) {
+ ir_variable *const input_var =
+ ((ir_instruction *) node)->as_variable();
+
+ if ((input_var != NULL) && (input_var->mode == ir_var_shader_in)) {
+ hash_table_insert(consumer_inputs, input_var,
+ ralloc_strdup(mem_ctx, input_var->name));
+ }
+ }
+ }
+
foreach_list(node, producer->ir) {
ir_variable *const output_var = ((ir_instruction *) node)->as_variable();
@@ -986,7 +1000,7 @@ assign_varying_locations(struct gl_context *ctx,
g.process(output_var);
ir_variable *input_var =
- consumer ? consumer->symbols->get_variable(output_var->name) : NULL;
+ (ir_variable *) hash_table_find(consumer_inputs, output_var->name);
if (input_var && input_var->mode != ir_var_shader_in)
input_var = NULL;
@@ -1005,6 +1019,7 @@ assign_varying_locations(struct gl_context *ctx,
if (matched_candidate == NULL) {
hash_table_dtor(tfeedback_candidates);
+ hash_table_dtor(consumer_inputs);
return false;
}
@@ -1021,11 +1036,13 @@ assign_varying_locations(struct gl_context *ctx,
if (!tfeedback_decls[i].assign_location(ctx, prog)) {
hash_table_dtor(tfeedback_candidates);
+ hash_table_dtor(consumer_inputs);
return false;
}
}
hash_table_dtor(tfeedback_candidates);
+ hash_table_dtor(consumer_inputs);
if (ctx->Const.DisableVaryingPacking) {
/* Transform feedback code assumes varyings are packed, so if the driver