glsl: use correct shader source in case of cache fallback
The scenario is: glShaderSource glCompileShader <-- deferred due to cache hit of shader glShaderSource <-- with new source code glAttachShader glLinkProgram <-- no cache hit for program At this point we need to compile the original source when we fallback. Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
@@ -1927,7 +1927,8 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
|
||||
{
|
||||
struct _mesa_glsl_parse_state *state =
|
||||
new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader);
|
||||
const char *source = shader->Source;
|
||||
const char *source = force_recompile && shader->FallbackSource ?
|
||||
shader->FallbackSource : shader->Source;
|
||||
|
||||
if (ctx->Const.GenerateTemporaryNames)
|
||||
(void) p_atomic_cmpxchg(&ir_variable::temporaries_allocate_names,
|
||||
@@ -1946,6 +1947,9 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
|
||||
_mesa_sha1_format(buf, shader->sha1));
|
||||
}
|
||||
shader->CompileStatus = true;
|
||||
|
||||
free((void *)shader->FallbackSource);
|
||||
shader->FallbackSource = NULL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -2067,6 +2071,11 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
|
||||
|
||||
_mesa_glsl_initialize_derived_variables(ctx, shader);
|
||||
|
||||
if (!force_recompile) {
|
||||
free((void *)shader->FallbackSource);
|
||||
shader->FallbackSource = NULL;
|
||||
}
|
||||
|
||||
delete state->symbols;
|
||||
ralloc_free(state);
|
||||
}
|
||||
|
@@ -2397,6 +2397,8 @@ struct gl_shader
|
||||
#endif
|
||||
const GLchar *Source; /**< Source code string */
|
||||
|
||||
const GLchar *FallbackSource; /**< Fallback string used by on-disk cache*/
|
||||
|
||||
GLchar *InfoLog;
|
||||
|
||||
unsigned Version; /**< GLSL version used for linking */
|
||||
|
@@ -1003,9 +1003,18 @@ shader_source(struct gl_shader *sh, const GLchar *source)
|
||||
{
|
||||
assert(sh);
|
||||
|
||||
if (sh->CompileStatus == GL_TRUE && !sh->FallbackSource) {
|
||||
/* If shader was previously compiled back-up the source in case of cache
|
||||
* fallback.
|
||||
*/
|
||||
sh->FallbackSource = sh->Source;
|
||||
sh->Source = source;
|
||||
} else {
|
||||
/* free old shader source string and install new one */
|
||||
free((void *)sh->Source);
|
||||
sh->Source = source;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
sh->SourceChecksum = util_hash_crc32(sh->Source, strlen(sh->Source));
|
||||
#endif
|
||||
|
@@ -122,6 +122,7 @@ void
|
||||
_mesa_delete_shader(struct gl_context *ctx, struct gl_shader *sh)
|
||||
{
|
||||
free((void *)sh->Source);
|
||||
free((void *)sh->FallbackSource);
|
||||
free(sh->Label);
|
||||
ralloc_free(sh);
|
||||
}
|
||||
|
Reference in New Issue
Block a user