[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