glsl: Permit non-ubo input interface arrays to use non-const indexing.
authorPaul Berry <stereotype441@gmail.com>
Mon, 22 Jul 2013 18:44:24 +0000 (11:44 -0700)
committerPaul Berry <stereotype441@gmail.com>
Fri, 2 Aug 2013 03:24:27 +0000 (20:24 -0700)
From the GLSL ES 3.00 spec:

    "All indexes used to index a uniform block array must be constant
    integral expressions."

Similar text exists in GLSL specs since 1.50.

When we implemented this, the only type of interface block supported
by Mesa was uniform blocks, so we required all indexes used to index
any interface block to be constant integral expressions.

Now that we are adding interface block support for GLSL 1.50, we need
a more specific check.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/ast_array_index.cpp

index 4baeb6f9dc6220fbb1140d441a2abef1a239adb3..51f6b10f365ca19a0f6b4e07fefaadae5eaf47cf 100644 (file)
@@ -117,7 +117,8 @@ _mesa_ast_array_index_to_hir(void *mem_ctx,
    } else if (const_index == NULL && array->type->is_array()) {
       if (array->type->array_size() == 0) {
         _mesa_glsl_error(&loc, state, "unsized array index must be constant");
-      } else if (array->type->fields.array->is_interface()) {
+      } else if (array->type->fields.array->is_interface()
+                 && array->variable_referenced()->mode == ir_var_uniform) {
         /* Page 46 in section 4.3.7 of the OpenGL ES 3.00 spec says:
          *
          *     "All indexes used to index a uniform block array must be