[Mesa-dev] [PATCH 2/2] softpipe: handle all queries, and change for the new disjoint semantics

Jose Fonseca jfonseca at vmware.com
Wed Jun 19 08:09:44 PDT 2013


Looks good to me.

Jose

----- Original Message -----
> From: Roland Scheidegger <sroland at vmware.com>
> 
> The driver can do render_condition but wasn't handling the occlusion
> and so_overflow predicates (though the latter might not work yet due
> to gs support).
> ---
>  src/gallium/drivers/softpipe/sp_query.c |   39
>  ++++++++++++++++++++++---------
>  1 file changed, 28 insertions(+), 11 deletions(-)
> 
> diff --git a/src/gallium/drivers/softpipe/sp_query.c
> b/src/gallium/drivers/softpipe/sp_query.c
> index b5bc0db..daeef53 100644
> --- a/src/gallium/drivers/softpipe/sp_query.c
> +++ b/src/gallium/drivers/softpipe/sp_query.c
> @@ -60,8 +60,10 @@ softpipe_create_query(struct pipe_context *pipe,
>     struct softpipe_query* sq;
>  
>     assert(type == PIPE_QUERY_OCCLUSION_COUNTER ||
> +          type == PIPE_QUERY_OCCLUSION_PREDICATE ||
>            type == PIPE_QUERY_TIME_ELAPSED ||
>            type == PIPE_QUERY_SO_STATISTICS ||
> +          type == PIPE_QUERY_SO_OVERFLOW_PREDICATE ||
>            type == PIPE_QUERY_PRIMITIVES_EMITTED ||
>            type == PIPE_QUERY_PRIMITIVES_GENERATED ||
>            type == PIPE_QUERY_PIPELINE_STATISTICS ||
> @@ -90,9 +92,9 @@ softpipe_begin_query(struct pipe_context *pipe, struct
> pipe_query *q)
>  
>     switch (sq->type) {
>     case PIPE_QUERY_OCCLUSION_COUNTER:
> +   case PIPE_QUERY_OCCLUSION_PREDICATE:
>        sq->start = softpipe->occlusion_count;
>        break;
> -   case PIPE_QUERY_TIMESTAMP_DISJOINT:
>     case PIPE_QUERY_TIME_ELAPSED:
>        sq->start = os_time_get_nano();
>        break;
> @@ -102,6 +104,10 @@ softpipe_begin_query(struct pipe_context *pipe, struct
> pipe_query *q)
>        softpipe->num_primitives_generated = 0;
>        sq->so.num_primitives_written = 0;
>        softpipe->so_stats.num_primitives_written = 0;
> +      break;
> +   case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
> +      sq->end = FALSE;
> +      break;
>     case PIPE_QUERY_PRIMITIVES_EMITTED:
>        sq->so.num_primitives_written = 0;
>        softpipe->so_stats.num_primitives_written = 0;
> @@ -112,6 +118,7 @@ softpipe_begin_query(struct pipe_context *pipe, struct
> pipe_query *q)
>        break;
>     case PIPE_QUERY_TIMESTAMP:
>     case PIPE_QUERY_GPU_FINISHED:
> +   case PIPE_QUERY_TIMESTAMP_DISJOINT:
>        break;
>     case PIPE_QUERY_PIPELINE_STATISTICS:
>        /* reset our cache */
> @@ -141,15 +148,19 @@ softpipe_end_query(struct pipe_context *pipe, struct
> pipe_query *q)
>     softpipe->active_query_count--;
>     switch (sq->type) {
>     case PIPE_QUERY_OCCLUSION_COUNTER:
> +   case PIPE_QUERY_OCCLUSION_PREDICATE:
>        sq->end = softpipe->occlusion_count;
>        break;
>     case PIPE_QUERY_TIMESTAMP:
>        sq->start = 0;
>        /* fall through */
> -   case PIPE_QUERY_TIMESTAMP_DISJOINT:
>     case PIPE_QUERY_TIME_ELAPSED:
>        sq->end = os_time_get_nano();
>        break;
> +   case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
> +      sq->end = (softpipe->num_primitives_generated >
> +                 softpipe->so_stats.num_primitives_written);
> +      break;
>     case PIPE_QUERY_SO_STATISTICS:
>        sq->num_primitives_generated =
>           softpipe->num_primitives_generated;
> @@ -164,6 +175,7 @@ softpipe_end_query(struct pipe_context *pipe, struct
> pipe_query *q)
>        sq->num_primitives_generated = softpipe->num_primitives_generated;
>        break;
>     case PIPE_QUERY_GPU_FINISHED:
> +   case PIPE_QUERY_TIMESTAMP_DISJOINT:
>        break;
>     case PIPE_QUERY_PIPELINE_STATISTICS:
>        sq->stats.ia_vertices =
> @@ -195,9 +207,9 @@ softpipe_end_query(struct pipe_context *pipe, struct
> pipe_query *q)
>  
>  static boolean
>  softpipe_get_query_result(struct pipe_context *pipe,
> -			  struct pipe_query *q,
> -			  boolean wait,
> -			  union pipe_query_result *vresult)
> +                          struct pipe_query *q,
> +                          boolean wait,
> +                          union pipe_query_result *vresult)
>  {
>     struct softpipe_query *sq = softpipe_query(q);
>     uint64_t *result = (uint64_t*)vresult;
> @@ -215,15 +227,17 @@ softpipe_get_query_result(struct pipe_context *pipe,
>               sizeof(struct pipe_query_data_pipeline_statistics));;
>        break;
>     case PIPE_QUERY_GPU_FINISHED:
> -      *result = TRUE;
> +      vresult->b = TRUE;
> +      break;
> +   case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
> +      vresult->b = sq->end != 0;
>        break;
>     case PIPE_QUERY_TIMESTAMP_DISJOINT: {
> -      struct pipe_query_data_timestamp_disjoint td;
> +      struct pipe_query_data_timestamp_disjoint *td =
> +          (struct pipe_query_data_timestamp_disjoint *)vresult;
>        /* os_get_time_nano return nanoseconds */
> -      td.frequency = UINT64_C(1000000000);
> -      td.disjoint = sq->end != sq->start;
> -      memcpy(vresult, &td,
> -             sizeof(struct pipe_query_data_timestamp_disjoint));
> +      td->frequency = UINT64_C(1000000000);
> +      td->disjoint = FALSE;
>     }
>        break;
>     case PIPE_QUERY_PRIMITIVES_EMITTED:
> @@ -232,6 +246,9 @@ softpipe_get_query_result(struct pipe_context *pipe,
>     case PIPE_QUERY_PRIMITIVES_GENERATED:
>        *result = sq->num_primitives_generated;
>        break;
> +   case PIPE_QUERY_OCCLUSION_PREDICATE:
> +      vresult->b = sq->end - sq->start != 0;
> +      break;
>     default:
>        *result = sq->end - sq->start;
>        break;
> --
> 1.7.9.5
> 


More information about the mesa-dev mailing list