summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKalyan Kondapally <[email protected]>2014-09-22 15:11:29 +0300
committerTapani Pälli <[email protected]>2014-09-26 08:29:10 +0300
commite018ea81bf580da7c771c5fd071343de92560083 (patch)
treed6964e8281df632a99dbb5871b73c710065d16d1
parent1cb81d3a9b65781802f641fb3e4435edfed7f14a (diff)
glsl: Structures must have same name to be considered same type.
According to GLSL(4.2) and GLSL-ES (1.0, 3.0) spec, Structures must have the same name to be considered same type. We currently ignore the name check while checking if two records are same. This patch fixes this. Patch fixes failing tests in WebGL conformance test 'shaders-with-uniform-structs' when running Chrome on OpenGL ES. v2: Do not force name comparison with unnamed types (Tapani) v3: Cleanups (Matt) Signed-off-by: Kalyan Kondapally <[email protected]> Signed-off-by: Tapani Pälli <[email protected]> Reviewed-by: Anuj Phogat <[email protected]> Reviewed-by: Matt Turner <[email protected]> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=83934
-rw-r--r--src/glsl/glsl_types.cpp14
-rw-r--r--src/glsl/glsl_types.h8
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