st/nir: Unify inputs_read/outputs_written before serializing NIR
authorDanylo Piliaiev <danylo.piliaiev@globallogic.com>
Wed, 12 Feb 2020 10:45:55 +0000 (12:45 +0200)
committerDanylo Piliaiev <danylo.piliaiev@gmail.com>
Tue, 18 Feb 2020 09:18:37 +0000 (09:18 +0000)
Otherwise input/output interfaces won't be unified when reading
NIR from a cache.

Fixes piglit test on iris:
  clip-distance-vs-gs-out.shader_test

Fixes: 19ed12af
Signed-off-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3787>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3787>

src/mesa/state_tracker/st_glsl_to_nir.cpp

index 35464c982a6b0835f077b43c3a8b0d2159cd4c34..796bfb0317e5fc30b7b310c7a49ec01befc2c111 100644 (file)
@@ -793,6 +793,25 @@ st_link_nir(struct gl_context *ctx,
       }
    }
 
+   struct shader_info *prev_info = NULL;
+
+   for (unsigned i = 0; i < num_shaders; i++) {
+      struct gl_linked_shader *shader = linked_shader[i];
+      struct shader_info *info = &shader->Program->nir->info;
+
+      if (prev_info &&
+          ctx->Const.ShaderCompilerOptions[shader->Stage].NirOptions->unify_interfaces) {
+         prev_info->outputs_written |= info->inputs_read &
+            ~(VARYING_BIT_TESS_LEVEL_INNER | VARYING_BIT_TESS_LEVEL_OUTER);
+         info->inputs_read |= prev_info->outputs_written &
+            ~(VARYING_BIT_TESS_LEVEL_INNER | VARYING_BIT_TESS_LEVEL_OUTER);
+
+         prev_info->patch_outputs_written |= info->patch_inputs_read;
+         info->patch_inputs_read |= prev_info->patch_outputs_written;
+      }
+      prev_info = info;
+   }
+
    for (unsigned i = 0; i < num_shaders; i++) {
       struct gl_linked_shader *shader = linked_shader[i];
       struct gl_program *prog = shader->Program;
@@ -819,28 +838,6 @@ st_link_nir(struct gl_context *ctx,
       shader->ir = NULL;
    }
 
-   struct shader_info *prev_info = NULL;
-
-   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
-      struct gl_linked_shader *shader = shader_program->_LinkedShaders[i];
-      if (!shader)
-         continue;
-
-      struct shader_info *info = &shader->Program->nir->info;
-
-      if (prev_info &&
-          ctx->Const.ShaderCompilerOptions[i].NirOptions->unify_interfaces) {
-         prev_info->outputs_written |= info->inputs_read &
-            ~(VARYING_BIT_TESS_LEVEL_INNER | VARYING_BIT_TESS_LEVEL_OUTER);
-         info->inputs_read |= prev_info->outputs_written &
-            ~(VARYING_BIT_TESS_LEVEL_INNER | VARYING_BIT_TESS_LEVEL_OUTER);
-
-         prev_info->patch_outputs_written |= info->patch_inputs_read;
-         info->patch_inputs_read |= prev_info->patch_outputs_written;
-      }
-      prev_info = info;
-   }
-
    return true;
 }