From: Timothy Date: Fri, 11 Sep 2015 21:33:27 +0000 (+1000) Subject: glsl: add helper for calculating offsets for struct members X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0ad44ce3735aa39391ab866c6a692eb76115b8c1;p=mesa.git glsl: add helper for calculating offsets for struct members V2: update comments Reviewed-by: Jason Ekstrand --- diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp index 755618ac28b..97c79fa4ca1 100644 --- a/src/glsl/glsl_types.cpp +++ b/src/glsl/glsl_types.cpp @@ -1039,6 +1039,32 @@ glsl_type::component_slots() const return 0; } +unsigned +glsl_type::record_location_offset(unsigned length) const +{ + unsigned offset = 0; + const glsl_type *t = this->without_array(); + if (t->is_record()) { + assert(length <= t->length); + + for (unsigned i = 0; i < length; i++) { + const glsl_type *st = t->fields.structure[i].type; + 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; + } else { + /* We dont worry about arrays here because unless the array + * contains a structure or another array it only takes up a single + * uniform slot. + */ + offset += 1; + } + } + } + return offset; +} + unsigned glsl_type::uniform_locations() const { diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h index 02a398f6112..860276a2b17 100644 --- a/src/glsl/glsl_types.h +++ b/src/glsl/glsl_types.h @@ -291,6 +291,14 @@ struct glsl_type { */ unsigned component_slots() const; + /** + * Calculate offset between the base location of the struct in + * uniform storage and a struct member. + * For the initial call, length is the index of the member to find the + * offset for. + */ + unsigned record_location_offset(unsigned length) const; + /** * Calculate the number of unique values from glGetUniformLocation for the * elements of the type.