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 mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev