static void trace_winsys_buffer_unmap(struct pipe_winsys *_winsys, struct pipe_buffer *buffer) { struct trace_winsys *tr_ws = trace_winsys(_winsys); struct pipe_winsys *winsys = tr_ws->winsys; const void *map; map = hash_table_get(tr_ws->buffer_maps, buffer); if(map) { trace_dump_call_begin("pipe_winsys", "buffer_write"); trace_dump_arg(ptr, winsys); trace_dump_arg(ptr, buffer); trace_dump_arg_begin("data"); trace_dump_bytes(map, buffer->size); trace_dump_arg_end(); trace_dump_arg_begin("size"); trace_dump_uint(buffer->size); trace_dump_arg_end(); trace_dump_call_end(); hash_table_remove(tr_ws->buffer_maps, buffer); } winsys->buffer_unmap(winsys, buffer); }
void trace_winsys_user_buffer_update(struct pipe_winsys *_winsys, struct pipe_buffer *buffer) { struct trace_winsys *tr_ws = trace_winsys(_winsys); struct pipe_winsys *winsys = tr_ws->winsys; const void *map; if(buffer && buffer->usage & TRACE_BUFFER_USAGE_USER) { map = winsys->buffer_map(winsys, buffer, PIPE_BUFFER_USAGE_CPU_READ); if(map) { trace_dump_call_begin("pipe_winsys", "buffer_write"); trace_dump_arg(ptr, winsys); trace_dump_arg(ptr, buffer); trace_dump_arg_begin("data"); trace_dump_bytes(map, buffer->size); trace_dump_arg_end(); trace_dump_arg_begin("size"); trace_dump_uint(buffer->size); trace_dump_arg_end(); trace_dump_call_end(); winsys->buffer_unmap(winsys, buffer); } } }
static struct pipe_buffer * trace_winsys_user_buffer_create(struct pipe_winsys *_winsys, void *data, unsigned size) { struct trace_winsys *tr_ws = trace_winsys(_winsys); struct pipe_winsys *winsys = tr_ws->winsys; struct pipe_buffer *result; trace_dump_call_begin("pipe_winsys", "user_buffer_create"); trace_dump_arg(ptr, winsys); trace_dump_arg_begin("data"); trace_dump_bytes(data, size); trace_dump_arg_end(); trace_dump_arg(uint, size); result = winsys->user_buffer_create(winsys, data, size); trace_dump_ret(ptr, result); trace_dump_call_end(); /* XXX: Mark the user buffers. (we should wrap pipe_buffers, but is is * impossible to do so while texture-less surfaces are still around */ if(result) { assert(!(result->usage & TRACE_BUFFER_USAGE_USER)); result->usage |= TRACE_BUFFER_USAGE_USER; } return result; }
static struct pipe_resource * trace_screen_user_buffer_create(struct pipe_screen *_screen, void *data, unsigned size, unsigned usage) { struct trace_screen *tr_scr = trace_screen(_screen); struct pipe_screen *screen = tr_scr->screen; struct pipe_resource *result; trace_dump_call_begin("pipe_screen", "user_buffer_create"); trace_dump_arg(ptr, screen); trace_dump_arg_begin("data"); trace_dump_bytes(data, size); trace_dump_arg_end(); trace_dump_arg(uint, size); trace_dump_arg(uint, usage); result = screen->user_buffer_create(screen, data, size, usage); trace_dump_ret(ptr, result); trace_dump_call_end(); if(result) { assert(!(result->flags & TRACE_FLAG_USER_BUFFER)); result->flags |= TRACE_FLAG_USER_BUFFER; } return trace_resource_create(tr_scr, result); }
static INLINE void trace_context_set_vertex_buffers(struct pipe_context *_pipe, unsigned num_buffers, const struct pipe_vertex_buffer *buffers) { struct trace_context *tr_ctx = trace_context(_pipe); struct pipe_context *pipe = tr_ctx->pipe; unsigned i; for(i = 0; i < num_buffers; ++i) trace_screen_user_buffer_update(_pipe->screen, buffers[i].buffer); trace_dump_call_begin("pipe_context", "set_vertex_buffers"); trace_dump_arg(ptr, pipe); trace_dump_arg(uint, num_buffers); trace_dump_arg_begin("buffers"); trace_dump_struct_array(vertex_buffer, buffers, num_buffers); trace_dump_arg_end(); if (num_buffers) { struct pipe_vertex_buffer *_buffers = malloc(num_buffers * sizeof(*_buffers)); memcpy(_buffers, buffers, num_buffers * sizeof(*_buffers)); for (i = 0; i < num_buffers; i++) _buffers[i].buffer = trace_buffer_unwrap(tr_ctx, buffers[i].buffer); pipe->set_vertex_buffers(pipe, num_buffers, _buffers); free(_buffers); } else { pipe->set_vertex_buffers(pipe, num_buffers, NULL); } trace_dump_call_end(); }
static INLINE void trace_context_set_vertex_elements(struct pipe_context *_pipe, unsigned num_elements, const struct pipe_vertex_element *elements) { struct trace_context *tr_ctx = trace_context(_pipe); struct pipe_context *pipe = tr_ctx->pipe; trace_dump_call_begin("pipe_context", "set_vertex_elements"); trace_dump_arg(ptr, pipe); trace_dump_arg(uint, num_elements); trace_dump_arg_begin("elements"); trace_dump_struct_array(vertex_element, elements, num_elements); trace_dump_arg_end(); pipe->set_vertex_elements(pipe, num_elements, elements); trace_dump_call_end(); }