llvmpipe: implement so_overflow query
authorZack Rusin <zackr@vmware.com>
Tue, 23 Apr 2013 10:19:14 +0000 (06:19 -0400)
committerZack Rusin <zackr@vmware.com>
Sat, 27 Apr 2013 02:58:54 +0000 (22:58 -0400)
Signed-off-by: Zack Rusin <zackr@vmware.com>
Reviewed-by: José Fonseca <jfonseca@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/drivers/llvmpipe/lp_query.c
src/gallium/drivers/llvmpipe/lp_query.h
src/gallium/drivers/llvmpipe/lp_rast.c

index fcb5c6ac340b919dbcc209c24173c09cee162c07..6b1da8bf3ecfa1c74cd172d3f35c1710a57eb044 100644 (file)
@@ -139,6 +139,9 @@ llvmpipe_get_query_result(struct pipe_context *pipe,
    case PIPE_QUERY_PRIMITIVES_EMITTED:
       *result = pq->num_primitives_written;
       break;
+   case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
+      *result = pq->so_has_overflown;
+      break;
    case PIPE_QUERY_SO_STATISTICS: {
       struct pipe_query_data_so_statistics *stats =
          (struct pipe_query_data_so_statistics *)vresult;
@@ -196,6 +199,10 @@ llvmpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q)
       llvmpipe->num_primitives_generated = 0;
    }
 
+   if (pq->type == PIPE_QUERY_SO_OVERFLOW_PREDICATE) {
+      pq->so_has_overflown = FALSE;
+   }
+
    if (pq->type == PIPE_QUERY_PIPELINE_STATISTICS) {
       /* reset our cache */
       if (llvmpipe->active_statistics_queries == 0) {
@@ -234,6 +241,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_OVERFLOW_PREDICATE) {
+      pq->so_has_overflown = (llvmpipe->num_primitives_generated >
+                              llvmpipe->so_stats.num_primitives_written);
+   }
+
    if (pq->type == PIPE_QUERY_PIPELINE_STATISTICS) {
       pq->stats.ia_vertices =
          llvmpipe->pipeline_statistics.ia_vertices - pq->stats.ia_vertices;
index 68dfe99f42835d3da5431988153fe11ed0fd3920..e29022ae6eeb3b4830676c15d6d6da8ce7fe28d2 100644 (file)
@@ -47,6 +47,7 @@ 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;
 };
index 29dd933c64476a9ec89814750db0e9f05dd94524..ef49ba9ab6f50f0457febe12e83ab047ff39f80f 100644 (file)
@@ -478,6 +478,7 @@ lp_rast_begin_query(struct lp_rasterizer_task *task,
    case PIPE_QUERY_PRIMITIVES_EMITTED:
    case PIPE_QUERY_SO_STATISTICS:
    case PIPE_QUERY_PIPELINE_STATISTICS:
+   case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
       break;
    default:
       assert(0);
@@ -511,6 +512,7 @@ lp_rast_end_query(struct lp_rasterizer_task *task,
    case PIPE_QUERY_PRIMITIVES_EMITTED:
    case PIPE_QUERY_SO_STATISTICS:
    case PIPE_QUERY_PIPELINE_STATISTICS:
+   case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
       break;
    default:
       assert(0);