trace: Trace surface contents.

This commit is contained in:
José Fonseca 2008-08-14 14:34:33 +01:00
parent 196167e9d5
commit 424dea98d4
3 changed files with 58 additions and 22 deletions

View File

@ -22,9 +22,5 @@ which should create a gallium.*.trace file, which is an XML file. You can view
copying trace.xsl and trace.css to the same directory, and opening with a
XSLT capable browser like Firefox or Internet Explorer.
This is still work in progress, namely:
- surface writes are not traced
- no way to know the start/end of a frame
--
Jose Fonseca <jrfonseca@tungstengraphics.com>

View File

@ -26,6 +26,7 @@
**************************************************************************/
#include "pipe/p_util.h"
#include "util/u_hash_table.h"
#include "tr_dump.h"
#include "tr_state.h"
@ -33,6 +34,18 @@
#include "tr_screen.h"
static unsigned trace_surface_hash(void *surface)
{
return (unsigned)(uintptr_t)surface;
}
static int trace_surface_compare(void *surface1, void *surface2)
{
return (char *)surface2 - (char *)surface1;
}
static const char *
trace_screen_get_name(struct pipe_screen *_screen)
{
@ -275,21 +288,17 @@ trace_screen_surface_map(struct pipe_screen *_screen,
{
struct trace_screen *tr_scr = trace_screen(_screen);
struct pipe_screen *screen = tr_scr->screen;
struct pipe_surface *result;
void *map;
trace_dump_call_begin("pipe_screen", "surface_map");
map = screen->surface_map(screen, surface, flags);
if(map) {
if(flags & PIPE_BUFFER_USAGE_CPU_WRITE) {
assert(!hash_table_get(tr_scr->surface_maps, surface));
hash_table_set(tr_scr->surface_maps, surface, map);
}
}
trace_dump_arg(ptr, screen);
trace_dump_arg(ptr, surface);
trace_dump_arg(uint, flags);
result = screen->surface_map(screen, surface, flags);
trace_dump_ret(ptr, result);
trace_dump_call_end();
return result;
return map;
}
@ -299,15 +308,36 @@ trace_screen_surface_unmap(struct pipe_screen *_screen,
{
struct trace_screen *tr_scr = trace_screen(_screen);
struct pipe_screen *screen = tr_scr->screen;
const void *map;
trace_dump_call_begin("pipe_screen", "surface_unmap");
map = hash_table_get(tr_scr->surface_maps, surface);
if(map) {
size_t size = surface->nblocksy * surface->stride;
trace_dump_call_begin("pipe_winsys", "surface_write");
trace_dump_arg(ptr, screen);
trace_dump_arg(ptr, surface);
trace_dump_arg_begin("data");
trace_dump_bytes(map, size);
trace_dump_arg_end();
trace_dump_arg_begin("stride");
trace_dump_uint(surface->stride);
trace_dump_arg_end();
trace_dump_arg_begin("size");
trace_dump_uint(size);
trace_dump_arg_end();
trace_dump_arg(ptr, screen);
trace_dump_arg(ptr, surface);
trace_dump_call_end();
hash_table_remove(tr_scr->surface_maps, surface);
}
screen->surface_unmap(screen, surface);
trace_dump_call_end();
}
@ -368,6 +398,11 @@ trace_screen_create(struct pipe_screen *screen)
tr_scr->screen = screen;
tr_scr->surface_maps = hash_table_create(trace_surface_hash,
trace_surface_compare);
if(!tr_scr->surface_maps)
goto error3;
trace_dump_call_begin("", "pipe_screen_create");
trace_dump_arg_begin("winsys");
trace_dump_ptr(screen->winsys);

View File

@ -34,11 +34,16 @@
#include "pipe/p_screen.h"
struct hash_table;
struct trace_screen
{
struct pipe_screen base;
struct pipe_screen *screen;
struct hash_table *surface_maps;
};