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

Marek Olšák maraeo at gmail.com
Fri Mar 10 11:53:12 UTC 2017


For the series:

Acked-by: Marek Olšák <marek.olsak at amd.com>

Does this fix the crash when GLSL gets a cache hit and st/mesa gets a
cache miss?

Marek


On Thu, Mar 9, 2017 at 1:42 PM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
> 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) {
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list