[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