diff options
author | Brian Paul <brianp@vmware.com> | 2013-04-01 17:51:43 -0600 |
---|---|---|
committer | Brian Paul <brianp@vmware.com> | 2013-04-03 09:56:08 -0600 |
commit | 3838edaf5d3f75ca5c2276db22ea0b96fce2bad7 (patch) | |
tree | bfbf4127c4d08f694bbe74100d827deb45f84c7f | |
parent | 49ed1f3cb335fada1f9ee26d5420889292da3c92 (diff) |
svga: add HUD queries for number of draw calls, number of fallbacks
The fallbacks count is the number of drawing calls that use a "draw"
module fallback, such as polygon stipple.
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
-rw-r--r-- | src/gallium/drivers/svga/svga_context.h | 9 | ||||
-rw-r--r-- | src/gallium/drivers/svga/svga_pipe_draw.c | 3 | ||||
-rw-r--r-- | src/gallium/drivers/svga/svga_pipe_query.c | 27 | ||||
-rw-r--r-- | src/gallium/drivers/svga/svga_screen.c | 22 |
4 files changed, 61 insertions, 0 deletions
diff --git a/src/gallium/drivers/svga/svga_context.h b/src/gallium/drivers/svga/svga_context.h index 32671ecafa7..e27778eafad 100644 --- a/src/gallium/drivers/svga/svga_context.h +++ b/src/gallium/drivers/svga/svga_context.h @@ -44,2 +44,7 @@ +/** Non-GPU queries for gallium HUD */ +#define SVGA_QUERY_DRAW_CALLS (PIPE_QUERY_DRIVER_SPECIFIC + 0) +#define SVGA_QUERY_FALLBACKS (PIPE_QUERY_DRIVER_SPECIFIC + 1) + + struct draw_vertex_shader; @@ -372,2 +377,6 @@ struct svga_context struct list_head dirty_buffers; + + /** performance / info queries */ + uint64_t num_draw_calls; /**< SVGA_QUERY_DRAW_CALLS */ + uint64_t num_fallbacks; /**< SVGA_QUERY_FALLBACKS */ }; diff --git a/src/gallium/drivers/svga/svga_pipe_draw.c b/src/gallium/drivers/svga/svga_pipe_draw.c index e72032e685d..f0da1704538 100644 --- a/src/gallium/drivers/svga/svga_pipe_draw.c +++ b/src/gallium/drivers/svga/svga_pipe_draw.c @@ -332,2 +332,4 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) + svga->num_draw_calls++; /* for SVGA_QUERY_DRAW_CALLS */ + if (!u_trim_pipe_prim( info->mode, &count )) @@ -360,2 +362,3 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) if (svga->state.sw.need_swtnl) { + svga->num_fallbacks++; /* for SVGA_QUERY_FALLBACKS */ if (!needed_swtnl) { diff --git a/src/gallium/drivers/svga/svga_pipe_query.c b/src/gallium/drivers/svga/svga_pipe_query.c index 5cfebaf6f79..11f6a052730 100644 --- a/src/gallium/drivers/svga/svga_pipe_query.c +++ b/src/gallium/drivers/svga/svga_pipe_query.c @@ -53,2 +53,5 @@ struct svga_query { struct pipe_fence_handle *fence; + + /** For non-GPU SVGA_QUERY_x queries */ + uint64_t begin_count, end_count; }; @@ -108,2 +111,5 @@ static struct pipe_query *svga_create_query( struct pipe_context *pipe, break; + case SVGA_QUERY_DRAW_CALLS: + case SVGA_QUERY_FALLBACKS: + break; default: @@ -138,2 +144,6 @@ static void svga_destroy_query(struct pipe_context *pipe, break; + case SVGA_QUERY_DRAW_CALLS: + case SVGA_QUERY_FALLBACKS: + /* nothing */ + break; default: @@ -189,2 +199,8 @@ static void svga_begin_query(struct pipe_context *pipe, break; + case SVGA_QUERY_DRAW_CALLS: + sq->begin_count = svga->num_draw_calls; + break; + case SVGA_QUERY_FALLBACKS: + sq->begin_count = svga->num_fallbacks; + break; default: @@ -226,2 +242,8 @@ static void svga_end_query(struct pipe_context *pipe, break; + case SVGA_QUERY_DRAW_CALLS: + sq->end_count = svga->num_draw_calls; + break; + case SVGA_QUERY_FALLBACKS: + sq->end_count = svga->num_fallbacks; + break; default: @@ -279,2 +301,7 @@ static boolean svga_get_query_result(struct pipe_context *pipe, break; + case SVGA_QUERY_DRAW_CALLS: + /* fall-through */ + case SVGA_QUERY_FALLBACKS: + vresult->u64 = sq->end_count - sq->begin_count; + break; default: diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c index 49059a5d294..bd1b03fc66c 100644 --- a/src/gallium/drivers/svga/svga_screen.c +++ b/src/gallium/drivers/svga/svga_screen.c @@ -494,2 +494,23 @@ svga_fence_finish(struct pipe_screen *screen, +static int +svga_get_driver_query_info(struct pipe_screen *screen, + unsigned index, + struct pipe_driver_query_info *info) +{ + static const struct pipe_driver_query_info queries[] = { + {"draw-calls", SVGA_QUERY_DRAW_CALLS, 0, FALSE}, + {"fallbacks", SVGA_QUERY_FALLBACKS, 0, FALSE} + }; + + if (!info) + return Elements(queries); + + if (index >= Elements(queries)) + return 0; + + *info = queries[index]; + return 1; +} + + static void @@ -553,2 +574,3 @@ svga_screen_create(struct svga_winsys_screen *sws) screen->fence_finish = svga_fence_finish; + screen->get_driver_query_info = svga_get_driver_query_info; svgascreen->sws = sws; |