Module: Mesa
Branch: master
Commit: 4900e625bd195021ec5577ae625685307c408910
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=4900e625bd195021ec5577ae625685307c408910

Author: Roland Scheidegger <srol...@vmware.com>
Date:   Fri Aug 23 21:23:07 2013 +0200

softpipe: 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 <bri...@vmware.com>

---

 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:

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to