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: