Note in future we may want to use the cache when in shader xfb qualifiers override the API. --- src/compiler/glsl/linker.cpp | 15 ++++++++++++++- src/compiler/glsl/shader_cache.cpp | 7 +++++++ src/mesa/drivers/dri/i965/brw_shader_cache.c | 7 +++++++ 3 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index da7f2ee..f35c0e7 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -4483,7 +4483,20 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog, tfeedback_decl *tfeedback_decls = NULL; #ifdef ENABLE_SHADER_CACHE - if (!is_cache_fallback && shader_cache_read_program_metadata(ctx, prog)) + /* If transform feedback used on the program then compile all shaders. */ + bool skip_cache = false; + if (prog->TransformFeedback.NumVarying > 0) { + for (unsigned i = 0; i < prog->NumShaders; i++) { + if (prog->Shaders[i]->ir) { + continue; + } + _mesa_glsl_compile_shader(ctx, prog->Shaders[i], false, false, true); + } + skip_cache = true; + } + + if (!is_cache_fallback && !skip_cache && + shader_cache_read_program_metadata(ctx, prog)) return; #endif diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp index 30255bc..e5f5f48 100644 --- a/src/compiler/glsl/shader_cache.cpp +++ b/src/compiler/glsl/shader_cache.cpp @@ -356,6 +356,13 @@ write_program_resource_data(struct blob *metadata, } } break; + case GL_TRANSFORM_FEEDBACK_BUFFER: + case GL_TRANSFORM_FEEDBACK_VARYING: + /* Don't bother caching transform feedback varyings/buffers as we will + * always relink a program which enables transform feedback. + * TODO: We may want to this for shaders that use the xfb_* qualifiers. + */ + break; default: assert(!"Support for writting resource not yet implemneted."); } diff --git a/src/mesa/drivers/dri/i965/brw_shader_cache.c b/src/mesa/drivers/dri/i965/brw_shader_cache.c index e5aa022..7945b16 100644 --- a/src/mesa/drivers/dri/i965/brw_shader_cache.c +++ b/src/mesa/drivers/dri/i965/brw_shader_cache.c @@ -66,6 +66,13 @@ upload_cached_program(struct brw_context *brw) if (prog == NULL) return; + /* FIXME: For now we don't read from the cache if transform feedback is + * enabled. However we should be able to use cached shaders when the xfb_* + * qualifiers were used to enable transform feedback. + */ + if (prog->TransformFeedback.NumVarying > 0) + return; + offset += snprintf(manifest + offset, sizeof(manifest) - offset, "program: %s\n", _mesa_sha1_format(sha1_buf, prog->sha1)); -- 2.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev