glsl: don't recompile a shader on fallback unless needed
authorTimothy Arceri <tarceri@itsqueeze.com>
Thu, 9 Mar 2017 11:58:38 +0000 (22:58 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Sun, 12 Mar 2017 06:26:08 +0000 (17:26 +1100)
Because we optimistically skip compiling shaders if we have seen them
before we may need to compile them later at link time if they haven't
yet been use in a specific combination to create a program.

Rather than always recompiling we take advantage of the
gl_compile_status enum introduced in the previous patch to only
compile when we have previously skipped compilation.

This helps with regressions in app start-up times on cold cache
runs, compared with no cache.

Deus Ex: Mankind Divided start-up times:

cache disabled:               ~3m15s
cold cache master:            ~4m23s
cold cache with this patch:   ~3m33s

Acked-by: Marek Olšák <marek.olsak@amd.com>
src/compiler/glsl/glsl_parser_extras.cpp

index 59114a7a48bf558f430b3f9ce2f2d62143406216..776636c03c9fde1406bf299199704b756aad933b 100644 (file)
@@ -1952,6 +1952,13 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
          shader->FallbackSource = NULL;
          return;
       }
+   } else {
+      /* We should only ever end up here if a re-compile has been forced by a
+       * shader cache miss. In which case we can skip the compile if its
+       * already be done by a previous fallback or the initial compile call.
+       */
+      if (shader->CompileStatus == compile_success)
+         return;
    }
 
    if (!state->error) {