From 2a6e09a16289747982c035bbf058183d78467916 Mon Sep 17 00:00:00 2001 From: Nicolai Hähnle Date: Sun, 22 Oct 2017 17:38:32 +0200 Subject: radeonsi: reduce the scope of sel->mutex in si_shader_select_with_key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/gallium/drivers/radeonsi/si_state_shaders.c | 8 ++++---- 1 file 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; } -- cgit v1.2.3