diff options
25 files changed, 52 insertions, 33 deletions
diff --git a/src/gallium/auxiliary/hud/hud_driver_query.c b/src/gallium/auxiliary/hud/hud_driver_query.c index 0f52e18cc2d..b48708c2fe6 100644 --- a/src/gallium/auxiliary/hud/hud_driver_query.c +++ b/src/gallium/auxiliary/hud/hud_driver_query.c @@ -90,7 +90,7 @@ query_new_value(struct hud_graph *gr) NUM_QUERIES); pipe->destroy_query(pipe, info->query[info->head]); info->query[info->head] = - pipe->create_query(pipe, info->query_type); + pipe->create_query(pipe, info->query_type, 0); } else { /* the last query is busy, we need to add a new one we can use @@ -98,7 +98,7 @@ query_new_value(struct hud_graph *gr) info->head = (info->head+1) % NUM_QUERIES; if (!info->query[info->head]) { info->query[info->head] = - pipe->create_query(pipe, info->query_type); + pipe->create_query(pipe, info->query_type, 0); } } break; @@ -119,7 +119,7 @@ query_new_value(struct hud_graph *gr) else { /* initialize */ info->last_time = now; - info->query[info->head] = pipe->create_query(pipe, info->query_type); + info->query[info->head] = pipe->create_query(pipe, info->query_type, 0); pipe->begin_query(pipe, info->query[info->head]); } } diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst index a9625f39edc..5861f46b30d 100644 --- a/src/gallium/docs/source/context.rst +++ b/src/gallium/docs/source/context.rst @@ -300,6 +300,10 @@ Queries can be created with ``create_query`` and deleted with ``destroy_query``. To start a query, use ``begin_query``, and when finished, use ``end_query`` to end the query. +``create_query`` takes a query type (``PIPE_QUERY_*``), as well as an index, +which is the vertex stream for ``PIPE_QUERY_PRIMITIVES_GENERATED`` and +``PIPE_QUERY_PRIMITIVES_EMITTED``, and allocates a query structure. + ``begin_query`` will clear/reset previous query results. ``get_query_result`` is used to retrieve the results of a query. If diff --git a/src/gallium/drivers/freedreno/freedreno_query.c b/src/gallium/drivers/freedreno/freedreno_query.c index 8753a4b02c9..cb3b49a5f58 100644 --- a/src/gallium/drivers/freedreno/freedreno_query.c +++ b/src/gallium/drivers/freedreno/freedreno_query.c @@ -40,7 +40,7 @@ */ static struct pipe_query * -fd_create_query(struct pipe_context *pctx, unsigned query_type) +fd_create_query(struct pipe_context *pctx, unsigned query_type, unsigned index) { struct fd_context *ctx = fd_context(pctx); struct fd_query *q; diff --git a/src/gallium/drivers/galahad/glhd_context.c b/src/gallium/drivers/galahad/glhd_context.c index 2e61e5924a6..79d549585b7 100644 --- a/src/gallium/drivers/galahad/glhd_context.c +++ b/src/gallium/drivers/galahad/glhd_context.c @@ -63,7 +63,8 @@ galahad_context_draw_vbo(struct pipe_context *_pipe, static struct pipe_query * galahad_context_create_query(struct pipe_context *_pipe, - unsigned query_type) + unsigned query_type, + unsigned index) { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct pipe_context *pipe = glhd_pipe->pipe; @@ -79,7 +80,8 @@ galahad_context_create_query(struct pipe_context *_pipe, } return pipe->create_query(pipe, - query_type); + query_type, + index); } static void diff --git a/src/gallium/drivers/i915/i915_query.c b/src/gallium/drivers/i915/i915_query.c index 0efceb192b6..1500d970b0f 100644 --- a/src/gallium/drivers/i915/i915_query.c +++ b/src/gallium/drivers/i915/i915_query.c @@ -40,7 +40,8 @@ struct i915_query }; static struct pipe_query *i915_create_query(struct pipe_context *ctx, - unsigned query_type) + unsigned query_type, + unsigned index) { struct i915_query *query = CALLOC_STRUCT( i915_query ); diff --git a/src/gallium/drivers/identity/id_context.c b/src/gallium/drivers/identity/id_context.c index 00414b89624..97b39671fce 100644 --- a/src/gallium/drivers/identity/id_context.c +++ b/src/gallium/drivers/identity/id_context.c @@ -57,13 +57,15 @@ identity_draw_vbo(struct pipe_context *_pipe, static struct pipe_query * identity_create_query(struct pipe_context *_pipe, - unsigned query_type) + unsigned query_type, + unsigned index) { struct identity_context *id_pipe = identity_context(_pipe); struct pipe_context *pipe = id_pipe->pipe; return pipe->create_query(pipe, - query_type); + query_type, + index); } static void diff --git a/src/gallium/drivers/ilo/ilo_query.c b/src/gallium/drivers/ilo/ilo_query.c index 71bcc0f983f..46e6bf766e1 100644 --- a/src/gallium/drivers/ilo/ilo_query.c +++ b/src/gallium/drivers/ilo/ilo_query.c @@ -70,7 +70,7 @@ ilo_query(struct pipe_query *query) } static struct pipe_query * -ilo_create_query(struct pipe_context *pipe, unsigned query_type) +ilo_create_query(struct pipe_context *pipe, unsigned query_type, unsigned index) { struct ilo_query *q; diff --git a/src/gallium/drivers/llvmpipe/lp_query.c b/src/gallium/drivers/llvmpipe/lp_query.c index 2bc9c1aeb86..8f41f56f1c4 100644 --- a/src/gallium/drivers/llvmpipe/lp_query.c +++ b/src/gallium/drivers/llvmpipe/lp_query.c @@ -50,7 +50,8 @@ static struct llvmpipe_query *llvmpipe_query( struct pipe_query *p ) static struct pipe_query * llvmpipe_create_query(struct pipe_context *pipe, - unsigned type) + unsigned type, + unsigned index) { struct llvmpipe_query *pq; diff --git a/src/gallium/drivers/noop/noop_pipe.c b/src/gallium/drivers/noop/noop_pipe.c index 27197a50454..8cb8c702c0e 100644 --- a/src/gallium/drivers/noop/noop_pipe.c +++ b/src/gallium/drivers/noop/noop_pipe.c @@ -46,7 +46,7 @@ struct noop_pipe_screen { struct noop_query { unsigned query; }; -static struct pipe_query *noop_create_query(struct pipe_context *ctx, unsigned query_type) +static struct pipe_query *noop_create_query(struct pipe_context *ctx, unsigned query_type, unsigned index) { struct noop_query *query = CALLOC_STRUCT(noop_query); diff --git a/src/gallium/drivers/nouveau/nv30/nv30_query.c b/src/gallium/drivers/nouveau/nv30/nv30_query.c index 01b3817c45d..ace2cdcd795 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_query.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_query.c @@ -105,7 +105,7 @@ nv30_query(struct pipe_query *pipe) } static struct pipe_query * -nv30_query_create(struct pipe_context *pipe, unsigned type) +nv30_query_create(struct pipe_context *pipe, unsigned type, unsigned index) { struct nv30_query *q = CALLOC_STRUCT(nv30_query); if (!q) diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query.c b/src/gallium/drivers/nouveau/nv50/nv50_query.c index 6a17139e1cd..a373dc60a67 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_query.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_query.c @@ -96,7 +96,7 @@ nv50_query_destroy(struct pipe_context *pipe, struct pipe_query *pq) } static struct pipe_query * -nv50_query_create(struct pipe_context *pipe, unsigned type) +nv50_query_create(struct pipe_context *pipe, unsigned type, unsigned index) { struct nv50_context *nv50 = nv50_context(pipe); struct nv50_query *q; diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state.c b/src/gallium/drivers/nouveau/nv50/nv50_state.c index d0bc7ff1a2a..915ee26ecac 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_state.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_state.c @@ -1028,7 +1028,7 @@ nv50_so_target_create(struct pipe_context *pipe, if (nouveau_context(pipe)->screen->class_3d >= NVA0_3D_CLASS) { targ->pq = pipe->create_query(pipe, - NVA0_QUERY_STREAM_OUTPUT_BUFFER_OFFSET); + NVA0_QUERY_STREAM_OUTPUT_BUFFER_OFFSET, 0); if (!targ->pq) { FREE(targ); return NULL; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query.c b/src/gallium/drivers/nouveau/nvc0/nvc0_query.c index 856f685ceb6..dc544d36efc 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_query.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query.c @@ -108,7 +108,7 @@ nvc0_query_destroy(struct pipe_context *pipe, struct pipe_query *pq) } static struct pipe_query * -nvc0_query_create(struct pipe_context *pipe, unsigned type) +nvc0_query_create(struct pipe_context *pipe, unsigned type, unsigned index) { struct nvc0_context *nvc0 = nvc0_context(pipe); struct nvc0_query *q; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c index c92aaaca578..ef9d479ca07 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c @@ -1022,7 +1022,7 @@ nvc0_so_target_create(struct pipe_context *pipe, if (!targ) return NULL; - targ->pq = pipe->create_query(pipe, NVC0_QUERY_TFB_BUFFER_OFFSET); + targ->pq = pipe->create_query(pipe, NVC0_QUERY_TFB_BUFFER_OFFSET, 0); if (!targ->pq) { FREE(targ); return NULL; diff --git a/src/gallium/drivers/r300/r300_query.c b/src/gallium/drivers/r300/r300_query.c index fbf44c68419..5305ebdcb7f 100644 --- a/src/gallium/drivers/r300/r300_query.c +++ b/src/gallium/drivers/r300/r300_query.c @@ -30,7 +30,8 @@ #include <stdio.h> static struct pipe_query *r300_create_query(struct pipe_context *pipe, - unsigned query_type) + unsigned query_type, + unsigned index) { struct r300_context *r300 = r300_context(pipe); struct r300_screen *r300screen = r300->screen; diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c index c4394416003..92863cb2143 100644 --- a/src/gallium/drivers/radeon/r600_query.c +++ b/src/gallium/drivers/radeon/r600_query.c @@ -346,7 +346,7 @@ static void r600_emit_query_predication(struct r600_common_context *ctx, struct } } -static struct pipe_query *r600_create_query(struct pipe_context *ctx, unsigned query_type) +static struct pipe_query *r600_create_query(struct pipe_context *ctx, unsigned query_type, unsigned index) { struct r600_common_context *rctx = (struct r600_common_context *)ctx; struct r600_query *query; diff --git a/src/gallium/drivers/rbug/rbug_context.c b/src/gallium/drivers/rbug/rbug_context.c index 2b99ddd7289..62fe543b761 100644 --- a/src/gallium/drivers/rbug/rbug_context.c +++ b/src/gallium/drivers/rbug/rbug_context.c @@ -134,14 +134,16 @@ rbug_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *info) static struct pipe_query * rbug_create_query(struct pipe_context *_pipe, - unsigned query_type) + unsigned query_type, + unsigned index) { struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; pipe_mutex_lock(rb_pipe->call_mutex); return pipe->create_query(pipe, - query_type); + query_type, + index); pipe_mutex_unlock(rb_pipe->call_mutex); } diff --git a/src/gallium/drivers/softpipe/sp_query.c b/src/gallium/drivers/softpipe/sp_query.c index 88223708f4f..e2fc917b361 100644 --- a/src/gallium/drivers/softpipe/sp_query.c +++ b/src/gallium/drivers/softpipe/sp_query.c @@ -53,7 +53,8 @@ static struct softpipe_query *softpipe_query( struct pipe_query *p ) static struct pipe_query * softpipe_create_query(struct pipe_context *pipe, - unsigned type) + unsigned type, + unsigned index) { struct softpipe_query* sq; diff --git a/src/gallium/drivers/svga/svga_pipe_query.c b/src/gallium/drivers/svga/svga_pipe_query.c index 0283aa90790..756e2b8baf4 100644 --- a/src/gallium/drivers/svga/svga_pipe_query.c +++ b/src/gallium/drivers/svga/svga_pipe_query.c @@ -74,7 +74,9 @@ svga_get_query_result(struct pipe_context *pipe, static struct pipe_query * -svga_create_query( struct pipe_context *pipe, unsigned query_type ) +svga_create_query(struct pipe_context *pipe, + unsigned query_type, + unsigned index) { struct svga_context *svga = svga_context( pipe ); struct svga_screen *svgascreen = svga_screen(pipe->screen); diff --git a/src/gallium/drivers/trace/tr_context.c b/src/gallium/drivers/trace/tr_context.c index 3e995980e92..551c3facb64 100644 --- a/src/gallium/drivers/trace/tr_context.c +++ b/src/gallium/drivers/trace/tr_context.c @@ -127,7 +127,8 @@ trace_context_draw_vbo(struct pipe_context *_pipe, static INLINE struct pipe_query * trace_context_create_query(struct pipe_context *_pipe, - unsigned query_type) + unsigned query_type, + unsigned index) { struct trace_context *tr_ctx = trace_context(_pipe); struct pipe_context *pipe = tr_ctx->pipe; @@ -137,8 +138,9 @@ trace_context_create_query(struct pipe_context *_pipe, trace_dump_arg(ptr, pipe); trace_dump_arg(query_type, query_type); + trace_dump_arg(int, index); - query = pipe->create_query(pipe, query_type); + query = pipe->create_query(pipe, query_type, index); trace_dump_ret(ptr, query); diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h index bc435308d2e..af5674ff753 100644 --- a/src/gallium/include/pipe/p_context.h +++ b/src/gallium/include/pipe/p_context.h @@ -109,7 +109,8 @@ struct pipe_context { */ /*@{*/ struct pipe_query *(*create_query)( struct pipe_context *pipe, - unsigned query_type ); + unsigned query_type, + unsigned index ); void (*destroy_query)(struct pipe_context *pipe, struct pipe_query *q); diff --git a/src/gallium/state_trackers/clover/core/timestamp.cpp b/src/gallium/state_trackers/clover/core/timestamp.cpp index f168d61b6c9..481c4f9d2ff 100644 --- a/src/gallium/state_trackers/clover/core/timestamp.cpp +++ b/src/gallium/state_trackers/clover/core/timestamp.cpp @@ -29,7 +29,7 @@ using namespace clover; timestamp::query::query(command_queue &q) : q(q), - _query(q.pipe->create_query(q.pipe, PIPE_QUERY_TIMESTAMP)) { + _query(q.pipe->create_query(q.pipe, PIPE_QUERY_TIMESTAMP, 0)) { } timestamp::query::query(query &&other) : diff --git a/src/gallium/tests/graw/occlusion-query.c b/src/gallium/tests/graw/occlusion-query.c index f5227e33e9d..d03934f9d19 100644 --- a/src/gallium/tests/graw/occlusion-query.c +++ b/src/gallium/tests/graw/occlusion-query.c @@ -169,8 +169,8 @@ draw(void) PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTHSTENCIL, &clear_color, 1.0, 0); - q1 = info.ctx->create_query(info.ctx, PIPE_QUERY_OCCLUSION_COUNTER); - q2 = info.ctx->create_query(info.ctx, PIPE_QUERY_OCCLUSION_COUNTER); + q1 = info.ctx->create_query(info.ctx, PIPE_QUERY_OCCLUSION_COUNTER, 0); + q2 = info.ctx->create_query(info.ctx, PIPE_QUERY_OCCLUSION_COUNTER, 0); /* draw first, large object */ set_vertices(obj1_vertices, sizeof(obj1_vertices)); diff --git a/src/gallium/tools/trace/dump_state.py b/src/gallium/tools/trace/dump_state.py index 8bb29e7d6c1..e726f7b2ad3 100755 --- a/src/gallium/tools/trace/dump_state.py +++ b/src/gallium/tools/trace/dump_state.py @@ -665,7 +665,7 @@ class Context(Dispatcher): def surface_destroy(self, surface): self.interpreter.unregister_object(surface) - def create_query(self, query_type): + def create_query(self, query_type, index): return query_type def destroy_query(self, query): diff --git a/src/mesa/state_tracker/st_cb_queryobj.c b/src/mesa/state_tracker/st_cb_queryobj.c index 78a737094cd..1aaa322f615 100644 --- a/src/mesa/state_tracker/st_cb_queryobj.c +++ b/src/mesa/state_tracker/st_cb_queryobj.c @@ -132,13 +132,13 @@ st_BeginQuery(struct gl_context *ctx, struct gl_query_object *q) type == PIPE_QUERY_TIMESTAMP) { /* Determine time elapsed by emitting two timestamp queries. */ if (!stq->pq_begin) { - stq->pq_begin = pipe->create_query(pipe, type); + stq->pq_begin = pipe->create_query(pipe, type, 0); stq->type = type; } pipe->end_query(pipe, stq->pq_begin); } else { if (!stq->pq) { - stq->pq = pipe->create_query(pipe, type); + stq->pq = pipe->create_query(pipe, type, 0); stq->type = type; } if (stq->pq) { @@ -164,7 +164,7 @@ st_EndQuery(struct gl_context *ctx, struct gl_query_object *q) if ((q->Target == GL_TIMESTAMP || q->Target == GL_TIME_ELAPSED) && !stq->pq) { - stq->pq = pipe->create_query(pipe, PIPE_QUERY_TIMESTAMP); + stq->pq = pipe->create_query(pipe, PIPE_QUERY_TIMESTAMP, 0); stq->type = PIPE_QUERY_TIMESTAMP; } |