svga: add HUD queries for number of draw calls, number of fallbacks
authorBrian Paul <brianp@vmware.com>
Mon, 1 Apr 2013 23:51:43 +0000 (17:51 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 3 Apr 2013 15:56:08 +0000 (09:56 -0600)
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>
src/gallium/drivers/svga/svga_context.h
src/gallium/drivers/svga/svga_pipe_draw.c
src/gallium/drivers/svga/svga_pipe_query.c
src/gallium/drivers/svga/svga_screen.c

index 32671ecafa72a55a364ca4c3f5fa0be48faf6777..e27778eafad5ddaebf783492b00c6ef701c3960c 100644 (file)
 #include "svga3d_shaderdefs.h"
 
 
+/** 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;
 struct draw_fragment_shader;
 struct svga_shader_result;
@@ -370,6 +375,10 @@ struct svga_context
 
    /** List of buffers with queued transfers */
    struct list_head dirty_buffers;
+
+   /** performance / info queries */
+   uint64_t num_draw_calls;  /**< SVGA_QUERY_DRAW_CALLS */
+   uint64_t num_fallbacks;   /**< SVGA_QUERY_FALLBACKS */
 };
 
 /* A flag for each state_tracker state object:
index e72032e685d6c7ac34b2f7ffa5c989f207018799..f0da1704538e74ff59dc6340a20ceb4969806fe7 100644 (file)
@@ -330,6 +330,8 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
    enum pipe_error ret = 0;
    boolean needed_swtnl;
 
+   svga->num_draw_calls++;  /* for SVGA_QUERY_DRAW_CALLS */
+
    if (!u_trim_pipe_prim( info->mode, &count ))
       return;
 
@@ -358,6 +360,7 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
 #endif
 
    if (svga->state.sw.need_swtnl) {
+      svga->num_fallbacks++;  /* for SVGA_QUERY_FALLBACKS */
       if (!needed_swtnl) {
          /*
           * We're switching from HW to SW TNL.  SW TNL will require mapping all
index 5cfebaf6f792f2b31a548a252bdef78b2dc73c95..11f6a052730b4373395844e406009db6125ddf48 100644 (file)
@@ -51,6 +51,9 @@ struct svga_query {
    struct svga_winsys_buffer *hwbuf;
    volatile SVGA3dQueryResult *queryResult;
    struct pipe_fence_handle *fence;
+
+   /** For non-GPU SVGA_QUERY_x queries */
+   uint64_t begin_count, end_count;
 };
 
 /***********************************************************************
@@ -106,6 +109,9 @@ static struct pipe_query *svga_create_query( struct pipe_context *pipe,
        */
       sws->buffer_unmap(sws, sq->hwbuf);
       break;
+   case SVGA_QUERY_DRAW_CALLS:
+   case SVGA_QUERY_FALLBACKS:
+      break;
    default:
       assert(!"unexpected query type in svga_create_query()");
    }
@@ -136,6 +142,10 @@ static void svga_destroy_query(struct pipe_context *pipe,
       sws->buffer_destroy(sws, sq->hwbuf);
       sws->fence_reference(sws, &sq->fence, NULL);
       break;
+   case SVGA_QUERY_DRAW_CALLS:
+   case SVGA_QUERY_FALLBACKS:
+      /* nothing */
+      break;
    default:
       assert(!"svga: unexpected query type in svga_destroy_query()");
    }
@@ -187,6 +197,12 @@ static void svga_begin_query(struct pipe_context *pipe,
 
       svga->sq = sq;
       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:
       assert(!"unexpected query type in svga_begin_query()");
    }
@@ -224,6 +240,12 @@ static void svga_end_query(struct pipe_context *pipe,
 
       svga->sq = NULL;
       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:
       assert(!"unexpected query type in svga_end_query()");
    }
@@ -277,6 +299,11 @@ static boolean svga_get_query_result(struct pipe_context *pipe,
 
       *result = (uint64_t)sq->queryResult->result32;
       break;
+   case SVGA_QUERY_DRAW_CALLS:
+      /* fall-through */
+   case SVGA_QUERY_FALLBACKS:
+      vresult->u64 = sq->end_count - sq->begin_count;
+      break;
    default:
       assert(!"unexpected query type in svga_get_query_result");
    }
index 49059a5d29422ac239494994cb8e6b682cd0c31e..bd1b03fc66cafe6b26d53f9dddcac24c0d71d382 100644 (file)
@@ -492,6 +492,27 @@ 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
 svga_destroy_screen( struct pipe_screen *screen )
 {
@@ -551,6 +572,7 @@ svga_screen_create(struct svga_winsys_screen *sws)
    screen->fence_reference = svga_fence_reference;
    screen->fence_signalled = svga_fence_signalled;
    screen->fence_finish = svga_fence_finish;
+   screen->get_driver_query_info = svga_get_driver_query_info;
    svgascreen->sws = sws;
 
    svga_init_screen_resource_functions(svgascreen);