svga: add new memory-used HUD query
authorBrian Paul <brianp@vmware.com>
Wed, 3 Apr 2013 16:23:57 +0000 (10:23 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 3 Apr 2013 17:02:47 +0000 (11:02 -0600)
To track the amount of memory used by all pipe_resources (textures
and buffers).

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/drivers/svga/svga_context.h
src/gallium/drivers/svga/svga_pipe_query.c
src/gallium/drivers/svga/svga_resource_buffer.c
src/gallium/drivers/svga/svga_resource_buffer.h
src/gallium/drivers/svga/svga_resource_texture.c
src/gallium/drivers/svga/svga_resource_texture.h
src/gallium/drivers/svga/svga_screen.c
src/gallium/drivers/svga/svga_screen.h

index e27778eafad5ddaebf783492b00c6ef701c3960c..517102d604164be88d3fdedf701ca19c0c6c8ec8 100644 (file)
@@ -45,6 +45,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)
+#define SVGA_QUERY_MEMORY_USED  (PIPE_QUERY_DRIVER_SPECIFIC + 2)
 
 
 struct draw_vertex_shader;
index 11f6a052730b4373395844e406009db6125ddf48..de841895f2e025e7c9d2225aa962f96da9283df5 100644 (file)
@@ -111,6 +111,7 @@ static struct pipe_query *svga_create_query( struct pipe_context *pipe,
       break;
    case SVGA_QUERY_DRAW_CALLS:
    case SVGA_QUERY_FALLBACKS:
+   case SVGA_QUERY_MEMORY_USED:
       break;
    default:
       assert(!"unexpected query type in svga_create_query()");
@@ -144,6 +145,7 @@ static void svga_destroy_query(struct pipe_context *pipe,
       break;
    case SVGA_QUERY_DRAW_CALLS:
    case SVGA_QUERY_FALLBACKS:
+   case SVGA_QUERY_MEMORY_USED:
       /* nothing */
       break;
    default:
@@ -203,6 +205,9 @@ static void svga_begin_query(struct pipe_context *pipe,
    case SVGA_QUERY_FALLBACKS:
       sq->begin_count = svga->num_fallbacks;
       break;
+   case SVGA_QUERY_MEMORY_USED:
+      /* nothing */
+      break;
    default:
       assert(!"unexpected query type in svga_begin_query()");
    }
@@ -246,6 +251,9 @@ static void svga_end_query(struct pipe_context *pipe,
    case SVGA_QUERY_FALLBACKS:
       sq->end_count = svga->num_fallbacks;
       break;
+   case SVGA_QUERY_MEMORY_USED:
+      /* nothing */
+      break;
    default:
       assert(!"unexpected query type in svga_end_query()");
    }
@@ -304,6 +312,9 @@ static boolean svga_get_query_result(struct pipe_context *pipe,
    case SVGA_QUERY_FALLBACKS:
       vresult->u64 = sq->end_count - sq->begin_count;
       break;
+   case SVGA_QUERY_MEMORY_USED:
+      vresult->u64 = svgascreen->total_resource_bytes;
+      break;
    default:
       assert(!"unexpected query type in svga_get_query_result");
    }
index 3aa6644a4a3bea7bad506b14f1b3bf01521f19bc..8ba22521e374e75392de9a6d3a6049c69aa740cd 100644 (file)
@@ -31,6 +31,7 @@
 #include "os/os_thread.h"
 #include "util/u_math.h"
 #include "util/u_memory.h"
+#include "util/u_resource.h"
 
 #include "svga_context.h"
 #include "svga_screen.h"
@@ -297,6 +298,8 @@ svga_buffer_destroy( struct pipe_screen *screen,
    if(sbuf->swbuf && !sbuf->user)
       align_free(sbuf->swbuf);
    
+   ss->total_resource_bytes -= sbuf->size;
+
    FREE(sbuf);
 }
 
@@ -342,6 +345,9 @@ svga_buffer_create(struct pipe_screen *screen,
    debug_reference(&sbuf->b.b.reference,
                    (debug_reference_descriptor)debug_describe_resource, 0);
 
+   sbuf->size = util_resource_size(template);
+   ss->total_resource_bytes += sbuf->size;
+
    return &sbuf->b.b; 
 
 error2:
index ee12acf69719bc24730109faee012fee9be86f9c..b431d7b5968852ff12473a84579f31ab50ab53af 100644 (file)
@@ -177,6 +177,8 @@ struct svga_buffer
     * a context. It is only valid if the dma.pending is set above.
     */
    struct list_head head;
+
+   unsigned size;  /**< Approximate size in bytes */
 };
 
 
index 7f36da811ff0534156710bde257e23c66d076e8d..3cb7d34bad0eda53b265ee7396cdc81942cd3d7c 100644 (file)
@@ -32,6 +32,7 @@
 #include "util/u_format.h"
 #include "util/u_math.h"
 #include "util/u_memory.h"
+#include "util/u_resource.h"
 
 #include "svga_format.h"
 #include "svga_screen.h"
@@ -229,6 +230,8 @@ svga_texture_destroy(struct pipe_screen *screen,
    SVGA_DBG(DEBUG_DMA, "unref sid %p (texture)\n", tex->handle);
    svga_screen_surface_destroy(ss, &tex->key, &tex->handle);
 
+   ss->total_resource_bytes -= tex->size;
+
    FREE(tex);
 }
 
@@ -470,6 +473,9 @@ svga_texture_create(struct pipe_screen *screen,
    debug_reference(&tex->b.b.reference,
                    (debug_reference_descriptor)debug_describe_resource, 0);
 
+   tex->size = util_resource_size(template);
+   svgascreen->total_resource_bytes += tex->size;
+
    return &tex->b.b;
 
 error2:
index 57ed0f5a93ded300515a8230417f4daa1a4b460b..b3a1a6d52f5530ba89d7cca32875503a2dbd897b 100644 (file)
@@ -75,6 +75,8 @@ struct svga_texture
     * to this texture and never destroy this handle directly.
     */
    struct svga_winsys_surface *handle;
+
+   unsigned size;  /**< Approximate size in bytes */
 };
 
 
index bd1b03fc66cafe6b26d53f9dddcac24c0d71d382..6213535a23ee68a1d4402e6a301b289c2c4fb739 100644 (file)
@@ -499,7 +499,8 @@ svga_get_driver_query_info(struct pipe_screen *screen,
 {
    static const struct pipe_driver_query_info queries[] = {
       {"draw-calls", SVGA_QUERY_DRAW_CALLS, 0, FALSE},
-      {"fallbacks", SVGA_QUERY_FALLBACKS, 0, FALSE}
+      {"fallbacks", SVGA_QUERY_FALLBACKS, 0, FALSE},
+      {"memory-used", SVGA_QUERY_MEMORY_USED, 0, TRUE}
    };
 
    if (!info)
index d7d2c7563598293b0a84f900881d8fa501a5ae7e..77b552af6b0d6f3472e9e8b74b8aa953adc52e16 100644 (file)
@@ -73,6 +73,9 @@ struct svga_screen
    } depth;
 
    struct svga_host_surface_cache cache;
+
+   /** Memory used by all resources (buffers and surfaces) */
+   uint64_t total_resource_bytes;
 };
 
 #ifndef DEBUG