mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 20:38:06 +02:00
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 <robdclark@gmail.com>
This commit is contained in:
parent
37b724ff72
commit
9e30e7490d
2 changed files with 28 additions and 8 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue