softpipe: add support for indexed queries.

We need indexed queries to retrieve the geom shader info.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie 2015-05-27 17:37:46 +10:00 committed by Dave Airlie
parent 00fe67c015
commit ddb9ad363d
4 changed files with 16 additions and 14 deletions

View File

@ -94,7 +94,7 @@ struct softpipe_context {
struct draw_so_target *so_targets[PIPE_MAX_SO_BUFFERS]; struct draw_so_target *so_targets[PIPE_MAX_SO_BUFFERS];
unsigned num_so_targets; unsigned num_so_targets;
struct pipe_query_data_so_statistics so_stats; struct pipe_query_data_so_statistics so_stats[PIPE_MAX_VERTEX_STREAMS];
struct pipe_query_data_pipeline_statistics pipeline_statistics; struct pipe_query_data_pipeline_statistics pipeline_statistics;
unsigned active_statistics_queries; unsigned active_statistics_queries;

View File

@ -602,8 +602,8 @@ sp_vbuf_so_info(struct vbuf_render *vbr, uint stream, uint primitives, uint prim
struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr); struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr);
struct softpipe_context *softpipe = cvbr->softpipe; struct softpipe_context *softpipe = cvbr->softpipe;
softpipe->so_stats.num_primitives_written += primitives; softpipe->so_stats[stream].num_primitives_written += primitives;
softpipe->so_stats.primitives_storage_needed += prim_generated; softpipe->so_stats[stream].primitives_storage_needed += prim_generated;
} }
static void static void

View File

@ -39,6 +39,7 @@
struct softpipe_query { struct softpipe_query {
unsigned type; unsigned type;
unsigned index;
uint64_t start; uint64_t start;
uint64_t end; uint64_t end;
struct pipe_query_data_so_statistics so; struct pipe_query_data_so_statistics so;
@ -73,7 +74,7 @@ softpipe_create_query(struct pipe_context *pipe,
type == PIPE_QUERY_TIMESTAMP_DISJOINT); type == PIPE_QUERY_TIMESTAMP_DISJOINT);
sq = CALLOC_STRUCT( softpipe_query ); sq = CALLOC_STRUCT( softpipe_query );
sq->type = type; sq->type = type;
sq->index = index;
return (struct pipe_query *)sq; return (struct pipe_query *)sq;
} }
@ -101,8 +102,8 @@ softpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q)
sq->start = os_time_get_nano(); sq->start = os_time_get_nano();
break; break;
case PIPE_QUERY_SO_STATISTICS: case PIPE_QUERY_SO_STATISTICS:
sq->so.num_primitives_written = softpipe->so_stats.num_primitives_written; sq->so.num_primitives_written = softpipe->so_stats[0].num_primitives_written;
sq->so.primitives_storage_needed = softpipe->so_stats.primitives_storage_needed; sq->so.primitives_storage_needed = softpipe->so_stats[0].primitives_storage_needed;
break; break;
case PIPE_QUERY_SO_OVERFLOW_PREDICATE: case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE: case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE:
@ -110,10 +111,10 @@ softpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q)
sq->so.primitives_storage_needed = softpipe->so_stats.primitives_storage_needed; sq->so.primitives_storage_needed = softpipe->so_stats.primitives_storage_needed;
break; break;
case PIPE_QUERY_PRIMITIVES_EMITTED: case PIPE_QUERY_PRIMITIVES_EMITTED:
sq->so.num_primitives_written = softpipe->so_stats.num_primitives_written; sq->so.num_primitives_written = softpipe->so_stats[sq->index].num_primitives_written;
break; break;
case PIPE_QUERY_PRIMITIVES_GENERATED: case PIPE_QUERY_PRIMITIVES_GENERATED:
sq->so.primitives_storage_needed = softpipe->so_stats.primitives_storage_needed; sq->so.primitives_storage_needed = softpipe->so_stats[sq->index].primitives_storage_needed;
break; break;
case PIPE_QUERY_TIMESTAMP: case PIPE_QUERY_TIMESTAMP:
case PIPE_QUERY_GPU_FINISHED: case PIPE_QUERY_GPU_FINISHED:
@ -161,24 +162,24 @@ softpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
case PIPE_QUERY_SO_OVERFLOW_PREDICATE: case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE: case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE:
sq->so.num_primitives_written = sq->so.num_primitives_written =
softpipe->so_stats.num_primitives_written - sq->so.num_primitives_written; softpipe->so_stats[0].num_primitives_written - sq->so.num_primitives_written;
sq->so.primitives_storage_needed = sq->so.primitives_storage_needed =
softpipe->so_stats.primitives_storage_needed - 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 = sq->so.primitives_storage_needed > sq->so.num_primitives_written;
break; break;
case PIPE_QUERY_SO_STATISTICS: case PIPE_QUERY_SO_STATISTICS:
sq->so.num_primitives_written = sq->so.num_primitives_written =
softpipe->so_stats.num_primitives_written - sq->so.num_primitives_written; softpipe->so_stats[sq->index].num_primitives_written - sq->so.num_primitives_written;
sq->so.primitives_storage_needed = sq->so.primitives_storage_needed =
softpipe->so_stats.primitives_storage_needed - sq->so.primitives_storage_needed; softpipe->so_stats[sq->index].primitives_storage_needed - sq->so.primitives_storage_needed;
break; break;
case PIPE_QUERY_PRIMITIVES_EMITTED: case PIPE_QUERY_PRIMITIVES_EMITTED:
sq->so.num_primitives_written = sq->so.num_primitives_written =
softpipe->so_stats.num_primitives_written - sq->so.num_primitives_written; softpipe->so_stats[sq->index].num_primitives_written - sq->so.num_primitives_written;
break; break;
case PIPE_QUERY_PRIMITIVES_GENERATED: case PIPE_QUERY_PRIMITIVES_GENERATED:
sq->so.primitives_storage_needed = sq->so.primitives_storage_needed =
softpipe->so_stats.primitives_storage_needed - sq->so.primitives_storage_needed; softpipe->so_stats[sq->index].primitives_storage_needed - sq->so.primitives_storage_needed;
break; break;
case PIPE_QUERY_GPU_FINISHED: case PIPE_QUERY_GPU_FINISHED:
case PIPE_QUERY_TIMESTAMP_DISJOINT: case PIPE_QUERY_TIMESTAMP_DISJOINT:

View File

@ -77,6 +77,7 @@ extern "C" {
#define PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE 4 #define PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE 4
#define PIPE_MAX_HW_ATOMIC_BUFFERS 32 #define PIPE_MAX_HW_ATOMIC_BUFFERS 32
#define PIPE_MAX_VERTEX_STREAMS 4
struct pipe_reference struct pipe_reference
{ {