[Mesa-dev] [PATCH V7 21/24] glsl: build ubo name and indexing offset for AoA

Samuel Iglesias Gonsálvez siglesias at igalia.com
Thu Oct 8 08:16:28 PDT 2015


On 07/10/15 00:47, Timothy Arceri wrote:
> ---
>  src/glsl/lower_ubo_reference.cpp | 119 ++++++++++++++++++++++++++++-----------
>  1 file changed, 87 insertions(+), 32 deletions(-)
> 
> diff --git a/src/glsl/lower_ubo_reference.cpp b/src/glsl/lower_ubo_reference.cpp
> index 247620e..7e983d0 100644
> --- a/src/glsl/lower_ubo_reference.cpp
> +++ b/src/glsl/lower_ubo_reference.cpp
> @@ -203,55 +203,113 @@ static const char *
>  interface_field_name(void *mem_ctx, char *base_name, ir_rvalue *d,
>                       ir_rvalue **nonconst_block_index)
>  {
> -   ir_rvalue *previous_index = NULL;
>     *nonconst_block_index = NULL;
> +   char *name_copy = NULL;
> +   size_t base_length = 0;
> +
> +   /* Loop back through the IR until we find the uniform block */
> +   ir_rvalue *ir = d;
> +   while (ir != NULL) {
> +      switch (ir->ir_type) {
> +      case ir_type_dereference_variable: {
> +         /* Exit loop */
> +         ir = NULL;
> +         break;
> +      }
> +
> +      case ir_type_dereference_record: {
> +         ir_dereference_record *r = (ir_dereference_record *) ir;
> +         ir = r->record->as_dereference();
> +
> +         /* If we got here it means any previous array subscripts belong to
> +          * block members and not the block itself so skip over them in the
> +          * next pass.
> +          */
> +         d = ir;
> +         break;
> +      }
> +
> +      case ir_type_dereference_array: {
> +         ir_dereference_array *a = (ir_dereference_array *) ir;
> +         ir = a->array->as_dereference();
> +         break;
> +      }
> +
> +      case ir_type_swizzle: {
> +         ir_swizzle *s = (ir_swizzle *) ir;
> +         ir = s->val->as_dereference();
> +         break;
> +      }
> +
> +      default:
> +         assert(!"Should not get here.");
> +         break;
> +      }
> +   }
>  
>     while (d != NULL) {
>        switch (d->ir_type) {
>        case ir_type_dereference_variable: {
>           ir_dereference_variable *v = (ir_dereference_variable *) d;
> -         if (previous_index
> -             && v->var->is_interface_instance()
> -             && v->var->type->is_array()) {
> -
> -            ir_constant *const_index = previous_index->as_constant();
> -            if (!const_index) {
> -               *nonconst_block_index = previous_index;
> -               return ralloc_asprintf(mem_ctx, "%s[0]", base_name);
> -            } else {
> -               return ralloc_asprintf(mem_ctx,
> -                                      "%s[%d]",
> -                                      base_name,
> -                                      const_index->get_uint_component(0));
> -            }
> +         if (name_copy != NULL &&
> +             v->var->is_interface_instance() &&
> +             v->var->type->is_array()) {
> +            return name_copy;
>           } else {
> +            *nonconst_block_index = NULL;
>              return base_name;
>           }
>  
>           break;
>        }
>  
> -      case ir_type_dereference_record: {
> -         ir_dereference_record *r = (ir_dereference_record *) d;
> -
> -         d = r->record->as_dereference();
> -         break;
> -      }
> -
>        case ir_type_dereference_array: {
>           ir_dereference_array *a = (ir_dereference_array *) d;
> +         size_t new_length;
> +
> +         if (name_copy == NULL) {
> +            name_copy = ralloc_strdup(mem_ctx, base_name);
> +            base_length = strlen(name_copy);
> +         }
> +
> +         /* For arrays of arrays we start at the innermost array and work our
> +          * way out so we need to insert the subscript at the base of the
> +          * name string rather than just attaching it to the end.
> +          */
> +         new_length = base_length;
> +         ir_constant *const_index = a->array_index->as_constant();
> +         char *end = ralloc_strdup(NULL, &name_copy[new_length]);
> +         if (!const_index) {
> +            ir_rvalue *array_index = a->array_index;
> +            if (array_index->type != glsl_type::uint_type)
> +               array_index = i2u(array_index);
> +
> +            if (a->array->type->fields.array->is_array()) {
> +               ir_constant *base_size = new(mem_ctx)
> +                  ir_constant(a->array->type->fields.array->arrays_of_arrays_size());
> +               array_index = mul(array_index, base_size);
> +            }
> +
> +            if (*nonconst_block_index) {
> +               *nonconst_block_index = add(*nonconst_block_index, array_index);
> +            } else {
> +               *nonconst_block_index = array_index;
> +            }
> +
> +            ralloc_asprintf_rewrite_tail(&name_copy, &new_length, "[0]%s",
> +                                         end);
> +         } else {
> +            ralloc_asprintf_rewrite_tail(&name_copy, &new_length, "[%d]%s",
> +                                         const_index->get_uint_component(0),
> +                                         end);
> +         }
> +         ralloc_free(end);
>  
>           d = a->array->as_dereference();
> -         previous_index = a->array_index;
>  
>           break;
>        }
> -      case ir_type_swizzle: {
> -         ir_swizzle *s = (ir_swizzle *) d;
>  
> -         d = s->val->as_dereference();
> -         break;
> -      }
>        default:
>           assert(!"Should not get here.");
>           break;
> @@ -285,8 +343,6 @@ lower_ubo_reference_visitor::setup_for_load_or_store(ir_variable *var,
>           ir_constant *index = new(mem_ctx) ir_constant(i);
>  
>           if (nonconst_block_index) {
> -            if (nonconst_block_index->type != glsl_type::uint_type)
> -               nonconst_block_index = i2u(nonconst_block_index);
>              this->uniform_block = add(nonconst_block_index, index);
>           } else {
>              this->uniform_block = index;
> @@ -335,7 +391,7 @@ lower_ubo_reference_visitor::setup_for_load_or_store(ir_variable *var,
>              if (deref_array->array->type->is_double())
>                 array_stride *= 2;
>              *matrix_columns = deref_array->array->type->matrix_columns;
> -         } else if (deref_array->type->is_interface()) {
> +         } else if (deref_array->type->without_array()->is_interface()) {

This change and the other below don't seem to be related to what the
commit log says.

You can create a separate patch for them and add my R-b to it.

For the rest of this patch,

Reviewed-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>

Thanks,

Sam

>              /* We're processing an array dereference of an interface instance
>               * array. The thing being dereferenced *must* be a variable
>               * dereference because interfaces cannot be embedded in other
> @@ -344,7 +400,6 @@ lower_ubo_reference_visitor::setup_for_load_or_store(ir_variable *var,
>               * interface instance array will have the same offsets relative to
>               * the base of the block that backs them.
>               */
> -            assert(deref_array->array->as_dereference_variable());
>              deref = deref_array->array->as_dereference();
>              break;
>           } else {
> 


More information about the mesa-dev mailing list