From: Tapani Pälli Date: Thu, 5 Jun 2014 04:37:16 +0000 (+0300) Subject: glsl: add glsl_type::uniform_locations() helper function X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=dadc3d04f034327b4afeeadf9a860e1b620fab37;p=mesa.git glsl: add glsl_type::uniform_locations() helper function This function calculates the number of unique values from glGetUniformLocation for the elements of the type. Signed-off-by: Tapani Pälli Reviewed-by: Ian Romanick --- diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp index 62a908782b1..f9cd258fefa 100644 --- a/src/glsl/glsl_types.cpp +++ b/src/glsl/glsl_types.cpp @@ -675,6 +675,32 @@ glsl_type::component_slots() const return 0; } +unsigned +glsl_type::uniform_locations() const +{ + if (this->is_matrix()) + return 1; + + unsigned size = 0; + + switch (this->base_type) { + case GLSL_TYPE_STRUCT: + case GLSL_TYPE_INTERFACE: + for (unsigned i = 0; i < this->length; i++) + size += this->fields.structure[i].type->uniform_locations(); + return size; + case GLSL_TYPE_ARRAY: + return this->length * this->fields.array->uniform_locations(); + default: + break; + } + + /* The location count for many types match with component_slots() result, + * all expections should be handled above. + */ + return component_slots(); +} + bool glsl_type::can_implicitly_convert_to(const glsl_type *desired, _mesa_glsl_parse_state *state) const diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h index 35a4e6acc8c..f6d4a02ab68 100644 --- a/src/glsl/glsl_types.h +++ b/src/glsl/glsl_types.h @@ -255,6 +255,12 @@ struct glsl_type { */ unsigned component_slots() const; + /** + * Calculate the number of unique values from glGetUniformLocation for the + * elements of the type. + */ + unsigned uniform_locations() const; + /** * Calculate the number of attribute slots required to hold this type *