*
**************************************************************************/
-#include "pipe/p_inlines.h"
+#include "util/u_inlines.h"
#include "util/u_hash_table.h"
#include "util/u_memory.h"
+#include "util/u_simple_list.h"
#include "tr_screen.h"
+#include "tr_context.h"
#include "tr_texture.h"
-struct pipe_texture *
-trace_texture_create(struct trace_screen *tr_scr,
- struct pipe_texture *texture)
+struct pipe_resource *
+trace_resource_create(struct trace_screen *tr_scr,
+ struct pipe_resource *texture)
{
- struct trace_texture *tr_tex;
-
+ struct trace_resource *tr_tex;
+
if(!texture)
goto error;
-
+
assert(texture->screen == tr_scr->screen);
-
- tr_tex = CALLOC_STRUCT(trace_texture);
+
+ tr_tex = CALLOC_STRUCT(trace_resource);
if(!tr_tex)
goto error;
-
- memcpy(&tr_tex->base, texture, sizeof(struct pipe_texture));
+
+ memcpy(&tr_tex->base, texture, sizeof(struct pipe_resource));
+
+ pipe_reference_init(&tr_tex->base.reference, 1);
tr_tex->base.screen = &tr_scr->base;
- tr_tex->texture = texture;
-
+ tr_tex->resource = texture;
+
+ trace_screen_add_to_list(tr_scr, textures, tr_tex);
+
return &tr_tex->base;
-
+
error:
- pipe_texture_reference(&texture, NULL);
+ pipe_resource_reference(&texture, NULL);
return NULL;
}
void
-trace_texture_destroy(struct trace_screen *tr_scr,
- struct pipe_texture *texture)
+trace_resource_destroy(struct trace_screen *tr_scr,
+ struct trace_resource *tr_tex)
{
- struct trace_texture *tr_tex = trace_texture(tr_scr, texture);
- pipe_texture_reference(&tr_tex->texture, NULL);
+ trace_screen_remove_from_list(tr_scr, textures, tr_tex);
+
+ pipe_resource_reference(&tr_tex->resource, NULL);
FREE(tr_tex);
}
struct pipe_surface *
-trace_surface_create(struct trace_texture *tr_tex,
+trace_surface_create(struct trace_resource *tr_tex,
struct pipe_surface *surface)
{
+ struct trace_screen *tr_scr = trace_screen(tr_tex->base.screen);
struct trace_surface *tr_surf;
-
+
if(!surface)
goto error;
-
- assert(surface->texture == tr_tex->texture);
-
+
+ assert(surface->texture == tr_tex->resource);
+
tr_surf = CALLOC_STRUCT(trace_surface);
if(!tr_surf)
goto error;
-
+
memcpy(&tr_surf->base, surface, sizeof(struct pipe_surface));
-
- tr_surf->base.winsys = tr_tex->base.screen->winsys;
+
+ pipe_reference_init(&tr_surf->base.reference, 1);
tr_surf->base.texture = NULL;
- pipe_texture_reference(&tr_surf->base.texture, &tr_tex->base);
+ pipe_resource_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:
pipe_surface_reference(&surface, NULL);
return NULL;
void
-trace_surface_destroy(struct trace_texture *tr_tex,
- struct pipe_surface *surface)
+trace_surface_destroy(struct trace_surface *tr_surf)
{
- struct trace_surface *tr_surf = trace_surface(tr_tex, surface);
- pipe_texture_reference(&tr_surf->base.texture, NULL);
+ struct trace_screen *tr_scr = trace_screen(tr_surf->base.texture->screen);
+
+ trace_screen_remove_from_list(tr_scr, surfaces, tr_surf);
+
+ pipe_resource_reference(&tr_surf->base.texture, NULL);
pipe_surface_reference(&tr_surf->surface, NULL);
FREE(tr_surf);
}
+
+struct pipe_transfer *
+trace_transfer_create(struct trace_context *tr_ctx,
+ struct trace_resource *tr_tex,
+ struct pipe_transfer *transfer)
+{
+ struct trace_screen *tr_scr = trace_screen(tr_tex->base.screen);
+ struct trace_transfer *tr_trans;
+
+ if(!transfer)
+ goto error;
+
+ assert(transfer->resource == tr_tex->resource);
+
+ tr_trans = CALLOC_STRUCT(trace_transfer);
+ if(!tr_trans)
+ goto error;
+
+ memcpy(&tr_trans->base, transfer, sizeof(struct pipe_transfer));
+
+ tr_trans->base.resource = NULL;
+ tr_trans->transfer = transfer;
+
+ pipe_resource_reference(&tr_trans->base.resource, &tr_tex->base);
+ assert(tr_trans->base.resource == &tr_tex->base);
+
+ trace_screen_add_to_list(tr_scr, transfers, tr_trans);
+
+ return &tr_trans->base;
+
+error:
+ tr_ctx->pipe->transfer_destroy(tr_ctx->pipe, transfer);
+ return NULL;
+}
+
+
+void
+trace_transfer_destroy(struct trace_context *tr_context,
+ struct trace_transfer *tr_trans)
+{
+ struct trace_screen *tr_scr = trace_screen(tr_context->base.screen);
+ struct pipe_context *context = tr_context->pipe;
+ struct pipe_transfer *transfer = tr_trans->transfer;
+
+ trace_screen_remove_from_list(tr_scr, transfers, tr_trans);
+
+ pipe_resource_reference(&tr_trans->base.resource, NULL);
+ context->transfer_destroy(context, transfer);
+ FREE(tr_trans);
+}
+