From: Ian Romanick Date: Mon, 21 Jun 2010 23:05:00 +0000 (-0700) Subject: glsl_type: Add method to get number of slots used by a type X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=57bb893a46ced683792f8e7ebdffbb5c5a892b84;p=mesa.git glsl_type: Add method to get number of slots used by a type --- diff --git a/glsl_types.cpp b/glsl_types.cpp index 290756d453c..2b7c5bce30f 100644 --- a/glsl_types.cpp +++ b/glsl_types.cpp @@ -732,3 +732,31 @@ glsl_type::field_index(const char *name) const return -1; } + + +unsigned +glsl_type::component_slots() const +{ + switch (this->base_type) { + case GLSL_TYPE_UINT: + case GLSL_TYPE_INT: + case GLSL_TYPE_FLOAT: + case GLSL_TYPE_BOOL: + return this->components(); + + case GLSL_TYPE_STRUCT: { + unsigned size = 0; + + for (unsigned i = 0; i < this->length; i++) + size += this->fields.structure[i].type->component_slots(); + + return size; + } + + case GLSL_TYPE_ARRAY: + return this->length * this->fields.array->component_slots(); + + default: + return 0; + } +} diff --git a/glsl_types.h b/glsl_types.h index 3265016146d..939c173fd41 100644 --- a/glsl_types.h +++ b/glsl_types.h @@ -214,6 +214,15 @@ struct glsl_type { return vector_elements * matrix_columns; } + /** + * Calculate the number of components slots required to hold this type + * + * This is used to determine how many uniform or varying locations a type + * might occupy. + */ + unsigned component_slots() const; + + /** * Query whether or not a type is a scalar (non-vector and non-matrix). */