[Mesa-stable] [Mesa-dev] [PATCH] glsl: Restrict initializers for global variables to constant expression in ES

Iago Toral itoral at igalia.com
Wed Oct 7 00:21:23 PDT 2015


On Tue, 2015-10-06 at 19:09 -0700, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> It may be possible to consolodate this check with the existing check for
                        consolidate
> uniform and const initializers, but a way that didn't require a huge
> amount of restructing was not obvious to me.
> 
> Fixes:
> 
>     ES2-CTS.shaders.negative.initialize
>     ES3-CTS.shaders.negative.initialize
> 
>     spec/glsl-es-1.00/compiler/global-initializer/from-attribute.vert
>     spec/glsl-es-1.00/compiler/global-initializer/from-uniform.vert
>     spec/glsl-es-1.00/compiler/global-initializer/from-uniform.frag
>     spec/glsl-es-1.00/compiler/global-initializer/from-global.vert
>     spec/glsl-es-1.00/compiler/global-initializer/from-global.frag
>     spec/glsl-es-1.00/compiler/global-initializer/from-varying.frag
>     spec/glsl-es-3.00/compiler/global-initializer/from-uniform.vert
>     spec/glsl-es-3.00/compiler/global-initializer/from-uniform.frag
>     spec/glsl-es-3.00/compiler/global-initializer/from-in.vert
>     spec/glsl-es-3.00/compiler/global-initializer/from-in.frag
>     spec/glsl-es-3.00/compiler/global-initializer/from-global.vert
>     spec/glsl-es-3.00/compiler/global-initializer/from-global.frag
> 
> Note: spec/glsl-es-3.00/compiler/global-initializer/from-sequence.*
> still fail because the result of a sequence operator is still considered
> to be a constant expression.
> 
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92304
> Cc: "10.6 11.0" <mesa-stable at lists.freedesktop.org>
> ---
>  src/glsl/ast_to_hir.cpp | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
> 
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 9511440..92f288f 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -3300,6 +3300,27 @@ process_initializer(ir_variable *var, ast_declaration *decl,
>        var->data.read_only = temp;
>     }
>  
> +   /* Section 4.3 (Storage Qualifiers) of the GLSL ES 1.00.17 spec says:
> +    *
> +    *     "Declarations of globals without a storage qualifier, or with
> +    *     just the const qualifier, may include initializers, in which case
> +    *     they will be initialized before the first line of main() is
> +    *     executed.  Such initializers must be a constant expression."
> +    *
> +    * The same section of the GLSL ES 3.00.4 spec has similar language.
> +    *
> +    * Initializers for const-decorated declarations are handled above.
> +    */
> +   const bool is_global_declaration = state->current_function == NULL;
> +   if (state->es_shader &&
> +       is_global_declaration &&
> +       var->data.has_initializer &&
> +       var->constant_initializer == NULL)
> +      _mesa_glsl_error(&initializer_loc, state,
> +                       "initializer of global variable `%s' must be a "
> +                       "constant expression",
> +                       decl->identifier);
> +
>     return result;
>  }
>  

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

BTW, while reading that spec quote I noticed that we should fail
declarations of out variables with initializers as well. Mesa currently
allows this (it kinda makes sense to me), but I have checked that
neither AMD nor nVidia proprietary driver don't, so I guess this is not
a behavior that people are relying on... I'll send a patch for this.

Iago



More information about the mesa-stable mailing list