[Mesa-dev] [PATCH 17/36] glsl ubo/ssbo: Move is_dereferenced_thing_row_major into lower_buffer_access

Iago Toral itoral at igalia.com
Mon Nov 16 04:42:51 PST 2015


Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>

On Sat, 2015-11-14 at 13:43 -0800, Jordan Justen wrote:
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> Cc: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> Cc: Iago Toral Quiroga <itoral at igalia.com>
> ---
>  src/glsl/lower_buffer_access.cpp | 90 ++++++++++++++++++++++++++++++++++++++++
>  src/glsl/lower_buffer_access.h   |  2 +
>  src/glsl/lower_ubo_reference.cpp | 90 ----------------------------------------
>  3 files changed, 92 insertions(+), 90 deletions(-)
> 
> diff --git a/src/glsl/lower_buffer_access.cpp b/src/glsl/lower_buffer_access.cpp
> index e0b5a2f..b7fc107 100644
> --- a/src/glsl/lower_buffer_access.cpp
> +++ b/src/glsl/lower_buffer_access.cpp
> @@ -304,4 +304,94 @@ is_dereferenced_thing_row_major(const ir_dereference *deref)
>     return false;
>  }
>  
> +/**
> + * Determine if a thing being dereferenced is row-major
> + *
> + * There is some trickery here.
> + *
> + * If the thing being dereferenced is a member of uniform block \b without an
> + * instance name, then the name of the \c ir_variable is the field name of an
> + * interface type.  If this field is row-major, then the thing referenced is
> + * row-major.
> + *
> + * If the thing being dereferenced is a member of uniform block \b with an
> + * instance name, then the last dereference in the tree will be an
> + * \c ir_dereference_record.  If that record field is row-major, then the
> + * thing referenced is row-major.
> + */
> +bool
> +lower_buffer_access::is_dereferenced_thing_row_major(const ir_rvalue *deref)
> +{
> +   bool matrix = false;
> +   const ir_rvalue *ir = deref;
> +
> +   while (true) {
> +      matrix = matrix || ir->type->without_array()->is_matrix();
> +
> +      switch (ir->ir_type) {
> +      case ir_type_dereference_array: {
> +         const ir_dereference_array *const array_deref =
> +            (const ir_dereference_array *) ir;
> +
> +         ir = array_deref->array;
> +         break;
> +      }
> +
> +      case ir_type_dereference_record: {
> +         const ir_dereference_record *const record_deref =
> +            (const ir_dereference_record *) ir;
> +
> +         ir = record_deref->record;
> +
> +         const int idx = ir->type->field_index(record_deref->field);
> +         assert(idx >= 0);
> +
> +         const enum glsl_matrix_layout matrix_layout =
> +            glsl_matrix_layout(ir->type->fields.structure[idx].matrix_layout);
> +
> +         switch (matrix_layout) {
> +         case GLSL_MATRIX_LAYOUT_INHERITED:
> +            break;
> +         case GLSL_MATRIX_LAYOUT_COLUMN_MAJOR:
> +            return false;
> +         case GLSL_MATRIX_LAYOUT_ROW_MAJOR:
> +            return matrix || deref->type->without_array()->is_record();
> +         }
> +
> +         break;
> +      }
> +
> +      case ir_type_dereference_variable: {
> +         const ir_dereference_variable *const var_deref =
> +            (const ir_dereference_variable *) ir;
> +
> +         const enum glsl_matrix_layout matrix_layout =
> +            glsl_matrix_layout(var_deref->var->data.matrix_layout);
> +
> +         switch (matrix_layout) {
> +         case GLSL_MATRIX_LAYOUT_INHERITED:
> +            assert(!matrix);
> +            return false;
> +         case GLSL_MATRIX_LAYOUT_COLUMN_MAJOR:
> +            return false;
> +         case GLSL_MATRIX_LAYOUT_ROW_MAJOR:
> +            return matrix || deref->type->without_array()->is_record();
> +         }
> +
> +         unreachable("invalid matrix layout");
> +         break;
> +      }
> +
> +      default:
> +         return false;
> +      }
> +   }
> +
> +   /* The tree must have ended with a dereference that wasn't an
> +    * ir_dereference_variable.  That is invalid, and it should be impossible.
> +    */
> +   unreachable("invalid dereference tree");
> +   return false;
> +}
> +
>  } /* namespace lower_buffer_access */
> diff --git a/src/glsl/lower_buffer_access.h b/src/glsl/lower_buffer_access.h
> index 3138963..0698e22 100644
> --- a/src/glsl/lower_buffer_access.h
> +++ b/src/glsl/lower_buffer_access.h
> @@ -48,6 +48,8 @@ public:
>                      bool row_major, int matrix_columns,
>                      unsigned int packing, unsigned int write_mask);
>  
> +   bool is_dereferenced_thing_row_major(const ir_rvalue *deref);
> +
>     void *mem_ctx;
>  };
>  
> diff --git a/src/glsl/lower_ubo_reference.cpp b/src/glsl/lower_ubo_reference.cpp
> index 8de4f5e..7e1221b 100644
> --- a/src/glsl/lower_ubo_reference.cpp
> +++ b/src/glsl/lower_ubo_reference.cpp
> @@ -42,96 +42,6 @@
>  
>  using namespace ir_builder;
>  
> -/**
> - * Determine if a thing being dereferenced is row-major
> - *
> - * There is some trickery here.
> - *
> - * If the thing being dereferenced is a member of uniform block \b without an
> - * instance name, then the name of the \c ir_variable is the field name of an
> - * interface type.  If this field is row-major, then the thing referenced is
> - * row-major.
> - *
> - * If the thing being dereferenced is a member of uniform block \b with an
> - * instance name, then the last dereference in the tree will be an
> - * \c ir_dereference_record.  If that record field is row-major, then the
> - * thing referenced is row-major.
> - */
> -static bool
> -is_dereferenced_thing_row_major(const ir_rvalue *deref)
> -{
> -   bool matrix = false;
> -   const ir_rvalue *ir = deref;
> -
> -   while (true) {
> -      matrix = matrix || ir->type->without_array()->is_matrix();
> -
> -      switch (ir->ir_type) {
> -      case ir_type_dereference_array: {
> -         const ir_dereference_array *const array_deref =
> -            (const ir_dereference_array *) ir;
> -
> -         ir = array_deref->array;
> -         break;
> -      }
> -
> -      case ir_type_dereference_record: {
> -         const ir_dereference_record *const record_deref =
> -            (const ir_dereference_record *) ir;
> -
> -         ir = record_deref->record;
> -
> -         const int idx = ir->type->field_index(record_deref->field);
> -         assert(idx >= 0);
> -
> -         const enum glsl_matrix_layout matrix_layout =
> -            glsl_matrix_layout(ir->type->fields.structure[idx].matrix_layout);
> -
> -         switch (matrix_layout) {
> -         case GLSL_MATRIX_LAYOUT_INHERITED:
> -            break;
> -         case GLSL_MATRIX_LAYOUT_COLUMN_MAJOR:
> -            return false;
> -         case GLSL_MATRIX_LAYOUT_ROW_MAJOR:
> -            return matrix || deref->type->without_array()->is_record();
> -         }
> -
> -         break;
> -      }
> -
> -      case ir_type_dereference_variable: {
> -         const ir_dereference_variable *const var_deref =
> -            (const ir_dereference_variable *) ir;
> -
> -         const enum glsl_matrix_layout matrix_layout =
> -            glsl_matrix_layout(var_deref->var->data.matrix_layout);
> -
> -         switch (matrix_layout) {
> -         case GLSL_MATRIX_LAYOUT_INHERITED:
> -            assert(!matrix);
> -            return false;
> -         case GLSL_MATRIX_LAYOUT_COLUMN_MAJOR:
> -            return false;
> -         case GLSL_MATRIX_LAYOUT_ROW_MAJOR:
> -            return matrix || deref->type->without_array()->is_record();
> -         }
> -
> -         unreachable("invalid matrix layout");
> -         break;
> -      }
> -
> -      default:
> -         return false;
> -      }
> -   }
> -
> -   /* The tree must have ended with a dereference that wasn't an
> -    * ir_dereference_variable.  That is invalid, and it should be impossible.
> -    */
> -   unreachable("invalid dereference tree");
> -   return false;
> -}
> -
>  namespace {
>  class lower_ubo_reference_visitor :
>        public lower_buffer_access::lower_buffer_access {




More information about the mesa-dev mailing list