llvmpipe: add a simple resource tracking/debug feature

If debug build, keep a linked list of all allocated resources (textures).
The llvmipe_print_resources() function can be called from a debugger to
print a list of all resources, their sizes, total size, etc.
This commit is contained in:
Brian Paul 2010-05-11 11:50:43 -06:00
parent f70d900b80
commit fea189d6e4
2 changed files with 58 additions and 0 deletions

View File

@ -39,6 +39,7 @@
#include "util/u_format.h"
#include "util/u_math.h"
#include "util/u_memory.h"
#include "util/u_simple_list.h"
#include "util/u_transfer.h"
#include "lp_context.h"
@ -51,6 +52,11 @@
#include "state_tracker/sw_winsys.h"
#ifdef DEBUG
static struct llvmpipe_resource resource_list;
#endif
static INLINE boolean
resource_is_texture(const struct pipe_resource *resource)
{
@ -245,6 +251,10 @@ llvmpipe_resource_create(struct pipe_screen *_screen,
lpr->id = id_counter++;
#ifdef DEBUG
insert_at_tail(&resource_list, lpr);
#endif
return &lpr->base;
fail:
@ -303,6 +313,11 @@ llvmpipe_resource_destroy(struct pipe_screen *pscreen,
align_free(lpr->data);
}
#ifdef DEBUG
if (lpr->next)
remove_from_list(lpr);
#endif
FREE(lpr);
}
@ -1208,9 +1223,43 @@ llvmpipe_resource_size(const struct pipe_resource *resource)
}
#ifdef DEBUG
void
llvmpipe_print_resources(void)
{
struct llvmpipe_resource *lpr;
unsigned n = 0, total = 0;
debug_printf("LLVMPIPE: current resources:\n");
foreach(lpr, &resource_list) {
unsigned size = llvmpipe_resource_size(&lpr->base);
debug_printf("resource %u at %p, size %ux%ux%u: %u bytes, refcount %u\n",
lpr->id, (void *) lpr,
lpr->base.width0, lpr->base.height0, lpr->base.depth0,
size, lpr->base.reference.count);
total += size;
n++;
}
debug_printf("LLVMPIPE: total size of %u resources: %u\n", n, total);
}
#endif
void
llvmpipe_init_screen_resource_funcs(struct pipe_screen *screen)
{
#ifdef DEBUG
/* init linked list for tracking resources */
{
static boolean first_call = TRUE;
if (first_call) {
memset(&resource_list, 0, sizeof(resource_list));
make_empty_list(&resource_list);
first_call = FALSE;
}
}
#endif
screen->resource_create = llvmpipe_resource_create;
screen->resource_destroy = llvmpipe_resource_destroy;
screen->resource_from_handle = llvmpipe_resource_from_handle;

View File

@ -119,6 +119,11 @@ struct llvmpipe_resource
unsigned timestamp;
unsigned id; /**< temporary, for debugging */
#ifdef DEBUG
/** for linked list */
struct llvmpipe_resource *prev, *next;
#endif
};
@ -219,6 +224,10 @@ llvmpipe_get_texture_tile(struct llvmpipe_resource *lpr,
extern void
llvmpipe_print_resources(void);
extern void
llvmpipe_init_screen_texture_funcs(struct pipe_screen *screen);