llvmpipe: implement PIPE_QUERY_SO_STATISTICS
authorZack Rusin <zackr@vmware.com>
Tue, 9 Apr 2013 10:50:32 +0000 (03:50 -0700)
committerZack Rusin <zackr@vmware.com>
Wed, 10 Apr 2013 19:32:56 +0000 (12:32 -0700)
We were missing the implementation of PIPE_QUERY_SO_STATISTICS
query, this change implements it on top of the existing
facilities.

Signed-off-by: Zack Rusin <zackr@vmware.com>
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/drivers/llvmpipe/lp_query.c
src/gallium/drivers/llvmpipe/lp_rast.c

index 01d5201a100bbe9c738e24123271096e8a0712b4..013d1928c11f4a347c5b2d96620fa752ea5d553f 100644 (file)
@@ -137,6 +137,13 @@ llvmpipe_get_query_result(struct pipe_context *pipe,
    case PIPE_QUERY_PRIMITIVES_EMITTED:
       *result = pq->num_primitives_written;
       break;
+   case PIPE_QUERY_SO_STATISTICS: {
+      struct pipe_query_data_so_statistics *stats =
+         (struct pipe_query_data_so_statistics *)vresult;
+      stats->num_primitives_written = pq->num_primitives_written;
+      stats->primitives_storage_needed = pq->num_primitives_generated;
+   }
+      break;
    default:
       assert(0);
       break;
@@ -174,6 +181,13 @@ llvmpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q)
       llvmpipe->num_primitives_generated = 0;
    }
 
+   if (pq->type == 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;
+   }
+
    if (pq->type == PIPE_QUERY_OCCLUSION_COUNTER) {
       llvmpipe->active_occlusion_query = TRUE;
       llvmpipe->dirty |= LP_NEW_OCCLUSION_QUERY;
@@ -197,6 +211,11 @@ llvmpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
       pq->num_primitives_generated = llvmpipe->num_primitives_generated;
    }
 
+   if (pq->type == PIPE_QUERY_SO_STATISTICS) {
+      pq->num_primitives_written = llvmpipe->so_stats.num_primitives_written;
+      pq->num_primitives_generated = llvmpipe->num_primitives_generated;
+   }
+
    if (pq->type == PIPE_QUERY_OCCLUSION_COUNTER) {
       assert(llvmpipe->active_occlusion_query);
       llvmpipe->active_occlusion_query = FALSE;
index 6183f4108d60c0d685d83a17c69f5ddef340b3fe..6cb27020566d744ed09ad144e08259a543b7f093 100644 (file)
@@ -476,6 +476,7 @@ lp_rast_begin_query(struct lp_rasterizer_task *task,
       break;
    case PIPE_QUERY_PRIMITIVES_GENERATED:
    case PIPE_QUERY_PRIMITIVES_EMITTED:
+   case PIPE_QUERY_SO_STATISTICS:
       break;
    default:
       assert(0);
@@ -507,6 +508,7 @@ lp_rast_end_query(struct lp_rasterizer_task *task,
       break;
    case PIPE_QUERY_PRIMITIVES_GENERATED:
    case PIPE_QUERY_PRIMITIVES_EMITTED:
+   case PIPE_QUERY_SO_STATISTICS:
       break;
    default:
       assert(0);