[Mesa-dev] [PATCH v2 7/9] gallium: add the concept of batch queries

Samuel Pitoiset samuel.pitoiset at gmail.com
Sun Nov 15 07:41:27 PST 2015


You'll need to update this patch and set 'info->flags = 0' in 
nv50_query.c as well. I pushed some performance counters for nv50 
yesterday. Thanks for doing this change.

On 11/13/2015 08:17 PM, Nicolai Hähnle wrote:
> Some drivers (in particular radeon[si], but also freedreno judging from
> a quick grep) may want to expose performance counters that cannot be
> individually enabled or disabled.
>
> Allow such drivers to mark driver-specific queries as requiring a new
> type of batch query object that is used to start and stop a list of queries
> simultaneously.
>
> v2: documentation for create_batch_query
> ---
>   src/gallium/drivers/nouveau/nvc0/nvc0_query.c |  1 +
>   src/gallium/include/pipe/p_context.h          | 19 +++++++++++++++++++
>   src/gallium/include/pipe/p_defines.h          | 27 +++++++++++++++++++++------
>   3 files changed, 41 insertions(+), 6 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query.c b/src/gallium/drivers/nouveau/nvc0/nvc0_query.c
> index a1d6162..0608337 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_query.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query.c
> @@ -162,6 +162,7 @@ nvc0_screen_get_driver_query_info(struct pipe_screen *pscreen,
>      info->max_value.u64 = 0;
>      info->type = PIPE_DRIVER_QUERY_TYPE_UINT64;
>      info->group_id = -1;
> +   info->flags = 0;
>
>   #ifdef NOUVEAU_ENABLE_DRIVER_STATISTICS
>      if (id < num_sw_queries)
> diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
> index 27f358f..be7447d 100644
> --- a/src/gallium/include/pipe/p_context.h
> +++ b/src/gallium/include/pipe/p_context.h
> @@ -116,6 +116,25 @@ struct pipe_context {
>                                          unsigned query_type,
>                                          unsigned index );
>
> +   /**
> +    * Create a query object that queries all given query types simultaneously.
> +    *
> +    * This can only be used for those query types for which
> +    * get_driver_query_info indicates that it must be used. Only one batch
> +    * query object may be active at a time.
> +    *
> +    * There may be additional constraints on which query types can be used
> +    * together, in particular those that are implied by
> +    * get_driver_query_group_info.
> +    *
> +    * \param num_queries the number of query types
> +    * \param query_types array of \p num_queries query types
> +    * \return a query object, or NULL on error.
> +    */
> +   struct pipe_query *(*create_batch_query)( struct pipe_context *pipe,
> +                                             unsigned num_queries,
> +                                             unsigned *query_types );
> +
>      void (*destroy_query)(struct pipe_context *pipe,
>                            struct pipe_query *q);
>
> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
> index 7ed9f6d..b3c8b9f 100644
> --- a/src/gallium/include/pipe/p_defines.h
> +++ b/src/gallium/include/pipe/p_defines.h
> @@ -776,6 +776,16 @@ struct pipe_query_data_pipeline_statistics
>   };
>
>   /**
> + * For batch queries.
> + */
> +union pipe_numeric_type_union
> +{
> +   uint64_t u64;
> +   uint32_t u32;
> +   float f;
> +};
> +
> +/**
>    * Query result (returned by pipe_context::get_query_result).
>    */
>   union pipe_query_result
> @@ -811,6 +821,9 @@ union pipe_query_result
>
>      /* PIPE_QUERY_PIPELINE_STATISTICS */
>      struct pipe_query_data_pipeline_statistics pipeline_statistics;
> +
> +   /* batch queries */
> +   union pipe_numeric_type_union batch[0];
>   };
>
>   union pipe_color_union
> @@ -840,12 +853,13 @@ enum pipe_driver_query_result_type
>      PIPE_DRIVER_QUERY_RESULT_TYPE_CUMULATIVE = 1,
>   };
>
> -union pipe_numeric_type_union
> -{
> -   uint64_t u64;
> -   uint32_t u32;
> -   float f;
> -};
> +/**
> + * Some hardware requires some hardware-specific queries to be submitted
> + * as batched queries. The corresponding query objects are created using
> + * create_batch_query, and at most one such query may be active at
> + * any time.
> + */
> +#define PIPE_DRIVER_QUERY_FLAG_BATCH     (1 << 0)
>
>   struct pipe_driver_query_info
>   {
> @@ -855,6 +869,7 @@ struct pipe_driver_query_info
>      enum pipe_driver_query_type type;
>      enum pipe_driver_query_result_type result_type;
>      unsigned group_id;
> +   unsigned flags;
>   };
>
>   struct pipe_driver_query_group_info
>


More information about the mesa-dev mailing list