[Mesa-dev] [PATCH v2] glsl: Make #pragma STDGL invariant(all) only modify outputs.

Iago Toral itoral at igalia.com
Wed Nov 8 06:57:37 UTC 2017


Yeah, this is nicer :)

Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>

On Tue, 2017-11-07 at 10:20 -0800, Kenneth Graunke wrote:
> 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 <itoral at igalia.com> [v1]
> Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu> [v1]
> ---
>  src/compiler/glsl/ast_to_hir.cpp | 26 ++------------------------
>  1 file changed, 2 insertions(+), 24 deletions(-)
> 
> Good call, Ilia :)  I'd originally had a /* Invariance isn't
> meaningful
> for fragment shader outputs */ comment, but then I looked elsewhere
> in
> the file and realized that it actually was allowed.  So, I changed
> the
> case, but didn't think to combine it.
> 
> It turns out we can combine all of them...here's a better version.
> 
> diff --git a/src/compiler/glsl/ast_to_hir.cpp
> b/src/compiler/glsl/ast_to_hir.cpp
> index 441404f86d3..1794a1af5cb 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,


More information about the mesa-dev mailing list