[Mesa-dev] [PATCH 2/4 v2] glsl: Restrict initializers for global variables to constant expression in ES
Lofstedt, Marta
marta.lofstedt at intel.com
Thu Oct 8 03:19:48 PDT 2015
Reviewed-by: Marta Lofstedt <marta.lofstedt at intel.com>
> -----Original Message-----
> From: mesa-dev [mailto:mesa-dev-bounces at lists.freedesktop.org] On
> Behalf Of Ian Romanick
> Sent: Wednesday, October 7, 2015 11:34 PM
> To: mesa-dev at lists.freedesktop.org
> Cc: Romanick, Ian D; 10.6 11.0
> Subject: [Mesa-dev] [PATCH 2/4 v2] glsl: Restrict initializers for global
> variables to constant expression in ES
>
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> v2: Combine this check with the existing const and uniform checks. This
> change depends on the previous patch (glsl: Only set
> ir_variable::constant_value for const-decorated variables).
>
> 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
> Reviewed-by: Tapani Pälli <tapani.palli at intel.com> [v1]
> Reviewed-by: Iago Toral Quiroga <itoral at igalia.com> [v1]
> Cc: "10.6 11.0" <mesa-stable at lists.freedesktop.org>
> ---
> src/glsl/ast_to_hir.cpp | 20 +++++++++++++++++---
> 1 file changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index
> e3d4c44..eefc7b7 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -3213,9 +3213,19 @@ process_initializer(ir_variable *var,
> ast_declaration *decl,
>
> /* Calculate the constant value if this is a const or uniform
> * declaration.
> + *
> + * 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.
> */
> if (type->qualifier.flags.q.constant
> - || type->qualifier.flags.q.uniform) {
> + || type->qualifier.flags.q.uniform
> + || (state->es_shader && state->current_function == NULL)) {
> ir_rvalue *new_rhs = validate_assignment(state, initializer_loc,
> lhs, rhs, true);
> if (new_rhs != NULL) {
> @@ -3223,6 +3233,11 @@ process_initializer(ir_variable *var,
> ast_declaration *decl,
>
> ir_constant *constant_value = rhs->constant_expression_value();
> if (!constant_value) {
> + const char *const variable_mode =
> + (type->qualifier.flags.q.constant)
> + ? "const"
> + : ((type->qualifier.flags.q.uniform) ? "uniform" :
> + "global");
> +
> /* If ARB_shading_language_420pack is enabled, initializers of
> * const-qualified local variables do not have to be constant
> * expressions. Const-qualified global variables must still be @@ -
> 3233,8 +3248,7 @@ process_initializer(ir_variable *var, ast_declaration *decl,
> _mesa_glsl_error(& initializer_loc, state,
> "initializer of %s variable `%s' must be a "
> "constant expression",
> - (type->qualifier.flags.q.constant)
> - ? "const" : "uniform",
> + variable_mode,
> decl->identifier);
> if (var->type->is_numeric()) {
> /* Reduce cascading errors. */
> --
> 2.1.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list