Fail linking if gl_FragCoord is used with different layout qualifiers in
seperate shader objects.
This fixes Piglit test shaders/link-mismatch-layout-01.
---
src/glsl/linker.cpp | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 2b30d2b..4415b8d 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -646,6 +646,40 @@ cross_validate_globals(struct gl_shader_program *prog,
mode_string(var), var->name);
return false;
}
+
+ /* Validate layout qualifiers for gl_FragCoord.
+ *
+ * From the ARB_fragment_coord_conventions specs:
+ *
+ * "If gl_FragCoord is redeclared in any fragment shader in a
program,
+ * it must be redeclared in all the fragment shaders in that
program
+ * that have a static use of gl_FragCoord. All redeclarations of
+ * gl_FragCoord in all fragment shaders in a single program must
have
+ * the same set of qualifiers."
+ */
+ if (strcmp(var->name, "gl_FragCoord") == 0) {
+ const bool layout_differs = var->pixel_center_integer !=
existing->pixel_center_integer ||
+ var->origin_upper_left !=
existing->origin_upper_left;
+
+ if (var->redeclared && layout_differs) {
+ linker_error(prog,
+ "All redeclarations of gl_FragCoord in all "
+ "fragment shaders in a single program must have "
+ "the same set of qualifiers.");
+ return false;
+ }
+
+ if (var->used && layout_differs) {
+ linker_error(prog,
+ "If gl_FragCoord is redeclared with a layout "
+ "qualifier in any fragment shader, it must be "
+ "redeclared with the same layout qualifier in "
+ "all fragment shaders that read from "
+ "gl_FragCoord.");
+ return false;
+ }
+ }
+
} else
variables.add_variable(var);
}
--
1.8.1.2
_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev