[Mesa-dev] [PATCH 1/2] gallium: add pipe_context::set_active_query_state for pausing queries

Nicolai Hähnle nhaehnle at gmail.com
Mon Apr 11 15:54:49 UTC 2016


On 07.04.2016 19:11, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
>   src/gallium/docs/source/context.rst             |  3 +++
>   src/gallium/drivers/ddebug/dd_context.c         |  9 +++++++++
>   src/gallium/drivers/freedreno/freedreno_query.c |  6 ++++++
>   src/gallium/drivers/i915/i915_query.c           |  6 ++++++
>   src/gallium/drivers/ilo/ilo_query.c             |  6 ++++++
>   src/gallium/drivers/llvmpipe/lp_query.c         |  6 ++++++
>   src/gallium/drivers/noop/noop_pipe.c            |  6 ++++++
>   src/gallium/drivers/nouveau/nv30/nv30_query.c   |  6 ++++++
>   src/gallium/drivers/nouveau/nv50/nv50_query.c   |  6 ++++++
>   src/gallium/drivers/nouveau/nvc0/nvc0_query.c   |  6 ++++++
>   src/gallium/drivers/r300/r300_query.c           |  6 ++++++
>   src/gallium/drivers/radeon/r600_query.c         |  6 ++++++
>   src/gallium/drivers/rbug/rbug_context.c         | 12 ++++++++++++
>   src/gallium/drivers/softpipe/sp_query.c         |  7 +++++++
>   src/gallium/drivers/svga/svga_pipe_query.c      |  7 +++++++
>   src/gallium/drivers/swr/swr_query.cpp           |  7 +++++++
>   src/gallium/drivers/trace/tr_context.c          | 19 +++++++++++++++++++
>   src/gallium/drivers/vc4/vc4_query.c             |  6 ++++++
>   src/gallium/drivers/virgl/virgl_query.c         |  6 ++++++
>   src/gallium/include/pipe/p_context.h            |  6 ++++++
>   20 files changed, 142 insertions(+)
>
> diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst
> index 904e1ff..ee80a4c 100644
> --- a/src/gallium/docs/source/context.rst
> +++ b/src/gallium/docs/source/context.rst
> @@ -330,6 +330,9 @@ a resource without synchronizing with the CPU. This write will optionally
>   wait for the query to complete, and will optionally write whether the value
>   is available instead of the value itself.
>
> +``set_active_query_state`` Set whether all current queries except TIME_ELAPSED
> +are active or paused.

Perhaps "all current queries" -> "all current non-driver queries". 
Probably nobody would want to pause driver queries.

Either way, both patches are

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

> +
>   The interface currently includes the following types of queries:
>
>   ``PIPE_QUERY_OCCLUSION_COUNTER`` counts the number of fragments which
> diff --git a/src/gallium/drivers/ddebug/dd_context.c b/src/gallium/drivers/ddebug/dd_context.c
> index 9dfaa0a..72a950a 100644
> --- a/src/gallium/drivers/ddebug/dd_context.c
> +++ b/src/gallium/drivers/ddebug/dd_context.c
> @@ -124,6 +124,14 @@ dd_context_get_query_result(struct pipe_context *_pipe,
>   }
>
>   static void
> +dd_context_set_active_query_state(struct pipe_context *_pipe, boolean enable)
> +{
> +   struct pipe_context *pipe = dd_context(_pipe)->pipe;
> +
> +   pipe->set_active_query_state(pipe, enable);
> +}
> +
> +static void
>   dd_context_render_condition(struct pipe_context *_pipe,
>                               struct pipe_query *query, boolean condition,
>                               uint mode)
> @@ -667,6 +675,7 @@ dd_context_create(struct dd_screen *dscreen, struct pipe_context *pipe)
>      CTX_INIT(begin_query);
>      CTX_INIT(end_query);
>      CTX_INIT(get_query_result);
> +   CTX_INIT(set_active_query_state);
>      CTX_INIT(create_blend_state);
>      CTX_INIT(bind_blend_state);
>      CTX_INIT(delete_blend_state);
> diff --git a/src/gallium/drivers/freedreno/freedreno_query.c b/src/gallium/drivers/freedreno/freedreno_query.c
> index b87e825..a942705 100644
> --- a/src/gallium/drivers/freedreno/freedreno_query.c
> +++ b/src/gallium/drivers/freedreno/freedreno_query.c
> @@ -114,6 +114,11 @@ fd_get_driver_query_info(struct pipe_screen *pscreen,
>   	return 1;
>   }
>
> +static void
> +fd_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>   void
>   fd_query_screen_init(struct pipe_screen *pscreen)
>   {
> @@ -128,5 +133,6 @@ fd_query_context_init(struct pipe_context *pctx)
>   	pctx->begin_query = fd_begin_query;
>   	pctx->end_query = fd_end_query;
>   	pctx->get_query_result = fd_get_query_result;
> +	pctx->set_active_query_state = fd_set_active_query_state;
>   	pctx->render_condition = fd_render_condition;
>   }
> diff --git a/src/gallium/drivers/i915/i915_query.c b/src/gallium/drivers/i915/i915_query.c
> index 78d67ce..fa1b01d 100644
> --- a/src/gallium/drivers/i915/i915_query.c
> +++ b/src/gallium/drivers/i915/i915_query.c
> @@ -76,6 +76,11 @@ static boolean i915_get_query_result(struct pipe_context *ctx,
>      return TRUE;
>   }
>
> +static void
> +i915_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>   void
>   i915_init_query_functions(struct i915_context *i915)
>   {
> @@ -84,5 +89,6 @@ i915_init_query_functions(struct i915_context *i915)
>      i915->base.begin_query = i915_begin_query;
>      i915->base.end_query = i915_end_query;
>      i915->base.get_query_result = i915_get_query_result;
> +   i915->base.set_active_query_state = i915_set_active_query_state;
>   }
>
> diff --git a/src/gallium/drivers/ilo/ilo_query.c b/src/gallium/drivers/ilo/ilo_query.c
> index 106bd42..8a42f58 100644
> --- a/src/gallium/drivers/ilo/ilo_query.c
> +++ b/src/gallium/drivers/ilo/ilo_query.c
> @@ -222,6 +222,11 @@ ilo_get_query_result(struct pipe_context *pipe, struct pipe_query *query,
>      return true;
>   }
>
> +static void
> +ilo_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>   /**
>    * Initialize query-related functions.
>    */
> @@ -233,4 +238,5 @@ ilo_init_query_functions(struct ilo_context *ilo)
>      ilo->base.begin_query = ilo_begin_query;
>      ilo->base.end_query = ilo_end_query;
>      ilo->base.get_query_result = ilo_get_query_result;
> +   ilo->base.set_active_query_state = ilo_set_active_query_state;
>   }
> diff --git a/src/gallium/drivers/llvmpipe/lp_query.c b/src/gallium/drivers/llvmpipe/lp_query.c
> index fc59367..2fddc90 100644
> --- a/src/gallium/drivers/llvmpipe/lp_query.c
> +++ b/src/gallium/drivers/llvmpipe/lp_query.c
> @@ -320,6 +320,11 @@ llvmpipe_check_render_cond(struct llvmpipe_context *lp)
>         return TRUE;
>   }
>
> +static void
> +llvmpipe_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>   void llvmpipe_init_query_funcs(struct llvmpipe_context *llvmpipe )
>   {
>      llvmpipe->pipe.create_query = llvmpipe_create_query;
> @@ -327,6 +332,7 @@ void llvmpipe_init_query_funcs(struct llvmpipe_context *llvmpipe )
>      llvmpipe->pipe.begin_query = llvmpipe_begin_query;
>      llvmpipe->pipe.end_query = llvmpipe_end_query;
>      llvmpipe->pipe.get_query_result = llvmpipe_get_query_result;
> +   llvmpipe->pipe.set_active_query_state = llvmpipe_set_active_query_state;
>   }
>
>
> diff --git a/src/gallium/drivers/noop/noop_pipe.c b/src/gallium/drivers/noop/noop_pipe.c
> index fd0a5d0..55aca74 100644
> --- a/src/gallium/drivers/noop/noop_pipe.c
> +++ b/src/gallium/drivers/noop/noop_pipe.c
> @@ -78,6 +78,11 @@ static boolean noop_get_query_result(struct pipe_context *ctx,
>   	return TRUE;
>   }
>
> +static void
> +noop_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>
>   /*
>    * resource
> @@ -284,6 +289,7 @@ static struct pipe_context *noop_create_context(struct pipe_screen *screen,
>   	ctx->begin_query = noop_begin_query;
>   	ctx->end_query = noop_end_query;
>   	ctx->get_query_result = noop_get_query_result;
> +	ctx->set_active_query_state = noop_set_active_query_state;
>   	ctx->transfer_map = noop_transfer_map;
>   	ctx->transfer_flush_region = noop_transfer_flush_region;
>   	ctx->transfer_unmap = noop_transfer_unmap;
> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_query.c b/src/gallium/drivers/nouveau/nv30/nv30_query.c
> index 75a4b04..cb53a36 100644
> --- a/src/gallium/drivers/nouveau/nv30/nv30_query.c
> +++ b/src/gallium/drivers/nouveau/nv30/nv30_query.c
> @@ -263,6 +263,11 @@ nv40_query_render_condition(struct pipe_context *pipe,
>      PUSH_DATA (push, 0x02000000 | q->qo[1]->hw->start);
>   }
>
> +static void
> +nv30_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>   void
>   nv30_query_init(struct pipe_context *pipe)
>   {
> @@ -273,6 +278,7 @@ nv30_query_init(struct pipe_context *pipe)
>      pipe->begin_query = nv30_query_begin;
>      pipe->end_query = nv30_query_end;
>      pipe->get_query_result = nv30_query_result;
> +   pipe->set_active_query_state = nv30_set_active_query_state;
>      if (eng3d->oclass >= NV40_3D_CLASS)
>         pipe->render_condition = nv40_query_render_condition;
>   }
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query.c b/src/gallium/drivers/nouveau/nv50/nv50_query.c
> index 4cd3b61..fa70fb6 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_query.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_query.c
> @@ -143,6 +143,11 @@ nv50_render_condition(struct pipe_context *pipe,
>      PUSH_DATA (push, hq->bo->offset + hq->offset);
>   }
>
> +static void
> +nv50_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>   void
>   nv50_init_query_functions(struct nv50_context *nv50)
>   {
> @@ -153,6 +158,7 @@ nv50_init_query_functions(struct nv50_context *nv50)
>      pipe->begin_query = nv50_begin_query;
>      pipe->end_query = nv50_end_query;
>      pipe->get_query_result = nv50_get_query_result;
> +   pipe->set_active_query_state = nv50_set_active_query_state;
>      pipe->render_condition = nv50_render_condition;
>      nv50->cond_condmode = NV50_3D_COND_MODE_ALWAYS;
>   }
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query.c b/src/gallium/drivers/nouveau/nvc0/nvc0_query.c
> index 92ca613..b34271c 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_query.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query.c
> @@ -254,6 +254,11 @@ nvc0_screen_get_driver_query_group_info(struct pipe_screen *pscreen,
>      return 0;
>   }
>
> +static void
> +nvc0_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>   void
>   nvc0_init_query_functions(struct nvc0_context *nvc0)
>   {
> @@ -265,6 +270,7 @@ nvc0_init_query_functions(struct nvc0_context *nvc0)
>      pipe->end_query = nvc0_end_query;
>      pipe->get_query_result = nvc0_get_query_result;
>      pipe->get_query_result_resource = nvc0_get_query_result_resource;
> +   pipe->set_active_query_state = nvc0_set_active_query_state;
>      pipe->render_condition = nvc0_render_condition;
>      nvc0->cond_condmode = NVC0_3D_COND_MODE_ALWAYS;
>   }
> diff --git a/src/gallium/drivers/r300/r300_query.c b/src/gallium/drivers/r300/r300_query.c
> index 6414e80..7603985 100644
> --- a/src/gallium/drivers/r300/r300_query.c
> +++ b/src/gallium/drivers/r300/r300_query.c
> @@ -200,6 +200,11 @@ static void r300_render_condition(struct pipe_context *pipe,
>       }
>   }
>
> +static void
> +r300_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>   void r300_init_query_functions(struct r300_context* r300)
>   {
>       r300->context.create_query = r300_create_query;
> @@ -207,5 +212,6 @@ void r300_init_query_functions(struct r300_context* r300)
>       r300->context.begin_query = r300_begin_query;
>       r300->context.end_query = r300_end_query;
>       r300->context.get_query_result = r300_get_query_result;
> +    r300->context.set_active_query_state = r300_set_active_query_state;
>       r300->context.render_condition = r300_render_condition;
>   }
> diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c
> index 7a2d2ee..d780b8c 100644
> --- a/src/gallium/drivers/radeon/r600_query.c
> +++ b/src/gallium/drivers/radeon/r600_query.c
> @@ -1261,6 +1261,11 @@ static int r600_get_driver_query_group_info(struct pipe_screen *screen,
>   	return 1;
>   }
>
> +static void
> +r600_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>   void r600_query_init(struct r600_common_context *rctx)
>   {
>   	rctx->b.create_query = r600_create_query;
> @@ -1269,6 +1274,7 @@ void r600_query_init(struct r600_common_context *rctx)
>   	rctx->b.begin_query = r600_begin_query;
>   	rctx->b.end_query = r600_end_query;
>   	rctx->b.get_query_result = r600_get_query_result;
> +	rctx->b.set_active_query_state = r600_set_active_query_state;
>   	rctx->render_cond_atom.emit = r600_emit_query_predication;
>
>   	if (((struct r600_common_screen*)rctx->b.screen)->info.num_render_backends > 0)
> diff --git a/src/gallium/drivers/rbug/rbug_context.c b/src/gallium/drivers/rbug/rbug_context.c
> index 9ecddad..1280c45 100644
> --- a/src/gallium/drivers/rbug/rbug_context.c
> +++ b/src/gallium/drivers/rbug/rbug_context.c
> @@ -211,6 +211,17 @@ rbug_get_query_result(struct pipe_context *_pipe,
>      return ret;
>   }
>
> +static void
> +rbug_set_active_query_state(struct pipe_context *_pipe, boolean enable)
> +{
> +   struct rbug_context *rb_pipe = rbug_context(_pipe);
> +   struct pipe_context *pipe = rb_pipe->pipe;
> +
> +   pipe_mutex_lock(rb_pipe->call_mutex);
> +   pipe->set_active_query_state(pipe, enable);
> +   pipe_mutex_unlock(rb_pipe->call_mutex);
> +}
> +
>   static void *
>   rbug_create_blend_state(struct pipe_context *_pipe,
>                           const struct pipe_blend_state *blend)
> @@ -1184,6 +1195,7 @@ rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
>      rb_pipe->base.begin_query = rbug_begin_query;
>      rb_pipe->base.end_query = rbug_end_query;
>      rb_pipe->base.get_query_result = rbug_get_query_result;
> +   rb_pipe->base.set_active_query_state = rbug_set_active_query_state;
>      rb_pipe->base.create_blend_state = rbug_create_blend_state;
>      rb_pipe->base.bind_blend_state = rbug_bind_blend_state;
>      rb_pipe->base.delete_blend_state = rbug_delete_blend_state;
> diff --git a/src/gallium/drivers/softpipe/sp_query.c b/src/gallium/drivers/softpipe/sp_query.c
> index c28d28d..81e9710 100644
> --- a/src/gallium/drivers/softpipe/sp_query.c
> +++ b/src/gallium/drivers/softpipe/sp_query.c
> @@ -283,6 +283,12 @@ softpipe_check_render_cond(struct softpipe_context *sp)
>   }
>
>
> +static void
> +softpipe_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
> +
>   void softpipe_init_query_funcs(struct softpipe_context *softpipe )
>   {
>      softpipe->pipe.create_query = softpipe_create_query;
> @@ -290,6 +296,7 @@ void softpipe_init_query_funcs(struct softpipe_context *softpipe )
>      softpipe->pipe.begin_query = softpipe_begin_query;
>      softpipe->pipe.end_query = softpipe_end_query;
>      softpipe->pipe.get_query_result = softpipe_get_query_result;
> +   softpipe->pipe.set_active_query_state = softpipe_set_active_query_state;
>   }
>
>
> diff --git a/src/gallium/drivers/svga/svga_pipe_query.c b/src/gallium/drivers/svga/svga_pipe_query.c
> index 88f41ea..75bc9ce 100644
> --- a/src/gallium/drivers/svga/svga_pipe_query.c
> +++ b/src/gallium/drivers/svga/svga_pipe_query.c
> @@ -1246,6 +1246,12 @@ svga_get_timestamp(struct pipe_context *pipe)
>   }
>
>
> +static void
> +svga_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
> +
>   void
>   svga_init_query_functions(struct svga_context *svga)
>   {
> @@ -1254,6 +1260,7 @@ svga_init_query_functions(struct svga_context *svga)
>      svga->pipe.begin_query = svga_begin_query;
>      svga->pipe.end_query = svga_end_query;
>      svga->pipe.get_query_result = svga_get_query_result;
> +   svga->pipe.set_active_query_state = svga_set_active_query_state;
>      svga->pipe.render_condition = svga_render_condition;
>      svga->pipe.get_timestamp = svga_get_timestamp;
>   }
> diff --git a/src/gallium/drivers/swr/swr_query.cpp b/src/gallium/drivers/swr/swr_query.cpp
> index 810c50b..e4b8b68 100644
> --- a/src/gallium/drivers/swr/swr_query.cpp
> +++ b/src/gallium/drivers/swr/swr_query.cpp
> @@ -319,6 +319,12 @@ swr_check_render_cond(struct pipe_context *pipe)
>         return TRUE;
>   }
>
> +
> +static void
> +swr_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>   void
>   swr_query_init(struct pipe_context *pipe)
>   {
> @@ -329,6 +335,7 @@ swr_query_init(struct pipe_context *pipe)
>      pipe->begin_query = swr_begin_query;
>      pipe->end_query = swr_end_query;
>      pipe->get_query_result = swr_get_query_result;
> +   pipe->set_active_query_state = swr_set_active_query_state;
>
>      ctx->active_queries = 0;
>   }
> diff --git a/src/gallium/drivers/trace/tr_context.c b/src/gallium/drivers/trace/tr_context.c
> index 08b1d32..b575f2c 100644
> --- a/src/gallium/drivers/trace/tr_context.c
> +++ b/src/gallium/drivers/trace/tr_context.c
> @@ -273,6 +273,24 @@ trace_context_get_query_result(struct pipe_context *_pipe,
>   }
>
>
> +static void
> +trace_context_set_active_query_state(struct pipe_context *_pipe,
> +                                     boolean enable)
> +{
> +   struct trace_context *tr_ctx = trace_context(_pipe);
> +   struct pipe_context *pipe = tr_ctx->pipe;
> +
> +   trace_dump_call_begin("pipe_context", "set_active_query_state");
> +
> +   trace_dump_arg(ptr, pipe);
> +   trace_dump_arg(bool, enable);
> +
> +   pipe->set_active_query_state(pipe, enable);
> +
> +   trace_dump_call_end();
> +}
> +
> +
>   static void *
>   trace_context_create_blend_state(struct pipe_context *_pipe,
>                                    const struct pipe_blend_state *state)
> @@ -1781,6 +1799,7 @@ trace_context_create(struct trace_screen *tr_scr,
>      TR_CTX_INIT(begin_query);
>      TR_CTX_INIT(end_query);
>      TR_CTX_INIT(get_query_result);
> +   TR_CTX_INIT(set_active_query_state);
>      TR_CTX_INIT(create_blend_state);
>      TR_CTX_INIT(bind_blend_state);
>      TR_CTX_INIT(delete_blend_state);
> diff --git a/src/gallium/drivers/vc4/vc4_query.c b/src/gallium/drivers/vc4/vc4_query.c
> index 270832e..17400a3 100644
> --- a/src/gallium/drivers/vc4/vc4_query.c
> +++ b/src/gallium/drivers/vc4/vc4_query.c
> @@ -72,6 +72,11 @@ vc4_get_query_result(struct pipe_context *ctx, struct pipe_query *query,
>           return true;
>   }
>
> +static void
> +vc4_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>   void
>   vc4_query_init(struct pipe_context *pctx)
>   {
> @@ -80,5 +85,6 @@ vc4_query_init(struct pipe_context *pctx)
>           pctx->begin_query = vc4_begin_query;
>           pctx->end_query = vc4_end_query;
>           pctx->get_query_result = vc4_get_query_result;
> +	pctx->set_active_query_state = vc4_set_active_query_state;
>   }
>
> diff --git a/src/gallium/drivers/virgl/virgl_query.c b/src/gallium/drivers/virgl/virgl_query.c
> index b020055..5173bd3 100644
> --- a/src/gallium/drivers/virgl/virgl_query.c
> +++ b/src/gallium/drivers/virgl/virgl_query.c
> @@ -164,6 +164,11 @@ static boolean virgl_get_query_result(struct pipe_context *ctx,
>      return TRUE;
>   }
>
> +static void
> +virgl_set_active_query_state(struct pipe_context *pipe, boolean enable)
> +{
> +}
> +
>   void virgl_init_query_functions(struct virgl_context *vctx)
>   {
>      vctx->base.render_condition = virgl_render_condition;
> @@ -172,4 +177,5 @@ void virgl_init_query_functions(struct virgl_context *vctx)
>      vctx->base.begin_query = virgl_begin_query;
>      vctx->base.end_query = virgl_end_query;
>      vctx->base.get_query_result = virgl_get_query_result;
> +   vctx->base.set_active_query_state = virgl_set_active_query_state;
>   }
> diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
> index 1c97e82..b444d2d 100644
> --- a/src/gallium/include/pipe/p_context.h
> +++ b/src/gallium/include/pipe/p_context.h
> @@ -173,6 +173,12 @@ struct pipe_context {
>                                        struct pipe_resource *resource,
>                                        unsigned offset);
>
> +   /**
> +    * Set whether all current queries except TIME_ELAPSED are active or
> +    * paused.
> +    */
> +   void (*set_active_query_state)(struct pipe_context *pipe, boolean enable);
> +
>      /*@}*/
>
>      /**
>


More information about the mesa-dev mailing list