mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 00:38:48 +02:00
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> (cherry picked from commitfa2b32b3b1)
This commit is contained in:
parent
4d28c2b086
commit
7ebbd4c654
2 changed files with 39 additions and 25 deletions
|
|
@ -445,7 +445,7 @@
|
|||
"description": "softpipe: fix streamout queries",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"master_sha": null,
|
||||
"because_sha": "ddb9ad363d900e00898b591fe0793622257acc47"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue