glsl: Add type predicate to check whether a type contains any opaque types.
authorFrancisco Jerez <currojerez@riseup.net>
Fri, 20 Sep 2013 21:58:03 +0000 (14:58 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Tue, 29 Oct 2013 19:40:55 +0000 (12:40 -0700)
And use it to forbid comparisons of opaque operands.  According to the
GL 4.2 specification:

> Except for array indexing, structure member selection, and
> parentheses, opaque variables are not allowed to be operands in
> expressions.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/ast_to_hir.cpp
src/glsl/glsl_types.cpp
src/glsl/glsl_types.h

index fa0d8c94adeba411118ccaf3cdeaa861d4403719..71e57ec8cae9cf5c5a22ab75a381b185381893be 100644 (file)
@@ -1238,6 +1238,10 @@ ast_expression::hir(exec_list *instructions,
                  !state->check_version(120, 300, &loc,
                                        "array comparisons forbidden")) {
         error_emitted = true;
+      } else if ((op[0]->type->contains_opaque() ||
+                  op[1]->type->contains_opaque())) {
+         _mesa_glsl_error(&loc, state, "opaque type comparisons forbidden");
+         error_emitted = true;
       }
 
       if (error_emitted) {
index 281e6902e8596c94ac8e4e345a9dc7d541b57a12..f740130968c1cdbc3695c1e450daa018092c0a5c 100644 (file)
@@ -168,6 +168,24 @@ glsl_type::contains_integer() const
    }
 }
 
+bool
+glsl_type::contains_opaque() const {
+   switch (base_type) {
+   case GLSL_TYPE_SAMPLER:
+   case GLSL_TYPE_ATOMIC_UINT:
+      return true;
+   case GLSL_TYPE_ARRAY:
+      return element_type()->contains_opaque();
+   case GLSL_TYPE_STRUCT:
+      for (unsigned int i = 0; i < length; i++) {
+         if (fields.structure[i].type->contains_opaque())
+            return true;
+      }
+      return false;
+   default:
+      return false;
+   }
+}
 
 gl_texture_index
 glsl_type::sampler_index() const
index 69ad4b8655450c9b5d64b65d4b80d35421b57001..fdb1f3a6efbf0c099e24e99208b53cd9adc8bffc 100644 (file)
@@ -462,6 +462,11 @@ struct glsl_type {
       return atomic_size();
    }
 
+   /**
+    * Return whether a type contains any opaque types.
+    */
+   bool contains_opaque() const;
+
    /**
     * Query the full type of a matrix row
     *