st/mesa: move some NIR lowering before shader caching
authorMarek Olšák <marek.olsak@amd.com>
Fri, 18 Oct 2019 01:03:34 +0000 (21:03 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 24 Oct 2019 01:12:52 +0000 (21:12 -0400)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/state_tracker/st_glsl_to_nir.cpp
src/mesa/state_tracker/st_program.c
src/mesa/state_tracker/st_program.h

index 43459d46b5797fffb9f55b4ffe5056913b99d45b..0e5bdaea59ddcfaa2f160d162b3e346b054a63d5 100644 (file)
@@ -486,6 +486,11 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog,
    nir_variable_mode mask = nir_var_function_temp;
    nir_remove_dead_variables(nir, mask);
 
+   NIR_PASS_V(nir, nir_lower_atomics_to_ssbo,
+              st->ctx->Const.Program[nir->info.stage].MaxAtomicBuffers);
+
+   st_finalize_nir_before_variants(nir);
+
    if (st->ctx->_Shader->Flags & GLSL_DUMP) {
       _mesa_log("\n");
       _mesa_log("NIR IR for linked %s program %d:\n",
@@ -899,25 +904,11 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog,
                 struct gl_shader_program *shader_program, nir_shader *nir)
 {
    struct pipe_screen *screen = st->pipe->screen;
-   const nir_shader_compiler_options *options =
-      st->ctx->Const.ShaderCompilerOptions[prog->info.stage].NirOptions;
 
    NIR_PASS_V(nir, nir_split_var_copies);
    NIR_PASS_V(nir, nir_lower_var_copies);
-   if (options->lower_all_io_to_temps ||
-       options->lower_all_io_to_elements ||
-       nir->info.stage == MESA_SHADER_VERTEX ||
-       nir->info.stage == MESA_SHADER_GEOMETRY) {
-      NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects, false);
-   } else if (nir->info.stage == MESA_SHADER_FRAGMENT) {
-      NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects, true);
-   }
 
    st_nir_assign_varying_locations(st, nir);
-
-   NIR_PASS_V(nir, nir_lower_atomics_to_ssbo,
-         st->ctx->Const.Program[nir->info.stage].MaxAtomicBuffers);
-
    st_nir_assign_uniform_locations(st->ctx, prog,
                                    &nir->uniforms);
 
index 684599e4ef5e973cef40b76a1c46a1e47fd92547..e60a9924f81a7b49f3dbdf771678b77d1d201916 100644 (file)
@@ -387,6 +387,20 @@ st_release_common_variants(struct st_context *st, struct st_common_program *p)
    delete_ir(&p->state);
 }
 
+void
+st_finalize_nir_before_variants(struct nir_shader *nir)
+{
+   NIR_PASS_V(nir, nir_split_var_copies);
+   NIR_PASS_V(nir, nir_lower_var_copies);
+   if (nir->options->lower_all_io_to_temps ||
+       nir->options->lower_all_io_to_elements ||
+       nir->info.stage == MESA_SHADER_VERTEX ||
+       nir->info.stage == MESA_SHADER_GEOMETRY) {
+      NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects, false);
+   } else if (nir->info.stage == MESA_SHADER_FRAGMENT) {
+      NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects, true);
+   }
+}
 
 /**
  * Translate ARB (asm) program to NIR
@@ -409,6 +423,7 @@ st_translate_prog_to_nir(struct st_context *st, struct gl_program *prog,
    /* Optimise NIR */
    NIR_PASS_V(nir, nir_opt_constant_folding);
    st_nir_opts(nir);
+   st_finalize_nir_before_variants(nir);
    nir_validate_shader(nir, "after st/ptn NIR opts");
 
    return nir;
index d698e7b633f9310ed4369c4d303d29961fb5bad4..90a77b9c17b108010aa8d8b51bad22f69f7290e4 100644 (file)
@@ -355,6 +355,9 @@ st_release_common_variants(struct st_context *st, struct st_common_program *p);
 extern void
 st_destroy_program_variants(struct st_context *st);
 
+extern void
+st_finalize_nir_before_variants(struct nir_shader *nir);
+
 extern void
 st_prepare_vertex_program(struct st_vertex_program *stvp);