llvmpipe: support nested/overlapping queries for all query types

There's just no way resetting the counters is working with nested/overlapping
queries.

Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Roland Scheidegger 2013-08-23 21:25:01 +02:00
parent 4900e625bd
commit aff2ecf09a
3 changed files with 20 additions and 18 deletions

View file

@ -154,7 +154,7 @@ llvmpipe_get_query_result(struct pipe_context *pipe,
*result = pq->num_primitives_written; *result = pq->num_primitives_written;
break; break;
case PIPE_QUERY_SO_OVERFLOW_PREDICATE: case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
vresult->b = pq->so_has_overflown; vresult->b = pq->num_primitives_generated > pq->num_primitives_written;
break; break;
case PIPE_QUERY_SO_STATISTICS: { case PIPE_QUERY_SO_STATISTICS: {
struct pipe_query_data_so_statistics *stats = struct pipe_query_data_so_statistics *stats =
@ -204,21 +204,18 @@ llvmpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q)
switch (pq->type) { switch (pq->type) {
case PIPE_QUERY_PRIMITIVES_EMITTED: case PIPE_QUERY_PRIMITIVES_EMITTED:
pq->num_primitives_written = 0; pq->num_primitives_written = llvmpipe->so_stats.num_primitives_written;
llvmpipe->so_stats.num_primitives_written = 0;
break; break;
case PIPE_QUERY_PRIMITIVES_GENERATED: case PIPE_QUERY_PRIMITIVES_GENERATED:
pq->num_primitives_generated = 0; pq->num_primitives_generated = llvmpipe->num_primitives_generated;
llvmpipe->num_primitives_generated = 0;
break; break;
case PIPE_QUERY_SO_STATISTICS: case PIPE_QUERY_SO_STATISTICS:
pq->num_primitives_written = 0; pq->num_primitives_written = llvmpipe->so_stats.num_primitives_written;
llvmpipe->so_stats.num_primitives_written = 0; pq->num_primitives_generated = llvmpipe->num_primitives_generated;
pq->num_primitives_generated = 0;
llvmpipe->num_primitives_generated = 0;
break; break;
case PIPE_QUERY_SO_OVERFLOW_PREDICATE: case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
pq->so_has_overflown = FALSE; pq->num_primitives_written = llvmpipe->so_stats.num_primitives_written;
pq->num_primitives_generated = llvmpipe->num_primitives_generated;
break; break;
case PIPE_QUERY_PIPELINE_STATISTICS: case PIPE_QUERY_PIPELINE_STATISTICS:
/* reset our cache */ /* reset our cache */
@ -251,18 +248,24 @@ llvmpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
switch (pq->type) { switch (pq->type) {
case PIPE_QUERY_PRIMITIVES_EMITTED: case PIPE_QUERY_PRIMITIVES_EMITTED:
pq->num_primitives_written = llvmpipe->so_stats.num_primitives_written; pq->num_primitives_written =
llvmpipe->so_stats.num_primitives_written - pq->num_primitives_written;
break; break;
case PIPE_QUERY_PRIMITIVES_GENERATED: case PIPE_QUERY_PRIMITIVES_GENERATED:
pq->num_primitives_generated = llvmpipe->num_primitives_generated; pq->num_primitives_generated =
llvmpipe->num_primitives_generated - pq->num_primitives_generated;
break; break;
case PIPE_QUERY_SO_STATISTICS: case PIPE_QUERY_SO_STATISTICS:
pq->num_primitives_written = llvmpipe->so_stats.num_primitives_written; pq->num_primitives_written =
pq->num_primitives_generated = llvmpipe->num_primitives_generated; llvmpipe->so_stats.num_primitives_written - pq->num_primitives_written;
pq->num_primitives_generated =
llvmpipe->num_primitives_generated - pq->num_primitives_generated;
break; break;
case PIPE_QUERY_SO_OVERFLOW_PREDICATE: case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
pq->so_has_overflown = (llvmpipe->num_primitives_generated > pq->num_primitives_written =
llvmpipe->so_stats.num_primitives_written); llvmpipe->so_stats.num_primitives_written - pq->num_primitives_written;
pq->num_primitives_generated =
llvmpipe->num_primitives_generated - pq->num_primitives_generated;
break; break;
case PIPE_QUERY_PIPELINE_STATISTICS: case PIPE_QUERY_PIPELINE_STATISTICS:
pq->stats.ia_vertices = pq->stats.ia_vertices =

View file

@ -48,7 +48,6 @@ struct llvmpipe_query {
unsigned type; /* PIPE_QUERY_* */ unsigned type; /* PIPE_QUERY_* */
unsigned num_primitives_generated; unsigned num_primitives_generated;
unsigned num_primitives_written; unsigned num_primitives_written;
boolean so_has_overflown;
struct pipe_query_data_pipeline_statistics stats; struct pipe_query_data_pipeline_statistics stats;
}; };

View file

@ -542,7 +542,7 @@ lp_setup_so_info(struct vbuf_render *vbr, uint primitives, uint vertices,
struct llvmpipe_context *lp = llvmpipe_context(setup->pipe); struct llvmpipe_context *lp = llvmpipe_context(setup->pipe);
lp->so_stats.num_primitives_written += primitives; lp->so_stats.num_primitives_written += primitives;
lp->so_stats.primitives_storage_needed = lp->so_stats.primitives_storage_needed +=
vertices * 4 /*sizeof(float|int32)*/ * 4 /*x,y,z,w*/; vertices * 4 /*sizeof(float|int32)*/ * 4 /*x,y,z,w*/;
lp->num_primitives_generated += prim_generated; lp->num_primitives_generated += prim_generated;
} }