Patch takes gl_shader_cache in to use. When compiling a shader, we first search the cache if it exists already and can be used from there. If cache did not exist, we attempt to cache the shader after compilation.
Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> --- src/glsl/glsl_parser_extras.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index cac5a18..cb546f7 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -30,6 +30,7 @@ extern "C" { #include "main/context.h" #include "main/shaderobj.h" } +#include "main/shadercache.h" #include "ralloc.h" #include "ast.h" @@ -37,6 +38,7 @@ extern "C" { #include "glsl_parser.h" #include "ir_optimization.h" #include "loop_analysis.h" +#include "linker.h" /** * Format a short human-readable description of the given GLSL version. @@ -1456,6 +1458,40 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, state->error = glcpp_preprocess(state, &source, &state->info_log, &ctx->Extensions, ctx); + /* check if we have same shader cached */ + struct gl_shader *existing = + ctx->VertexProgram.ShaderCache->find(shader, source, state); + if (existing) { + /* use cached shader, clone ir list, populate symbol table */ + shader->CompileStatus = GL_TRUE; + shader->InfoLog = ralloc_strdup(shader, "cached shader"); + shader->Version = existing->Version; + shader->Type = existing->Type; + shader->IsES = existing->IsES; + + /** + * NOTE - following should not be needed and should be removed + * as takes a lot of time. Problem with this is that we might currently + * bail out while reading cache and decide to use the original. This + * should be decided/known already when writing cache. + */ + ralloc_free(shader->ir); + shader->ir = new(shader) exec_list; + clone_ir_list(shader, shader->ir, existing->ir); + ralloc_free(existing->ir); + ralloc_free(existing); + + populate_symbol_table(shader); + + memcpy(shader->builtins_to_link, state->builtins_to_link, + sizeof(shader->builtins_to_link[0]) * state->num_builtins_to_link); + shader->num_builtins_to_link = state->num_builtins_to_link; + + _mesa_debug(ctx, "used a shader from cache\n"); + return; + } + + if (!state->error) { _mesa_glsl_lexer_ctor(state, source); _mesa_glsl_parse(state); @@ -1524,6 +1560,10 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, /* Retain any live IR, but trash the rest. */ reparent_ir(shader->ir, shader->ir); + /* attempt to cache this shader */ + if (ctx->VertexProgram.ShaderCache->cache(shader, source, state) == 0) + _mesa_debug(ctx, "cached a shader\n"); + ralloc_free(state); } -- 1.8.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev