[Mesa-dev] [PATCH V7 09/24] glsl: calculate AoA uniform offset correctly for structs
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Fri Oct 9 00:21:18 PDT 2015
Reviewed-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>
On 07/10/15 00:47, Timothy Arceri wrote:
> This allows the correct offset to be calculated for use in indirect
> indexing of samplers.
> ---
> src/glsl/glsl_types.cpp | 17 ++++++++++++++++-
> 1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
> index 25927f6..a1ee505 100644
> --- a/src/glsl/glsl_types.cpp
> +++ b/src/glsl/glsl_types.cpp
> @@ -1071,7 +1071,22 @@ glsl_type::record_location_offset(unsigned length) const
> const glsl_type *wa = st->without_array();
> if (wa->is_record()) {
> unsigned r_offset = wa->record_location_offset(wa->length);
> - offset += st->is_array() ? st->length * r_offset : r_offset;
> + offset += st->is_array() ?
> + st->arrays_of_arrays_size() * r_offset : r_offset;
> + } else if (st->is_array() && st->fields.array->is_array()) {
> + unsigned outer_array_size = st->length;
> + const glsl_type *base_type = st->fields.array;
> +
> + /* For arrays of arrays the outer arrays take up a uniform
> + * slot for each element. The innermost array elements share a
> + * single slot so we ignore the innermost array when calculating
> + * the offset.
> + */
> + while (base_type->fields.array->is_array()) {
> + outer_array_size = outer_array_size * base_type->length;
> + base_type = base_type->fields.array;
> + }
> + offset += outer_array_size;
> } else {
> /* We dont worry about arrays here because unless the array
> * contains a structure or another array it only takes up a single
>
More information about the mesa-dev
mailing list