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

Reply via email to