[Mesa-dev] [PATCH 2/2] glsl: don't recompile a shader on fallback unless needed

Timothy Arceri tarceri at itsqueeze.com
Thu Mar 9 12:42:08 UTC 2017


On 09/03/17 22:58, Timothy Arceri wrote:
> 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 should help with regressions in app start-up times on cold cache
> runs, compared with no cache.

Here are the stats:

Deus Ex: Mankind Divided start-up times:

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

> ---
>  src/compiler/glsl/glsl_parser_extras.cpp | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp
> index 59114a7..776636c 100644
> --- a/src/compiler/glsl/glsl_parser_extras.cpp
> +++ b/src/compiler/glsl/glsl_parser_extras.cpp
> @@ -1945,20 +1945,27 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
>           if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
>              fprintf(stderr, "deferring compile of shader: %s\n",
>                      _mesa_sha1_format(buf, shader->sha1));
>           }
>           shader->CompileStatus = compile_skipped;
>
>           free((void *)shader->FallbackSource);
>           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) {
>       _mesa_glsl_lexer_ctor(state, source);
>       _mesa_glsl_parse(state);
>       _mesa_glsl_lexer_dtor(state);
>       do_late_parsing_checks(state);
>     }
>
>     if (dump_ast) {
>


More information about the mesa-dev mailing list