| @@ -4,6 +4,7 @@ include $(TOP)/configs/current | |||
| LIBNAME = trace | |||
| C_SOURCES = \ | |||
| tr_buffer.c \ | |||
| tr_context.c \ | |||
| tr_dump.c \ | |||
| tr_screen.c \ | |||
| @@ -5,6 +5,7 @@ env = env.Clone() | |||
| trace = env.ConvenienceLibrary( | |||
| target = 'trace', | |||
| source = [ | |||
| 'tr_buffer.c', | |||
| 'tr_context.c', | |||
| 'tr_dump.c', | |||
| 'tr_screen.c', | |||
| @@ -0,0 +1,68 @@ | |||
| /************************************************************************** | |||
| * | |||
| * Copyright 2009 VMware, Inc. | |||
| * All Rights Reserved. | |||
| * | |||
| * Permission is hereby granted, free of charge, to any person obtaining a | |||
| * copy of this software and associated documentation files (the | |||
| * "Software"), to deal in the Software without restriction, including | |||
| * without limitation the rights to use, copy, modify, merge, publish, | |||
| * distribute, sub license, and/or sell copies of the Software, and to | |||
| * permit persons to whom the Software is furnished to do so, subject to | |||
| * the following conditions: | |||
| * | |||
| * The above copyright notice and this permission notice (including the | |||
| * next paragraph) shall be included in all copies or substantial portions | |||
| * of the Software. | |||
| * | |||
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |||
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. | |||
| * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR | |||
| * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
| * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
| * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
| * | |||
| **************************************************************************/ | |||
| #include "util/u_memory.h" | |||
| #include "tr_buffer.h" | |||
| struct pipe_buffer * | |||
| trace_buffer_create(struct trace_screen *tr_scr, | |||
| struct pipe_buffer *buffer) | |||
| { | |||
| struct trace_buffer *tr_buf; | |||
| if(!buffer) | |||
| goto error; | |||
| assert(buffer->screen == tr_scr->screen); | |||
| tr_buf = CALLOC_STRUCT(trace_buffer); | |||
| if(!tr_buf) | |||
| goto error; | |||
| memcpy(&tr_buf->base, buffer, sizeof(struct pipe_buffer)); | |||
| tr_buf->base.screen = &tr_scr->base; | |||
| tr_buf->buffer = buffer; | |||
| return &tr_buf->base; | |||
| error: | |||
| pipe_buffer_reference(&buffer, NULL); | |||
| return NULL; | |||
| } | |||
| void | |||
| trace_buffer_destroy(struct trace_screen *tr_scr, | |||
| struct pipe_buffer *buffer) | |||
| { | |||
| struct trace_buffer *tr_buf = trace_buffer(tr_scr, buffer); | |||
| pipe_buffer_reference(&tr_buf->buffer, NULL); | |||
| FREE(tr_buf); | |||
| } | |||
| @@ -0,0 +1,69 @@ | |||
| /************************************************************************** | |||
| * | |||
| * Copyright 2009 VMware, Inc. | |||
| * All Rights Reserved. | |||
| * | |||
| * Permission is hereby granted, free of charge, to any person obtaining a | |||
| * copy of this software and associated documentation files (the | |||
| * "Software"), to deal in the Software without restriction, including | |||
| * without limitation the rights to use, copy, modify, merge, publish, | |||
| * distribute, sub license, and/or sell copies of the Software, and to | |||
| * permit persons to whom the Software is furnished to do so, subject to | |||
| * the following conditions: | |||
| * | |||
| * The above copyright notice and this permission notice (including the | |||
| * next paragraph) shall be included in all copies or substantial portions | |||
| * of the Software. | |||
| * | |||
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |||
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. | |||
| * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR | |||
| * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
| * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
| * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
| * | |||
| **************************************************************************/ | |||
| #ifndef TR_BUFFER_H_ | |||
| #define TR_BUFFER_H_ | |||
| #include "pipe/p_compiler.h" | |||
| #include "pipe/p_state.h" | |||
| #include "tr_screen.h" | |||
| struct trace_buffer | |||
| { | |||
| struct pipe_buffer base; | |||
| struct pipe_buffer *buffer; | |||
| void *map; | |||
| }; | |||
| static INLINE struct trace_buffer * | |||
| trace_buffer(struct trace_screen *tr_scr, | |||
| struct pipe_buffer *buffer) | |||
| { | |||
| if(!buffer) | |||
| return NULL; | |||
| assert(tr_scr); | |||
| assert(buffer->screen == &tr_scr->base); | |||
| return (struct trace_buffer *)buffer; | |||
| } | |||
| struct pipe_buffer * | |||
| trace_buffer_create(struct trace_screen *tr_scr, | |||
| struct pipe_buffer *buffer); | |||
| void | |||
| trace_buffer_destroy(struct trace_screen *tr_scr, | |||
| struct pipe_buffer *buffer); | |||
| #endif | |||
| @@ -30,11 +30,30 @@ | |||
| #include "tr_dump.h" | |||
| #include "tr_state.h" | |||
| #include "tr_buffer.h" | |||
| #include "tr_screen.h" | |||
| #include "tr_texture.h" | |||
| #include "tr_context.h" | |||
| static INLINE struct pipe_buffer * | |||
| trace_buffer_unwrap(struct trace_context *tr_ctx, | |||
| struct pipe_buffer *buffer) | |||
| { | |||
| struct trace_screen *tr_scr = trace_screen(tr_ctx->base.screen); | |||
| struct trace_buffer *tr_buf; | |||
| if(!buffer) | |||
| return NULL; | |||
| tr_buf = trace_buffer(tr_scr, buffer); | |||
| assert(tr_buf->buffer); | |||
| assert(tr_buf->buffer->screen == tr_scr->screen); | |||
| return tr_buf->buffer; | |||
| } | |||
| static INLINE struct pipe_texture * | |||
| trace_texture_unwrap(struct trace_context *tr_ctx, | |||
| struct pipe_texture *texture) | |||
| @@ -123,12 +142,15 @@ trace_context_draw_arrays(struct pipe_context *_pipe, | |||
| static INLINE boolean | |||
| trace_context_draw_elements(struct pipe_context *_pipe, | |||
| struct pipe_buffer *indexBuffer, | |||
| struct pipe_buffer *_indexBuffer, | |||
| unsigned indexSize, | |||
| unsigned mode, unsigned start, unsigned count) | |||
| { | |||
| struct trace_screen *tr_scr = trace_screen(_pipe->screen); | |||
| struct trace_context *tr_ctx = trace_context(_pipe); | |||
| struct trace_buffer *tr_buf = trace_buffer(tr_scr, _indexBuffer); | |||
| struct pipe_context *pipe = tr_ctx->pipe; | |||
| struct pipe_buffer *indexBuffer = tr_buf->buffer; | |||
| boolean result; | |||
| trace_screen_user_buffer_update(_pipe->screen, indexBuffer); | |||
| @@ -154,7 +176,7 @@ trace_context_draw_elements(struct pipe_context *_pipe, | |||
| static INLINE boolean | |||
| trace_context_draw_range_elements(struct pipe_context *_pipe, | |||
| struct pipe_buffer *indexBuffer, | |||
| struct pipe_buffer *_indexBuffer, | |||
| unsigned indexSize, | |||
| unsigned minIndex, | |||
| unsigned maxIndex, | |||
| @@ -162,8 +184,11 @@ trace_context_draw_range_elements(struct pipe_context *_pipe, | |||
| unsigned start, | |||
| unsigned count) | |||
| { | |||
| struct trace_screen *tr_scr = trace_screen(_pipe->screen); | |||
| struct trace_context *tr_ctx = trace_context(_pipe); | |||
| struct trace_buffer *tr_buf = trace_buffer(tr_scr, _indexBuffer); | |||
| struct pipe_context *pipe = tr_ctx->pipe; | |||
| struct pipe_buffer *indexBuffer = tr_buf->buffer; | |||
| boolean result; | |||
| trace_screen_user_buffer_update(_pipe->screen, indexBuffer); | |||
| @@ -695,7 +720,8 @@ trace_context_set_constant_buffer(struct pipe_context *_pipe, | |||
| struct trace_context *tr_ctx = trace_context(_pipe); | |||
| struct pipe_context *pipe = tr_ctx->pipe; | |||
| trace_screen_user_buffer_update(_pipe->screen, (struct pipe_buffer *)buffer); | |||
| if (buffer) | |||
| trace_screen_user_buffer_update(_pipe->screen, buffer->buffer); | |||
| trace_dump_call_begin("pipe_context", "set_constant_buffer"); | |||
| @@ -704,7 +730,13 @@ trace_context_set_constant_buffer(struct pipe_context *_pipe, | |||
| trace_dump_arg(uint, index); | |||
| trace_dump_arg(constant_buffer, buffer); | |||
| pipe->set_constant_buffer(pipe, shader, index, buffer);; | |||
| if (buffer) { | |||
| struct pipe_constant_buffer _buffer; | |||
| _buffer.buffer = trace_buffer_unwrap(tr_ctx, buffer->buffer); | |||
| pipe->set_constant_buffer(pipe, shader, index, &_buffer); | |||
| } else { | |||
| pipe->set_constant_buffer(pipe, shader, index, buffer); | |||
| } | |||
| trace_dump_call_end(); | |||
| } | |||
| @@ -840,7 +872,15 @@ trace_context_set_vertex_buffers(struct pipe_context *_pipe, | |||
| trace_dump_struct_array(vertex_buffer, buffers, num_buffers); | |||
| trace_dump_arg_end(); | |||
| pipe->set_vertex_buffers(pipe, num_buffers, buffers);; | |||
| 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); | |||
| } else { | |||
| pipe->set_vertex_buffers(pipe, num_buffers, buffers); | |||
| } | |||
| trace_dump_call_end(); | |||
| } | |||
| @@ -27,6 +27,7 @@ | |||
| #include "util/u_memory.h" | |||
| #include "tr_buffer.h" | |||
| #include "tr_dump.h" | |||
| #include "tr_state.h" | |||
| #include "tr_texture.h" | |||
| @@ -34,6 +35,7 @@ | |||
| #include "pipe/p_inlines.h" | |||
| static const char * | |||
| trace_screen_get_name(struct pipe_screen *_screen) | |||
| { | |||
| @@ -488,7 +490,7 @@ trace_screen_surface_buffer_create(struct pipe_screen *_screen, | |||
| trace_dump_call_end(); | |||
| return result; | |||
| return trace_buffer_create(tr_scr, result); | |||
| } | |||
| @@ -525,7 +527,7 @@ trace_screen_buffer_create(struct pipe_screen *_screen, | |||
| } | |||
| } | |||
| return result; | |||
| return trace_buffer_create(tr_scr, result); | |||
| } | |||
| @@ -559,7 +561,7 @@ trace_screen_user_buffer_create(struct pipe_screen *_screen, | |||
| result->usage |= TRACE_BUFFER_USAGE_USER; | |||
| } | |||
| return result; | |||
| return trace_buffer_create(tr_scr, result); | |||
| } | |||
| @@ -569,7 +571,7 @@ trace_screen_user_buffer_create(struct pipe_screen *_screen, | |||
| */ | |||
| void | |||
| trace_screen_user_buffer_update(struct pipe_screen *_screen, | |||
| struct pipe_buffer *buffer) | |||
| struct pipe_buffer *_buffer) | |||
| { | |||
| #if 0 | |||
| struct trace_screen *tr_scr = trace_screen(_screen); | |||
| @@ -604,11 +606,13 @@ trace_screen_user_buffer_update(struct pipe_screen *_screen, | |||
| static void * | |||
| trace_screen_buffer_map(struct pipe_screen *_screen, | |||
| struct pipe_buffer *buffer, | |||
| struct pipe_buffer *_buffer, | |||
| unsigned usage) | |||
| { | |||
| struct trace_screen *tr_scr = trace_screen(_screen); | |||
| struct trace_buffer *tr_buf = trace_buffer(tr_scr, _buffer); | |||
| struct pipe_screen *screen = tr_scr->screen; | |||
| struct pipe_buffer *buffer = tr_buf->buffer; | |||
| void *map; | |||
| trace_dump_call_begin("pipe_screen", "buffer_map"); | |||
| @@ -636,13 +640,15 @@ trace_screen_buffer_map(struct pipe_screen *_screen, | |||
| static void * | |||
| trace_screen_buffer_map_range(struct pipe_screen *_screen, | |||
| struct pipe_buffer *buffer, | |||
| struct pipe_buffer *_buffer, | |||
| unsigned offset, | |||
| unsigned length, | |||
| unsigned usage) | |||
| { | |||
| struct trace_screen *tr_scr = trace_screen(_screen); | |||
| struct trace_buffer *tr_buf = trace_buffer(tr_scr, _buffer); | |||
| struct pipe_screen *screen = tr_scr->screen; | |||
| struct pipe_buffer *buffer = tr_buf->buffer; | |||
| void *map; | |||
| trace_dump_call_begin("pipe_screen", "buffer_map_range"); | |||
| @@ -666,12 +672,14 @@ trace_screen_buffer_map_range(struct pipe_screen *_screen, | |||
| static void | |||
| trace_screen_buffer_flush_mapped_range(struct pipe_screen *_screen, | |||
| struct pipe_buffer *buffer, | |||
| struct pipe_buffer *_buffer, | |||
| unsigned offset, | |||
| unsigned length) | |||
| { | |||
| struct trace_screen *tr_scr = trace_screen(_screen); | |||
| struct trace_buffer *tr_buf = trace_buffer(tr_scr, _buffer); | |||
| struct pipe_screen *screen = tr_scr->screen; | |||
| struct pipe_buffer *buffer = tr_buf->buffer; | |||
| trace_dump_call_begin("pipe_screen", "buffer_flush_mapped_range"); | |||
| @@ -689,10 +697,12 @@ trace_screen_buffer_flush_mapped_range(struct pipe_screen *_screen, | |||
| static void | |||
| trace_screen_buffer_unmap(struct pipe_screen *_screen, | |||
| struct pipe_buffer *buffer) | |||
| struct pipe_buffer *_buffer) | |||
| { | |||
| struct trace_screen *tr_scr = trace_screen(_screen); | |||
| struct trace_buffer *tr_buf = trace_buffer(tr_scr, _buffer); | |||
| struct pipe_screen *screen = tr_scr->screen; | |||
| struct pipe_buffer *buffer = tr_buf->buffer; | |||
| #if 0 | |||
| const void *map; | |||
| @@ -731,23 +741,29 @@ trace_screen_buffer_unmap(struct pipe_screen *_screen, | |||
| static void | |||
| trace_screen_buffer_destroy(struct pipe_buffer *buffer) | |||
| trace_screen_buffer_destroy(struct pipe_buffer *_buffer) | |||
| { | |||
| struct trace_screen *tr_scr = trace_screen(buffer->screen); | |||
| struct trace_screen *tr_scr = trace_screen(_buffer->screen); | |||
| struct trace_buffer *tr_buf = trace_buffer(tr_scr, _buffer); | |||
| struct pipe_screen *screen = tr_scr->screen; | |||
| struct pipe_buffer *buffer = tr_buf->buffer; | |||
| trace_dump_call_begin("pipe_screen", "buffer_destroy"); | |||
| trace_dump_arg(ptr, screen); | |||
| trace_dump_arg(ptr, buffer); | |||
| assert(screen->buffer_destroy); | |||
| screen->buffer_destroy(buffer); | |||
| trace_dump_call_end(); | |||
| trace_buffer_destroy(tr_scr, _buffer); | |||
| } | |||
| /******************************************************************** | |||
| * fence | |||
| */ | |||
| static void | |||
| trace_screen_fence_reference(struct pipe_screen *_screen, | |||
| struct pipe_fence_handle **dst, | |||
| @@ -230,7 +230,7 @@ void trace_dump_constant_buffer(const struct pipe_constant_buffer *state) | |||
| trace_dump_struct_begin("pipe_constant_buffer"); | |||
| trace_dump_member(ptr, state, buffer); | |||
| trace_dump_member(buffer_ptr, state, buffer); | |||
| trace_dump_struct_end(); | |||
| } | |||
| @@ -469,7 +469,7 @@ void trace_dump_vertex_buffer(const struct pipe_vertex_buffer *state) | |||
| trace_dump_member(uint, state, stride); | |||
| trace_dump_member(uint, state, max_index); | |||
| trace_dump_member(uint, state, buffer_offset); | |||
| trace_dump_member(ptr, state, buffer); | |||
| trace_dump_member(buffer_ptr, state, buffer); | |||
| trace_dump_struct_end(); | |||
| } | |||