diff options
-rw-r--r-- | src/compiler/glsl/glsl_parser_extras.cpp | 25 | ||||
-rw-r--r-- | src/compiler/glsl/linker.cpp | 16 |
2 files changed, 10 insertions, 31 deletions
diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index 97c7b4d7820..822301a5842 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -1968,6 +1968,7 @@ do_late_parsing_checks(struct _mesa_glsl_parse_state *state) static void opt_shader_and_create_symbol_table(struct gl_context *ctx, + struct glsl_symbol_table *source_symbols, struct gl_shader *shader) { assert(shader->CompileStatus != compile_failure && @@ -2025,22 +2026,8 @@ opt_shader_and_create_symbol_table(struct gl_context *ctx, * We don't have to worry about types or interface-types here because those * are fly-weights that are looked up by glsl_type. */ - foreach_in_list (ir_instruction, ir, shader->ir) { - switch (ir->ir_type) { - case ir_type_function: - shader->symbols->add_function((ir_function *) ir); - break; - case ir_type_variable: { - ir_variable *const var = (ir_variable *) ir; - - if (var->data.mode != ir_var_temporary) - shader->symbols->add_variable(var); - break; - } - default: - break; - } - } + _mesa_glsl_copy_symbols_from_table(shader->ir, source_symbols, + shader->symbols); } void @@ -2077,7 +2064,9 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, return; if (shader->CompileStatus == compiled_no_opts) { - opt_shader_and_create_symbol_table(ctx, shader); + opt_shader_and_create_symbol_table(ctx, + NULL, /* source_symbols */ + shader); shader->CompileStatus = compile_success; return; } @@ -2138,7 +2127,7 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, lower_subroutine(shader->ir, state); if (!ctx->Cache || force_recompile) - opt_shader_and_create_symbol_table(ctx, shader); + opt_shader_and_create_symbol_table(ctx, state->symbols, shader); else { reparent_ir(shader->ir, shader->ir); shader->CompileStatus = compiled_no_opts; diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index f827b68555f..004529157ee 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -1255,21 +1255,11 @@ interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog, * Populates a shaders symbol table with all global declarations */ static void -populate_symbol_table(gl_linked_shader *sh) +populate_symbol_table(gl_linked_shader *sh, glsl_symbol_table *symbols) { sh->symbols = new(sh) glsl_symbol_table; - foreach_in_list(ir_instruction, inst, sh->ir) { - ir_variable *var; - ir_function *func; - - if ((func = inst->as_function()) != NULL) { - sh->symbols->add_function(func); - } else if ((var = inst->as_variable()) != NULL) { - if (var->data.mode != ir_var_temporary) - sh->symbols->add_variable(var); - } - } + _mesa_glsl_copy_symbols_from_table(sh->ir, symbols, sh->symbols); } @@ -2288,7 +2278,7 @@ link_intrastage_shaders(void *mem_ctx, link_bindless_layout_qualifiers(prog, shader_list, num_shaders); - populate_symbol_table(linked); + populate_symbol_table(linked, shader_list[0]->symbols); /* The pointer to the main function in the final linked shader (i.e., the * copy of the original shader that contained the main function). |