[Mesa-dev] [PATCH 1/3] softpipe: support nested/overlapping queries for all query types
Brian Paul
brianp at vmware.com
Mon Aug 26 09:01:59 PDT 2013
On 08/23/2013 03:10 PM, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> There's just no way resetting the counters is working with nested/overlapping
> queries.
> ---
> src/gallium/drivers/softpipe/sp_prim_vbuf.c | 2 +-
> src/gallium/drivers/softpipe/sp_query.c | 33 +++++++++++++--------------
> 2 files changed, 17 insertions(+), 18 deletions(-)
>
> diff --git a/src/gallium/drivers/softpipe/sp_prim_vbuf.c b/src/gallium/drivers/softpipe/sp_prim_vbuf.c
> index 5d0b5e1..80c6450 100644
> --- a/src/gallium/drivers/softpipe/sp_prim_vbuf.c
> +++ b/src/gallium/drivers/softpipe/sp_prim_vbuf.c
> @@ -595,7 +595,7 @@ sp_vbuf_so_info(struct vbuf_render *vbr, uint primitives, uint vertices,
> struct softpipe_context *softpipe = cvbr->softpipe;
>
> softpipe->so_stats.num_primitives_written += primitives;
> - softpipe->so_stats.primitives_storage_needed =
> + softpipe->so_stats.primitives_storage_needed +=
> vertices * 4 /*sizeof(float|int32)*/ * 4 /*x,y,z,w*/;
> softpipe->num_primitives_generated += prim_generated;
> }
> diff --git a/src/gallium/drivers/softpipe/sp_query.c b/src/gallium/drivers/softpipe/sp_query.c
> index daeef53..ca15f03 100644
> --- a/src/gallium/drivers/softpipe/sp_query.c
> +++ b/src/gallium/drivers/softpipe/sp_query.c
> @@ -99,22 +99,17 @@ softpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q)
> sq->start = os_time_get_nano();
> break;
> case PIPE_QUERY_SO_STATISTICS:
> - sq->so.primitives_storage_needed = 0;
> - sq->num_primitives_generated = 0;
> - softpipe->num_primitives_generated = 0;
> - sq->so.num_primitives_written = 0;
> - softpipe->so_stats.num_primitives_written = 0;
> + sq->so.num_primitives_written = softpipe->so_stats.num_primitives_written;
> + sq->so.primitives_storage_needed = softpipe->num_primitives_generated;
> 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;
> + sq->so.num_primitives_written = softpipe->so_stats.num_primitives_written;
> break;
> case PIPE_QUERY_PRIMITIVES_GENERATED:
> - sq->num_primitives_generated = 0;
> - softpipe->num_primitives_generated = 0;
> + sq->num_primitives_generated = softpipe->num_primitives_generated;
> break;
> case PIPE_QUERY_TIMESTAMP:
> case PIPE_QUERY_GPU_FINISHED:
> @@ -158,21 +153,25 @@ softpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
> 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);
> + sq->so.num_primitives_written =
> + softpipe->so_stats.num_primitives_written - sq->so.num_primitives_written;
> + sq->num_primitives_generated =
> + softpipe->num_primitives_generated - sq->num_primitives_generated;
> + sq->end = sq->num_primitives_generated > sq->so.num_primitives_written;
> break;
> case PIPE_QUERY_SO_STATISTICS:
> - sq->num_primitives_generated =
> - softpipe->num_primitives_generated;
> sq->so.num_primitives_written =
> - softpipe->so_stats.num_primitives_written;
> + softpipe->so_stats.num_primitives_written - sq->so.num_primitives_written;
> + sq->so.primitives_storage_needed =
> + softpipe->num_primitives_generated - sq->so.primitives_storage_needed;
> break;
> case PIPE_QUERY_PRIMITIVES_EMITTED:
> sq->so.num_primitives_written =
> - softpipe->so_stats.num_primitives_written;
> + softpipe->so_stats.num_primitives_written - sq->so.num_primitives_written;
> break;
> case PIPE_QUERY_PRIMITIVES_GENERATED:
> - sq->num_primitives_generated = softpipe->num_primitives_generated;
> + sq->num_primitives_generated =
> + softpipe->num_primitives_generated - sq->num_primitives_generated;
> break;
> case PIPE_QUERY_GPU_FINISHED:
> case PIPE_QUERY_TIMESTAMP_DISJOINT:
> @@ -219,7 +218,7 @@ softpipe_get_query_result(struct pipe_context *pipe,
> struct pipe_query_data_so_statistics *stats =
> (struct pipe_query_data_so_statistics *)vresult;
> stats->num_primitives_written = sq->so.num_primitives_written;
> - stats->primitives_storage_needed = sq->num_primitives_generated;
> + stats->primitives_storage_needed = sq->so.primitives_storage_needed;
> }
> break;
> case PIPE_QUERY_PIPELINE_STATISTICS:
>
For the series:
Reviewed-by: Brian Paul <brianp at vmware.com>
More information about the mesa-dev
mailing list