Mesa (staging/21.1): softpipe: fix streamout queries

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Apr 25 14:58:12 UTC 2021


Module: Mesa
Branch: staging/21.1
Commit: 7ebbd4c65411893225d6350b2fe512e21058adeb
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7ebbd4c65411893225d6350b2fe512e21058adeb

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Thu Apr 22 08:44:53 2021 -0400

softpipe: fix streamout queries

these need to always use the query index in order to access the correct
vertex stream

Fixes: ddb9ad363d9 ("softpipe: add support for indexed queries.")

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10398>
(cherry picked from commit fa2b32b3b141cda001a345f993de180af8852ad8)

---

 .pick_status.json                       |  2 +-
 src/gallium/drivers/softpipe/sp_query.c | 62 ++++++++++++++++++++-------------
 2 files changed, 39 insertions(+), 25 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index e9a7f345c33..a2cdb549cb0 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -445,7 +445,7 @@
         "description": "softpipe: fix streamout queries",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": "ddb9ad363d900e00898b591fe0793622257acc47"
     },
diff --git a/src/gallium/drivers/softpipe/sp_query.c b/src/gallium/drivers/softpipe/sp_query.c
index 68eeb8b5586..fa4dc501c34 100644
--- a/src/gallium/drivers/softpipe/sp_query.c
+++ b/src/gallium/drivers/softpipe/sp_query.c
@@ -42,7 +42,7 @@ struct softpipe_query {
    unsigned index;
    uint64_t start;
    uint64_t end;
-   struct pipe_query_data_so_statistics so;
+   struct pipe_query_data_so_statistics so[PIPE_MAX_VERTEX_STREAMS];
    struct pipe_query_data_pipeline_statistics stats;
 };
 
@@ -102,19 +102,24 @@ 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.num_primitives_written = softpipe->so_stats[0].num_primitives_written;
-      sq->so.primitives_storage_needed = softpipe->so_stats[0].primitives_storage_needed;
+      sq->so[sq->index].num_primitives_written = softpipe->so_stats[sq->index].num_primitives_written;
+      sq->so[sq->index].primitives_storage_needed = softpipe->so_stats[sq->index].primitives_storage_needed;
       break;
    case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
+      sq->so[sq->index].num_primitives_written = softpipe->so_stats[sq->index].num_primitives_written;
+      sq->so[sq->index].primitives_storage_needed = softpipe->so_stats[sq->index].primitives_storage_needed;
+      break;
    case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE:
-      sq->so.num_primitives_written = softpipe->so_stats[sq->index].num_primitives_written;
-      sq->so.primitives_storage_needed = softpipe->so_stats[sq->index].primitives_storage_needed;
+      for (unsigned i = 0; i < PIPE_MAX_VERTEX_STREAMS; i++) {
+         sq->so[i].num_primitives_written = softpipe->so_stats[i].num_primitives_written;
+         sq->so[i].primitives_storage_needed = softpipe->so_stats[i].primitives_storage_needed;
+      }
       break;
    case PIPE_QUERY_PRIMITIVES_EMITTED:
-      sq->so.num_primitives_written = softpipe->so_stats[sq->index].num_primitives_written;
+      sq->so[sq->index].num_primitives_written = softpipe->so_stats[sq->index].num_primitives_written;
       break;
    case PIPE_QUERY_PRIMITIVES_GENERATED:
-      sq->so.primitives_storage_needed = softpipe->so_stats[sq->index].primitives_storage_needed;
+      sq->so[sq->index].primitives_storage_needed = softpipe->so_stats[sq->index].primitives_storage_needed;
       break;
    case PIPE_QUERY_TIMESTAMP:
    case PIPE_QUERY_GPU_FINISHED:
@@ -160,26 +165,35 @@ 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->so[sq->index].num_primitives_written =
+         softpipe->so_stats[sq->index].num_primitives_written - sq->so[sq->index].num_primitives_written;
+      sq->so[sq->index].primitives_storage_needed =
+         softpipe->so_stats[sq->index].primitives_storage_needed - sq->so[sq->index].primitives_storage_needed;
+      sq->end = sq->so[sq->index].primitives_storage_needed > sq->so[sq->index].num_primitives_written;
+      break;
    case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE:
-      sq->so.num_primitives_written =
-         softpipe->so_stats[0].num_primitives_written - sq->so.num_primitives_written;
-      sq->so.primitives_storage_needed =
-         softpipe->so_stats[0].primitives_storage_needed - sq->so.primitives_storage_needed;
-      sq->end = sq->so.primitives_storage_needed > sq->so.num_primitives_written;
+      sq->end = 0;
+      for (unsigned i = 0; i < PIPE_MAX_VERTEX_STREAMS; i++) {
+         sq->so[i].num_primitives_written =
+            softpipe->so_stats[i].num_primitives_written - sq->so[i].num_primitives_written;
+         sq->so[i].primitives_storage_needed =
+            softpipe->so_stats[i].primitives_storage_needed - sq->so[i].primitives_storage_needed;
+         sq->end |= sq->so[i].primitives_storage_needed > sq->so[i].num_primitives_written;
+      }
       break;
    case PIPE_QUERY_SO_STATISTICS:
-      sq->so.num_primitives_written =
-         softpipe->so_stats[sq->index].num_primitives_written - sq->so.num_primitives_written;
-      sq->so.primitives_storage_needed =
-         softpipe->so_stats[sq->index].primitives_storage_needed - sq->so.primitives_storage_needed;
+      sq->so[sq->index].num_primitives_written =
+         softpipe->so_stats[sq->index].num_primitives_written - sq->so[sq->index].num_primitives_written;
+      sq->so[sq->index].primitives_storage_needed =
+         softpipe->so_stats[sq->index].primitives_storage_needed - sq->so[sq->index].primitives_storage_needed;
       break;
    case PIPE_QUERY_PRIMITIVES_EMITTED:
-      sq->so.num_primitives_written =
-         softpipe->so_stats[sq->index].num_primitives_written - sq->so.num_primitives_written;
+      sq->so[sq->index].num_primitives_written =
+         softpipe->so_stats[sq->index].num_primitives_written - sq->so[sq->index].num_primitives_written;
       break;
    case PIPE_QUERY_PRIMITIVES_GENERATED:
-      sq->so.primitives_storage_needed =
-         softpipe->so_stats[sq->index].primitives_storage_needed - sq->so.primitives_storage_needed;
+      sq->so[sq->index].primitives_storage_needed =
+         softpipe->so_stats[sq->index].primitives_storage_needed - sq->so[sq->index].primitives_storage_needed;
       break;
    case PIPE_QUERY_GPU_FINISHED:
    case PIPE_QUERY_TIMESTAMP_DISJOINT:
@@ -228,8 +242,8 @@ softpipe_get_query_result(struct pipe_context *pipe,
    case PIPE_QUERY_SO_STATISTICS: {
       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->so.primitives_storage_needed;
+      stats->num_primitives_written = sq->so[sq->index].num_primitives_written;
+      stats->primitives_storage_needed = sq->so[sq->index].primitives_storage_needed;
    }
       break;
    case PIPE_QUERY_PIPELINE_STATISTICS:
@@ -252,10 +266,10 @@ softpipe_get_query_result(struct pipe_context *pipe,
    }
       break;
    case PIPE_QUERY_PRIMITIVES_EMITTED:
-      *result = sq->so.num_primitives_written;
+      *result = sq->so[sq->index].num_primitives_written;
       break;
    case PIPE_QUERY_PRIMITIVES_GENERATED:
-      *result = sq->so.primitives_storage_needed;
+      *result = sq->so[sq->index].primitives_storage_needed;
       break;
    case PIPE_QUERY_OCCLUSION_PREDICATE:
    case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:



More information about the mesa-commit mailing list