glsl: remove dead builtins before assigning varying locations
authorTimothy Arceri <timothy.arceri@collabora.com>
Wed, 27 Jul 2016 05:20:43 +0000 (15:20 +1000)
committerTimothy Arceri <timothy.arceri@collabora.com>
Wed, 10 Aug 2016 22:33:21 +0000 (08:33 +1000)
Builtins already have locations assigned so this shouldn't
change anything. We want to call it earlier so we can tranform
GLSL IR to NIR earlier.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/compiler/glsl/linker.cpp

index 569a8b9f94786541109e36fa30b2985d4bd9903b..7a3d35f925310ca1f7025363c338d74256b7d917 100644 (file)
@@ -4589,8 +4589,12 @@ link_varyings_and_uniforms(unsigned first, unsigned last,
 
       /* If the program is made up of only a single stage */
       if (first == last) {
-
          gl_linked_shader *const sh = prog->_LinkedShaders[last];
+
+         do_dead_builtin_varyings(ctx, NULL, sh, 0, NULL);
+         do_dead_builtin_varyings(ctx, sh, NULL, num_tfeedback_decls,
+                                  tfeedback_decls);
+
          if (prog->SeparateShader) {
             const uint64_t reserved_slots =
                reserved_varying_slot(sh, ir_var_shader_in);
@@ -4606,10 +4610,6 @@ link_varyings_and_uniforms(unsigned first, unsigned last,
                                           reserved_slots))
                return false;
          }
-
-         do_dead_builtin_varyings(ctx, NULL, sh, 0, NULL);
-         do_dead_builtin_varyings(ctx, sh, NULL, num_tfeedback_decls,
-                                  tfeedback_decls);
       } else {
          /* Linking the stages in the opposite order (from fragment to vertex)
           * ensures that inter-shader outputs written to in an earlier stage
@@ -4629,16 +4629,16 @@ link_varyings_and_uniforms(unsigned first, unsigned last,
             const uint64_t reserved_in_slots =
                reserved_varying_slot(sh_next, ir_var_shader_in);
 
+            do_dead_builtin_varyings(ctx, sh_i, sh_next,
+                      next == MESA_SHADER_FRAGMENT ? num_tfeedback_decls : 0,
+                      tfeedback_decls);
+
             if (!assign_varying_locations(ctx, mem_ctx, prog, sh_i, sh_next,
                       next == MESA_SHADER_FRAGMENT ? num_tfeedback_decls : 0,
                       tfeedback_decls,
                       reserved_out_slots | reserved_in_slots))
                return false;
 
-            do_dead_builtin_varyings(ctx, sh_i, sh_next,
-                      next == MESA_SHADER_FRAGMENT ? num_tfeedback_decls : 0,
-                      tfeedback_decls);
-
             /* This must be done after all dead varyings are eliminated. */
             if (sh_i != NULL) {
                unsigned slots_used = _mesa_bitcount_64(reserved_out_slots);