diff options
Diffstat (limited to 'src/compiler/glsl/shader_cache.cpp')
-rw-r--r-- | src/compiler/glsl/shader_cache.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp index dd8c6c0b408..274bb8c91e7 100644 --- a/src/compiler/glsl/shader_cache.cpp +++ b/src/compiler/glsl/shader_cache.cpp @@ -1409,6 +1409,23 @@ 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; |