glsl: Allow dynamically uniform sampler array indexing with 4.0/gs5
authorChris Forbes <chrisf@ijw.co.nz>
Sun, 3 Aug 2014 05:57:05 +0000 (17:57 +1200)
committerChris Forbes <chrisf@ijw.co.nz>
Tue, 12 Aug 2014 07:17:56 +0000 (19:17 +1200)
V2: Expand comment to explain what dynamically uniform expressions are
about.

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/glsl/ast_array_index.cpp

index 50f9987c8afe5ae991015f5de9d9659b3363f27a..5ca85f6ab3fc4ad611ed1a737d17f4ef728b14e3 100644 (file)
@@ -213,6 +213,13 @@ _mesa_ast_array_index_to_hir(void *mem_ctx,
        * as using a loop counter as the index to an array of samplers.  If the
        * loop in unrolled, the code should compile correctly.  Instead, emit a
        * warning.
+       *
+       * In GLSL 4.00 / ARB_gpu_shader5, this requirement is relaxed again to allow
+       * indexing with dynamically uniform expressions. Note that these are not
+       * required to be uniforms or expressions based on them, but merely that the
+       * values must not diverge between shader invocations run together. If the
+       * values *do* diverge, then the behavior of the operation requiring a
+       * dynamically uniform expression is undefined.
        */
       if (array->type->element_type()->is_sampler()) {
         if (!state->is_version(130, 100)) {
@@ -227,7 +234,7 @@ _mesa_ast_array_index_to_hir(void *mem_ctx,
                                  "expressions will be forbidden in GLSL 1.30 "
                                  "and later");
            }
-        } else {
+        } else if (!state->is_version(400, 0) && !state->ARB_gpu_shader5_enable) {
            _mesa_glsl_error(&loc, state,
                             "sampler arrays indexed with non-constant "
                             "expressions is forbidden in GLSL 1.30 and "