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) 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; trace_screen_add_to_list(tr_scr, surfaces, tr_surf); return &tr_surf->base; error: pipe_surface_reference(&surface, NULL); return NULL; }
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) 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); trace_screen_add_to_list(tr_scr, transfers, tr_trans); return &tr_trans->base; error: transfer->texture->screen->tex_transfer_destroy(transfer); return NULL; }
struct pipe_texture * 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; trace_screen_add_to_list(tr_scr, textures, tr_tex); return &tr_tex->base; error: pipe_texture_reference(&texture, NULL); return NULL; }
struct trace_shader * trace_shader_create(struct trace_context *tr_ctx, const struct pipe_shader_state *state, void *result, enum trace_shader_type type) { struct trace_shader *tr_shdr = CALLOC_STRUCT(trace_shader); tr_shdr->state = result; tr_shdr->type = type; tr_shdr->tokens = tgsi_dup_tokens(state->tokens); /* works on context as well */ trace_screen_add_to_list(tr_ctx, shaders, tr_shdr); return tr_shdr; }
struct pipe_context * trace_context_create(struct trace_screen *tr_scr, struct pipe_context *pipe) { struct trace_context *tr_ctx; if(!pipe) goto error1; if(!trace_enabled()) goto error1; tr_ctx = CALLOC_STRUCT(trace_context); if(!tr_ctx) goto error1; tr_ctx->base.winsys = NULL; tr_ctx->base.priv = pipe->priv; /* expose wrapped priv data */ tr_ctx->base.screen = &tr_scr->base; tr_ctx->draw_blocker = debug_get_flags_option("RBUG_BLOCK", rbug_blocker_flags, 0); pipe_mutex_init(tr_ctx->draw_mutex); pipe_condvar_init(tr_ctx->draw_cond); pipe_mutex_init(tr_ctx->list_mutex); make_empty_list(&tr_ctx->shaders); tr_ctx->base.destroy = trace_context_destroy; tr_ctx->base.draw_arrays = trace_context_draw_arrays; tr_ctx->base.draw_elements = trace_context_draw_elements; tr_ctx->base.draw_range_elements = trace_context_draw_range_elements; tr_ctx->base.create_query = trace_context_create_query; tr_ctx->base.destroy_query = trace_context_destroy_query; tr_ctx->base.begin_query = trace_context_begin_query; tr_ctx->base.end_query = trace_context_end_query; tr_ctx->base.get_query_result = trace_context_get_query_result; tr_ctx->base.create_blend_state = trace_context_create_blend_state; tr_ctx->base.bind_blend_state = trace_context_bind_blend_state; tr_ctx->base.delete_blend_state = trace_context_delete_blend_state; tr_ctx->base.create_sampler_state = trace_context_create_sampler_state; tr_ctx->base.bind_fragment_sampler_states = trace_context_bind_fragment_sampler_states; tr_ctx->base.bind_vertex_sampler_states = trace_context_bind_vertex_sampler_states; tr_ctx->base.delete_sampler_state = trace_context_delete_sampler_state; tr_ctx->base.create_rasterizer_state = trace_context_create_rasterizer_state; tr_ctx->base.bind_rasterizer_state = trace_context_bind_rasterizer_state; tr_ctx->base.delete_rasterizer_state = trace_context_delete_rasterizer_state; tr_ctx->base.create_depth_stencil_alpha_state = trace_context_create_depth_stencil_alpha_state; tr_ctx->base.bind_depth_stencil_alpha_state = trace_context_bind_depth_stencil_alpha_state; tr_ctx->base.delete_depth_stencil_alpha_state = trace_context_delete_depth_stencil_alpha_state; tr_ctx->base.create_fs_state = trace_context_create_fs_state; tr_ctx->base.bind_fs_state = trace_context_bind_fs_state; tr_ctx->base.delete_fs_state = trace_context_delete_fs_state; tr_ctx->base.create_vs_state = trace_context_create_vs_state; tr_ctx->base.bind_vs_state = trace_context_bind_vs_state; tr_ctx->base.delete_vs_state = trace_context_delete_vs_state; tr_ctx->base.set_blend_color = trace_context_set_blend_color; tr_ctx->base.set_stencil_ref = trace_context_set_stencil_ref; tr_ctx->base.set_clip_state = trace_context_set_clip_state; tr_ctx->base.set_constant_buffer = trace_context_set_constant_buffer; tr_ctx->base.set_framebuffer_state = trace_context_set_framebuffer_state; tr_ctx->base.set_polygon_stipple = trace_context_set_polygon_stipple; tr_ctx->base.set_scissor_state = trace_context_set_scissor_state; tr_ctx->base.set_viewport_state = trace_context_set_viewport_state; tr_ctx->base.set_fragment_sampler_textures = trace_context_set_fragment_sampler_textures; tr_ctx->base.set_vertex_sampler_textures = trace_context_set_vertex_sampler_textures; tr_ctx->base.set_vertex_buffers = trace_context_set_vertex_buffers; tr_ctx->base.set_vertex_elements = trace_context_set_vertex_elements; if (pipe->surface_copy) tr_ctx->base.surface_copy = trace_context_surface_copy; if (pipe->surface_fill) tr_ctx->base.surface_fill = trace_context_surface_fill; tr_ctx->base.clear = trace_context_clear; tr_ctx->base.flush = trace_context_flush; tr_ctx->base.is_texture_referenced = trace_is_texture_referenced; tr_ctx->base.is_buffer_referenced = trace_is_buffer_referenced; tr_ctx->pipe = pipe; trace_screen_add_to_list(tr_scr, contexts, tr_ctx); return &tr_ctx->base; error1: return pipe; }