[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