From ddb9ad363d900e00898b591fe0793622257acc47 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 27 May 2015 17:37:46 +1000 Subject: [PATCH 1/1] softpipe: add support for indexed queries. We need indexed queries to retrieve the geom shader info. Reviewed-by: Roland Scheidegger Signed-off-by: Dave Airlie --- src/gallium/drivers/softpipe/sp_context.h | 2 +- src/gallium/drivers/softpipe/sp_prim_vbuf.c | 4 ++-- src/gallium/drivers/softpipe/sp_query.c | 23 +++++++++++---------- src/gallium/include/pipe/p_state.h | 1 + 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/gallium/drivers/softpipe/sp_context.h b/src/gallium/drivers/softpipe/sp_context.h index 7c42403009c..3bde9baa23a 100644 --- a/src/gallium/drivers/softpipe/sp_context.h +++ b/src/gallium/drivers/softpipe/sp_context.h @@ -94,7 +94,7 @@ struct softpipe_context { struct draw_so_target *so_targets[PIPE_MAX_SO_BUFFERS]; 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; unsigned active_statistics_queries; diff --git a/src/gallium/drivers/softpipe/sp_prim_vbuf.c b/src/gallium/drivers/softpipe/sp_prim_vbuf.c index 783adf4f448..12734314bf0 100644 --- a/src/gallium/drivers/softpipe/sp_prim_vbuf.c +++ b/src/gallium/drivers/softpipe/sp_prim_vbuf.c @@ -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_context *softpipe = cvbr->softpipe; - softpipe->so_stats.num_primitives_written += primitives; - softpipe->so_stats.primitives_storage_needed += prim_generated; + softpipe->so_stats[stream].num_primitives_written += primitives; + softpipe->so_stats[stream].primitives_storage_needed += prim_generated; } static void diff --git a/src/gallium/drivers/softpipe/sp_query.c b/src/gallium/drivers/softpipe/sp_query.c index 5c9afe6fe47..7187c562068 100644 --- a/src/gallium/drivers/softpipe/sp_query.c +++ b/src/gallium/drivers/softpipe/sp_query.c @@ -39,6 +39,7 @@ struct softpipe_query { unsigned type; + unsigned index; uint64_t start; uint64_t end; struct pipe_query_data_so_statistics so; @@ -73,7 +74,7 @@ softpipe_create_query(struct pipe_context *pipe, type == PIPE_QUERY_TIMESTAMP_DISJOINT); sq = CALLOC_STRUCT( softpipe_query ); sq->type = type; - + sq->index = index; 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(); break; case PIPE_QUERY_SO_STATISTICS: - sq->so.num_primitives_written = softpipe->so_stats.num_primitives_written; - sq->so.primitives_storage_needed = softpipe->so_stats.primitives_storage_needed; + sq->so.num_primitives_written = softpipe->so_stats[0].num_primitives_written; + sq->so.primitives_storage_needed = softpipe->so_stats[0].primitives_storage_needed; break; case PIPE_QUERY_SO_OVERFLOW_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; break; 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; 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; case PIPE_QUERY_TIMESTAMP: 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_ANY_PREDICATE: 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 = - 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; break; case PIPE_QUERY_SO_STATISTICS: 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 = - 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; 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 - sq->so.num_primitives_written; break; 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 - sq->so.primitives_storage_needed; break; case PIPE_QUERY_GPU_FINISHED: case PIPE_QUERY_TIMESTAMP_DISJOINT: diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index 3a91ddd71b5..b7fa76a803a 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -77,6 +77,7 @@ extern "C" { #define PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE 4 #define PIPE_MAX_HW_ATOMIC_BUFFERS 32 +#define PIPE_MAX_VERTEX_STREAMS 4 struct pipe_reference { -- 2.30.2