Add new GALLIUM_HUD queries for:
num-shaders
num-resources
num-state-objects
num-validations
map-buffer-time
num-surface-views
num-resources-mapped
num-flushes
Most of this patch was originally written by Neha. Additional clean-ups
and num-flushes counter added by Brian Paul.
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
tags/11.1-branchpoint
| @@ -312,6 +312,8 @@ void svga_context_flush( struct svga_context *svga, | |||
| */ | |||
| svga->swc->flush(svga->swc, &fence); | |||
| svga->hud.num_flushes++; | |||
| svga_screen_cache_flush(svgascreen, fence); | |||
| /* To force the re-emission of rendertargets and texture sampler bindings on | |||
| @@ -44,10 +44,21 @@ | |||
| /** 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) | |||
| #define SVGA_QUERY_MAX (PIPE_QUERY_DRIVER_SPECIFIC + 3) | |||
| /* per-frame counters */ | |||
| #define SVGA_QUERY_NUM_DRAW_CALLS (PIPE_QUERY_DRIVER_SPECIFIC + 0) | |||
| #define SVGA_QUERY_NUM_FALLBACKS (PIPE_QUERY_DRIVER_SPECIFIC + 1) | |||
| #define SVGA_QUERY_NUM_FLUSHES (PIPE_QUERY_DRIVER_SPECIFIC + 2) | |||
| #define SVGA_QUERY_NUM_VALIDATIONS (PIPE_QUERY_DRIVER_SPECIFIC + 3) | |||
| #define SVGA_QUERY_MAP_BUFFER_TIME (PIPE_QUERY_DRIVER_SPECIFIC + 4) | |||
| #define SVGA_QUERY_NUM_RESOURCES_MAPPED (PIPE_QUERY_DRIVER_SPECIFIC + 5) | |||
| /* running total counters */ | |||
| #define SVGA_QUERY_MEMORY_USED (PIPE_QUERY_DRIVER_SPECIFIC + 6) | |||
| #define SVGA_QUERY_NUM_SHADERS (PIPE_QUERY_DRIVER_SPECIFIC + 7) | |||
| #define SVGA_QUERY_NUM_RESOURCES (PIPE_QUERY_DRIVER_SPECIFIC + 8) | |||
| #define SVGA_QUERY_NUM_STATE_OBJECTS (PIPE_QUERY_DRIVER_SPECIFIC + 9) | |||
| #define SVGA_QUERY_NUM_SURFACE_VIEWS (PIPE_QUERY_DRIVER_SPECIFIC + 10) | |||
| /*SVGA_QUERY_MAX has to be last because it is size of an array*/ | |||
| #define SVGA_QUERY_MAX (PIPE_QUERY_DRIVER_SPECIFIC + 11) | |||
| /** | |||
| * Maximum supported number of constant buffers per shader | |||
| @@ -463,9 +474,18 @@ 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 */ | |||
| /** performance / info queries for HUD */ | |||
| struct { | |||
| uint64_t num_draw_calls; /**< SVGA_QUERY_DRAW_CALLS */ | |||
| uint64_t num_fallbacks; /**< SVGA_QUERY_NUM_FALLBACKS */ | |||
| uint64_t num_flushes; /**< SVGA_QUERY_NUM_FLUSHES */ | |||
| uint64_t num_validations; /**< SVGA_QUERY_NUM_VALIDATIONS */ | |||
| uint64_t map_buffer_time; /**< SVGA_QUERY_MAP_BUFFER_TIME */ | |||
| uint64_t num_resources_mapped; /**< SVGA_QUERY_NUM_RESOURCES_MAPPED */ | |||
| uint64_t num_shaders; /**< SVGA_QUERY_NUM_SHADERS */ | |||
| uint64_t num_state_objects; /**< SVGA_QUERY_NUM_STATE_OBJECTS */ | |||
| uint64_t num_surface_views; /**< SVGA_QUERY_NUM_SURFACE_VIEWS */ | |||
| } hud; | |||
| /** The currently bound stream output targets */ | |||
| unsigned num_so_targets; | |||
| @@ -321,6 +321,8 @@ svga_create_blend_state(struct pipe_context *pipe, | |||
| define_blend_state_object(svga, blend); | |||
| } | |||
| svga->hud.num_state_objects++; | |||
| return blend; | |||
| } | |||
| @@ -359,6 +361,7 @@ static void svga_delete_blend_state(struct pipe_context *pipe, | |||
| } | |||
| FREE(blend); | |||
| svga->hud.num_state_objects--; | |||
| } | |||
| static void svga_set_blend_color( struct pipe_context *pipe, | |||
| @@ -202,6 +202,8 @@ svga_create_depth_stencil_state(struct pipe_context *pipe, | |||
| define_depth_stencil_state_object(svga, ds); | |||
| } | |||
| svga->hud.num_state_objects++; | |||
| return ds; | |||
| } | |||
| @@ -248,6 +250,7 @@ static void svga_delete_depth_stencil_state(struct pipe_context *pipe, | |||
| } | |||
| FREE(depth_stencil); | |||
| svga->hud.num_state_objects--; | |||
| } | |||
| @@ -177,7 +177,7 @@ 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 */ | |||
| svga->hud.num_draw_calls++; /* for SVGA_QUERY_NUM_DRAW_CALLS */ | |||
| if (u_reduced_prim(info->mode) == PIPE_PRIM_TRIANGLES && | |||
| svga->curr.rast->templ.cull_face == PIPE_FACE_FRONT_AND_BACK) | |||
| @@ -219,7 +219,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 */ | |||
| svga->hud.num_fallbacks++; /* for SVGA_QUERY_NUM_FALLBACKS */ | |||
| if (!needed_swtnl) { | |||
| /* | |||
| * We're switching from HW to SW TNL. SW TNL will require mapping all | |||
| @@ -720,9 +720,17 @@ svga_create_query(struct pipe_context *pipe, | |||
| define_query_vgpu10(svga, sq, | |||
| sizeof(SVGADXTimestampQueryResult)); | |||
| break; | |||
| case SVGA_QUERY_DRAW_CALLS: | |||
| case SVGA_QUERY_FALLBACKS: | |||
| case SVGA_QUERY_NUM_DRAW_CALLS: | |||
| case SVGA_QUERY_NUM_FALLBACKS: | |||
| case SVGA_QUERY_NUM_FLUSHES: | |||
| case SVGA_QUERY_MEMORY_USED: | |||
| case SVGA_QUERY_NUM_SHADERS: | |||
| case SVGA_QUERY_NUM_RESOURCES: | |||
| case SVGA_QUERY_NUM_STATE_OBJECTS: | |||
| case SVGA_QUERY_NUM_VALIDATIONS: | |||
| case SVGA_QUERY_MAP_BUFFER_TIME: | |||
| case SVGA_QUERY_NUM_SURFACE_VIEWS: | |||
| case SVGA_QUERY_NUM_RESOURCES_MAPPED: | |||
| break; | |||
| default: | |||
| assert(!"unexpected query type in svga_create_query()"); | |||
| @@ -778,9 +786,17 @@ svga_destroy_query(struct pipe_context *pipe, struct pipe_query *q) | |||
| destroy_query_vgpu10(svga, sq); | |||
| sws->fence_reference(sws, &sq->fence, NULL); | |||
| break; | |||
| case SVGA_QUERY_DRAW_CALLS: | |||
| case SVGA_QUERY_FALLBACKS: | |||
| case SVGA_QUERY_NUM_DRAW_CALLS: | |||
| case SVGA_QUERY_NUM_FALLBACKS: | |||
| case SVGA_QUERY_NUM_FLUSHES: | |||
| case SVGA_QUERY_MEMORY_USED: | |||
| case SVGA_QUERY_NUM_SHADERS: | |||
| case SVGA_QUERY_NUM_RESOURCES: | |||
| case SVGA_QUERY_NUM_STATE_OBJECTS: | |||
| case SVGA_QUERY_NUM_VALIDATIONS: | |||
| case SVGA_QUERY_MAP_BUFFER_TIME: | |||
| case SVGA_QUERY_NUM_SURFACE_VIEWS: | |||
| case SVGA_QUERY_NUM_RESOURCES_MAPPED: | |||
| /* nothing */ | |||
| break; | |||
| default: | |||
| @@ -842,13 +858,29 @@ svga_begin_query(struct pipe_context *pipe, struct pipe_query *q) | |||
| ret = begin_query_vgpu10(svga, sq); | |||
| assert(ret == PIPE_OK); | |||
| break; | |||
| case SVGA_QUERY_DRAW_CALLS: | |||
| sq->begin_count = svga->num_draw_calls; | |||
| case SVGA_QUERY_NUM_DRAW_CALLS: | |||
| sq->begin_count = svga->hud.num_draw_calls; | |||
| break; | |||
| case SVGA_QUERY_FALLBACKS: | |||
| sq->begin_count = svga->num_fallbacks; | |||
| case SVGA_QUERY_NUM_FALLBACKS: | |||
| sq->begin_count = svga->hud.num_fallbacks; | |||
| break; | |||
| case SVGA_QUERY_NUM_FLUSHES: | |||
| sq->begin_count = svga->hud.num_flushes; | |||
| break; | |||
| case SVGA_QUERY_NUM_VALIDATIONS: | |||
| sq->begin_count = svga->hud.num_validations; | |||
| break; | |||
| case SVGA_QUERY_MAP_BUFFER_TIME: | |||
| sq->begin_count = svga->hud.map_buffer_time; | |||
| break; | |||
| case SVGA_QUERY_NUM_RESOURCES_MAPPED: | |||
| sq->begin_count = svga->hud.num_resources_mapped; | |||
| break; | |||
| case SVGA_QUERY_MEMORY_USED: | |||
| case SVGA_QUERY_NUM_SHADERS: | |||
| case SVGA_QUERY_NUM_RESOURCES: | |||
| case SVGA_QUERY_NUM_STATE_OBJECTS: | |||
| case SVGA_QUERY_NUM_SURFACE_VIEWS: | |||
| /* nothing */ | |||
| break; | |||
| default: | |||
| @@ -916,13 +948,29 @@ svga_end_query(struct pipe_context *pipe, struct pipe_query *q) | |||
| ret = end_query_vgpu10(svga, sq); | |||
| assert(ret == PIPE_OK); | |||
| break; | |||
| case SVGA_QUERY_DRAW_CALLS: | |||
| sq->end_count = svga->num_draw_calls; | |||
| case SVGA_QUERY_NUM_DRAW_CALLS: | |||
| sq->end_count = svga->hud.num_draw_calls; | |||
| break; | |||
| case SVGA_QUERY_NUM_FALLBACKS: | |||
| sq->end_count = svga->hud.num_fallbacks; | |||
| break; | |||
| case SVGA_QUERY_NUM_FLUSHES: | |||
| sq->end_count = svga->hud.num_flushes; | |||
| break; | |||
| case SVGA_QUERY_FALLBACKS: | |||
| sq->end_count = svga->num_fallbacks; | |||
| case SVGA_QUERY_NUM_VALIDATIONS: | |||
| sq->end_count = svga->hud.num_validations; | |||
| break; | |||
| case SVGA_QUERY_MAP_BUFFER_TIME: | |||
| sq->end_count = svga->hud.map_buffer_time; | |||
| break; | |||
| case SVGA_QUERY_NUM_RESOURCES_MAPPED: | |||
| sq->end_count = svga->hud.num_resources_mapped; | |||
| break; | |||
| case SVGA_QUERY_MEMORY_USED: | |||
| case SVGA_QUERY_NUM_SHADERS: | |||
| case SVGA_QUERY_NUM_RESOURCES: | |||
| case SVGA_QUERY_NUM_STATE_OBJECTS: | |||
| case SVGA_QUERY_NUM_SURFACE_VIEWS: | |||
| /* nothing */ | |||
| break; | |||
| default: | |||
| @@ -1007,13 +1055,30 @@ svga_get_query_result(struct pipe_context *pipe, | |||
| *result = (uint64_t)sResult.numPrimitivesWritten; | |||
| break; | |||
| } | |||
| case SVGA_QUERY_DRAW_CALLS: | |||
| /* fall-through */ | |||
| case SVGA_QUERY_FALLBACKS: | |||
| /* These are per-frame counters */ | |||
| case SVGA_QUERY_NUM_DRAW_CALLS: | |||
| case SVGA_QUERY_NUM_FALLBACKS: | |||
| case SVGA_QUERY_NUM_FLUSHES: | |||
| case SVGA_QUERY_NUM_VALIDATIONS: | |||
| case SVGA_QUERY_NUM_RESOURCES_MAPPED: | |||
| case SVGA_QUERY_MAP_BUFFER_TIME: | |||
| vresult->u64 = sq->end_count - sq->begin_count; | |||
| break; | |||
| /* These are running total counters */ | |||
| case SVGA_QUERY_MEMORY_USED: | |||
| vresult->u64 = svgascreen->total_resource_bytes; | |||
| vresult->u64 = svgascreen->hud.total_resource_bytes; | |||
| break; | |||
| case SVGA_QUERY_NUM_SHADERS: | |||
| vresult->u64 = svga->hud.num_shaders; | |||
| break; | |||
| case SVGA_QUERY_NUM_RESOURCES: | |||
| vresult->u64 = svgascreen->hud.num_resources; | |||
| break; | |||
| case SVGA_QUERY_NUM_STATE_OBJECTS: | |||
| vresult->u64 = svga->hud.num_state_objects; | |||
| break; | |||
| case SVGA_QUERY_NUM_SURFACE_VIEWS: | |||
| vresult->u64 = svga->hud.num_surface_views; | |||
| break; | |||
| default: | |||
| assert(!"unexpected query type in svga_get_query_result"); | |||
| @@ -352,6 +352,8 @@ svga_create_rasterizer_state(struct pipe_context *pipe, | |||
| define_rasterizer_object(svga, rast); | |||
| } | |||
| svga->hud.num_state_objects++; | |||
| return rast; | |||
| } | |||
| @@ -392,6 +394,7 @@ svga_delete_rasterizer_state(struct pipe_context *pipe, void *state) | |||
| } | |||
| FREE(state); | |||
| svga->hud.num_state_objects--; | |||
| } | |||
| @@ -273,6 +273,8 @@ svga_create_sampler_state(struct pipe_context *pipe, | |||
| cso->min_lod, cso->view_min_lod, cso->view_max_lod, | |||
| cso->mipfilter == SVGA3D_TEX_FILTER_NONE ? "SVGA3D_TEX_FILTER_NONE" : "SOMETHING"); | |||
| svga->hud.num_state_objects++; | |||
| return cso; | |||
| } | |||
| @@ -328,6 +330,7 @@ static void svga_delete_sampler_state(struct pipe_context *pipe, | |||
| } | |||
| FREE(sampler); | |||
| svga->hud.num_state_objects--; | |||
| } | |||
| @@ -274,6 +274,9 @@ svga_create_vertex_elements_state(struct pipe_context *pipe, | |||
| translate_vertex_decls(svga, velems); | |||
| } | |||
| } | |||
| svga->hud.num_state_objects++; | |||
| return velems; | |||
| } | |||
| @@ -315,6 +318,7 @@ svga_delete_vertex_elements_state(struct pipe_context *pipe, void *state) | |||
| } | |||
| FREE(velems); | |||
| svga->hud.num_state_objects--; | |||
| } | |||
| void svga_cleanup_vertex_state( struct svga_context *svga ) | |||
| @@ -29,6 +29,7 @@ | |||
| #include "pipe/p_defines.h" | |||
| #include "util/u_inlines.h" | |||
| #include "os/os_thread.h" | |||
| #include "os/os_time.h" | |||
| #include "util/u_math.h" | |||
| #include "util/u_memory.h" | |||
| #include "util/u_resource.h" | |||
| @@ -77,6 +78,7 @@ svga_buffer_transfer_map(struct pipe_context *pipe, | |||
| struct svga_buffer *sbuf = svga_buffer(resource); | |||
| struct pipe_transfer *transfer; | |||
| uint8_t *map; | |||
| int64_t begin = os_time_get(); | |||
| transfer = CALLOC_STRUCT(pipe_transfer); | |||
| if (transfer == NULL) { | |||
| @@ -244,6 +246,9 @@ svga_buffer_transfer_map(struct pipe_context *pipe, | |||
| FREE(transfer); | |||
| } | |||
| svga->hud.map_buffer_time += (os_time_get() - begin); | |||
| svga->hud.num_resources_mapped++; | |||
| return map; | |||
| } | |||
| @@ -331,7 +336,10 @@ svga_buffer_destroy( struct pipe_screen *screen, | |||
| if (sbuf->swbuf && !sbuf->user) | |||
| align_free(sbuf->swbuf); | |||
| ss->total_resource_bytes -= sbuf->size; | |||
| ss->hud.total_resource_bytes -= sbuf->size; | |||
| assert(ss->hud.num_resources > 0); | |||
| if (ss->hud.num_resources > 0) | |||
| ss->hud.num_resources--; | |||
| FREE(sbuf); | |||
| } | |||
| @@ -409,7 +417,9 @@ svga_buffer_create(struct pipe_screen *screen, | |||
| (debug_reference_descriptor)debug_describe_resource, 0); | |||
| sbuf->size = util_resource_size(&sbuf->b.b); | |||
| ss->total_resource_bytes += sbuf->size; | |||
| ss->hud.total_resource_bytes += sbuf->size; | |||
| ss->hud.num_resources++; | |||
| return &sbuf->b.b; | |||
| @@ -427,6 +437,7 @@ svga_user_buffer_create(struct pipe_screen *screen, | |||
| unsigned bind) | |||
| { | |||
| struct svga_buffer *sbuf; | |||
| struct svga_screen *ss = svga_screen(screen); | |||
| sbuf = CALLOC_STRUCT(svga_buffer); | |||
| if (!sbuf) | |||
| @@ -450,6 +461,8 @@ svga_user_buffer_create(struct pipe_screen *screen, | |||
| debug_reference(&sbuf->b.b.reference, | |||
| (debug_reference_descriptor)debug_describe_resource, 0); | |||
| ss->hud.num_resources++; | |||
| return &sbuf->b.b; | |||
| no_sbuf: | |||
| @@ -29,6 +29,7 @@ | |||
| #include "pipe/p_state.h" | |||
| #include "pipe/p_defines.h" | |||
| #include "os/os_thread.h" | |||
| #include "os/os_time.h" | |||
| #include "util/u_format.h" | |||
| #include "util/u_inlines.h" | |||
| #include "util/u_math.h" | |||
| @@ -229,11 +230,15 @@ 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; | |||
| ss->hud.total_resource_bytes -= tex->size; | |||
| FREE(tex->defined); | |||
| FREE(tex->rendered_to); | |||
| FREE(tex); | |||
| assert(ss->hud.num_resources > 0); | |||
| if (ss->hud.num_resources > 0) | |||
| ss->hud.num_resources--; | |||
| } | |||
| @@ -322,6 +327,8 @@ svga_texture_transfer_map(struct pipe_context *pipe, | |||
| boolean use_direct_map = svga_have_gb_objects(svga) && | |||
| !svga_have_gb_dma(svga); | |||
| unsigned d; | |||
| void *returnVal; | |||
| int64_t begin = os_time_get(); | |||
| /* We can't map texture storage directly unless we have GB objects */ | |||
| if (usage & PIPE_TRANSFER_MAP_DIRECTLY) { | |||
| @@ -464,10 +471,10 @@ svga_texture_transfer_map(struct pipe_context *pipe, | |||
| * Begin mapping code | |||
| */ | |||
| if (st->swbuf) { | |||
| return st->swbuf; | |||
| returnVal = st->swbuf; | |||
| } | |||
| else if (!st->use_direct_map) { | |||
| return sws->buffer_map(sws, st->hwbuf, usage); | |||
| returnVal = sws->buffer_map(sws, st->hwbuf, usage); | |||
| } | |||
| else { | |||
| SVGA3dSize baseLevelSize; | |||
| @@ -518,9 +525,13 @@ svga_texture_transfer_map(struct pipe_context *pipe, | |||
| offset += svga3dsurface_get_pixel_offset(tex->key.format, | |||
| mip_width, mip_height, | |||
| xoffset, yoffset, zoffset); | |||
| return (void *) (map + offset); | |||
| returnVal = (void *) (map + offset); | |||
| } | |||
| svga->hud.map_buffer_time += (os_time_get() - begin); | |||
| svga->hud.num_resources_mapped++; | |||
| return returnVal; | |||
| } | |||
| @@ -889,7 +900,8 @@ svga_texture_create(struct pipe_screen *screen, | |||
| (debug_reference_descriptor)debug_describe_resource, 0); | |||
| tex->size = util_resource_size(template); | |||
| svgascreen->total_resource_bytes += tex->size; | |||
| svgascreen->hud.total_resource_bytes += tex->size; | |||
| svgascreen->hud.num_resources++; | |||
| return &tex->b.b; | |||
| } | |||
| @@ -901,6 +913,7 @@ svga_texture_from_handle(struct pipe_screen *screen, | |||
| struct winsys_handle *whandle) | |||
| { | |||
| struct svga_winsys_screen *sws = svga_winsys_screen(screen); | |||
| struct svga_screen *ss = svga_screen(screen); | |||
| struct svga_winsys_surface *srf; | |||
| struct svga_texture *tex; | |||
| enum SVGA3dSurfaceFormat format = 0; | |||
| @@ -970,5 +983,7 @@ svga_texture_from_handle(struct pipe_screen *screen, | |||
| tex->rendered_to = CALLOC(1, sizeof(tex->rendered_to[0])); | |||
| tex->imported = TRUE; | |||
| ss->hud.num_resources++; | |||
| return &tex->b.b; | |||
| } | |||
| @@ -772,9 +772,22 @@ svga_get_driver_query_info(struct pipe_screen *screen, | |||
| struct pipe_driver_query_info *info) | |||
| { | |||
| static const struct pipe_driver_query_info queries[] = { | |||
| {"draw-calls", SVGA_QUERY_DRAW_CALLS, {0}}, | |||
| {"fallbacks", SVGA_QUERY_FALLBACKS, {0}}, | |||
| {"memory-used", SVGA_QUERY_MEMORY_USED, {0}, PIPE_DRIVER_QUERY_TYPE_BYTES} | |||
| /* per-frame counters */ | |||
| {"num-draw-calls", SVGA_QUERY_NUM_DRAW_CALLS, {0}}, | |||
| {"num-fallbacks", SVGA_QUERY_NUM_FALLBACKS, {0}}, | |||
| {"num-flushes", SVGA_QUERY_NUM_FLUSHES, {0}}, | |||
| {"num-validations", SVGA_QUERY_NUM_VALIDATIONS, {0}}, | |||
| {"map-buffer-time", SVGA_QUERY_MAP_BUFFER_TIME, {0}, | |||
| PIPE_DRIVER_QUERY_TYPE_MICROSECONDS}, | |||
| {"num-resources-mapped", SVGA_QUERY_NUM_RESOURCES_MAPPED, {0}}, | |||
| /* running total counters */ | |||
| {"memory-used", SVGA_QUERY_MEMORY_USED, {0}, | |||
| PIPE_DRIVER_QUERY_TYPE_BYTES}, | |||
| {"num-shaders", SVGA_QUERY_NUM_SHADERS, {0}}, | |||
| {"num-resources", SVGA_QUERY_NUM_RESOURCES, {0}}, | |||
| {"num-state-objects", SVGA_QUERY_NUM_STATE_OBJECTS, {0}}, | |||
| {"num-surface-views", SVGA_QUERY_NUM_SURFACE_VIEWS, {0}}, | |||
| }; | |||
| if (!info) | |||
| @@ -80,8 +80,12 @@ struct svga_screen | |||
| struct svga_host_surface_cache cache; | |||
| /** Memory used by all resources (buffers and surfaces) */ | |||
| uint64_t total_resource_bytes; | |||
| /** HUD counters */ | |||
| struct { | |||
| /** Memory used by all resources (buffers and surfaces) */ | |||
| uint64_t total_resource_bytes; | |||
| uint64_t num_resources; | |||
| } hud; | |||
| }; | |||
| #ifndef DEBUG | |||
| @@ -417,6 +417,7 @@ svga_set_shader(struct svga_context *svga, | |||
| struct svga_shader_variant * | |||
| svga_new_shader_variant(struct svga_context *svga) | |||
| { | |||
| svga->hud.num_shaders++; | |||
| return CALLOC_STRUCT(svga_shader_variant); | |||
| } | |||
| @@ -462,6 +463,8 @@ svga_destroy_shader_variant(struct svga_context *svga, | |||
| FREE((unsigned *)variant->tokens); | |||
| FREE(variant); | |||
| svga->hud.num_shaders--; | |||
| return ret; | |||
| } | |||
| @@ -225,6 +225,9 @@ svga_update_state(struct svga_context *svga, unsigned max_level) | |||
| svga->state.dirty[i] |= svga->dirty; | |||
| svga->dirty = 0; | |||
| svga->hud.num_validations++; | |||
| return PIPE_OK; | |||
| } | |||
| @@ -317,6 +317,8 @@ svga_create_surface_view(struct pipe_context *pipe, | |||
| s->real_level = surf_tmpl->u.tex.level; | |||
| } | |||
| svga->hud.num_surface_views++; | |||
| return &s->base; | |||
| } | |||
| @@ -509,6 +511,8 @@ svga_surface_destroy(struct pipe_context *pipe, | |||
| pipe_resource_reference(&surf->texture, NULL); | |||
| FREE(surf); | |||
| svga->hud.num_surface_views--; | |||
| } | |||