From: Jordan Justen Date: Wed, 13 Feb 2013 00:12:31 +0000 (-0800) Subject: glsl: Remove VS output varyings which are optimized out of the FS X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0486d503209cf375ae77456336742774b12eda02;p=mesa.git 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 Reviewed-by: Paul Berry Reviewed-by: Kenneth Graunke --- 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