st/mesa: fix crash in shader cache cased by race condition

If a thread doesn't load GLSL IR from cache but does load TGSI
from cache (that was created by another thread) than it will
crash due to expecting gl_program_parameter_list to have been
restored from the GLSL IR cache and not be null.

Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Tested-by: Michel Dänzer <michel.daenzer@amd.com>
This commit is contained in:
Timothy Arceri
2017-02-23 14:42:07 +11:00
parent 261092f7d4
commit c24d0aaa9a
+8 -6
View File
@@ -233,6 +233,14 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
ralloc_free(buf);
}
/* Now that we have created the sha1 keys that will be used for writting to
* the tgsi cache fallback to the regular glsl to tgsi path if we didn't
* load the GLSL IR from cache. We do this as glsl to tgsi can alter things
* such as gl_program_parameter_list which holds things like uniforms.
*/
if (prog->data->LinkStatus != linking_skipped)
return false;
struct st_context *st = st_context(ctx);
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
if (prog->_LinkedShaders[i] == NULL)
@@ -389,12 +397,6 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
fallback_recompile:
/* GLSL IR was compiled and linked so just fallback to the regular
* glsl to tgsi path.
*/
if (prog->data->LinkStatus != linking_skipped)
return false;
for (unsigned i = 0; i < prog->NumShaders; i++) {
_mesa_glsl_compile_shader(ctx, prog->Shaders[i], false, false, true);
}