X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=inline;f=src%2Fgallium%2Fdrivers%2Ftrace%2Ftr_screen.h;h=dba8cd7c6535a5de4733df9e0efb3a48eb17a1cf;hb=7549a8397b310acf672f97a08c8e7d866cdf492c;hp=93fefdb9a5f69df2ce8a9656adfda05cc8b59149;hpb=0815ebccfc0a12d8f3e831928f1c4210b7f75ad8;p=mesa.git diff --git a/src/gallium/drivers/trace/tr_screen.h b/src/gallium/drivers/trace/tr_screen.h index 93fefdb9a5f..dba8cd7c653 100644 --- a/src/gallium/drivers/trace/tr_screen.h +++ b/src/gallium/drivers/trace/tr_screen.h @@ -30,28 +30,98 @@ #include "pipe/p_screen.h" +#include "pipe/p_thread.h" #ifdef __cplusplus extern "C" { #endif - + +struct tr_list { + struct tr_list *next; + struct tr_list *prev; +}; + +/** + * It often happens that new data is written directly to the user buffers + * without mapping/unmapping. This flag marks user buffers, so that their + * contents can be dumpped before being used by the pipe context. + */ +#define TRACE_BUFFER_USAGE_USER (1 << 31) + + struct trace_screen { struct pipe_screen base; - + struct pipe_screen *screen; + + /* remote debugger */ + struct trace_rbug *rbug; + + pipe_mutex list_mutex; + int num_buffers; + int num_contexts; + int num_textures; + int num_surfaces; + int num_transfers; + struct tr_list buffers; + struct tr_list contexts; + struct tr_list textures; + struct tr_list surfaces; + struct tr_list transfers; }; +/* + * tr_rbug.c + */ + + +struct trace_rbug; + +struct trace_rbug * +trace_rbug_start(struct trace_screen *tr_scr); + +void +trace_rbug_stop(struct trace_rbug *tr_rbug); + + +/* + * tr_screen.c + */ + + +boolean +trace_enabled(void); + struct trace_screen * trace_screen(struct pipe_screen *screen); - struct pipe_screen * trace_screen_create(struct pipe_screen *screen); +void +trace_screen_user_buffer_update(struct pipe_screen *screen, + struct pipe_buffer *buffer); + +#define trace_screen_add_to_list(tr_scr, name, obj) \ + do { \ + pipe_mutex_lock(tr_scr->list_mutex); \ + insert_at_head(&tr_scr->name, &obj->list); \ + tr_scr->num_##name++; \ + pipe_mutex_unlock(tr_scr->list_mutex); \ + } while (0) + +#define trace_screen_remove_from_list(tr_scr, name, obj) \ + do { \ + pipe_mutex_lock(tr_scr->list_mutex); \ + remove_from_list(&obj->list); \ + tr_scr->num_##name--; \ + pipe_mutex_unlock(tr_scr->list_mutex); \ + } while (0) + #ifdef __cplusplus }