Merge branch 'master' of ../mesa into vulkan
[mesa.git] / src / glsl / glsl_types.h
index 0a8a0b97dc908cb5d5701bed255a2ae5059f69f9..b83e1ca3d2cbca3c2f65a41443171a27e700e7e7 100644 (file)
@@ -78,7 +78,8 @@ enum glsl_sampler_dim {
 enum glsl_interface_packing {
    GLSL_INTERFACE_PACKING_STD140,
    GLSL_INTERFACE_PACKING_SHARED,
-   GLSL_INTERFACE_PACKING_PACKED
+   GLSL_INTERFACE_PACKING_PACKED,
+   GLSL_INTERFACE_PACKING_STD430
 };
 
 enum glsl_matrix_layout {
@@ -299,6 +300,14 @@ struct glsl_type {
     */
    unsigned component_slots() const;
 
+   /**
+    * Calculate offset between the base location of the struct in
+    * uniform storage and a struct member.
+    * For the initial call, length is the index of the member to find the
+    * offset for.
+    */
+   unsigned record_location_offset(unsigned length) const;
+
    /**
     * Calculate the number of unique values from glGetUniformLocation for the
     * elements of the type.
@@ -333,6 +342,25 @@ struct glsl_type {
     */
    unsigned std140_size(bool row_major) const;
 
+   /**
+    * Alignment in bytes of the start of this type in a std430 shader
+    * storage block.
+    */
+   unsigned std430_base_alignment(bool row_major) const;
+
+   /**
+    * Calculate array stride in bytes of this type in a std430 shader storage
+    * block.
+    */
+   unsigned std430_array_stride(bool row_major) const;
+
+   /**
+    * Size in bytes of this type in a std430 shader storage block.
+    *
+    * Note that this is not GL_BUFFER_SIZE
+    */
+   unsigned std430_size(bool row_major) const;
+
    /**
     * \brief Can this type be implicitly converted to another?
     *
@@ -557,6 +585,25 @@ struct glsl_type {
       return t;
    }
 
+   /**
+    * Return the total number of elements in an array including the elements
+    * in arrays of arrays.
+    */
+   unsigned arrays_of_arrays_size() const
+   {
+      if (!is_array())
+         return 0;
+
+      unsigned size = length;
+      const glsl_type *base_type = fields.array;
+
+      while (base_type->is_array()) {
+         size = size * base_type->length;
+         base_type = base_type->fields.array;
+      }
+      return size;
+   }
+
    /**
     * Return the amount of atomic counter storage required for a type.
     */
@@ -801,6 +848,16 @@ struct glsl_struct_field {
     */
    int stream;
 
+   /**
+    * Image qualifiers, applicable to buffer variables defined in shader
+    * storage buffer objects (SSBOs)
+    */
+   unsigned image_read_only:1;
+   unsigned image_write_only:1;
+   unsigned image_coherent:1;
+   unsigned image_volatile:1;
+   unsigned image_restrict:1;
+
 #ifdef __cplusplus
    glsl_struct_field(const struct glsl_type *_type, const char *_name)
       : type(_type), name(_name), location(-1), interpolation(0), centroid(0),