glsl: Allow non-constant expression initializers of const-qualified vars.
authorMatt Turner <mattst88@gmail.com>
Thu, 23 May 2013 18:48:40 +0000 (11:48 -0700)
committerMatt Turner <mattst88@gmail.com>
Mon, 8 Jul 2013 19:46:56 +0000 (12:46 -0700)
Required by ARB_shading_language_420pack.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/ast_to_hir.cpp

index efbd72c1834e3872283b9ef08d6eb87751152150..cbd9ea35716eff283d22104860071625605f1d99 100644 (file)
@@ -2355,17 +2355,25 @@ process_initializer(ir_variable *var, ast_declaration *decl,
 
         ir_constant *constant_value = rhs->constant_expression_value();
         if (!constant_value) {
-           _mesa_glsl_error(& initializer_loc, state,
-                            "initializer of %s variable `%s' must be a "
-                            "constant expression",
-                            (type->qualifier.flags.q.constant)
-                            ? "const" : "uniform",
-                            decl->identifier);
-           if (var->type->is_numeric()) {
-              /* Reduce cascading errors. */
-              var->constant_value = ir_constant::zero(state, var->type);
-           }
-        } else {
+            /* 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
+             * initialized with constant expressions.
+             */
+            if (!state->ARB_shading_language_420pack_enable
+                || state->current_function == NULL) {
+               _mesa_glsl_error(& initializer_loc, state,
+                                "initializer of %s variable `%s' must be a "
+                                "constant expression",
+                                (type->qualifier.flags.q.constant)
+                                ? "const" : "uniform",
+                                decl->identifier);
+               if (var->type->is_numeric()) {
+                  /* Reduce cascading errors. */
+                  var->constant_value = ir_constant::zero(state, var->type);
+               }
+            }
+         } else {
            rhs = constant_value;
            var->constant_value = constant_value;
         }