trace: Keep screen objects on lists
This commit is contained in:
parent
1e42f68fd6
commit
44d0e0caf4
|
@ -27,10 +27,10 @@
|
|||
|
||||
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_simple_list.h"
|
||||
|
||||
#include "tr_buffer.h"
|
||||
|
||||
|
||||
struct pipe_buffer *
|
||||
trace_buffer_create(struct trace_screen *tr_scr,
|
||||
struct pipe_buffer *buffer)
|
||||
|
@ -52,6 +52,8 @@ trace_buffer_create(struct trace_screen *tr_scr,
|
|||
tr_buf->base.screen = &tr_scr->base;
|
||||
tr_buf->buffer = buffer;
|
||||
|
||||
trace_screen_add_to_list(tr_scr, buffers, tr_buf);
|
||||
|
||||
return &tr_buf->base;
|
||||
|
||||
error:
|
||||
|
@ -66,6 +68,8 @@ trace_buffer_destroy(struct trace_screen *tr_scr,
|
|||
{
|
||||
struct trace_buffer *tr_buf = trace_buffer(buffer);
|
||||
|
||||
trace_screen_remove_from_list(tr_scr, buffers, tr_buf);
|
||||
|
||||
pipe_buffer_reference(&tr_buf->buffer, NULL);
|
||||
FREE(tr_buf);
|
||||
}
|
||||
|
|
|
@ -41,6 +41,8 @@ struct trace_buffer
|
|||
|
||||
struct pipe_buffer *buffer;
|
||||
|
||||
struct tr_list list;
|
||||
|
||||
void *map;
|
||||
boolean range_flushed;
|
||||
};
|
||||
|
|
|
@ -26,6 +26,8 @@
|
|||
**************************************************************************/
|
||||
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_simple_list.h"
|
||||
|
||||
#include "pipe/p_screen.h"
|
||||
|
||||
#include "tr_dump.h"
|
||||
|
@ -1014,17 +1016,18 @@ trace_context_flush(struct pipe_context *_pipe,
|
|||
static INLINE void
|
||||
trace_context_destroy(struct pipe_context *_pipe)
|
||||
{
|
||||
struct trace_screen *tr_scr = trace_screen(_pipe->screen);
|
||||
struct trace_context *tr_ctx = trace_context(_pipe);
|
||||
struct pipe_context *pipe = tr_ctx->pipe;
|
||||
|
||||
trace_dump_call_begin("pipe_context", "destroy");
|
||||
|
||||
trace_dump_arg(ptr, pipe);
|
||||
trace_dump_call_end();
|
||||
|
||||
trace_screen_remove_from_list(tr_scr, contexts, tr_ctx);
|
||||
|
||||
pipe->destroy(pipe);
|
||||
|
||||
trace_dump_call_end();
|
||||
|
||||
FREE(tr_ctx);
|
||||
}
|
||||
|
||||
|
@ -1150,6 +1153,8 @@ trace_context_create(struct pipe_screen *_screen,
|
|||
trace_dump_ret(ptr, pipe);
|
||||
trace_dump_call_end();
|
||||
|
||||
trace_screen_add_to_list(tr_scr, contexts, tr_ctx);
|
||||
|
||||
return &tr_ctx->base;
|
||||
|
||||
error1:
|
||||
|
|
|
@ -44,6 +44,8 @@ struct trace_context
|
|||
struct pipe_context base;
|
||||
|
||||
struct pipe_context *pipe;
|
||||
|
||||
struct tr_list list;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
**************************************************************************/
|
||||
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_simple_list.h"
|
||||
|
||||
#include "tr_buffer.h"
|
||||
#include "tr_dump.h"
|
||||
|
@ -855,6 +856,12 @@ trace_screen_create(struct pipe_screen *screen)
|
|||
#else
|
||||
winsys = screen->winsys;
|
||||
#endif
|
||||
pipe_mutex_init(tr_scr->list_mutex);
|
||||
make_empty_list(&tr_scr->buffers);
|
||||
make_empty_list(&tr_scr->contexts);
|
||||
make_empty_list(&tr_scr->textures);
|
||||
make_empty_list(&tr_scr->surfaces);
|
||||
make_empty_list(&tr_scr->transfers);
|
||||
|
||||
tr_scr->base.winsys = winsys;
|
||||
tr_scr->base.destroy = trace_screen_destroy;
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_thread.h"
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -37,6 +38,11 @@ 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
|
||||
|
@ -50,6 +56,18 @@ struct trace_screen
|
|||
struct pipe_screen base;
|
||||
|
||||
struct pipe_screen *screen;
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -65,6 +83,21 @@ 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
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
|
||||
#include "util/u_hash_table.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_simple_list.h"
|
||||
|
||||
#include "tr_screen.h"
|
||||
#include "tr_texture.h"
|
||||
|
@ -53,6 +54,8 @@ trace_texture_create(struct trace_screen *tr_scr,
|
|||
tr_tex->base.screen = &tr_scr->base;
|
||||
tr_tex->texture = texture;
|
||||
|
||||
trace_screen_add_to_list(tr_scr, textures, tr_tex);
|
||||
|
||||
return &tr_tex->base;
|
||||
|
||||
error:
|
||||
|
@ -64,6 +67,10 @@ error:
|
|||
void
|
||||
trace_texture_destroy(struct trace_texture *tr_tex)
|
||||
{
|
||||
struct trace_screen *tr_scr = trace_screen(tr_tex->base.screen);
|
||||
|
||||
trace_screen_remove_from_list(tr_scr, textures, tr_tex);
|
||||
|
||||
pipe_texture_reference(&tr_tex->texture, NULL);
|
||||
FREE(tr_tex);
|
||||
}
|
||||
|
@ -73,6 +80,7 @@ struct pipe_surface *
|
|||
trace_surface_create(struct trace_texture *tr_tex,
|
||||
struct pipe_surface *surface)
|
||||
{
|
||||
struct trace_screen *tr_scr = trace_screen(tr_tex->base.screen);
|
||||
struct trace_surface *tr_surf;
|
||||
|
||||
if(!surface)
|
||||
|
@ -91,6 +99,8 @@ trace_surface_create(struct trace_texture *tr_tex,
|
|||
pipe_texture_reference(&tr_surf->base.texture, &tr_tex->base);
|
||||
tr_surf->surface = surface;
|
||||
|
||||
trace_screen_add_to_list(tr_scr, surfaces, tr_surf);
|
||||
|
||||
return &tr_surf->base;
|
||||
|
||||
error:
|
||||
|
@ -102,6 +112,10 @@ error:
|
|||
void
|
||||
trace_surface_destroy(struct trace_surface *tr_surf)
|
||||
{
|
||||
struct trace_screen *tr_scr = trace_screen(tr_surf->base.texture->screen);
|
||||
|
||||
trace_screen_remove_from_list(tr_scr, surfaces, tr_surf);
|
||||
|
||||
pipe_texture_reference(&tr_surf->base.texture, NULL);
|
||||
pipe_surface_reference(&tr_surf->surface, NULL);
|
||||
FREE(tr_surf);
|
||||
|
@ -112,6 +126,7 @@ struct pipe_transfer *
|
|||
trace_transfer_create(struct trace_texture *tr_tex,
|
||||
struct pipe_transfer *transfer)
|
||||
{
|
||||
struct trace_screen *tr_scr = trace_screen(tr_tex->base.screen);
|
||||
struct trace_transfer *tr_trans;
|
||||
|
||||
if(!transfer)
|
||||
|
@ -130,6 +145,8 @@ trace_transfer_create(struct trace_texture *tr_tex,
|
|||
tr_trans->transfer = transfer;
|
||||
assert(tr_trans->base.texture == &tr_tex->base);
|
||||
|
||||
trace_screen_add_to_list(tr_scr, transfers, tr_trans);
|
||||
|
||||
return &tr_trans->base;
|
||||
|
||||
error:
|
||||
|
@ -141,7 +158,11 @@ error:
|
|||
void
|
||||
trace_transfer_destroy(struct trace_transfer *tr_trans)
|
||||
{
|
||||
struct trace_screen *tr_scr = trace_screen(tr_trans->base.texture->screen);
|
||||
struct pipe_screen *screen = tr_trans->transfer->texture->screen;
|
||||
|
||||
trace_screen_remove_from_list(tr_scr, transfers, tr_trans);
|
||||
|
||||
pipe_texture_reference(&tr_trans->base.texture, NULL);
|
||||
screen->tex_transfer_destroy(tr_trans->transfer);
|
||||
FREE(tr_trans);
|
||||
|
|
|
@ -40,6 +40,8 @@ struct trace_texture
|
|||
struct pipe_texture base;
|
||||
|
||||
struct pipe_texture *texture;
|
||||
|
||||
struct tr_list list;
|
||||
};
|
||||
|
||||
|
||||
|
@ -48,6 +50,8 @@ struct trace_surface
|
|||
struct pipe_surface base;
|
||||
|
||||
struct pipe_surface *surface;
|
||||
|
||||
struct tr_list list;
|
||||
};
|
||||
|
||||
|
||||
|
@ -57,6 +61,8 @@ struct trace_transfer
|
|||
|
||||
struct pipe_transfer *transfer;
|
||||
|
||||
struct tr_list list;
|
||||
|
||||
void *map;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue