summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2013-04-01 17:51:43 -0600
committerBrian Paul <brianp@vmware.com>2013-04-03 09:56:08 -0600
commit3838edaf5d3f75ca5c2276db22ea0b96fce2bad7 (patch)
treebfbf4127c4d08f694bbe74100d827deb45f84c7f
parent49ed1f3cb335fada1f9ee26d5420889292da3c92 (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.h9
-rw-r--r--src/gallium/drivers/svga/svga_pipe_draw.c3
-rw-r--r--src/gallium/drivers/svga/svga_pipe_query.c27
-rw-r--r--src/gallium/drivers/svga/svga_screen.c22
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
45struct draw_vertex_shader; 50struct draw_vertex_shader;
46struct draw_fragment_shader; 51struct draw_fragment_shader;
47struct svga_shader_result; 52struct 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
495static int
496svga_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
495static void 516static void
496svga_destroy_screen( struct pipe_screen *screen ) 517svga_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);