Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Sat, Nov 28, 2015 at 12:24 AM, Nicolai Hähnle <nhaeh...@gmail.com> wrote: > From: Nicolai Hähnle <nicolai.haeh...@amd.com> > > Non-timer queries are suspended during blits. When the blits end, the queries > are resumed, but this resume operation itself might run out of CS space and > trigger a flush. When this happens, we must prevent a duplicate suspend during > preflush suspend, and we must also prevent a duplicate resume when the CS > flush > returns back to the original resume operation. > > This fixes a regression that was introduced by: > > commit 8a125afa6e88a3eeddba8c7fdc1a75c9b99d5489 > Author: Nicolai Hähnle <nhaeh...@gmail.com> > Date: Wed Nov 18 18:40:22 2015 +0100 > > radeon: ensure that timing/profiling queries are suspended on flush > > The queries_suspended_for_flush flag is redundant because suspended > queries > are not removed from their respective linked list. > > Reviewed-by: Marek Olšák <marek.ol...@amd.com> > > Reported-by: Axel Davy <axel.d...@ens.fr> > Cc: "11.1" <mesa-sta...@lists.freedesktop.org> > --- > src/gallium/drivers/radeon/r600_pipe_common.c | 10 ++++++++-- > src/gallium/drivers/radeon/r600_pipe_common.h | 1 + > 2 files changed, 9 insertions(+), 2 deletions(-) > > diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c > b/src/gallium/drivers/radeon/r600_pipe_common.c > index f03dcd9..aaea8fe 100644 > --- a/src/gallium/drivers/radeon/r600_pipe_common.c > +++ b/src/gallium/drivers/radeon/r600_pipe_common.c > @@ -136,8 +136,12 @@ static void r600_memory_barrier(struct pipe_context > *ctx, unsigned flags) > void r600_preflush_suspend_features(struct r600_common_context *ctx) > { > /* suspend queries */ > - if (!LIST_IS_EMPTY(&ctx->active_nontimer_queries)) > + if (ctx->num_cs_dw_nontimer_queries_suspend) { > + /* Since non-timer queries are suspended during blits, > + * we have to guard against double-suspends. */ > r600_suspend_nontimer_queries(ctx); > + ctx->nontimer_queries_suspended_by_flush = true; > + } > if (!LIST_IS_EMPTY(&ctx->active_timer_queries)) > r600_suspend_timer_queries(ctx); > > @@ -158,8 +162,10 @@ void r600_postflush_resume_features(struct > r600_common_context *ctx) > /* resume queries */ > if (!LIST_IS_EMPTY(&ctx->active_timer_queries)) > r600_resume_timer_queries(ctx); > - if (!LIST_IS_EMPTY(&ctx->active_nontimer_queries)) > + if (ctx->nontimer_queries_suspended_by_flush) { > + ctx->nontimer_queries_suspended_by_flush = false; > r600_resume_nontimer_queries(ctx); > + } > } > > static void r600_flush_from_st(struct pipe_context *ctx, > diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h > b/src/gallium/drivers/radeon/r600_pipe_common.h > index 253d657..a4f3fce 100644 > --- a/src/gallium/drivers/radeon/r600_pipe_common.h > +++ b/src/gallium/drivers/radeon/r600_pipe_common.h > @@ -396,6 +396,7 @@ struct r600_common_context { > struct list_head active_nontimer_queries; > struct list_head active_timer_queries; > unsigned num_cs_dw_nontimer_queries_suspend; > + bool nontimer_queries_suspended_by_flush; > unsigned num_cs_dw_timer_queries_suspend; > /* Additional hardware info. */ > unsigned backend_mask; > -- > 2.5.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev