[Mesa-dev] [PATCH] radeon: only suspend queries on flush if they haven't been suspended yet

Marek Olšák maraeo at gmail.com
Fri Nov 27 16:03:49 PST 2015


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Sat, Nov 28, 2015 at 12:24 AM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at 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 <nhaehnle at 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.olsak at amd.com>
>
> Reported-by: Axel Davy <axel.davy at ens.fr>
> Cc: "11.1" <mesa-stable at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list