diff options
Diffstat (limited to 'src/gallium/drivers/trace/tr_texture.c')
-rw-r--r-- | src/gallium/drivers/trace/tr_texture.c | 80 |
1 files changed, 62 insertions, 18 deletions
diff --git a/src/gallium/drivers/trace/tr_texture.c b/src/gallium/drivers/trace/tr_texture.c index 1cc4f0bd436..7b392f07286 100644 --- a/src/gallium/drivers/trace/tr_texture.c +++ b/src/gallium/drivers/trace/tr_texture.c @@ -25,7 +25,6 @@ * **************************************************************************/ -#include "pipe/p_inlines.h" #include "util/u_hash_table.h" #include "util/u_memory.h" @@ -34,26 +33,28 @@ struct pipe_texture * -trace_texture_create(struct trace_screen *tr_scr, +trace_texture_create(struct trace_screen *tr_scr, struct pipe_texture *texture) { struct trace_texture *tr_tex; - + if(!texture) goto error; - + assert(texture->screen == tr_scr->screen); - + tr_tex = CALLOC_STRUCT(trace_texture); if(!tr_tex) goto error; - + memcpy(&tr_tex->base, texture, sizeof(struct pipe_texture)); + + pipe_reference_init(&tr_tex->base.reference, 1); tr_tex->base.screen = &tr_scr->base; tr_tex->texture = texture; - + return &tr_tex->base; - + error: pipe_texture_reference(&texture, NULL); return NULL; @@ -61,38 +62,39 @@ error: void -trace_texture_destroy(struct trace_screen *tr_scr, +trace_texture_destroy(struct trace_screen *tr_scr, struct pipe_texture *texture) { - struct trace_texture *tr_tex = trace_texture(tr_scr, texture); + struct trace_texture *tr_tex = trace_texture(tr_scr, texture); pipe_texture_reference(&tr_tex->texture, NULL); FREE(tr_tex); } struct pipe_surface * -trace_surface_create(struct trace_texture *tr_tex, +trace_surface_create(struct trace_texture *tr_tex, struct pipe_surface *surface) { struct trace_surface *tr_surf; - + if(!surface) goto error; - + assert(surface->texture == tr_tex->texture); - + tr_surf = CALLOC_STRUCT(trace_surface); if(!tr_surf) goto error; - + memcpy(&tr_surf->base, surface, sizeof(struct pipe_surface)); - + + pipe_reference_init(&tr_surf->base.reference, 1); tr_surf->base.texture = NULL; pipe_texture_reference(&tr_surf->base.texture, &tr_tex->base); tr_surf->surface = surface; return &tr_surf->base; - + error: pipe_surface_reference(&surface, NULL); return NULL; @@ -100,7 +102,7 @@ error: void -trace_surface_destroy(struct trace_texture *tr_tex, +trace_surface_destroy(struct trace_texture *tr_tex, struct pipe_surface *surface) { struct trace_surface *tr_surf = trace_surface(tr_tex, surface); @@ -109,3 +111,45 @@ trace_surface_destroy(struct trace_texture *tr_tex, FREE(tr_surf); } + +struct pipe_transfer * +trace_transfer_create(struct trace_texture *tr_tex, + struct pipe_transfer *transfer) +{ + struct trace_transfer *tr_trans; + + if(!transfer) + goto error; + + assert(transfer->texture == tr_tex->texture); + + tr_trans = CALLOC_STRUCT(trace_transfer); + if(!tr_trans) + goto error; + + memcpy(&tr_trans->base, transfer, sizeof(struct pipe_transfer)); + + tr_trans->base.texture = NULL; + pipe_texture_reference(&tr_trans->base.texture, &tr_tex->base); + tr_trans->transfer = transfer; + assert(tr_trans->base.texture == &tr_tex->base); + + return &tr_trans->base; + +error: + transfer->texture->screen->tex_transfer_destroy(transfer); + return NULL; +} + + +void +trace_transfer_destroy(struct trace_texture *tr_tex, + struct pipe_transfer *transfer) +{ + struct trace_transfer *tr_trans = trace_transfer(tr_tex, transfer); + struct pipe_screen *screen = tr_trans->transfer->texture->screen; + pipe_texture_reference(&tr_trans->base.texture, NULL); + screen->tex_transfer_destroy(tr_trans->transfer); + FREE(tr_trans); +} + |