glsl/ast: Keep track of type qualifiers defined by ARB_shader_image_load_store.
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 12 Feb 2014 15:56:01 +0000 (16:56 +0100)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 12 Feb 2014 17:44:05 +0000 (18:44 +0100)
v2: Add comment next to the read_only and write_only qualifier flags.
    Change temporary copies of the type qualifier mask to use uint64_t
    too.

Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/glsl/ast.h
src/glsl/ast_type.cpp
src/glsl/glsl_parser.yy

index 61fd923bcf942da4ce08fc261b11672ba403eeb5..cd913ab34ebc36b073cfa7021191c2582459e280 100644 (file)
@@ -466,12 +466,23 @@ struct ast_type_qualifier {
           * local_size_x, and so on.
           */
          unsigned local_size:3;
+
+        /** \name Layout and memory qualifiers for ARB_shader_image_load_store. */
+        /** \{ */
+        unsigned early_fragment_tests:1;
+        unsigned explicit_image_format:1;
+        unsigned coherent:1;
+        unsigned _volatile:1;
+        unsigned _restrict:1;
+        unsigned read_only:1; /**< "readonly" qualifier. */
+        unsigned write_only:1; /**< "writeonly" qualifier. */
+        /** \} */
       }
       /** \brief Set of flags, accessed by name. */
       q;
 
       /** \brief Set of flags, accessed as a bitmask. */
-      unsigned i;
+      uint64_t i;
    } flags;
 
    /** Precision of the type (highp/medium/lowp). */
@@ -522,6 +533,25 @@ struct ast_type_qualifier {
     */
    int local_size[3];
 
+   /**
+    * Image format specified with an ARB_shader_image_load_store
+    * layout qualifier.
+    *
+    * \note
+    * This field is only valid if \c explicit_image_format is set.
+    */
+   GLenum image_format;
+
+   /**
+    * Base type of the data read from or written to this image.  Only
+    * the following enumerants are allowed: GLSL_TYPE_UINT,
+    * GLSL_TYPE_INT, GLSL_TYPE_FLOAT.
+    *
+    * \note
+    * This field is only valid if \c explicit_image_format is set.
+    */
+   glsl_base_type image_base_type;
+
    /**
     * Return true if and only if an interpolation qualifier is present.
     */
index bbc430808014b803a79278ff560ab43ab3066624..200566c6d3fb87b5f4e793123982a70510b4a025 100644 (file)
@@ -190,6 +190,11 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
    if (q.precision != ast_precision_none)
       this->precision = q.precision;
 
+   if (q.flags.q.explicit_image_format) {
+      this->image_format = q.image_format;
+      this->image_base_type = q.image_base_type;
+   }
+
    return true;
 }
 
index dc35c1a51b3ee1e8f5d8ffaa504043e4a52fa6c7..ddbcfb396da34c120fa11a77212c889107d873b7 100644 (file)
@@ -2228,7 +2228,7 @@ basic_interface_block:
                                "an instance name are not allowed");
       }
 
-      unsigned interface_type_mask;
+      uint64_t interface_type_mask;
       struct ast_type_qualifier temp_type_qualifier;
 
       /* Get a bitmask containing only the in/out/uniform flags, allowing us
@@ -2244,7 +2244,7 @@ basic_interface_block:
        * production rule guarantees that only one bit will be set (and
        * it will be in/out/uniform).
        */
-       unsigned block_interface_qualifier = $1.flags.i;
+      uint64_t block_interface_qualifier = $1.flags.i;
 
       block->layout.flags.i |= block_interface_qualifier;