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 | |||
@@ -42,6 +42,11 @@ | |||
42 | #include "svga3d_shaderdefs.h" | 42 | #include "svga3d_shaderdefs.h" |
43 | 43 | ||
44 | 44 | ||
45 | /** Non-GPU queries for gallium HUD */ | ||
46 | #define SVGA_QUERY_DRAW_CALLS (PIPE_QUERY_DRIVER_SPECIFIC + 0) | ||
47 | #define SVGA_QUERY_FALLBACKS (PIPE_QUERY_DRIVER_SPECIFIC + 1) | ||
48 | |||
49 | |||
45 | struct draw_vertex_shader; | 50 | struct draw_vertex_shader; |
46 | struct draw_fragment_shader; | 51 | struct draw_fragment_shader; |
47 | struct svga_shader_result; | 52 | struct svga_shader_result; |
@@ -370,6 +375,10 @@ struct svga_context | |||
370 | 375 | ||
371 | /** List of buffers with queued transfers */ | 376 | /** List of buffers with queued transfers */ |
372 | struct list_head dirty_buffers; | 377 | struct list_head dirty_buffers; |
378 | |||
379 | /** performance / info queries */ | ||
380 | uint64_t num_draw_calls; /**< SVGA_QUERY_DRAW_CALLS */ | ||
381 | uint64_t num_fallbacks; /**< SVGA_QUERY_FALLBACKS */ | ||
373 | }; | 382 | }; |
374 | 383 | ||
375 | /* A flag for each state_tracker state object: | 384 | /* A flag for each state_tracker state object: |
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 | |||
@@ -330,6 +330,8 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) | |||
330 | enum pipe_error ret = 0; | 330 | enum pipe_error ret = 0; |
331 | boolean needed_swtnl; | 331 | boolean needed_swtnl; |
332 | 332 | ||
333 | svga->num_draw_calls++; /* for SVGA_QUERY_DRAW_CALLS */ | ||
334 | |||
333 | if (!u_trim_pipe_prim( info->mode, &count )) | 335 | if (!u_trim_pipe_prim( info->mode, &count )) |
334 | return; | 336 | return; |
335 | 337 | ||
@@ -358,6 +360,7 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) | |||
358 | #endif | 360 | #endif |
359 | 361 | ||
360 | if (svga->state.sw.need_swtnl) { | 362 | if (svga->state.sw.need_swtnl) { |
363 | svga->num_fallbacks++; /* for SVGA_QUERY_FALLBACKS */ | ||
361 | if (!needed_swtnl) { | 364 | if (!needed_swtnl) { |
362 | /* | 365 | /* |
363 | * We're switching from HW to SW TNL. SW TNL will require mapping all | 366 | * We're switching from HW to SW TNL. SW TNL will require mapping all |
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 | |||
@@ -51,6 +51,9 @@ struct svga_query { | |||
51 | struct svga_winsys_buffer *hwbuf; | 51 | struct svga_winsys_buffer *hwbuf; |
52 | volatile SVGA3dQueryResult *queryResult; | 52 | volatile SVGA3dQueryResult *queryResult; |
53 | struct pipe_fence_handle *fence; | 53 | struct pipe_fence_handle *fence; |
54 | |||
55 | /** For non-GPU SVGA_QUERY_x queries */ | ||
56 | uint64_t begin_count, end_count; | ||
54 | }; | 57 | }; |
55 | 58 | ||
56 | /*********************************************************************** | 59 | /*********************************************************************** |
@@ -106,6 +109,9 @@ static struct pipe_query *svga_create_query( struct pipe_context *pipe, | |||
106 | */ | 109 | */ |
107 | sws->buffer_unmap(sws, sq->hwbuf); | 110 | sws->buffer_unmap(sws, sq->hwbuf); |
108 | break; | 111 | break; |
112 | case SVGA_QUERY_DRAW_CALLS: | ||
113 | case SVGA_QUERY_FALLBACKS: | ||
114 | break; | ||
109 | default: | 115 | default: |
110 | assert(!"unexpected query type in svga_create_query()"); | 116 | assert(!"unexpected query type in svga_create_query()"); |
111 | } | 117 | } |
@@ -136,6 +142,10 @@ static void svga_destroy_query(struct pipe_context *pipe, | |||
136 | sws->buffer_destroy(sws, sq->hwbuf); | 142 | sws->buffer_destroy(sws, sq->hwbuf); |
137 | sws->fence_reference(sws, &sq->fence, NULL); | 143 | sws->fence_reference(sws, &sq->fence, NULL); |
138 | break; | 144 | break; |
145 | case SVGA_QUERY_DRAW_CALLS: | ||
146 | case SVGA_QUERY_FALLBACKS: | ||
147 | /* nothing */ | ||
148 | break; | ||
139 | default: | 149 | default: |
140 | assert(!"svga: unexpected query type in svga_destroy_query()"); | 150 | assert(!"svga: unexpected query type in svga_destroy_query()"); |
141 | } | 151 | } |
@@ -187,6 +197,12 @@ static void svga_begin_query(struct pipe_context *pipe, | |||
187 | 197 | ||
188 | svga->sq = sq; | 198 | svga->sq = sq; |
189 | break; | 199 | break; |
200 | case SVGA_QUERY_DRAW_CALLS: | ||
201 | sq->begin_count = svga->num_draw_calls; | ||
202 | break; | ||
203 | case SVGA_QUERY_FALLBACKS: | ||
204 | sq->begin_count = svga->num_fallbacks; | ||
205 | break; | ||
190 | default: | 206 | default: |
191 | assert(!"unexpected query type in svga_begin_query()"); | 207 | assert(!"unexpected query type in svga_begin_query()"); |
192 | } | 208 | } |
@@ -224,6 +240,12 @@ static void svga_end_query(struct pipe_context *pipe, | |||
224 | 240 | ||
225 | svga->sq = NULL; | 241 | svga->sq = NULL; |
226 | break; | 242 | break; |
243 | case SVGA_QUERY_DRAW_CALLS: | ||
244 | sq->end_count = svga->num_draw_calls; | ||
245 | break; | ||
246 | case SVGA_QUERY_FALLBACKS: | ||
247 | sq->end_count = svga->num_fallbacks; | ||
248 | break; | ||
227 | default: | 249 | default: |
228 | assert(!"unexpected query type in svga_end_query()"); | 250 | assert(!"unexpected query type in svga_end_query()"); |
229 | } | 251 | } |
@@ -277,6 +299,11 @@ static boolean svga_get_query_result(struct pipe_context *pipe, | |||
277 | 299 | ||
278 | *result = (uint64_t)sq->queryResult->result32; | 300 | *result = (uint64_t)sq->queryResult->result32; |
279 | break; | 301 | break; |
302 | case SVGA_QUERY_DRAW_CALLS: | ||
303 | /* fall-through */ | ||
304 | case SVGA_QUERY_FALLBACKS: | ||
305 | vresult->u64 = sq->end_count - sq->begin_count; | ||
306 | break; | ||
280 | default: | 307 | default: |
281 | assert(!"unexpected query type in svga_get_query_result"); | 308 | assert(!"unexpected query type in svga_get_query_result"); |
282 | } | 309 | } |
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 | |||
@@ -492,6 +492,27 @@ svga_fence_finish(struct pipe_screen *screen, | |||
492 | } | 492 | } |
493 | 493 | ||
494 | 494 | ||
495 | static int | ||
496 | svga_get_driver_query_info(struct pipe_screen *screen, | ||
497 | unsigned index, | ||
498 | struct pipe_driver_query_info *info) | ||
499 | { | ||
500 | static const struct pipe_driver_query_info queries[] = { | ||
501 | {"draw-calls", SVGA_QUERY_DRAW_CALLS, 0, FALSE}, | ||
502 | {"fallbacks", SVGA_QUERY_FALLBACKS, 0, FALSE} | ||
503 | }; | ||
504 | |||
505 | if (!info) | ||
506 | return Elements(queries); | ||
507 | |||
508 | if (index >= Elements(queries)) | ||
509 | return 0; | ||
510 | |||
511 | *info = queries[index]; | ||
512 | return 1; | ||
513 | } | ||
514 | |||
515 | |||
495 | static void | 516 | static void |
496 | svga_destroy_screen( struct pipe_screen *screen ) | 517 | svga_destroy_screen( struct pipe_screen *screen ) |
497 | { | 518 | { |
@@ -551,6 +572,7 @@ svga_screen_create(struct svga_winsys_screen *sws) | |||
551 | screen->fence_reference = svga_fence_reference; | 572 | screen->fence_reference = svga_fence_reference; |
552 | screen->fence_signalled = svga_fence_signalled; | 573 | screen->fence_signalled = svga_fence_signalled; |
553 | screen->fence_finish = svga_fence_finish; | 574 | screen->fence_finish = svga_fence_finish; |
575 | screen->get_driver_query_info = svga_get_driver_query_info; | ||
554 | svgascreen->sws = sws; | 576 | svgascreen->sws = sws; |
555 | 577 | ||
556 | svga_init_screen_resource_functions(svgascreen); | 578 | svga_init_screen_resource_functions(svgascreen); |