diff options
author | Marek Olšák <[email protected]> | 2019-02-12 14:38:31 -0500 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-05-16 13:10:07 -0400 |
commit | 301344008f9d651676d6cfb4c4a4047c987efa6d (patch) | |
tree | 87ae6c7135e72268e2678db2a9fd8270d1dc7ac0 /src | |
parent | ca9edd7cd06ad53205fe26ead201ba67cefb8f14 (diff) |
radeonsi: allow si_shader_select_with_key to return an optimized shader or fail
If a prim discard compute shader hasn't finished compilation, we don't want
to any shader.
Tested-by: Dieter Nützel <[email protected]>
Acked-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state.h | 7 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state_shaders.c | 37 |
2 files changed, 32 insertions, 12 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h index 116fce5b146..15c4ef6d9a1 100644 --- a/src/gallium/drivers/radeonsi/si_state.h +++ b/src/gallium/drivers/radeonsi/si_state.h @@ -41,6 +41,7 @@ struct si_screen; struct si_shader; +struct si_shader_ctx_state; struct si_shader_selector; struct si_texture; struct si_qbo_state; @@ -576,6 +577,12 @@ void si_schedule_initial_compile(struct si_context *sctx, unsigned processor, void si_get_active_slot_masks(const struct tgsi_shader_info *info, uint32_t *const_and_shader_buffers, uint64_t *samplers_and_images); +int si_shader_select_with_key(struct si_screen *sscreen, + struct si_shader_ctx_state *state, + struct si_compiler_ctx_state *compiler_state, + struct si_shader_key *key, + int thread_index, + bool optimized_or_none); /* si_state_draw.c */ void si_emit_cache_flush(struct si_context *sctx); diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 10677f175de..8ae77fda3f3 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -1794,12 +1794,19 @@ static bool si_check_missing_main_part(struct si_screen *sscreen, return true; } -/* Select the hw shader variant depending on the current state. */ -static int si_shader_select_with_key(struct si_screen *sscreen, - struct si_shader_ctx_state *state, - struct si_compiler_ctx_state *compiler_state, - struct si_shader_key *key, - int thread_index) +/** + * Select a shader variant according to the shader key. + * + * \param optimized_or_none If the key describes an optimized shader variant and + * the compilation isn't finished, don't select any + * shader and return an error. + */ +int si_shader_select_with_key(struct si_screen *sscreen, + struct si_shader_ctx_state *state, + struct si_compiler_ctx_state *compiler_state, + struct si_shader_key *key, + int thread_index, + bool optimized_or_none) { struct si_shader_selector *sel = state->cso; struct si_shader_selector *previous_stage_sel = NULL; @@ -1815,6 +1822,9 @@ again: memcmp(¤t->key, key, sizeof(*key)) == 0)) { if (unlikely(!util_queue_fence_is_signalled(¤t->ready))) { if (current->is_optimized) { + if (optimized_or_none) + return -1; + memset(&key->opt, 0, sizeof(key->opt)); goto current_not_ready; } @@ -1851,6 +1861,8 @@ current_not_ready: * shader so as not to cause a stall due to compilation. */ if (iter->is_optimized) { + if (optimized_or_none) + return -1; memset(&key->opt, 0, sizeof(key->opt)); goto again; } @@ -1892,12 +1904,13 @@ current_not_ready: util_queue_fence_wait(&previous_stage_sel->ready); } - /* Compile the main shader part if it doesn't exist. This can happen - * if the initial guess was wrong. */ bool is_pure_monolithic = sscreen->use_monolithic_shaders || memcmp(&key->mono, &zeroed.mono, sizeof(key->mono)) != 0; + /* Compile the main shader part if it doesn't exist. This can happen + * if the initial guess was wrong. + */ if (!is_pure_monolithic) { bool ok; @@ -1954,9 +1967,7 @@ current_not_ready: memcmp(&key->opt, &zeroed.opt, sizeof(key->opt)) != 0; /* If it's an optimized shader, compile it asynchronously. */ - if (shader->is_optimized && - !is_pure_monolithic && - thread_index < 0) { + if (shader->is_optimized && thread_index < 0) { /* Compile it asynchronously. */ util_queue_add_job(&sscreen->shader_compiler_queue_low_priority, shader, &shader->ready, @@ -1979,6 +1990,8 @@ current_not_ready: if (sscreen->options.sync_compile) util_queue_fence_wait(&shader->ready); + if (optimized_or_none) + return -1; goto again; } @@ -2015,7 +2028,7 @@ static int si_shader_select(struct pipe_context *ctx, si_shader_selector_key(ctx, state->cso, &key); return si_shader_select_with_key(sctx->screen, state, compiler_state, - &key, -1); + &key, -1, false); } static void si_parse_next_shader_property(const struct tgsi_shader_info *info, |