From 93183480fc06267d1ab676e3286e76ea422ac7df Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Mon, 12 Apr 2021 08:03:41 +0200 Subject: [PATCH] radeonsi: re-create the aux context in si_create_context MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit If a GPU reset occurs, all contexts need to be recreated. So instead of re-creating the aux context during the flush of a normal context, we build a new one if we detect that it needs to be updated. Reviewed-by: Marek Olšák Part-of: --- src/gallium/drivers/radeonsi/si_pipe.c | 44 ++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 6c141d9..b88e93e 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -351,7 +351,9 @@ static void si_destroy_context(struct pipe_context *context) static enum pipe_reset_status si_get_reset_status(struct pipe_context *ctx) { struct si_context *sctx = (struct si_context *)ctx; - struct si_screen *sscreen = sctx->screen; + if (sctx->context_flags & SI_CONTEXT_FLAG_AUX) + return PIPE_NO_RESET; + bool needs_reset; enum pipe_reset_status status = sctx->ws->ctx_query_reset_status(sctx->ctx, &needs_reset); @@ -360,22 +362,6 @@ static enum pipe_reset_status si_get_reset_status(struct pipe_context *ctx) if (sctx->device_reset_callback.reset) { sctx->device_reset_callback.reset(sctx->device_reset_callback.data, status); } - - /* Re-create the auxiliary context, because it won't submit - * any new IBs due to a GPU reset. - */ - simple_mtx_lock(&sscreen->aux_context_lock); - - struct u_log_context *aux_log = ((struct si_context *)sscreen->aux_context)->log; - sscreen->aux_context->set_log_context(sscreen->aux_context, NULL); - sscreen->aux_context->destroy(sscreen->aux_context); - - sscreen->aux_context = si_create_context( - &sscreen->b, SI_CONTEXT_FLAG_AUX | - (sscreen->options.aux_debug ? PIPE_CONTEXT_DEBUG : 0) | - (sscreen->info.has_graphics ? 0 : PIPE_CONTEXT_COMPUTE_ONLY)); - sscreen->aux_context->set_log_context(sscreen->aux_context, aux_log); - simple_mtx_unlock(&sscreen->aux_context_lock); } return status; } @@ -753,9 +739,31 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen, unsign SI_CP_DMA_CLEAR_METHOD); } - if (!(flags & SI_CONTEXT_FLAG_AUX)) + if (!(flags & SI_CONTEXT_FLAG_AUX)) { p_atomic_inc(&screen->num_contexts); + /* Check if the aux_context needs to be recreated */ + struct si_context *saux = (struct si_context *)sscreen->aux_context; + bool needs_reset; + + simple_mtx_lock(&sscreen->aux_context_lock); + enum pipe_reset_status status = sctx->ws->ctx_query_reset_status( + saux->ctx, &needs_reset); + if (status != PIPE_NO_RESET && needs_reset) { + /* We lost the aux_context, create a new one */ + struct u_log_context *aux_log = (saux)->log; + sscreen->aux_context->set_log_context(sscreen->aux_context, NULL); + sscreen->aux_context->destroy(sscreen->aux_context); + + sscreen->aux_context = si_create_context( + &sscreen->b, SI_CONTEXT_FLAG_AUX | + (sscreen->options.aux_debug ? PIPE_CONTEXT_DEBUG : 0) | + (sscreen->info.has_graphics ? 0 : PIPE_CONTEXT_COMPUTE_ONLY)); + sscreen->aux_context->set_log_context(sscreen->aux_context, aux_log); + } + simple_mtx_unlock(&sscreen->aux_context_lock); + } + sctx->initial_gfx_cs_size = sctx->gfx_cs.current.cdw; return &sctx->b; fail: -- 2.7.4