Reviewed-by: Iago Toral Quiroga <ito...@igalia.com> On Sat, 2015-11-14 at 13:43 -0800, Jordan Justen wrote: > Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com> > Cc: Samuel Iglesias Gonsalvez <sigles...@igalia.com> > Cc: Iago Toral Quiroga <ito...@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 {
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev