[Mesa-dev] [PATCH 10/10] radeon: count cs dwords separately for query begin and end

Marek Olšák maraeo at gmail.com
Mon Nov 16 02:18:47 PST 2015


For the series:

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

Marek

On Fri, Nov 13, 2015 at 5:10 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> This will be important for perfcounter queries.
> ---
>  src/gallium/drivers/radeon/r600_query.c | 33 +++++++++++++++++++--------------
>  src/gallium/drivers/radeon/r600_query.h |  3 ++-
>  2 files changed, 21 insertions(+), 15 deletions(-)
>
> diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c
> index 4f89634..f8a30a2 100644
> --- a/src/gallium/drivers/radeon/r600_query.c
> +++ b/src/gallium/drivers/radeon/r600_query.c
> @@ -342,16 +342,18 @@ static struct pipe_query *r600_query_hw_create(struct r600_common_context *rctx,
>         case PIPE_QUERY_OCCLUSION_COUNTER:
>         case PIPE_QUERY_OCCLUSION_PREDICATE:
>                 query->result_size = 16 * rctx->max_db;
> -               query->num_cs_dw = 6;
> +               query->num_cs_dw_begin = 6;
> +               query->num_cs_dw_end = 6;
>                 break;
>         case PIPE_QUERY_TIME_ELAPSED:
>                 query->result_size = 16;
> -               query->num_cs_dw = 8;
> +               query->num_cs_dw_begin = 8;
> +               query->num_cs_dw_end = 8;
>                 query->flags = R600_QUERY_HW_FLAG_TIMER;
>                 break;
>         case PIPE_QUERY_TIMESTAMP:
>                 query->result_size = 8;
> -               query->num_cs_dw = 8;
> +               query->num_cs_dw_end = 8;
>                 query->flags = R600_QUERY_HW_FLAG_TIMER |
>                                R600_QUERY_HW_FLAG_NO_START;
>                 break;
> @@ -361,13 +363,15 @@ static struct pipe_query *r600_query_hw_create(struct r600_common_context *rctx,
>         case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
>                 /* NumPrimitivesWritten, PrimitiveStorageNeeded. */
>                 query->result_size = 32;
> -               query->num_cs_dw = 6;
> +               query->num_cs_dw_begin = 6;
> +               query->num_cs_dw_end = 6;
>                 query->stream = index;
>                 break;
>         case PIPE_QUERY_PIPELINE_STATISTICS:
>                 /* 11 values on EG, 8 on R600. */
>                 query->result_size = (rctx->chip_class >= EVERGREEN ? 11 : 8) * 16;
> -               query->num_cs_dw = 6;
> +               query->num_cs_dw_begin = 6;
> +               query->num_cs_dw_end = 6;
>                 break;
>         default:
>                 assert(0);
> @@ -465,7 +469,9 @@ static void r600_query_hw_emit_start(struct r600_common_context *ctx,
>
>         r600_update_occlusion_query_state(ctx, query->b.type, 1);
>         r600_update_prims_generated_query_state(ctx, query->b.type, 1);
> -       ctx->need_gfx_cs_space(&ctx->b, query->num_cs_dw * 2, TRUE);
> +
> +       ctx->need_gfx_cs_space(&ctx->b, query->num_cs_dw_begin + query->num_cs_dw_end,
> +                              TRUE);
>
>         /* Get a new query buffer if needed. */
>         if (query->buffer.results_end + query->result_size > query->buffer.buf->b.b.width0) {
> @@ -482,10 +488,9 @@ static void r600_query_hw_emit_start(struct r600_common_context *ctx,
>         query->ops->emit_start(ctx, query, query->buffer.buf, va);
>
>         if (query->flags & R600_QUERY_HW_FLAG_TIMER)
> -               ctx->num_cs_dw_timer_queries_suspend += query->num_cs_dw;
> +               ctx->num_cs_dw_timer_queries_suspend += query->num_cs_dw_end;
>         else
> -               ctx->num_cs_dw_nontimer_queries_suspend += query->num_cs_dw;
> -
> +               ctx->num_cs_dw_nontimer_queries_suspend += query->num_cs_dw_end;
>  }
>
>  static void r600_query_hw_do_emit_stop(struct r600_common_context *ctx,
> @@ -546,7 +551,7 @@ static void r600_query_hw_emit_stop(struct r600_common_context *ctx,
>
>         /* The queries which need begin already called this in begin_query. */
>         if (query->flags & R600_QUERY_HW_FLAG_NO_START) {
> -               ctx->need_gfx_cs_space(&ctx->b, query->num_cs_dw, FALSE);
> +               ctx->need_gfx_cs_space(&ctx->b, query->num_cs_dw_end, FALSE);
>         }
>
>         /* emit end query */
> @@ -558,9 +563,9 @@ static void r600_query_hw_emit_stop(struct r600_common_context *ctx,
>
>         if (!(query->flags & R600_QUERY_HW_FLAG_NO_START)) {
>                 if (query->flags & R600_QUERY_HW_FLAG_TIMER)
> -                       ctx->num_cs_dw_timer_queries_suspend -= query->num_cs_dw;
> +                       ctx->num_cs_dw_timer_queries_suspend -= query->num_cs_dw_end;
>                 else
> -                       ctx->num_cs_dw_nontimer_queries_suspend -= query->num_cs_dw;
> +                       ctx->num_cs_dw_nontimer_queries_suspend -= query->num_cs_dw_end;
>         }
>
>         r600_update_occlusion_query_state(ctx, query->b.type, -1);
> @@ -980,14 +985,14 @@ static unsigned r600_queries_num_cs_dw_for_resuming(struct r600_common_context *
>
>         LIST_FOR_EACH_ENTRY(query, query_list, list) {
>                 /* begin + end */
> -               num_dw += query->num_cs_dw * 2;
> +               num_dw += query->num_cs_dw_begin + query->num_cs_dw_end;
>
>                 /* Workaround for the fact that
>                  * num_cs_dw_nontimer_queries_suspend is incremented for every
>                  * resumed query, which raises the bar in need_cs_space for
>                  * queries about to be resumed.
>                  */
> -               num_dw += query->num_cs_dw;
> +               num_dw += query->num_cs_dw_end;
>         }
>         /* primitives generated query */
>         num_dw += ctx->streamout.enable_atom.num_dw;
> diff --git a/src/gallium/drivers/radeon/r600_query.h b/src/gallium/drivers/radeon/r600_query.h
> index 4e357f5..e934a18 100644
> --- a/src/gallium/drivers/radeon/r600_query.h
> +++ b/src/gallium/drivers/radeon/r600_query.h
> @@ -115,7 +115,8 @@ struct r600_query_hw {
>          * this can be one or two numbers, or it could even be a size of a structure. */
>         unsigned result_size;
>         /* The number of dwords for begin_query or end_query. */
> -       unsigned num_cs_dw;
> +       unsigned num_cs_dw_begin;
> +       unsigned num_cs_dw_end;
>         /* Linked list of queries */
>         struct list_head list;
>         /* For transform feedback: which stream the query is for */
> --
> 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