freedreno: batch query prep-work
authorRob Clark <robdclark@gmail.com>
Thu, 28 Jun 2018 12:16:12 +0000 (08:16 -0400)
committerRob Clark <robdclark@gmail.com>
Wed, 18 Jul 2018 14:19:03 +0000 (10:19 -0400)
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>
src/gallium/drivers/freedreno/freedreno_query_acc.c
src/gallium/drivers/freedreno/freedreno_query_acc.h

index a8e28026a84e348ecad225d6fbe2b50627d3a468..a7420d695f0c67686f55226a5f5515d37dcaedf3 100644 (file)
@@ -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)
 {
index 8c4415fe73699ecd6132ed84e7a5ca8bbf3ac13f..3bbffe4436f02758c1da780ed30522edac92f20d 100644 (file)
@@ -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);