diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index 8c4a08b0bf3..587845a2134 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -2193,6 +2193,7 @@ do_late_parsing_checks(struct _mesa_glsl_parse_state *state) static void opt_shader_and_create_symbol_table(const struct gl_constants *consts, + const struct gl_extensions *exts, struct glsl_symbol_table *source_symbols, struct gl_shader *shader) { @@ -2229,6 +2230,17 @@ opt_shader_and_create_symbol_table(const struct gl_constants *consts, optimize_dead_builtin_variables(shader->ir, other); + lower_vector_derefs(shader); + + lower_packing_builtins(shader->ir, exts->ARB_shading_language_packing, + exts->ARB_gpu_shader5, + consts->GLSLHasHalfFloatPacking); + do_mat_op_to_vec(shader->ir); + + lower_instructions(shader->ir, exts->ARB_gpu_shader5); + + do_vec_index_to_cond_assign(shader->ir); + validate_ir_tree(shader->ir); /* Retain any live IR, but trash the rest. */ @@ -2399,7 +2411,8 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, lower_builtins(shader->ir); assign_subroutine_indexes(state); lower_subroutine(shader->ir, state); - opt_shader_and_create_symbol_table(&ctx->Const, state->symbols, shader); + opt_shader_and_create_symbol_table(&ctx->Const, &ctx->Extensions, + state->symbols, shader); } if (!force_recompile) { diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_optimization.h index b2ced464a22..ddae635eacb 100644 --- a/src/compiler/glsl/ir_optimization.h +++ b/src/compiler/glsl/ir_optimization.h @@ -30,6 +30,7 @@ #ifndef GLSL_IR_OPTIMIZATION_H #define GLSL_IR_OPTIMIZATION_H +struct gl_shader; struct gl_linked_shader; struct gl_shader_program; @@ -60,7 +61,7 @@ bool lower_packing_builtins(exec_list *instructions, bool has_shading_language_packing, bool has_gpu_shader5, bool has_half_float_packing); -bool lower_vector_derefs(gl_linked_shader *shader); +bool lower_vector_derefs(gl_shader *shader); void optimize_dead_builtin_variables(exec_list *instructions, enum ir_variable_mode other); diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index eb0df14004b..e5fe4c4fad3 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -2919,17 +2919,6 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) if (!prog->data->LinkStatus) goto done; - lower_vector_derefs(shader); - - lower_packing_builtins(ir, ctx->Extensions.ARB_shading_language_packing, - ctx->Extensions.ARB_gpu_shader5, - ctx->Const.GLSLHasHalfFloatPacking); - do_mat_op_to_vec(ir); - - lower_instructions(ir, ctx->Extensions.ARB_gpu_shader5); - - do_vec_index_to_cond_assign(ir); - const struct gl_shader_compiler_options *gl_options = &consts->ShaderCompilerOptions[i]; diff --git a/src/compiler/glsl/lower_vector_derefs.cpp b/src/compiler/glsl/lower_vector_derefs.cpp index c027ceb1300..f4b51fe8ede 100644 --- a/src/compiler/glsl/lower_vector_derefs.cpp +++ b/src/compiler/glsl/lower_vector_derefs.cpp @@ -193,7 +193,7 @@ vector_deref_visitor::handle_rvalue(ir_rvalue **rv) } bool -lower_vector_derefs(gl_linked_shader *shader) +lower_vector_derefs(gl_shader *shader) { vector_deref_visitor v(shader->ir, shader->Stage); diff --git a/src/compiler/glsl/tests/lower_precision_test.py b/src/compiler/glsl/tests/lower_precision_test.py index 7e4f4921424..97478fd9b9f 100644 --- a/src/compiler/glsl/tests/lower_precision_test.py +++ b/src/compiler/glsl/tests/lower_precision_test.py @@ -401,7 +401,7 @@ TESTS = [ gl_FragColor = vec4(b * a, 0.0, 0.0); } """, - r'\(expression +f16vec2 \* \(var_ref b\) \(var_ref a\)'), + r'\(expression f16vec2 \+ \(expression f16vec2 \* \(array_ref \(var_ref b\) \(constant int \(0\)\) \) \(swiz x \(var_ref a\) \)\) \(expression f16vec2 \* \(array_ref \(var_ref b\) \(constant int \(1\)\) \) \(swiz y \(var_ref a\) \)\) \) \)'), Test("f32 simple struct deref", """ precision mediump float;