st/mesa: call st_nir_opts for linked shaders only once
authorMarek Olšák <marek.olsak@amd.com>
Tue, 8 Oct 2019 02:15:01 +0000 (22:15 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 18 Oct 2019 00:31:34 +0000 (20:31 -0400)
The removed st_nir_opts calls are mostly redundant.

There is an improvement with shader-db on radeonsi:

Before:
    real 1m54.047s
    user 28m37.857s
    sys  0m7.573s

After:
    real 1m52.012s
    user 28m3.412s
    sys  0m7.808s

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/mesa/state_tracker/st_glsl_to_nir.cpp

index 35494761ac1270457399b33af4497df255621320..f7e42646c80262fcee3b13dae630cd537a547d00 100644 (file)
@@ -387,7 +387,6 @@ st_nir_preprocess(struct st_context *st, struct gl_program *prog,
 
    /* before buffers and vars_to_ssa */
    NIR_PASS_V(nir, gl_nir_lower_bindless_images);
-   st_nir_opts(nir);
 
    /* TODO: Change GLSL to not lower shared memory. */
    if (prog->nir->info.stage == MESA_SHADER_COMPUTE &&
@@ -403,6 +402,9 @@ st_nir_preprocess(struct st_context *st, struct gl_program *prog,
    NIR_PASS_V(nir, nir_opt_constant_folding);
 
    if (lower_64bit) {
+      /* Clean up the IR before 64-bit lowering. */
+      st_nir_opts(nir);
+
       bool lowered_64bit_ops = false;
       if (options->lower_doubles_options) {
          NIR_PASS(lowered_64bit_ops, nir, nir_lower_doubles,
@@ -653,6 +655,7 @@ st_link_nir(struct gl_context *ctx,
 {
    struct st_context *st = st_context(ctx);
    struct pipe_screen *screen = st->pipe->screen;
+   unsigned num_linked_shaders = 0;
 
    unsigned last_stage = 0;
    for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
@@ -660,6 +663,8 @@ st_link_nir(struct gl_context *ctx,
       if (shader == NULL)
          continue;
 
+      num_linked_shaders++;
+
       const nir_shader_compiler_options *options =
          st->ctx->Const.ShaderCompilerOptions[shader->Stage].NirOptions;
       struct gl_program *prog = shader->Program;
@@ -757,6 +762,12 @@ st_link_nir(struct gl_context *ctx,
 
       nir_shader *nir = shader->Program->nir;
 
+      /* Linked shaders are optimized in st_nir_link_shaders. Separate shaders
+       * and shaders with a fixed-func VS or FS are optimized here.
+       */
+      if (num_linked_shaders == 1)
+         st_nir_opts(nir);
+
       NIR_PASS_V(nir, st_nir_lower_wpos_ytransform, shader->Program,
                  st->pipe->screen);