[Mesa-dev] [PATCH v5 27/70] glsl: Add std430 interface packing support to program_resource_visitor's member functions

Jordan Justen jordan.l.justen at intel.com
Tue Sep 15 23:53:50 PDT 2015


Subject line is too long.

On 2015-09-10 06:35:43, Iago Toral Quiroga wrote:
> From: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> 
> They are used to calculate the offset, array stride of uniform/shader storage
> buffer variables. Take into account this info to get the right value for std430.

Commit message line length is too long.

> 
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> ---
>  src/glsl/link_uniform_blocks.cpp | 19 +++++++---
>  src/glsl/link_uniforms.cpp       | 81 ++++++++++++++++++++++++++++------------
>  src/glsl/linker.h                |  6 ++-
>  3 files changed, 76 insertions(+), 30 deletions(-)
> 
> diff --git a/src/glsl/link_uniform_blocks.cpp b/src/glsl/link_uniform_blocks.cpp
> index c891d03..8f65f4a 100644
> --- a/src/glsl/link_uniform_blocks.cpp
> +++ b/src/glsl/link_uniform_blocks.cpp
> @@ -68,14 +68,18 @@ private:
>     }
>  
>     virtual void enter_record(const glsl_type *type, const char *,
> -                             bool row_major) {
> +                             bool row_major, const unsigned packing) {
>        assert(type->is_record());
> -      this->offset = glsl_align(
> +      if (packing == GLSL_INTERFACE_PACKING_STD430)
> +         this->offset = glsl_align(
> +            this->offset, type->std430_base_alignment(row_major));
> +      else
> +         this->offset = glsl_align(
>              this->offset, type->std140_base_alignment(row_major));
>     }
>  
>     virtual void leave_record(const glsl_type *type, const char *,
> -                             bool row_major) {
> +                             bool row_major, const unsigned packing) {
>        assert(type->is_record());
>  
>        /* If this is the last field of a structure, apply rule #9.  The
> @@ -85,12 +89,17 @@ private:
>         *     the member following the sub-structure is rounded up to the next
>         *     multiple of the base alignment of the structure."
>         */
> -      this->offset = glsl_align(
> +      if (packing == GLSL_INTERFACE_PACKING_STD430)
> +         this->offset = glsl_align(
> +            this->offset, type->std430_base_alignment(row_major));
> +      else
> +         this->offset = glsl_align(
>              this->offset, type->std140_base_alignment(row_major));
>     }
>  
>     virtual void visit_field(const glsl_type *type, const char *name,
>                              bool row_major, const glsl_type *,
> +                            const unsigned packing,
>                              bool /* last_field */)
>     {
>        assert(this->index < this->num_variables);
> @@ -122,7 +131,7 @@ private:
>        unsigned alignment = 0;
>        unsigned size = 0;
>  
> -      if (v->Type->interface_packing == GLSL_INTERFACE_PACKING_STD430) {
> +      if (packing == GLSL_INTERFACE_PACKING_STD430) {
>           alignment = type->std430_base_alignment(v->RowMajor);
>           size = type->std430_size(v->RowMajor);
>        } else {
> diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp
> index fefc1ec..1d678c2 100644
> --- a/src/glsl/link_uniforms.cpp
> +++ b/src/glsl/link_uniforms.cpp
> @@ -63,7 +63,9 @@ program_resource_visitor::process(const glsl_type *type, const char *name)
>            || type->without_array()->is_interface());
>  
>     char *name_copy = ralloc_strdup(NULL, name);
> -   recursion(type, &name_copy, strlen(name), false, NULL, false);
> +   unsigned packing = type->interface_packing;
> +
> +   recursion(type, &name_copy, strlen(name), false, NULL, packing, false);
>     ralloc_free(name_copy);
>  }
>  
> @@ -74,6 +76,10 @@ program_resource_visitor::process(ir_variable *var)
>     const bool row_major =
>        var->data.matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR;
>  
> +   const unsigned packing = var->get_interface_type() ?
> +      var->get_interface_type()->interface_packing :
> +      var->type->interface_packing;
> +
>     /* false is always passed for the row_major parameter to the other
>      * processing functions because no information is available to do
>      * otherwise.  See the warning in linker.h.
> @@ -110,7 +116,8 @@ program_resource_visitor::process(ir_variable *var)
>            * lowering is only applied to non-uniform interface blocks, so we
>            * can safely pass false for row_major.
>            */
> -         recursion(var->type, &name, new_length, row_major, NULL, false);
> +         recursion(var->type, &name, new_length, row_major, NULL, packing,
> +                   false);
>        }
>        ralloc_free(name);
>     } else if (var->data.from_named_ifc_block_nonarray) {
> @@ -134,22 +141,22 @@ program_resource_visitor::process(ir_variable *var)
>         * is only applied to non-uniform interface blocks, so we can safely
>         * pass false for row_major.
>         */
> -      recursion(var->type, &name, strlen(name), row_major, NULL, false);
> +      recursion(var->type, &name, strlen(name), row_major, NULL, packing, false);
>        ralloc_free(name);
>     } else if (t->without_array()->is_record()) {
>        char *name = ralloc_strdup(NULL, var->name);
> -      recursion(var->type, &name, strlen(name), row_major, NULL, false);
> +      recursion(var->type, &name, strlen(name), row_major, NULL, packing, false);
>        ralloc_free(name);
>     } else if (t->is_interface()) {
>        char *name = ralloc_strdup(NULL, var->type->name);
> -      recursion(var->type, &name, strlen(name), row_major, NULL, false);
> +      recursion(var->type, &name, strlen(name), row_major, NULL, packing, false);
>        ralloc_free(name);
>     } else if (t->is_array() && t->fields.array->is_interface()) {
>        char *name = ralloc_strdup(NULL, var->type->fields.array->name);
> -      recursion(var->type, &name, strlen(name), row_major, NULL, false);
> +      recursion(var->type, &name, strlen(name), row_major, NULL, packing, false);
>        ralloc_free(name);
>     } else {
> -      this->visit_field(t, var->name, row_major, NULL, false);
> +      this->visit_field(t, var->name, row_major, NULL, packing, false);
>     }
>  }
>  
> @@ -157,6 +164,7 @@ void
>  program_resource_visitor::recursion(const glsl_type *t, char **name,
>                                      size_t name_length, bool row_major,
>                                      const glsl_type *record_type,
> +                                    const unsigned packing,
>                                      bool last_field)
>  {
>     /* Records need to have each field processed individually.
> @@ -170,7 +178,7 @@ program_resource_visitor::recursion(const glsl_type *t, char **name,
>           record_type = t;
>  
>        if (t->is_record())
> -         this->enter_record(t, *name, row_major);
> +         this->enter_record(t, *name, row_major, packing);
>  
>        for (unsigned i = 0; i < t->length; i++) {
>          const char *field = t->fields.structure[i].name;
> @@ -204,6 +212,7 @@ program_resource_visitor::recursion(const glsl_type *t, char **name,
>           recursion(t->fields.structure[i].type, name, new_length,
>                     field_row_major,
>                     record_type,
> +                   packing,
>                     (i + 1) == t->length);
>  
>           /* Only the first leaf-field of the record gets called with the
> @@ -214,7 +223,7 @@ program_resource_visitor::recursion(const glsl_type *t, char **name,
>  
>        if (t->is_record()) {
>           (*name)[name_length] = '\0';
> -         this->leave_record(t, *name, row_major);
> +         this->leave_record(t, *name, row_major, packing);
>        }
>     } else if (t->is_array() && (t->fields.array->is_record()
>                                  || t->fields.array->is_interface())) {
> @@ -235,6 +244,7 @@ program_resource_visitor::recursion(const glsl_type *t, char **name,
>  
>           recursion(t->fields.array, name, new_length, row_major,
>                     record_type,
> +                   packing,
>                     (i + 1) == t->length);
>  
>           /* Only the first leaf-field of the record gets called with the
> @@ -243,7 +253,7 @@ program_resource_visitor::recursion(const glsl_type *t, char **name,
>           record_type = NULL;
>        }
>     } else {
> -      this->visit_field(t, *name, row_major, record_type, last_field);
> +      this->visit_field(t, *name, row_major, record_type, packing, last_field);
>     }
>  }
>  
> @@ -251,6 +261,7 @@ void
>  program_resource_visitor::visit_field(const glsl_type *type, const char *name,
>                                        bool row_major,
>                                        const glsl_type *,
> +                                      const unsigned,
>                                        bool /* last_field */)
>  {
>     visit_field(type, name, row_major);
> @@ -264,12 +275,14 @@ program_resource_visitor::visit_field(const glsl_struct_field *field)
>  }
>  
>  void
> -program_resource_visitor::enter_record(const glsl_type *, const char *, bool)
> +program_resource_visitor::enter_record(const glsl_type *, const char *, bool,
> +                                       const unsigned)
>  {
>  }
>  
>  void
> -program_resource_visitor::leave_record(const glsl_type *, const char *, bool)
> +program_resource_visitor::leave_record(const glsl_type *, const char *, bool,
> +                                       const unsigned)
>  {
>  }
>  
> @@ -579,25 +592,34 @@ private:
>     }
>  
>     virtual void enter_record(const glsl_type *type, const char *,
> -                             bool row_major) {
> +                             bool row_major, const unsigned packing) {
>        assert(type->is_record());
>        if (this->ubo_block_index == -1)
>           return;
> -      this->ubo_byte_offset = glsl_align(
> +      if (packing == GLSL_INTERFACE_PACKING_STD430)
> +         this->ubo_byte_offset = glsl_align(
> +            this->ubo_byte_offset, type->std430_base_alignment(row_major));
> +      else
> +         this->ubo_byte_offset = glsl_align(
>              this->ubo_byte_offset, type->std140_base_alignment(row_major));
>     }
>  
>     virtual void leave_record(const glsl_type *type, const char *,
> -                             bool row_major) {
> +                             bool row_major, const unsigned packing) {
>        assert(type->is_record());
>        if (this->ubo_block_index == -1)
>           return;
> -      this->ubo_byte_offset = glsl_align(
> +      if (packing == GLSL_INTERFACE_PACKING_STD430)
> +         this->ubo_byte_offset = glsl_align(
> +            this->ubo_byte_offset, type->std430_base_alignment(row_major));
> +      else
> +         this->ubo_byte_offset = glsl_align(
>              this->ubo_byte_offset, type->std140_base_alignment(row_major));
>     }
>  
>     virtual void visit_field(const glsl_type *type, const char *name,
>                              bool row_major, const glsl_type *record_type,
> +                            const unsigned packing,
>                              bool /* last_field */)
>     {
>        assert(!type->without_array()->is_record());
> @@ -667,14 +689,23 @@ private:
>        if (this->ubo_block_index != -1) {
>          this->uniforms[id].block_index = this->ubo_block_index;
>  
> -        const unsigned alignment = type->std140_base_alignment(row_major);
> +        unsigned alignment = type->std140_base_alignment(row_major);
> +         if (packing == GLSL_INTERFACE_PACKING_STD430)
> +            alignment = type->std430_base_alignment(row_major);

Appears that something is off in indentation here.

Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>

>          this->ubo_byte_offset = glsl_align(this->ubo_byte_offset, alignment);
>          this->uniforms[id].offset = this->ubo_byte_offset;
> -        this->ubo_byte_offset += type->std140_size(row_major);
> -
> -        if (type->is_array()) {
> -           this->uniforms[id].array_stride =
> -              glsl_align(type->fields.array->std140_size(row_major), 16);
> +         if (packing == GLSL_INTERFACE_PACKING_STD430)
> +            this->ubo_byte_offset += type->std430_size(row_major);
> +         else
> +            this->ubo_byte_offset += type->std140_size(row_major);
> +
> +         if (type->is_array()) {
> +            if (packing == GLSL_INTERFACE_PACKING_STD430)
> +               this->uniforms[id].array_stride =
> +                  type->fields.array->std430_array_stride(row_major);
> +            else
> +               this->uniforms[id].array_stride =
> +                  glsl_align(type->fields.array->std140_size(row_major), 16);
>          } else {
>             this->uniforms[id].array_stride = 0;
>          }
> @@ -685,7 +716,11 @@ private:
>              const unsigned items = row_major ? matrix->matrix_columns : matrix->vector_elements;
>  
>              assert(items <= 4);
> -            this->uniforms[id].matrix_stride = glsl_align(items * N, 16);
> +            if (packing == GLSL_INTERFACE_PACKING_STD430)
> +               this->uniforms[id].matrix_stride = items < 3 ? items * N :
> +                                                          glsl_align(items * N, 16);
> +            else
> +               this->uniforms[id].matrix_stride = glsl_align(items * N, 16);
>             this->uniforms[id].row_major = row_major;
>          } else {
>             this->uniforms[id].matrix_stride = 0;
> diff --git a/src/glsl/linker.h b/src/glsl/linker.h
> index ce3dc32..fb8f81e 100644
> --- a/src/glsl/linker.h
> +++ b/src/glsl/linker.h
> @@ -153,6 +153,7 @@ protected:
>      */
>     virtual void visit_field(const glsl_type *type, const char *name,
>                              bool row_major, const glsl_type *record_type,
> +                            const unsigned packing,
>                              bool last_field);
>  
>     /**
> @@ -176,10 +177,10 @@ protected:
>     virtual void visit_field(const glsl_struct_field *field);
>  
>     virtual void enter_record(const glsl_type *type, const char *name,
> -                             bool row_major);
> +                             bool row_major, const unsigned packing);
>  
>     virtual void leave_record(const glsl_type *type, const char *name,
> -                             bool row_major);
> +                             bool row_major, const unsigned packing);
>  
>  private:
>     /**
> @@ -191,6 +192,7 @@ private:
>      */
>     void recursion(const glsl_type *t, char **name, size_t name_length,
>                    bool row_major, const glsl_type *record_type,
> +                  const unsigned packing,
>                    bool last_field);
>  };
>  
> -- 
> 1.9.1
> 


More information about the mesa-dev mailing list