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; }
void trace_dump_box_bytes(const void *data, struct pipe_resource *resource, const struct pipe_box *box, unsigned stride, unsigned slice_stride) { size_t size; /* * Only dump buffer transfers to avoid huge files. * TODO: Make this run-time configurable */ if (resource->target != PIPE_BUFFER) { size = 0; } else { enum pipe_format format = resource->format; if (slice_stride) size = box->depth * slice_stride; else if (stride) size = util_format_get_nblocksy(format, box->height) * stride; else { size = util_format_get_nblocksx(format, box->width) * util_format_get_blocksize(format); } } trace_dump_bytes(data, size); }
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); }
void trace_dump_blend_state(const struct pipe_blend_state *state) { if (!trace_dumping_enabled_locked()) return; if(!state) { trace_dump_null(); return; } trace_dump_bytes(state, sizeof *state); }
void trace_dump_box_bytes(const void *data, enum pipe_format format, const struct pipe_box *box, unsigned stride, unsigned slice_stride) { size_t size; if (slice_stride) size = box->depth * slice_stride; else if (stride) size = util_format_get_nblocksy(format, box->height) * stride; else { size = util_format_get_nblocksx(format, box->width) * util_format_get_blocksize(format); } trace_dump_bytes(data, size); }