Looks good to me. Jose
----- Original Message ----- > From: Roland Scheidegger <srol...@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 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev