summaryrefslogtreecommitdiffstats
path: root/src/compiler/glsl/link_varyings.cpp
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2016-05-17 10:31:29 +1000
committerDave Airlie <airlied@redhat.com>2016-05-19 08:16:50 +1000
commit61b67892522c89800541ed4f266ab88e5f1db620 (patch)
tree3c6eb2949aed6549a7da6a73d7a7f4141e654325 /src/compiler/glsl/link_varyings.cpp
parent4dfa89e33c810bac02e2678814621d2f3868d58b (diff)
downloadexternal_mesa3d-61b67892522c89800541ed4f266ab88e5f1db620.zip
external_mesa3d-61b67892522c89800541ed4f266ab88e5f1db620.tar.gz
external_mesa3d-61b67892522c89800541ed4f266ab88e5f1db620.tar.bz2
glsl/linker: attempt to match anonymous structures at link
This is my attempt at fixing at least one of the UE4 bugs with GL4.3. If we are doing intrastage matching and hit anonymous structs, then we should do a record comparison instead of using the names. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95005 Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'src/compiler/glsl/link_varyings.cpp')
-rw-r--r--src/compiler/glsl/link_varyings.cpp24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp
index 59ce1a2..1782a96 100644
--- a/src/compiler/glsl/link_varyings.cpp
+++ b/src/compiler/glsl/link_varyings.cpp
@@ -226,15 +226,21 @@ cross_validate_types_and_qualifiers(struct gl_shader_program *prog,
* fragment language."
*/
if (!output->type->is_array() || !is_gl_identifier(output->name)) {
- linker_error(prog,
- "%s shader output `%s' declared as type `%s', "
- "but %s shader input declared as type `%s'\n",
- _mesa_shader_stage_to_string(producer_stage),
- output->name,
- output->type->name,
- _mesa_shader_stage_to_string(consumer_stage),
- input->type->name);
- return;
+ bool anon_matches = output->type->is_anonymous() &&
+ type_to_match->is_anonymous() &&
+ type_to_match->record_compare(output->type);
+
+ if (!anon_matches) {
+ linker_error(prog,
+ "%s shader output `%s' declared as type `%s', "
+ "but %s shader input declared as type `%s'\n",
+ _mesa_shader_stage_to_string(producer_stage),
+ output->name,
+ output->type->name,
+ _mesa_shader_stage_to_string(consumer_stage),
+ input->type->name);
+ return;
+ }
}
}