summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2017-10-22 17:38:32 +0200
committerNicolai Hähnle <nicolai.haehnle@amd.com>2017-11-03 19:38:42 +0100
commit2a6e09a16289747982c035bbf058183d78467916 (patch)
treead78299831a7b68d953d50cf274a5f044b6a2260
parentc1e1e8bfe8b05daa2e01a7e2524419499c36a08f (diff)
radeonsi: reduce the scope of sel->mutex in si_shader_select_with_key
We only need the lock to guard changes in the variant linked list. The actual compilation can happen outside the lock, since we use the ready fence as a guard. v2: fix double-unlock Reviewed-by: Marek Olšák <marek.olsak@amd.com>
-rw-r--r--src/gallium/drivers/radeonsi/si_state_shaders.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 4c0292404e..75b1648748 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -1621,6 +1621,8 @@ current_not_ready:
/* Don't check the "current" shader. We checked it above. */
if (current != iter &&
memcmp(&iter->key, key, sizeof(*key)) == 0) {
+ mtx_unlock(&sel->mutex);
+
if (unlikely(!util_queue_fence_is_signalled(&iter->ready))) {
/* If it's an optimized shader and its compilation has
* been started but isn't done, use the unoptimized
@@ -1628,7 +1630,6 @@ current_not_ready:
*/
if (iter->is_optimized) {
memset(&key->opt, 0, sizeof(key->opt));
- mtx_unlock(&sel->mutex);
goto again;
}
@@ -1636,12 +1637,10 @@ current_not_ready:
}
if (iter->compilation_failed) {
- mtx_unlock(&sel->mutex);
return -1; /* skip the draw call */
}
state->current = iter;
- mtx_unlock(&sel->mutex);
return 0;
}
}
@@ -1768,6 +1767,8 @@ current_not_ready:
sel->last_variant = shader;
}
+ mtx_unlock(&sel->mutex);
+
assert(!shader->is_optimized);
si_build_shader_variant(shader, thread_index, false);
@@ -1776,7 +1777,6 @@ current_not_ready:
if (!shader->compilation_failed)
state->current = shader;
- mtx_unlock(&sel->mutex);
return shader->compilation_failed ? -1 : 0;
}