diff options
author | Nicolai Hähnle <nicolai.haehnle@amd.com> | 2017-10-22 17:38:32 +0200 |
---|---|---|
committer | Nicolai Hähnle <nicolai.haehnle@amd.com> | 2017-11-03 19:38:42 +0100 |
commit | 2a6e09a16289747982c035bbf058183d78467916 (patch) | |
tree | ad78299831a7b68d953d50cf274a5f044b6a2260 | |
parent | c1e1e8bfe8b05daa2e01a7e2524419499c36a08f (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.c | 8 |
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; } |