From: Kenneth Graunke Date: Tue, 7 Nov 2017 08:57:52 +0000 (-0800) Subject: glsl: Make #pragma STDGL invariant(all) only modify outputs. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=688d6958682f96aaeb88aa8cc23cc5c9886a6be4;p=mesa.git glsl: Make #pragma STDGL invariant(all) only modify outputs. According to the GLSL ES 3.20, GLSL 4.50, and GLSL 1.20 specs: "To force all output variables to be invariant, use the pragma #pragma STDGL invariant(all) before all declarations in a shader." Notably, this is only supposed to affect output variables. Furthermore, "Only variables output from a shader can be candidates for invariance." It looks like this has been wrong since we first supported the pragma in 2011 (commit 86b4398cd158024f6be9fa830554a11c2a7ebe0c). Fixes dEQP-GLES2.functional.shaders.preprocessor.pragmas.pragma_fragment. v2: Now that all cases are identical (other than compute shaders, which have no output variables anyway), we can drop the switch statement entirely. We also don't need the current_function == NULL check; this was a hold over from when we had a single var_mode_out for both function parameters and shader varyings, in the bad old days. Reviewed-by: Iago Toral Quiroga Reviewed-by: Ilia Mirkin --- diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index adb613a2c78..5cdeb94720b 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -4077,30 +4077,8 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, } } - if (state->all_invariant && (state->current_function == NULL)) { - switch (state->stage) { - case MESA_SHADER_VERTEX: - if (var->data.mode == ir_var_shader_out) - var->data.invariant = true; - break; - case MESA_SHADER_TESS_CTRL: - case MESA_SHADER_TESS_EVAL: - case MESA_SHADER_GEOMETRY: - if ((var->data.mode == ir_var_shader_in) - || (var->data.mode == ir_var_shader_out)) - var->data.invariant = true; - break; - case MESA_SHADER_FRAGMENT: - if (var->data.mode == ir_var_shader_in) - var->data.invariant = true; - break; - case MESA_SHADER_COMPUTE: - /* Invariance isn't meaningful in compute shaders. */ - break; - default: - break; - } - } + if (state->all_invariant && var->data.mode == ir_var_shader_out) + var->data.invariant = true; var->data.interpolation = interpret_interpolation_qualifier(qual, var->type,