[Mesa-dev] [PATCH 1/9] panfrost: Implement callbacks for PRIMITIVES queries
Boris Brezillon
boris.brezillon at collabora.com
Tue Aug 13 15:57:32 UTC 2019
On Fri, 9 Aug 2019 13:00:44 -0700
Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com> wrote:
> We're just going to compute them in the driver but let's get the
> structures setup to handle them. Implementation from v3d.
>
> Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
The whole patchset is
Reviewed-by: Boris Brezillon <boris.brezillon at collabora.com>
> ---
> src/gallium/drivers/panfrost/pan_context.c | 52 ++++++++++++++++------
> src/gallium/drivers/panfrost/pan_context.h | 15 ++++++-
> 2 files changed, 52 insertions(+), 15 deletions(-)
>
> diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
> index ac1d1b9429b..3903a4ca337 100644
> --- a/src/gallium/drivers/panfrost/pan_context.c
> +++ b/src/gallium/drivers/panfrost/pan_context.c
> @@ -2365,7 +2365,8 @@ static void
> panfrost_set_active_query_state(struct pipe_context *pipe,
> bool enable)
> {
> - //struct panfrost_context *panfrost = pan_context(pipe);
> + struct panfrost_context *ctx = pan_context(pipe);
> + ctx->active_queries = enable;
> }
>
> static void
> @@ -2415,17 +2416,24 @@ panfrost_begin_query(struct pipe_context *pipe, struct pipe_query *q)
> switch (query->type) {
> case PIPE_QUERY_OCCLUSION_COUNTER:
> case PIPE_QUERY_OCCLUSION_PREDICATE:
> - case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE: {
> + case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:
> /* Allocate a word for the query results to be stored */
> query->transfer = panfrost_allocate_transient(ctx, sizeof(unsigned));
> -
> ctx->occlusion_query = query;
> + break;
> +
> + /* Geometry statistics are computed in the driver. XXX: geom/tess
> + * shaders.. */
>
> + case PIPE_QUERY_PRIMITIVES_GENERATED:
> + query->start = ctx->prims_generated;
> + break;
> + case PIPE_QUERY_PRIMITIVES_EMITTED:
> + query->start = ctx->tf_prims_generated;
> break;
> - }
>
> default:
> - DBG("Skipping query %d\n", query->type);
> + fprintf(stderr, "Skipping query %d\n", query->type);
> break;
> }
>
> @@ -2436,7 +2444,22 @@ static bool
> panfrost_end_query(struct pipe_context *pipe, struct pipe_query *q)
> {
> struct panfrost_context *ctx = pan_context(pipe);
> - ctx->occlusion_query = NULL;
> + struct panfrost_query *query = (struct panfrost_query *) q;
> +
> + switch (query->type) {
> + case PIPE_QUERY_OCCLUSION_COUNTER:
> + case PIPE_QUERY_OCCLUSION_PREDICATE:
> + case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:
> + ctx->occlusion_query = NULL;
> + break;
> + case PIPE_QUERY_PRIMITIVES_GENERATED:
> + query->end = ctx->prims_generated;
> + break;
> + case PIPE_QUERY_PRIMITIVES_EMITTED:
> + query->end = ctx->tf_prims_generated;
> + break;
> + }
> +
> return true;
> }
>
> @@ -2446,18 +2469,16 @@ panfrost_get_query_result(struct pipe_context *pipe,
> bool wait,
> union pipe_query_result *vresult)
> {
> - /* STUB */
> struct panfrost_query *query = (struct panfrost_query *) q;
>
> - /* We need to flush out the jobs to actually run the counter, TODO
> - * check wait, TODO wallpaper after if needed */
> -
> - panfrost_flush(pipe, NULL, PIPE_FLUSH_END_OF_FRAME);
>
> switch (query->type) {
> case PIPE_QUERY_OCCLUSION_COUNTER:
> case PIPE_QUERY_OCCLUSION_PREDICATE:
> - case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE: {
> + case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:
> + /* Flush first */
> + panfrost_flush(pipe, NULL, PIPE_FLUSH_END_OF_FRAME);
> +
> /* Read back the query results */
> unsigned *result = (unsigned *) query->transfer.cpu;
> unsigned passed = *result;
> @@ -2469,7 +2490,12 @@ panfrost_get_query_result(struct pipe_context *pipe,
> }
>
> break;
> - }
> +
> + case PIPE_QUERY_PRIMITIVES_GENERATED:
> + case PIPE_QUERY_PRIMITIVES_EMITTED:
> + vresult->u64 = query->end - query->start;
> + break;
> +
> default:
> DBG("Skipped query get %d\n", query->type);
> break;
> diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
> index 542d24d2c27..24c54fe3467 100644
> --- a/src/gallium/drivers/panfrost/pan_context.h
> +++ b/src/gallium/drivers/panfrost/pan_context.h
> @@ -79,8 +79,16 @@ struct panfrost_query {
> unsigned type;
> unsigned index;
>
> - /* Memory for the GPU to writeback the value of the query */
> - struct panfrost_transfer transfer;
> + union {
> + /* For computed queries. 64-bit to prevent overflow */
> + struct {
> + uint64_t start;
> + uint64_t end;
> + };
> +
> + /* Memory for the GPU to writeback the value of the query */
> + struct panfrost_transfer transfer;
> + };
> };
>
> struct panfrost_fence {
> @@ -120,6 +128,9 @@ struct panfrost_context {
> struct panfrost_memory tiler_dummy;
> struct panfrost_memory depth_stencil_buffer;
>
> + bool active_queries;
> + uint64_t prims_generated;
> + uint64_t tf_prims_generated;
> struct panfrost_query *occlusion_query;
>
> /* Each draw has corresponding vertex and tiler payloads */
More information about the mesa-dev
mailing list