From 8b6f8fe5030a0bcc6cce6bf3aae48795802b6fb6 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Tue, 15 Mar 2016 17:52:06 +1100 Subject: glsl: add helper for counting varyings This will be used to get a count of the number of varying name strings we are required to generate for use with the query api. Reviewed-by: Dave Airlie --- src/compiler/glsl_types.cpp | 32 ++++++++++++++++++++++++++++++++ src/compiler/glsl_types.h | 6 ++++++ 2 files changed, 38 insertions(+) (limited to 'src') diff --git a/src/compiler/glsl_types.cpp b/src/compiler/glsl_types.cpp index c6a742e3aaf..39585bff3b9 100644 --- a/src/compiler/glsl_types.cpp +++ b/src/compiler/glsl_types.cpp @@ -1350,6 +1350,38 @@ glsl_type::uniform_locations() const } } +unsigned +glsl_type::varying_count() const +{ + unsigned size = 0; + + switch (this->base_type) { + case GLSL_TYPE_UINT: + case GLSL_TYPE_INT: + case GLSL_TYPE_FLOAT: + case GLSL_TYPE_DOUBLE: + case GLSL_TYPE_BOOL: + return 1; + + case GLSL_TYPE_STRUCT: + case GLSL_TYPE_INTERFACE: + for (unsigned i = 0; i < this->length; i++) + size += this->fields.structure[i].type->varying_count(); + return size; + case GLSL_TYPE_ARRAY: + /* Don't count innermost array elements */ + if (this->without_array()->is_record() || + this->without_array()->is_interface() || + this->fields.array->is_array()) + return this->length * this->fields.array->varying_count(); + else + return this->fields.array->varying_count(); + default: + assert(!"unsupported varying type"); + return 0; + } +} + bool glsl_type::can_implicitly_convert_to(const glsl_type *desired, _mesa_glsl_parse_state *state) const diff --git a/src/compiler/glsl_types.h b/src/compiler/glsl_types.h index 4f4cfea1201..dd46479755a 100644 --- a/src/compiler/glsl_types.h +++ b/src/compiler/glsl_types.h @@ -326,6 +326,12 @@ struct glsl_type { */ unsigned uniform_locations() const; + /** + * Used to count the number of varyings contained in the type ignoring + * innermost array elements. + */ + unsigned varying_count() const; + /** * Calculate the number of attribute slots required to hold this type * -- cgit v1.2.3