<p dir="ltr">You should be able to check for the slot, which is faster than a strcmp. Also in the second if, you can hoist the invariant check up to the second containing if to avoid a bit of unnecessary work.</p>
<div class="gmail_quote">On May 9, 2016 9:46 AM, "Lars Hamre" <<a href="mailto:chemecse@gmail.com">chemecse@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">v2:<br>
 - ES version check (Tapani Pälli)<br>
<br>
The conditions for which certain built-in special variables<br>
can be declared invariant were not being checked.<br>
<br>
GLSL ES 1.00 specification, Section "Invariance and linkage" says:<br>
<br>
For the built-in special variables, gl_FragCoord can<br>
only be declared invariant if and only if gl_Position is<br>
declared invariant. Similarly gl_PointCoord can only be<br>
declared invariant if and only if gl_PointSize is declared<br>
invariant. It is an error to declare gl_FrontFacing as invariant.<br>
<br>
This fixes the following piglit tests in spec/glsl-es-1.00/linker:<br>
glsl-fcoord-invariant<br>
glsl-fface-invariant<br>
glsl-pcoord-invariant<br>
<br>
Signed-off-by: Lars Hamre <<a href="mailto:chemecse@gmail.com">chemecse@gmail.com</a>><br>
<br>
---<br>
<br>
CC: Tapani Pälli <<a href="mailto:tapani.palli@intel.com">tapani.palli@intel.com</a>><br>
<br>
NOTE: Someone with access will need to commit this after the<br>
      review process<br>
<br>
 src/compiler/glsl/link_varyings.cpp | 46 +++++++++++++++++++++++++++++++++++--<br>
 1 file changed, 44 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp<br>
index 34e82c7..2c1f57d 100644<br>
--- a/src/compiler/glsl/link_varyings.cpp<br>
+++ b/src/compiler/glsl/link_varyings.cpp<br>
@@ -352,13 +352,23 @@ cross_validate_outputs_to_inputs(struct gl_shader_program *prog,<br>
    glsl_symbol_table parameters;<br>
    ir_variable *explicit_locations[MAX_VARYING][4] = { {NULL, NULL} };<br>
<br>
+   bool is_gl_position_invariant = false;<br>
+   bool is_gl_point_size_invariant = false;<br>
+<br>
    /* Find all shader outputs in the "producer" stage.<br>
     */<br>
    foreach_in_list(ir_instruction, node, producer->ir) {<br>
       ir_variable *const var = node->as_variable();<br>
<br>
       if ((var == NULL) || (var->data.mode != ir_var_shader_out))<br>
-        continue;<br>
+         continue;<br>
+<br>
+      if (prog->IsES && prog->Version < 300) {<br>
+         if (!strcmp(var->name, "gl_Position"))<br>
+            is_gl_position_invariant = var->data.invariant;<br>
+         if (!strcmp(var->name, "gl_PointSize"))<br>
+            is_gl_point_size_invariant = var->data.invariant;<br>
+      }<br>
<br>
       if (!var->data.explicit_location<br>
           || var->data.location < VARYING_SLOT_VAR0)<br>
@@ -442,7 +452,39 @@ cross_validate_outputs_to_inputs(struct gl_shader_program *prog,<br>
       ir_variable *const input = node->as_variable();<br>
<br>
       if ((input == NULL) || (input->data.mode != ir_var_shader_in))<br>
-        continue;<br>
+         continue;<br>
+<br>
+      /*<br>
+       * GLSL ES 1.00 specification, Section "Invariance and linkage" says:<br>
+       *<br>
+       *  "For the built-in special variables, gl_FragCoord can<br>
+       *  only be declared invariant if and only if gl_Position is<br>
+       *  declared invariant. Similarly gl_PointCoord can only be<br>
+       *  declared invariant if and only if gl_PointSize is declared<br>
+       *  invariant. It is an error to declare gl_FrontFacing as invariant."<br>
+       */<br>
+      if (prog->IsES && prog->Version < 300) {<br>
+         if (!strcmp(input->name, "gl_FrontFacing") &&<br>
+               input->data.invariant) {<br>
+            linker_error(prog,<br>
+                         "gl_FrontFacing cannot be declared invariant");<br>
+            return;<br>
+         } else if (!strcmp(input->name, "gl_FragCoord") &&<br>
+                    input->data.invariant &&<br>
+                    !is_gl_position_invariant) {<br>
+            linker_error(prog,<br>
+                         "gl_FragCoord cannot be declared invariant "<br>
+                         "unless gl_Position is also invariant");<br>
+            return;<br>
+         } else if (!strcmp(input->name, "gl_PointCoord") &&<br>
+                    input->data.invariant &&<br>
+                    !is_gl_point_size_invariant) {<br>
+            linker_error(prog,<br>
+                         "gl_PointCoord cannot be declared invariant "<br>
+                         "unless gl_PointSize is also invariant");<br>
+            return;<br>
+         }<br>
+      }<br>
<br>
       if (strcmp(input->name, "gl_Color") == 0 && input->data.used) {<br>
          const ir_variable *const front_color =<br>
--<br>
2.5.5<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div>