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;
break;
case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
vresult->b = pq->so_has_overflown;
vresult->b = pq->num_primitives_generated > pq->num_primitives_written;
break;
case PIPE_QUERY_SO_STATISTICS: {
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) {
case PIPE_QUERY_PRIMITIVES_EMITTED:
pq->num_primitives_written = 0;
llvmpipe->so_stats.num_primitives_written = 0;
pq->num_primitives_written = llvmpipe->so_stats.num_primitives_written;
break;
case PIPE_QUERY_PRIMITIVES_GENERATED:
pq->num_primitives_generated = 0;
llvmpipe->num_primitives_generated = 0;
pq->num_primitives_generated = llvmpipe->num_primitives_generated;
break;
case PIPE_QUERY_SO_STATISTICS:
pq->num_primitives_written = 0;
llvmpipe->so_stats.num_primitives_written = 0;
pq->num_primitives_generated = 0;
llvmpipe->num_primitives_generated = 0;
pq->num_primitives_written = llvmpipe->so_stats.num_primitives_written;
pq->num_primitives_generated = llvmpipe->num_primitives_generated;
break;
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;
case PIPE_QUERY_PIPELINE_STATISTICS:
/* reset our cache */
@@ -251,18 +248,24 @@ llvmpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
switch (pq->type) {
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;
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;
case PIPE_QUERY_SO_STATISTICS:
pq->num_primitives_written = llvmpipe->so_stats.num_primitives_written;
pq->num_primitives_generated = llvmpipe->num_primitives_generated;
pq->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;
case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
pq->so_has_overflown = (llvmpipe->num_primitives_generated >
llvmpipe->so_stats.num_primitives_written);
pq->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;
case PIPE_QUERY_PIPELINE_STATISTICS:
pq->stats.ia_vertices =

View File

@@ -48,7 +48,6 @@ struct llvmpipe_query {
unsigned type; /* PIPE_QUERY_* */
unsigned num_primitives_generated;
unsigned num_primitives_written;
boolean so_has_overflown;
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);
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*/;
lp->num_primitives_generated += prim_generated;
}