diff --git a/src/gallium/drivers/r600/r600_pipe_common.c b/src/gallium/drivers/r600/r600_pipe_common.c index 1b4f93c4b86..fe3d0c6169a 100644 --- a/src/gallium/drivers/r600/r600_pipe_common.c +++ b/src/gallium/drivers/r600/r600_pipe_common.c @@ -487,7 +487,7 @@ static enum pipe_reset_status r600_get_reset_status(struct pipe_context *ctx) { struct r600_common_context *rctx = (struct r600_common_context *)ctx; - return rctx->ws->ctx_query_reset_status(rctx->ctx, NULL); + return rctx->ws->ctx_query_reset_status(rctx->ctx, false, NULL); } static void r600_set_debug_callback(struct pipe_context *ctx, diff --git a/src/gallium/drivers/radeon/radeon_winsys.h b/src/gallium/drivers/radeon/radeon_winsys.h index 770f30b47e1..6b72bfb8003 100644 --- a/src/gallium/drivers/radeon/radeon_winsys.h +++ b/src/gallium/drivers/radeon/radeon_winsys.h @@ -492,6 +492,7 @@ struct radeon_winsys { * Query a GPU reset status. */ enum pipe_reset_status (*ctx_query_reset_status)(struct radeon_winsys_ctx *ctx, + bool full_reset_only, bool *needs_reset); /** diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index b88e93e36d4..d204cf2e150 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -355,7 +355,7 @@ static enum pipe_reset_status si_get_reset_status(struct pipe_context *ctx) return PIPE_NO_RESET; bool needs_reset; - enum pipe_reset_status status = sctx->ws->ctx_query_reset_status(sctx->ctx, &needs_reset); + enum pipe_reset_status status = sctx->ws->ctx_query_reset_status(sctx->ctx, false, &needs_reset); if (status != PIPE_NO_RESET && needs_reset && !(sctx->context_flags & SI_CONTEXT_FLAG_AUX)) { /* Call the gallium frontend to set a no-op API dispatch. */ @@ -744,12 +744,11 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen, unsign /* 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) { + saux->ctx, true, NULL); + if (status != PIPE_NO_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); diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c index 6b9614f3f41..e8263818968 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c @@ -334,7 +334,8 @@ static void amdgpu_ctx_destroy(struct radeon_winsys_ctx *rwctx) } static enum pipe_reset_status -amdgpu_ctx_query_reset_status(struct radeon_winsys_ctx *rwctx, bool *needs_reset) +amdgpu_ctx_query_reset_status(struct radeon_winsys_ctx *rwctx, bool full_reset_only, + bool *needs_reset) { struct amdgpu_ctx *ctx = (struct amdgpu_ctx*)rwctx; int r; @@ -346,6 +347,14 @@ amdgpu_ctx_query_reset_status(struct radeon_winsys_ctx *rwctx, bool *needs_reset if (ctx->ws->info.drm_minor >= 24) { uint64_t flags; + if (full_reset_only && + ctx->initial_num_total_rejected_cs == ctx->ws->num_total_rejected_cs) { + /* If the caller is only interested in full reset (= wants to ignore soft + * recoveries), we can use the rejected cs count as a quick first check. + */ + return PIPE_NO_RESET; + } + r = amdgpu_cs_query_reset_state2(ctx->ctx, &flags); if (r) { fprintf(stderr, "amdgpu: amdgpu_cs_query_reset_state failed. (%i)\n", r); diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c index 3a3f28dda8a..a9eaf9688b6 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c @@ -87,7 +87,8 @@ static void radeon_drm_ctx_destroy(struct radeon_winsys_ctx *ctx) } static enum pipe_reset_status -radeon_drm_ctx_query_reset_status(struct radeon_winsys_ctx *rctx, bool *needs_reset) +radeon_drm_ctx_query_reset_status(struct radeon_winsys_ctx *rctx, bool full_reset_only, + bool *needs_reset) { struct radeon_ctx *ctx = (struct radeon_ctx*)rctx;