softpipe: fix streamout queries

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

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

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10398>
This commit is contained in:
Mike Blumenkrantz
2021-04-22 08:44:53 -04:00
committed by Marge Bot
parent 8dbb022b8a
commit fa2b32b3b1
+38 -24
View File
@@ -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: