From: Timothy Arceri <timothy.arc...@collabora.com> The hash key for glsl metadata is a hash of the hashes of each GLSL source string.
This commit uses the put_key/get_key support in the cache put the SHA-1 hash of the source string for each successfully compiled shader into the cache. This allows for early, optimistic returns from glCompileShader (if the identical source string had been successfully compiled in the past), in the hope that the final, linked shader will be found in the cache. This is based on the intial patch by Carl. --- src/compiler/glsl/glsl_parser_extras.cpp | 18 ++++++++++++++++++ src/compiler/glsl/linker.cpp | 7 +++++++ src/mesa/program/ir_to_mesa.cpp | 14 ++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index f75165d..a68b76a 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -32,6 +32,8 @@ #include "main/shaderobj.h" #include "util/u_atomic.h" /* for p_atomic_cmpxchg */ #include "util/ralloc.h" +#include "util/disk_cache.h" +#include "util/mesa-sha1.h" #include "ast.h" #include "glsl_parser_extras.h" #include "glsl_parser.h" @@ -1923,6 +1925,22 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, state->error = glcpp_preprocess(state, &source, &state->info_log, add_builtin_defines, state, ctx); +#ifdef ENABLE_SHADER_CACHE + if (!force_recompile) { + char buf[41]; + _mesa_sha1_compute(source, strlen(source), shader->sha1); + if (ctx->Cache && disk_cache_has_key(ctx->Cache, shader->sha1)) { + /* We've seen this shader before and know it compiles */ + if (ctx->_Shader->Flags & GLSL_CACHE_INFO) { + fprintf(stderr, "deferring compile of shader: %s\n", + _mesa_sha1_format(buf, shader->sha1)); + } + shader->CompileStatus = true; + return; + } + } +#endif + if (!state->error) { _mesa_glsl_lexer_ctor(state, source); _mesa_glsl_parse(state); diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index dafa39d..f556ca6 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -73,6 +73,7 @@ #include "program.h" #include "program/prog_instruction.h" #include "program/program.h" +#include "util/mesa-sha1.h" #include "util/set.h" #include "util/string_to_uint_map.h" #include "linker.h" @@ -81,6 +82,7 @@ #include "ir_rvalue_visitor.h" #include "ir_uniform.h" #include "builtin_functions.h" +#include "shader_cache.h" #include "main/shaderobj.h" #include "main/enums.h" @@ -4633,6 +4635,11 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) return; } +#ifdef ENABLE_SHADER_CACHE + if (shader_cache_read_program_metadata(ctx, prog)) + return; +#endif + void *mem_ctx = ralloc_context(NULL); // temporary linker context prog->ARB_fragment_coord_conventions_enable = false; diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index 0ae797f..350c856 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -46,6 +46,7 @@ #include "compiler/glsl_types.h" #include "compiler/glsl/linker.h" #include "compiler/glsl/program.h" +#include "compiler/glsl/shader_cache.h" #include "program/prog_instruction.h" #include "program/prog_optimize.h" #include "program/prog_print.h" @@ -3101,6 +3102,14 @@ _mesa_glsl_link_shader(struct gl_context *ctx, struct gl_shader_program *prog) link_shaders(ctx, prog); } + /* FIXME: We look at prog->Version to determine whether we actually linked + * the program or just loaded the uniform meta data from cache. We + * probably want to turn prog->LinkStatus into an enum that captures the + * different states. + */ + if (prog->data->LinkStatus && prog->data->Version == 0) + return; + if (prog->data->LinkStatus) { if (!ctx->Driver.LinkShader(ctx, prog)) { prog->data->LinkStatus = GL_FALSE; @@ -3117,6 +3126,11 @@ _mesa_glsl_link_shader(struct gl_context *ctx, struct gl_shader_program *prog) fprintf(stderr, "%s\n", prog->data->InfoLog); } } + +#ifdef ENABLE_SHADER_CACHE + if (prog->data->LinkStatus) + shader_cache_write_program_metadata(ctx, prog); +#endif } } /* extern "C" */ -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev