Module: Mesa Branch: master Commit: 0ad44ce3735aa39391ab866c6a692eb76115b8c1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0ad44ce3735aa39391ab866c6a692eb76115b8c1
Author: Timothy <[email protected]> Date: Sat Sep 12 07:33:27 2015 +1000 glsl: add helper for calculating offsets for struct members V2: update comments Reviewed-by: Jason Ekstrand <[email protected]> --- src/glsl/glsl_types.cpp | 26 ++++++++++++++++++++++++++ src/glsl/glsl_types.h | 8 ++++++++ 2 files changed, 34 insertions(+) diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp index 755618a..97c79fa 100644 --- a/src/glsl/glsl_types.cpp +++ b/src/glsl/glsl_types.cpp @@ -1040,6 +1040,32 @@ glsl_type::component_slots() const } 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 { unsigned size = 0; diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h index 02a398f..860276a 100644 --- a/src/glsl/glsl_types.h +++ b/src/glsl/glsl_types.h @@ -292,6 +292,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. * _______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
