summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2017-02-23 14:42:07 +1100
committerTimothy Arceri <[email protected]>2017-02-24 09:01:59 +1100
commitc24d0aaa9a197ccf7cbaa9154b840aed6397f6bd (patch)
treeffd65bbda66a0c8273b870b200b4ed8e5b10ce11 /src/mesa/state_tracker
parent261092f7d4f3142760fcce98ccb63b4efd47cc48 (diff)
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 <[email protected]> Tested-by: Michel Dänzer <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_shader_cache.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/mesa/state_tracker/st_shader_cache.c b/src/mesa/state_tracker/st_shader_cache.c
index 607e5b10766..eb66f999a5b 100644
--- a/src/mesa/state_tracker/st_shader_cache.c
+++ b/src/mesa/state_tracker/st_shader_cache.c
@@ -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);
}