[Mesa-dev] [PATCH 42/74] glsl: propagate interface packing information to arrays of scalars, vectors.

Iago Toral Quiroga itoral at igalia.com
Thu May 14 07:06:45 PDT 2015


From: Samuel Iglesias Gonsalvez <siglesias at igalia.com>

Now std140 is not the only interface packing qualifier that can be used.

Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
---
 src/glsl/ast.h          | 10 +++++++++
 src/glsl/ast_to_hir.cpp | 54 +++++++++++++++++++++++++++++++++++++------------
 src/glsl/glsl_types.cpp | 16 +++++++++++----
 src/glsl/glsl_types.h   |  8 ++++++--
 4 files changed, 69 insertions(+), 19 deletions(-)

diff --git a/src/glsl/ast.h b/src/glsl/ast.h
index 6cbbf09..19034c4 100644
--- a/src/glsl/ast.h
+++ b/src/glsl/ast.h
@@ -681,6 +681,11 @@ public:
 				     struct _mesa_glsl_parse_state *state)
       const;
 
+   const struct glsl_type *glsl_type(const char **name,
+                                     struct _mesa_glsl_parse_state *state,
+                                     enum glsl_interface_packing packing)
+      const;
+
    virtual void print(void) const;
 
    ir_rvalue *hir(exec_list *, struct _mesa_glsl_parse_state *);
@@ -708,6 +713,11 @@ public:
 				     struct _mesa_glsl_parse_state *state)
       const;
 
+   const struct glsl_type *glsl_type(const char **name,
+                                     struct _mesa_glsl_parse_state *state,
+                                     enum glsl_interface_packing packing)
+      const;
+
    ast_type_qualifier qualifier;
    ast_type_specifier *specifier;
 };
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 8a3960a..dd693b0 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -1894,10 +1894,15 @@ process_array_size(exec_node *node,
 static const glsl_type *
 process_array_type(YYLTYPE *loc, const glsl_type *base,
                    ast_array_specifier *array_specifier,
-                   struct _mesa_glsl_parse_state *state)
+                   struct _mesa_glsl_parse_state *state,
+                   enum glsl_interface_packing packing)
 {
    const glsl_type *array_type = base;
 
+   /* Mesa uses std140 interface packing by default. */
+   if (packing != GLSL_INTERFACE_PACKING_STD430)
+      packing = GLSL_INTERFACE_PACKING_STD140;
+
    if (array_specifier != NULL) {
       if (base->is_array()) {
 
@@ -1926,11 +1931,12 @@ process_array_type(YYLTYPE *loc, const glsl_type *base,
       for (exec_node *node = array_specifier->array_dimensions.tail_pred;
            !node->is_head_sentinel(); node = node->prev) {
          unsigned array_size = process_array_size(node, state);
-         array_type = glsl_type::get_array_instance(array_type, array_size);
+         array_type = glsl_type::get_array_instance(array_type, array_size,
+                                                    packing);
       }
 
       if (array_specifier->is_unsized_array)
-         array_type = glsl_type::get_array_instance(array_type, 0);
+         array_type = glsl_type::get_array_instance(array_type, 0, packing);
    }
 
    return array_type;
@@ -1941,13 +1947,22 @@ const glsl_type *
 ast_type_specifier::glsl_type(const char **name,
                               struct _mesa_glsl_parse_state *state) const
 {
+   return glsl_type(name, state, GLSL_INTERFACE_PACKING_STD140);
+}
+
+const glsl_type *
+ast_type_specifier::glsl_type(const char **name,
+                              struct _mesa_glsl_parse_state *state,
+                              enum glsl_interface_packing packing) const
+{
    const struct glsl_type *type;
 
    type = state->symbols->get_type(this->type_name);
    *name = this->type_name;
 
    YYLTYPE loc = this->get_location();
-   type = process_array_type(&loc, type, this->array_specifier, state);
+   type = process_array_type(&loc, type, this->array_specifier, state,
+                             packing);
 
    return type;
 }
@@ -1956,7 +1971,14 @@ const glsl_type *
 ast_fully_specified_type::glsl_type(const char **name,
                                     struct _mesa_glsl_parse_state *state) const
 {
-   const struct glsl_type *type = this->specifier->glsl_type(name, state);
+   return glsl_type(name, state, GLSL_INTERFACE_PACKING_STD140);
+}
+const glsl_type *
+ast_fully_specified_type::glsl_type(const char **name,
+                                    struct _mesa_glsl_parse_state *state,
+                                    enum glsl_interface_packing packing) const
+{
+   const struct glsl_type *type = this->specifier->glsl_type(name, state, packing);
 
    if (type == NULL)
       return NULL;
@@ -3484,7 +3506,7 @@ ast_declarator_list::hir(exec_list *instructions,
       }
 
       var_type = process_array_type(&loc, decl_type, decl->array_specifier,
-                                    state);
+                                    state, GLSL_INTERFACE_PACKING_STD140);
 
       var = new(ctx) ir_variable(var_type, decl->identifier, ir_var_auto);
 
@@ -4026,7 +4048,8 @@ ast_parameter_declarator::hir(exec_list *instructions,
    /* This only handles "vec4 foo[..]".  The earlier specifier->glsl_type(...)
     * call already handled the "vec4[..] foo" case.
     */
-   type = process_array_type(&loc, type, this->array_specifier, state);
+   type = process_array_type(&loc, type, this->array_specifier, state,
+                             GLSL_INTERFACE_PACKING_STD140);
 
    if (!type->is_error() && type->is_unsized_array()) {
       _mesa_glsl_error(&loc, state, "arrays passed as parameters must have "
@@ -5234,7 +5257,8 @@ ast_process_structure_or_interface_block(exec_list *instructions,
                                          bool is_interface,
                                          enum glsl_matrix_layout matrix_layout,
                                          bool allow_reserved_names,
-                                         ir_variable_mode var_mode)
+                                         ir_variable_mode var_mode,
+                                         enum glsl_interface_packing packing)
 {
    unsigned decl_count = 0;
 
@@ -5270,7 +5294,7 @@ ast_process_structure_or_interface_block(exec_list *instructions,
       }
 
       const glsl_type *decl_type =
-         decl_list->type->glsl_type(& type_name, state);
+         decl_list->type->glsl_type(& type_name, state, packing);
 
       foreach_list_typed (ast_declaration, decl, link,
                           &decl_list->declarations) {
@@ -5339,7 +5363,8 @@ ast_process_structure_or_interface_block(exec_list *instructions,
          }
 
          field_type = process_array_type(&loc, decl_type,
-                                         decl->array_specifier, state);
+                                         decl->array_specifier, state,
+                                         packing);
          fields[i].type = field_type;
          fields[i].name = decl->identifier;
          fields[i].location = -1;
@@ -5452,7 +5477,8 @@ ast_struct_specifier::hir(exec_list *instructions,
                                                false,
                                                GLSL_MATRIX_LAYOUT_INHERITED,
                                                false /* allow_reserved_names */,
-                                               ir_var_auto);
+                                               ir_var_auto,
+                                               GLSL_INTERFACE_PACKING_STD140);
 
    validate_identifier(this->name, loc, state);
 
@@ -5607,7 +5633,8 @@ ast_interface_block::hir(exec_list *instructions,
                                                true,
                                                matrix_layout,
                                                redeclaring_per_vertex,
-                                               var_mode);
+                                               var_mode,
+                                               packing);
 
    state->struct_specifier_depth--;
 
@@ -5816,7 +5843,8 @@ ast_interface_block::hir(exec_list *instructions,
          }
 
          const glsl_type *block_array_type =
-            process_array_type(&loc, block_type, this->array_specifier, state);
+            process_array_type(&loc, block_type, this->array_specifier, state,
+                               GLSL_INTERFACE_PACKING_STD140);
 
          var = new(state) ir_variable(block_array_type,
                                       this->instance_name,
diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
index 8c534c0..5bacf60 100644
--- a/src/glsl/glsl_types.cpp
+++ b/src/glsl/glsl_types.cpp
@@ -340,10 +340,11 @@ _mesa_glsl_release_types(void)
 }
 
 
-glsl_type::glsl_type(const glsl_type *array, unsigned length) :
+glsl_type::glsl_type(const glsl_type *array, unsigned length,
+                     enum glsl_interface_packing packing) :
    base_type(GLSL_TYPE_ARRAY),
    sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
-   sampler_type(0), interface_packing(0),
+   sampler_type(0), interface_packing(packing),
    vector_elements(0), matrix_columns(0),
    length(length), name(NULL)
 {
@@ -637,6 +638,13 @@ glsl_type::get_sampler_instance(enum glsl_sampler_dim dim,
 const glsl_type *
 glsl_type::get_array_instance(const glsl_type *base, unsigned array_size)
 {
+   return get_array_instance(base, array_size, GLSL_INTERFACE_PACKING_STD140);
+}
+
+const glsl_type *
+glsl_type::get_array_instance(const glsl_type *base, unsigned array_size,
+                              enum glsl_interface_packing packing)
+{
    /* Generate a name using the base type pointer in the key.  This is
     * done because the name of the base type may not be unique across
     * shaders.  For example, two shaders may have different record types
@@ -649,14 +657,14 @@ glsl_type::get_array_instance(const glsl_type *base, unsigned array_size)
 
    if (array_types == NULL) {
       array_types = hash_table_ctor(64, hash_table_string_hash,
-				    hash_table_string_compare);
+                                    hash_table_string_compare);
    }
 
    const glsl_type *t = (glsl_type *) hash_table_find(array_types, key);
 
    if (t == NULL) {
       mtx_unlock(&glsl_type::mutex);
-      t = new glsl_type(base, array_size);
+      t = new glsl_type(base, array_size, packing);
       mtx_lock(&glsl_type::mutex);
 
       hash_table_insert(array_types, (void *) t, ralloc_strdup(mem_ctx, key));
diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
index 3224001..164e9af 100644
--- a/src/glsl/glsl_types.h
+++ b/src/glsl/glsl_types.h
@@ -259,7 +259,10 @@ struct glsl_type {
     * Get the instance of an array type
     */
    static const glsl_type *get_array_instance(const glsl_type *base,
-					      unsigned elements);
+                                              unsigned elements);
+   static const glsl_type *get_array_instance(const glsl_type *base,
+					      unsigned elements,
+                                              enum glsl_interface_packing packing);
 
    /**
     * Get the instance of a record type
@@ -702,7 +705,8 @@ private:
 	     enum glsl_interface_packing packing, const char *name);
 
    /** Constructor for array types */
-   glsl_type(const glsl_type *array, unsigned length);
+   glsl_type(const glsl_type *array, unsigned length,
+             enum glsl_interface_packing packing);
 
    /** Hash table containing the known array types. */
    static struct hash_table *array_types;
-- 
1.9.1



More information about the mesa-dev mailing list