diff options
-rw-r--r-- | src/glsl/glsl_types.cpp | 14 | ||||
-rw-r--r-- | src/glsl/glsl_types.h | 8 |
2 files changed, 22 insertions, 0 deletions
diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp index 3c13fcea550..435b8667330 100644 --- a/src/glsl/glsl_types.cpp +++ b/src/glsl/glsl_types.cpp @@ -490,6 +490,20 @@ glsl_type::record_compare(const glsl_type *b) const if (this->interface_packing != b->interface_packing) return false; + /* From the GLSL 4.20 specification (Sec 4.2): + * + * "Structures must have the same name, sequence of type names, and + * type definitions, and field names to be considered the same type." + * + * GLSL ES behaves the same (Ver 1.00 Sec 4.2.4, Ver 3.00 Sec 4.2.5). + * + * Note that we cannot force type name check when comparing unnamed + * structure types, these have a unique name assigned during parsing. + */ + if (!this->is_anonymous() && !b->is_anonymous()) + if (strcmp(this->name, b->name) != 0) + return false; + for (unsigned i = 0; i < this->length; i++) { if (this->fields.structure[i].type != b->fields.structure[i].type) return false; diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h index 5a307bb7404..eeb14c27402 100644 --- a/src/glsl/glsl_types.h +++ b/src/glsl/glsl_types.h @@ -489,6 +489,14 @@ struct glsl_type { } /** + * Query if a type is unnamed/anonymous (named by the parser) + */ + bool is_anonymous() const + { + return !strncmp(name, "#anon", 5); + } + + /** * Get the type stripped of any arrays * * \return |