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 86b4398cd1).
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 <itoral@igalia.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user