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
@@ -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;