[Mesa-dev] [PATCH] glsl/shader_cache: restore evicted shader keys

Timothy Arceri tarceri at itsqueeze.com
Sun Mar 26 22:06:04 UTC 2017


On 27/03/17 08:44, Timothy Arceri wrote:
> I'm actually wondering if we still even need the index at all? After
> bfa95997c4ecf74a329a047359d5e8d1217da49b and
> b607aad8e1a40c473176e31e11deaa26477c54c0 we should be able to just
> always set CompileStatus to skipped and fallback to a recompile should
> the linked program not be found in the cache.
>
> To me the chance of having to compile the shader once on the first run
> at link time seems better than constantly recompiling shaders when we
> hit collisions. With an index table of only 65,536 entries the chance of
> collisions is fairly high even if you have only run a couple of
> applications.

Although that won't work for shaders that fail to compile. So I guess 
disabling optimistaions might be the only option.

Anyway I'll push this change. Thanks!

>
> The other option could be to delay shader optimisations until we have
> checked the linked program is not in the cache. That should cut down
> times when we have collisions in the index but the linked program is
> still in the cache.
>
>
> On 27/03/17 03:28, Grazvydas Ignotas wrote:
>> Even though the programs themselves stay in cache and are loaded, the
>> shader keys can be evicted separately. If that happens, unnecessary
>> compiles are caused that waste time, and no matter how many times the
>> program is re-run, performance never recovers to the levels of first
>> hot cache run. To deal with this, we need to refresh the shader keys
>> of shaders that were recompiled.
>>
>> An easy way to currently observe this is running Deux Ex, then piglit
>> and Deux Ex again, or deleting just the cache index. The later is
>> causing over a minute of lost time on all later Deux Ex runs, with this
>> patch it returns to normal after 1 run.
>>
>> Signed-off-by: Grazvydas Ignotas <notasas at gmail.com>
>> ---
>>  src/compiler/glsl/shader_cache.cpp | 17 +++++++++++++++++
>>  1 file changed, 17 insertions(+)
>>
>> diff --git a/src/compiler/glsl/shader_cache.cpp
>> b/src/compiler/glsl/shader_cache.cpp
>> index dd8c6c0..274bb8c 100644
>> --- a/src/compiler/glsl/shader_cache.cpp
>> +++ b/src/compiler/glsl/shader_cache.cpp
>> @@ -1407,9 +1407,26 @@ shader_cache_read_program_metadata(struct
>> gl_context *ctx,
>>     }
>>
>>     /* This is used to flag a shader retrieved from cache */
>>     prog->data->LinkStatus = linking_skipped;
>>
>> +   /* Since the program load was successful, CompileStatus of all
>> shaders at
>> +    * this point should normally be compile_skipped. However because
>> of how
>> +    * the eviction works, it may happen that some of the individual
>> shader keys
>> +    * have been evicted, resulting in unnecessary recompiles on this
>> load, so
>> +    * mark them again to skip such recompiles next time.
>> +    */
>> +   char sha1_buf[41];
>> +   for (unsigned i = 0; i < prog->NumShaders; i++) {
>> +      if (prog->Shaders[i]->CompileStatus == compile_success) {
>> +         disk_cache_put_key(cache, prog->Shaders[i]->sha1);
>> +         if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
>> +            _mesa_sha1_format(sha1_buf, prog->Shaders[i]->sha1);
>> +            fprintf(stderr, "re-marking shader: %s\n", sha1_buf);
>> +         }
>> +      }
>> +   }
>> +
>>     free (buffer);
>>
>>     return true;
>>  }
>>
> _______________________________________________
> 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