From 0ad44ce3735aa39391ab866c6a692eb76115b8c1 Mon Sep 17 00:00:00 2001 From: Timothy Date: Sat, 12 Sep 2015 07:33:27 +1000 Subject: [PATCH] glsl: add helper for calculating offsets for struct members V2: update comments Reviewed-by: Jason Ekstrand --- 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 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. -- 2.30.2