On 02/25/2014 01:15 PM, Anuj Phogat wrote:
On Tue, Feb 25, 2014 at 7:47 AM, Ian Romanick <i...@freedesktop.org> wrote:

On 02/24/2014 05:34 PM, Anuj Phogat wrote:

Section 4.3.8.1, page 39 of GLSL 1.50 spec says:
    "Within any shader, the first redeclarations of gl_FragCoord
     must appear before any use of gl_FragCoord."

GLSL compiler should generate an error in following case:

vec4 p = gl_FragCoord;
layout(origin_upper_left) in vec4 gl_FragCoord;

void main()
{
}

Signed-off-by: Anuj Phogat <anuj.pho...@gmail.com>
Cc: <mesa-sta...@lists.freedesktop.org>
---
   src/glsl/ast_to_hir.cpp | 16 ++++++++++++++++
   1 file changed, 16 insertions(+)

diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 9fe3095..f5dacfd 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -2490,6 +2490,22 @@ apply_type_qualifier_to_variable(const struct 
ast_type_qualifier *qual,
      }

      if (strcmp(var->name, "gl_FragCoord") == 0) {
+      /* Section 4.3.8.1, page 39 of GLSL 1.50 spec says:
+       *
+       *    "Within any shader, the first redeclarations of gl_FragCoord
+       *     must appear before any use of gl_FragCoord."
+       *
+       * Generate a compiler error if above condition is not met by the
+       * fragment shader.
+       */
+      ir_variable *earlier = state->symbols->get_variable("gl_FragCoord");
+      if (earlier != NULL &&
+          earlier->data.used &&
+          !state->fs_redeclares_gl_fragcoord) {


I don't think '!state->fs_redeclares_gl_fragcoord' should be there. What about 
a shader like:

     layout(origin_upper_left) in vec4 gl_FragCoord;

     vec4 p = gl_FragCoord;
     layout(origin_upper_left) in vec4 gl_FragCoord;

     void main()
     {
     }

This shader compiles successfully as I expected. Only the first re-declaration
must appear before gl_FragCoord usage. Do you interpret the spec differently?
I've added new piglit tests which cover this case as well:
http://patchwork.freedesktop.org/project/piglit/list/?submitter=Anuj+Phogat&q=glsl-1.50

I overlooked "the first" in that sentence. Your code should be correct, then. :)

+         _mesa_glsl_error(loc, state,
+                          "gl_FragCoord used before its first redeclaration "
+                          "in fragment shader");
+      }

         /* Make sure all gl_FragCoord redeclarations specify the same layout
          * qualifiers.


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to