From 9e30e7490da0a89a1760fc23d150e21310066d0c Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Thu, 28 Jun 2018 08:16:12 -0400 Subject: [PATCH 1/1] freedreno: batch query prep-work For batch queries we have N different query_type's for one query, so mapping a single query_type to a sample_provider doesn't really work out. Instead add a new constructor to construct a query directly from a sample_provider. Also, the sample buffer size needs to be determined at runtime, as it depends on the number of query_types. Signed-off-by: Rob Clark --- .../drivers/freedreno/freedreno_query_acc.c | 25 +++++++++++++------ .../drivers/freedreno/freedreno_query_acc.h | 11 +++++++- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/freedreno/freedreno_query_acc.c b/src/gallium/drivers/freedreno/freedreno_query_acc.c index a8e28026a84..a7420d695f0 100644 --- a/src/gallium/drivers/freedreno/freedreno_query_acc.c +++ b/src/gallium/drivers/freedreno/freedreno_query_acc.c @@ -49,6 +49,7 @@ fd_acc_destroy_query(struct fd_context *ctx, struct fd_query *q) pipe_resource_reference(&aq->prsc, NULL); list_del(&aq->node); + free(aq->query_data); free(aq); } @@ -69,7 +70,7 @@ realloc_query_bo(struct fd_context *ctx, struct fd_acc_query *aq) fd_bo_cpu_prep(rsc->bo, ctx->pipe, DRM_FREEDRENO_PREP_WRITE); map = fd_bo_map(rsc->bo); - memset(map, 0, aq->provider->size); + memset(map, 0, aq->size); fd_bo_cpu_fini(rsc->bo); } @@ -171,14 +172,11 @@ static const struct fd_query_funcs acc_query_funcs = { }; struct fd_query * -fd_acc_create_query(struct fd_context *ctx, unsigned query_type) +fd_acc_create_query2(struct fd_context *ctx, unsigned query_type, + const struct fd_acc_sample_provider *provider) { struct fd_acc_query *aq; struct fd_query *q; - int idx = pidx(query_type); - - if ((idx < 0) || !ctx->acc_sample_providers[idx]) - return NULL; aq = CALLOC_STRUCT(fd_acc_query); if (!aq) @@ -186,7 +184,8 @@ fd_acc_create_query(struct fd_context *ctx, unsigned query_type) DBG("%p: query_type=%u", aq, query_type); - aq->provider = ctx->acc_sample_providers[idx]; + aq->provider = provider; + aq->size = provider->size; list_inithead(&aq->node); @@ -197,6 +196,18 @@ fd_acc_create_query(struct fd_context *ctx, unsigned query_type) return q; } +struct fd_query * +fd_acc_create_query(struct fd_context *ctx, unsigned query_type) +{ + int idx = pidx(query_type); + + if ((idx < 0) || !ctx->acc_sample_providers[idx]) + return NULL; + + return fd_acc_create_query2(ctx, query_type, + ctx->acc_sample_providers[idx]); +} + void fd_acc_query_set_stage(struct fd_batch *batch, enum fd_render_stage stage) { diff --git a/src/gallium/drivers/freedreno/freedreno_query_acc.h b/src/gallium/drivers/freedreno/freedreno_query_acc.h index 8c4415fe736..3bbffe4436f 100644 --- a/src/gallium/drivers/freedreno/freedreno_query_acc.h +++ b/src/gallium/drivers/freedreno/freedreno_query_acc.h @@ -77,11 +77,18 @@ struct fd_acc_query { const struct fd_acc_sample_provider *provider; struct pipe_resource *prsc; - unsigned offset; + + /* usually the same as provider->size but for batch queries we + * need to calculate the size dynamically when the query is + * allocated: + */ + unsigned size; struct list_head node; /* list-node in ctx->active_acc_queries */ int no_wait_cnt; /* see fd_acc_get_query_result() */ + + void *query_data; /* query specific data */ }; static inline struct fd_acc_query * @@ -91,6 +98,8 @@ fd_acc_query(struct fd_query *q) } struct fd_query * fd_acc_create_query(struct fd_context *ctx, unsigned query_type); +struct fd_query * fd_acc_create_query2(struct fd_context *ctx, unsigned query_type, + const struct fd_acc_sample_provider *provider); void fd_acc_query_set_stage(struct fd_batch *batch, enum fd_render_stage stage); void fd_acc_query_register_provider(struct pipe_context *pctx, const struct fd_acc_sample_provider *provider); -- 2.30.2