diff options
Diffstat (limited to 'src/gallium/drivers/trace')
| -rw-r--r-- | src/gallium/drivers/trace/Makefile | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/SConscript | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_buffer.c | 76 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_buffer.h | 70 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_context.c | 519 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_context.h | 16 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_drm.c | 70 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_dump.c | 42 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_dump.h | 20 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_dump_state.c | 89 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_dump_state.h | 8 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_public.h | 45 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_rbug.c | 59 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_screen.c | 496 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_screen.h | 10 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_texture.c | 60 | ||||
| -rw-r--r-- | src/gallium/drivers/trace/tr_texture.h | 54 | 
17 files changed, 727 insertions, 909 deletions
diff --git a/src/gallium/drivers/trace/Makefile b/src/gallium/drivers/trace/Makefile index dd6831c70a..78f6347dc7 100644 --- a/src/gallium/drivers/trace/Makefile +++ b/src/gallium/drivers/trace/Makefile @@ -4,7 +4,6 @@ include $(TOP)/configs/current  LIBNAME = trace  C_SOURCES = \ -	tr_buffer.c \  	tr_context.c \  	tr_dump.c \  	tr_dump_state.c \ diff --git a/src/gallium/drivers/trace/SConscript b/src/gallium/drivers/trace/SConscript index c1675d1c16..5f1fb17966 100644 --- a/src/gallium/drivers/trace/SConscript +++ b/src/gallium/drivers/trace/SConscript @@ -5,7 +5,6 @@ env = env.Clone()  trace = env.ConvenienceLibrary(      target = 'trace',      source = [ -        'tr_buffer.c',          'tr_context.c',          'tr_drm.c',          'tr_dump.c', diff --git a/src/gallium/drivers/trace/tr_buffer.c b/src/gallium/drivers/trace/tr_buffer.c deleted file mode 100644 index fa2ac068eb..0000000000 --- a/src/gallium/drivers/trace/tr_buffer.c +++ /dev/null @@ -1,76 +0,0 @@ -/************************************************************************** - * - * 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_inlines.h" -#include "util/u_memory.h" -#include "util/u_simple_list.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)); - -   pipe_reference_init(&tr_buf->base.reference, 1); -   tr_buf->base.screen = &tr_scr->base; -   tr_buf->buffer = buffer; - -   trace_screen_add_to_list(tr_scr, buffers, tr_buf); - -   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(buffer); - -   trace_screen_remove_from_list(tr_scr, buffers, tr_buf); - -   pipe_buffer_reference(&tr_buf->buffer, NULL); -   FREE(tr_buf); -} diff --git a/src/gallium/drivers/trace/tr_buffer.h b/src/gallium/drivers/trace/tr_buffer.h deleted file mode 100644 index 1a2d0b9aea..0000000000 --- a/src/gallium/drivers/trace/tr_buffer.h +++ /dev/null @@ -1,70 +0,0 @@ -/************************************************************************** - * - * 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; - -   struct tr_list list; - -   void *map; -   boolean range_flushed; -}; - - -static INLINE struct trace_buffer * -trace_buffer(struct pipe_buffer *buffer) -{ -   if(!buffer) -      return NULL; -   (void)trace_screen(buffer->screen); -   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 diff --git a/src/gallium/drivers/trace/tr_context.c b/src/gallium/drivers/trace/tr_context.c index df40fbade6..8216c06260 100644 --- a/src/gallium/drivers/trace/tr_context.c +++ b/src/gallium/drivers/trace/tr_context.c @@ -25,51 +25,37 @@   *   **************************************************************************/ +#include "util/u_inlines.h"  #include "util/u_memory.h"  #include "util/u_simple_list.h" +#include "util/u_format.h" +#include "pipe/p_format.h"  #include "pipe/p_screen.h"  #include "tr_dump.h"  #include "tr_dump_state.h"  #include "tr_state.h" -#include "tr_buffer.h"  #include "tr_screen.h"  #include "tr_texture.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(buffer); -   assert(tr_buf->buffer); -   assert(tr_buf->buffer->screen == tr_scr->screen); -   (void) tr_scr; -   return tr_buf->buffer; -} - -static INLINE struct pipe_texture * -trace_texture_unwrap(struct trace_context *tr_ctx, -                     struct pipe_texture *texture) +static INLINE struct pipe_resource * +trace_resource_unwrap(struct trace_context *tr_ctx, +                     struct pipe_resource *resource)  { -   struct trace_texture *tr_tex; +   struct trace_resource *tr_tex; -   if(!texture) +   if(!resource)        return NULL; -   tr_tex = trace_texture(texture); +   tr_tex = trace_resource(resource); -   assert(tr_tex->texture); -   return tr_tex->texture; +   assert(tr_tex->resource); +   return tr_tex->resource;  } @@ -112,7 +98,7 @@ trace_context_draw_block(struct trace_context *tr_ctx, int flag)                     (void *) tr_ctx->draw_rule.fs, (void *) tr_ctx->curr.fs,                     (void *) tr_ctx->draw_rule.vs, (void *) tr_ctx->curr.vs,                     (void *) tr_ctx->draw_rule.surf, 0, -                   (void *) tr_ctx->draw_rule.tex, 0); +                   (void *) tr_ctx->draw_rule.sampler_view, 0);        if (tr_ctx->draw_rule.fs &&            tr_ctx->draw_rule.fs == tr_ctx->curr.fs)           block = TRUE; @@ -126,12 +112,12 @@ trace_context_draw_block(struct trace_context *tr_ctx, int flag)           for (k = 0; k < tr_ctx->curr.nr_cbufs; k++)              if (tr_ctx->draw_rule.surf == tr_ctx->curr.cbufs[k])                 block = TRUE; -      if (tr_ctx->draw_rule.tex) { -         for (k = 0; k < tr_ctx->curr.num_texs; k++) -            if (tr_ctx->draw_rule.tex == tr_ctx->curr.tex[k]) +      if (tr_ctx->draw_rule.sampler_view) { +         for (k = 0; k < tr_ctx->curr.num_sampler_views; k++) +            if (tr_ctx->draw_rule.sampler_view == tr_ctx->curr.sampler_views[k])                 block = TRUE; -         for (k = 0; k < tr_ctx->curr.num_vert_texs; k++) { -            if (tr_ctx->draw_rule.tex == tr_ctx->curr.vert_tex[k]) { +         for (k = 0; k < tr_ctx->curr.num_vert_sampler_views; k++) { +            if (tr_ctx->draw_rule.sampler_view == tr_ctx->curr.vert_sampler_views[k]) {                 block = TRUE;              }           } @@ -190,32 +176,32 @@ trace_context_draw_arrays(struct pipe_context *_pipe,  static INLINE void  trace_context_draw_elements(struct pipe_context *_pipe, -                          struct pipe_buffer *_indexBuffer, -                          unsigned indexSize, -                          unsigned mode, unsigned start, unsigned count) +                            struct pipe_resource *_indexBuffer, +                            unsigned indexSize, int indexBias, +                            unsigned mode, unsigned start, unsigned count)  {     struct trace_context *tr_ctx = trace_context(_pipe); -   struct trace_buffer *tr_buf = trace_buffer(_indexBuffer); +   struct trace_resource *tr_buf = trace_resource(_indexBuffer);     struct pipe_context *pipe = tr_ctx->pipe; -   struct pipe_buffer *indexBuffer = tr_buf->buffer; +   struct pipe_resource *indexBuffer = tr_buf->resource;     if (tr_ctx->curr.fs->disabled || tr_ctx->curr.vs->disabled)        return;     trace_context_draw_block(tr_ctx, 1); -   trace_screen_user_buffer_update(_pipe->screen, indexBuffer); -     trace_dump_call_begin("pipe_context", "draw_elements");     trace_dump_arg(ptr, pipe);     trace_dump_arg(ptr, indexBuffer);     trace_dump_arg(uint, indexSize); +   trace_dump_arg(int, indexBias);     trace_dump_arg(uint, mode);     trace_dump_arg(uint, start);     trace_dump_arg(uint, count); -   pipe->draw_elements(pipe, indexBuffer, indexSize, mode, start, count); +   pipe->draw_elements(pipe, indexBuffer, indexSize, indexBias, +                       mode, start, count);     trace_dump_call_end(); @@ -225,8 +211,9 @@ trace_context_draw_elements(struct pipe_context *_pipe,  static INLINE void  trace_context_draw_range_elements(struct pipe_context *_pipe, -                                  struct pipe_buffer *_indexBuffer, +                                  struct pipe_resource *_indexBuffer,                                    unsigned indexSize, +                                  int indexBias,                                    unsigned minIndex,                                    unsigned maxIndex,                                    unsigned mode, @@ -234,22 +221,21 @@ trace_context_draw_range_elements(struct pipe_context *_pipe,                                    unsigned count)  {     struct trace_context *tr_ctx = trace_context(_pipe); -   struct trace_buffer *tr_buf = trace_buffer(_indexBuffer); +   struct trace_resource *tr_buf = trace_resource(_indexBuffer);     struct pipe_context *pipe = tr_ctx->pipe; -   struct pipe_buffer *indexBuffer = tr_buf->buffer; +   struct pipe_resource *indexBuffer = tr_buf->resource;     if (tr_ctx->curr.fs->disabled || tr_ctx->curr.vs->disabled)        return;     trace_context_draw_block(tr_ctx, 1); -   trace_screen_user_buffer_update(_pipe->screen, indexBuffer); -     trace_dump_call_begin("pipe_context", "draw_range_elements");     trace_dump_arg(ptr, pipe);     trace_dump_arg(ptr, indexBuffer);     trace_dump_arg(uint, indexSize); +   trace_dump_arg(int, indexBias);     trace_dump_arg(uint, minIndex);     trace_dump_arg(uint, maxIndex);     trace_dump_arg(uint, mode); @@ -257,8 +243,8 @@ trace_context_draw_range_elements(struct pipe_context *_pipe,     trace_dump_arg(uint, count);     pipe->draw_range_elements(pipe, -                             indexBuffer, -                             indexSize, minIndex, maxIndex, +                             indexBuffer, indexSize, indexBias, +                             minIndex, maxIndex,                               mode, start, count);     trace_dump_call_end(); @@ -773,6 +759,70 @@ trace_context_delete_vs_state(struct pipe_context *_pipe,  } +static INLINE void * +trace_context_create_vertex_elements_state(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; +   void * result; + +   trace_dump_call_begin("pipe_context", "create_vertex_elements_state"); + +   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(); + +   result = pipe->create_vertex_elements_state(pipe, num_elements, elements); + +   trace_dump_ret(ptr, result); + +   trace_dump_call_end(); + +   return result; +} + + +static INLINE void +trace_context_bind_vertex_elements_state(struct pipe_context *_pipe, +                                         void *state) +{ +   struct trace_context *tr_ctx = trace_context(_pipe); +   struct pipe_context *pipe = tr_ctx->pipe; + +   trace_dump_call_begin("pipe_context", "bind_vertex_elements_state"); + +   trace_dump_arg(ptr, pipe); +   trace_dump_arg(ptr, state); + +   pipe->bind_vertex_elements_state(pipe, state); + +   trace_dump_call_end(); +} + + +static INLINE void +trace_context_delete_vertex_elements_state(struct pipe_context *_pipe, +                                           void *state) +{ +   struct trace_context *tr_ctx = trace_context(_pipe); +   struct pipe_context *pipe = tr_ctx->pipe; + +   trace_dump_call_begin("pipe_context", "delete_verte_elements_state"); + +   trace_dump_arg(ptr, pipe); +   trace_dump_arg(ptr, state); + +   pipe->delete_vertex_elements_state(pipe, state); + +   trace_dump_call_end(); +} + +  static INLINE void  trace_context_set_blend_color(struct pipe_context *_pipe,                                const struct pipe_blend_color *state) @@ -830,14 +880,13 @@ trace_context_set_clip_state(struct pipe_context *_pipe,  static INLINE void  trace_context_set_constant_buffer(struct pipe_context *_pipe,                                    uint shader, uint index, -                                  struct pipe_buffer *buffer) +                                  struct pipe_resource *buffer)  {     struct trace_context *tr_ctx = trace_context(_pipe);     struct pipe_context *pipe = tr_ctx->pipe;     if (buffer) { -      trace_screen_user_buffer_update(_pipe->screen, buffer); -      buffer = trace_buffer_unwrap(tr_ctx, buffer); +      buffer = trace_resource_unwrap(tr_ctx, buffer);     }     trace_dump_call_begin("pipe_context", "set_constant_buffer"); @@ -866,11 +915,11 @@ trace_context_set_framebuffer_state(struct pipe_context *_pipe,        tr_ctx->curr.nr_cbufs = state->nr_cbufs;        for (i = 0; i < state->nr_cbufs; i++)           if (state->cbufs[i]) -            tr_ctx->curr.cbufs[i] = trace_texture(state->cbufs[i]->texture); +            tr_ctx->curr.cbufs[i] = trace_resource(state->cbufs[i]->texture);           else              tr_ctx->curr.cbufs[i] = NULL;        if (state->zsbuf) -         tr_ctx->curr.zsbuf = trace_texture(state->zsbuf->texture); +         tr_ctx->curr.zsbuf = trace_resource(state->zsbuf->texture);        else           tr_ctx->curr.zsbuf = NULL;     } @@ -949,63 +998,126 @@ trace_context_set_viewport_state(struct pipe_context *_pipe,  } +static struct pipe_sampler_view * +trace_create_sampler_view(struct pipe_context *_pipe, +                          struct pipe_resource *_resource, +                          const struct pipe_sampler_view *templ) +{ +   struct trace_context *tr_ctx = trace_context(_pipe); +   struct trace_resource *tr_tex = trace_resource(_resource); +   struct pipe_context *pipe = tr_ctx->pipe; +   struct pipe_resource *texture = tr_tex->resource; +   struct pipe_sampler_view *result; +   struct trace_sampler_view *tr_view; + +   trace_dump_call_begin("pipe_context", "create_sampler_view"); + +   trace_dump_arg(ptr, pipe); +   trace_dump_arg(ptr, texture); +   trace_dump_arg(sampler_view_template, templ); + +   result = pipe->create_sampler_view(pipe, texture, templ); + +   trace_dump_ret(ptr, result); + +   trace_dump_call_end(); + +   /* +    * Wrap pipe_sampler_view +    */ +   tr_view = CALLOC_STRUCT(trace_sampler_view); +   tr_view->base = *templ; +   tr_view->base.reference.count = 1; +   tr_view->base.texture = NULL; +   pipe_resource_reference(&tr_view->base.texture, _resource); +   tr_view->base.context = _pipe; +   tr_view->sampler_view = result; +   result = &tr_view->base; + +   return result; +} + + +static void +trace_sampler_view_destroy(struct pipe_context *_pipe, +                           struct pipe_sampler_view *_view) +{ +   struct trace_context *tr_ctx = trace_context(_pipe); +   struct trace_sampler_view *tr_view = trace_sampler_view(_view); +   struct pipe_context *pipe = tr_ctx->pipe; +   struct pipe_sampler_view *view = tr_view->sampler_view; + +   trace_dump_call_begin("pipe_context", "sampler_view_destroy"); + +   trace_dump_arg(ptr, pipe); +   trace_dump_arg(ptr, view); + +   pipe->sampler_view_destroy(pipe, view); + +   trace_dump_call_end(); + +   pipe_resource_reference(&_view->texture, NULL); +   FREE(_view); +} + +  static INLINE void -trace_context_set_fragment_sampler_textures(struct pipe_context *_pipe, -                                            unsigned num_textures, -                                            struct pipe_texture **textures) +trace_context_set_fragment_sampler_views(struct pipe_context *_pipe, +                                         unsigned num, +                                         struct pipe_sampler_view **views)  {     struct trace_context *tr_ctx = trace_context(_pipe); -   struct trace_texture *tr_tex; +   struct trace_sampler_view *tr_view;     struct pipe_context *pipe = tr_ctx->pipe; -   struct pipe_texture *unwrapped_textures[PIPE_MAX_SAMPLERS]; +   struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SAMPLERS];     unsigned i; -   tr_ctx->curr.num_texs = num_textures; -   for(i = 0; i < num_textures; ++i) { -      tr_tex = trace_texture(textures[i]); -      tr_ctx->curr.tex[i] = tr_tex; -      unwrapped_textures[i] = tr_tex ? tr_tex->texture : NULL; +   tr_ctx->curr.num_sampler_views = num; +   for(i = 0; i < num; ++i) { +      tr_view = trace_sampler_view(views[i]); +      tr_ctx->curr.sampler_views[i] = tr_view; +      unwrapped_views[i] = tr_view ? tr_view->sampler_view : NULL;     } -   textures = unwrapped_textures; +   views = unwrapped_views; -   trace_dump_call_begin("pipe_context", "set_fragment_sampler_textures"); +   trace_dump_call_begin("pipe_context", "set_fragment_sampler_views");     trace_dump_arg(ptr, pipe); -   trace_dump_arg(uint, num_textures); -   trace_dump_arg_array(ptr, textures, num_textures); +   trace_dump_arg(uint, num); +   trace_dump_arg_array(ptr, views, num); -   pipe->set_fragment_sampler_textures(pipe, num_textures, textures); +   pipe->set_fragment_sampler_views(pipe, num, views);     trace_dump_call_end();  }  static INLINE void -trace_context_set_vertex_sampler_textures(struct pipe_context *_pipe, -                                          unsigned num_textures, -                                          struct pipe_texture **textures) +trace_context_set_vertex_sampler_views(struct pipe_context *_pipe, +                                       unsigned num, +                                       struct pipe_sampler_view **views)  {     struct trace_context *tr_ctx = trace_context(_pipe); -   struct trace_texture *tr_tex; +   struct trace_sampler_view *tr_view;     struct pipe_context *pipe = tr_ctx->pipe; -   struct pipe_texture *unwrapped_textures[PIPE_MAX_VERTEX_SAMPLERS]; +   struct pipe_sampler_view *unwrapped_views[PIPE_MAX_VERTEX_SAMPLERS];     unsigned i; -   tr_ctx->curr.num_vert_texs = num_textures; -   for(i = 0; i < num_textures; ++i) { -      tr_tex = trace_texture(textures[i]); -      tr_ctx->curr.vert_tex[i] = tr_tex; -      unwrapped_textures[i] = tr_tex ? tr_tex->texture : NULL; +   tr_ctx->curr.num_vert_sampler_views = num; +   for(i = 0; i < num; ++i) { +      tr_view = trace_sampler_view(views[i]); +      tr_ctx->curr.vert_sampler_views[i] = tr_view; +      unwrapped_views[i] = tr_view ? tr_view->sampler_view : NULL;     } -   textures = unwrapped_textures; +   views = unwrapped_views; -   trace_dump_call_begin("pipe_context", "set_vertex_sampler_textures"); +   trace_dump_call_begin("pipe_context", "set_vertex_sampler_views");     trace_dump_arg(ptr, pipe); -   trace_dump_arg(uint, num_textures); -   trace_dump_arg_array(ptr, textures, num_textures); +   trace_dump_arg(uint, num); +   trace_dump_arg_array(ptr, views, num); -   pipe->set_vertex_sampler_textures(pipe, num_textures, textures); +   pipe->set_vertex_sampler_views(pipe, num, views);     trace_dump_call_end();  } @@ -1020,9 +1132,6 @@ trace_context_set_vertex_buffers(struct pipe_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); @@ -1036,7 +1145,7 @@ trace_context_set_vertex_buffers(struct pipe_context *_pipe,        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); +         _buffers[i].buffer = trace_resource_unwrap(tr_ctx, buffers[i].buffer);        pipe->set_vertex_buffers(pipe, num_buffers, _buffers);        free(_buffers);     } else { @@ -1048,29 +1157,6 @@ trace_context_set_vertex_buffers(struct pipe_context *_pipe,  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(); -} - - -static INLINE void  trace_context_surface_copy(struct pipe_context *_pipe,                             struct pipe_surface *dest,                             unsigned destx, unsigned desty, @@ -1196,23 +1282,23 @@ trace_context_destroy(struct pipe_context *_pipe)  }  static unsigned int -trace_is_texture_referenced( struct pipe_context *_pipe, -			    struct pipe_texture *_texture, -			    unsigned face, unsigned level) +trace_is_resource_referenced( struct pipe_context *_pipe, +			      struct pipe_resource *_resource, +			      unsigned face, unsigned level)  {     struct trace_context *tr_ctx = trace_context(_pipe); -   struct trace_texture *tr_tex = trace_texture(_texture); +   struct trace_resource *tr_tex = trace_resource(_resource);     struct pipe_context *pipe = tr_ctx->pipe; -   struct pipe_texture *texture = tr_tex->texture; +   struct pipe_resource *texture = tr_tex->resource;     unsigned int referenced; -   trace_dump_call_begin("pipe_context", "is_texture_referenced"); +   trace_dump_call_begin("pipe_context", "is_resource_referenced");     trace_dump_arg(ptr, pipe);     trace_dump_arg(ptr, texture);     trace_dump_arg(uint, face);     trace_dump_arg(uint, level); -   referenced = pipe->is_texture_referenced(pipe, texture, face, level); +   referenced = pipe->is_resource_referenced(pipe, texture, face, level);     trace_dump_ret(uint, referenced);     trace_dump_call_end(); @@ -1220,28 +1306,183 @@ trace_is_texture_referenced( struct pipe_context *_pipe,     return referenced;  } -static unsigned int -trace_is_buffer_referenced( struct pipe_context *_pipe, -			    struct pipe_buffer *_buf) + +/******************************************************************** + * transfer + */ + + +static struct pipe_transfer * +trace_context_get_transfer(struct pipe_context *_context, +			   struct pipe_resource *_resource, +			   struct pipe_subresource sr, +			   unsigned usage, +			   const struct pipe_box *box)  { -   struct trace_context *tr_ctx = trace_context(_pipe); -   struct trace_buffer *tr_buf = trace_buffer(_buf); -   struct pipe_context *pipe = tr_ctx->pipe; -   struct pipe_buffer *buf = tr_buf->buffer; -   unsigned int referenced; +   struct trace_context *tr_context = trace_context(_context); +   struct trace_resource *tr_tex = trace_resource(_resource); +   struct pipe_context *context = tr_context->pipe; +   struct pipe_resource *texture = tr_tex->resource; +   struct pipe_transfer *result = NULL; -   trace_dump_call_begin("pipe_context", "is_buffer_referenced"); -   trace_dump_arg(ptr, pipe); -   trace_dump_arg(ptr, buf); +   assert(texture->screen == context->screen); -   referenced = pipe->is_buffer_referenced(pipe, buf); +   /* +    * Map and transfers can't be serialized so we convert all write transfers +    * to transfer_inline_write and ignore read transfers. +    */ + +   result = context->get_transfer(context, texture, sr, usage, box); + +   if (result) +      result = trace_transfer_create(tr_context, tr_tex, result); + +   return result; +} + + +static void +trace_context_transfer_destroy(struct pipe_context *_context, +                                   struct pipe_transfer *_transfer) +{ +   struct trace_context *tr_context = trace_context(_context); +   struct trace_transfer *tr_trans = trace_transfer(_transfer); + +   trace_transfer_destroy(tr_context, tr_trans); +} + + +static void * +trace_context_transfer_map(struct pipe_context *_context, +                          struct pipe_transfer *_transfer) +{ +   struct trace_context *tr_context = trace_context(_context); +   struct trace_transfer *tr_trans = trace_transfer(_transfer); +   struct pipe_context *context = tr_context->pipe; +   struct pipe_transfer *transfer = tr_trans->transfer; +   void *map; + +   map = context->transfer_map(context, transfer); +   if(map) { +      if(transfer->usage & PIPE_TRANSFER_WRITE) { +         assert(!tr_trans->map); +         tr_trans->map = map; +      } +   } + +   return map; +} + + +static void +trace_context_transfer_flush_region( struct pipe_context *_context, +				     struct pipe_transfer *_transfer, +				     const struct pipe_box *box) +{ +   struct trace_context *tr_context = trace_context(_context); +   struct trace_transfer *tr_transfer = trace_transfer(_transfer); +   struct pipe_context *context = tr_context->pipe; +   struct pipe_transfer *transfer = tr_transfer->transfer; + +   context->transfer_flush_region(context, +				  transfer, +				  box); +} + +static void +trace_context_transfer_unmap(struct pipe_context *_context, +			     struct pipe_transfer *_transfer) +{ +   struct trace_context *tr_ctx = trace_context(_context); +   struct trace_transfer *tr_trans = trace_transfer(_transfer); +   struct pipe_context *context = tr_ctx->pipe; +   struct pipe_transfer *transfer = tr_trans->transfer; + +   if(tr_trans->map) { +      /* +       * Fake a transfer_inline_write +       */ + +      struct pipe_resource *resource = transfer->resource; +      struct pipe_subresource sr = transfer->sr; +      unsigned usage = transfer->usage; +      const struct pipe_box *box = &transfer->box; +      unsigned stride = transfer->stride; +      unsigned slice_stride = transfer->slice_stride; + +      trace_dump_call_begin("pipe_context", "transfer_inline_write"); + +      trace_dump_arg(ptr, context); +      trace_dump_arg(ptr, resource); +      trace_dump_arg_struct(subresource, sr); +      trace_dump_arg(uint, usage); +      trace_dump_arg(box, box); + +      trace_dump_arg_begin("data"); +      trace_dump_box_bytes(tr_trans->map, +                           resource->format, +                           box, +                           stride, +                           slice_stride); +      trace_dump_arg_end(); + +      trace_dump_arg(uint, stride); +      trace_dump_arg(uint, slice_stride); + +      trace_dump_call_end(); + +      tr_trans->map = NULL; +   } + +   context->transfer_unmap(context, transfer); +} + + +static void +trace_context_transfer_inline_write(struct pipe_context *_context, +				    struct pipe_resource *_resource, +				    struct pipe_subresource sr, +				    unsigned usage, +				    const struct pipe_box *box, +				    const void *data, +				    unsigned stride, +				    unsigned slice_stride) +{ +   struct trace_context *tr_context = trace_context(_context); +   struct trace_resource *tr_tex = trace_resource(_resource); +   struct pipe_context *context = tr_context->pipe; +   struct pipe_resource *resource = tr_tex->resource; + +   assert(resource->screen == context->screen); + +   trace_dump_call_begin("pipe_context", "transfer_inline_write"); + +   trace_dump_arg(ptr, context); +   trace_dump_arg(ptr, resource); +   trace_dump_arg_struct(subresource, sr); +   trace_dump_arg(uint, usage); +   trace_dump_arg(box, box); + +   trace_dump_arg_begin("data"); +   trace_dump_box_bytes(data, +                        resource->format, +                        box, +                        stride, +                        slice_stride); +   trace_dump_arg_end(); + +   trace_dump_arg(uint, stride); +   trace_dump_arg(uint, slice_stride); -   trace_dump_ret(uint, referenced);     trace_dump_call_end(); -   return referenced; +   context->transfer_inline_write(context, resource, +				  sr, usage, box, data, stride, slice_stride);  } + + +  static const struct debug_named_value rbug_blocker_flags[] = {     {"before", 1},     {"after", 2}, @@ -1303,6 +1544,9 @@ trace_context_create(struct trace_screen *tr_scr,     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.create_vertex_elements_state = trace_context_create_vertex_elements_state; +   tr_ctx->base.bind_vertex_elements_state = trace_context_bind_vertex_elements_state; +   tr_ctx->base.delete_vertex_elements_state = trace_context_delete_vertex_elements_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; @@ -1311,18 +1555,25 @@ trace_context_create(struct trace_screen *tr_scr,     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_fragment_sampler_views = trace_context_set_fragment_sampler_views; +   tr_ctx->base.set_vertex_sampler_views = trace_context_set_vertex_sampler_views; +   tr_ctx->base.create_sampler_view = trace_create_sampler_view; +   tr_ctx->base.sampler_view_destroy = trace_sampler_view_destroy;     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->base.is_resource_referenced = trace_is_resource_referenced; + +   tr_ctx->base.get_transfer = trace_context_get_transfer; +   tr_ctx->base.transfer_destroy = trace_context_transfer_destroy; +   tr_ctx->base.transfer_map = trace_context_transfer_map; +   tr_ctx->base.transfer_unmap = trace_context_transfer_unmap; +   tr_ctx->base.transfer_flush_region = trace_context_transfer_flush_region; +   tr_ctx->base.transfer_inline_write = trace_context_transfer_inline_write;     tr_ctx->pipe = pipe; diff --git a/src/gallium/drivers/trace/tr_context.h b/src/gallium/drivers/trace/tr_context.h index 1428423248..1b4121d80a 100644 --- a/src/gallium/drivers/trace/tr_context.h +++ b/src/gallium/drivers/trace/tr_context.h @@ -53,23 +53,23 @@ struct trace_context        struct trace_shader *fs;        struct trace_shader *vs; -      struct trace_texture *tex[PIPE_MAX_SAMPLERS]; -      unsigned num_texs; +      struct trace_sampler_view *sampler_views[PIPE_MAX_SAMPLERS]; +      unsigned num_sampler_views; -      struct trace_texture *vert_tex[PIPE_MAX_VERTEX_SAMPLERS]; -      unsigned num_vert_texs; +      struct trace_sampler_view *vert_sampler_views[PIPE_MAX_VERTEX_SAMPLERS]; +      unsigned num_vert_sampler_views;        unsigned nr_cbufs; -      struct trace_texture *cbufs[PIPE_MAX_COLOR_BUFS]; -      struct trace_texture *zsbuf; +      struct trace_resource *cbufs[PIPE_MAX_COLOR_BUFS]; +      struct trace_resource *zsbuf;     } curr;     struct {        struct trace_shader *fs;        struct trace_shader *vs; -      struct trace_texture *tex; -      struct trace_texture *surf; +      struct trace_sampler_view *sampler_view; +      struct trace_resource *surf;        int blocker;     } draw_rule; diff --git a/src/gallium/drivers/trace/tr_drm.c b/src/gallium/drivers/trace/tr_drm.c index 2b4915003e..eaa47df406 100644 --- a/src/gallium/drivers/trace/tr_drm.c +++ b/src/gallium/drivers/trace/tr_drm.c @@ -30,9 +30,7 @@  #include "util/u_memory.h"  #include "tr_drm.h"  #include "tr_screen.h" -#include "tr_context.h" -#include "tr_buffer.h" -#include "tr_texture.h" +#include "tr_public.h"  struct trace_drm_api  { @@ -62,69 +60,8 @@ trace_drm_create_screen(struct drm_api *_api, int fd,     screen = api->create_screen(api, fd, arg); -   return trace_screen_create(screen); -} - - -static struct pipe_texture * -trace_drm_texture_from_shared_handle(struct drm_api *_api, -                                     struct pipe_screen *_screen, -                                     struct pipe_texture *templ, -                                     const char *name, -                                     unsigned stride, -                                     unsigned handle) -{ -   struct trace_screen *tr_screen = trace_screen(_screen); -   struct trace_drm_api *tr_api = trace_drm_api(_api); -   struct pipe_screen *screen = tr_screen->screen; -   struct drm_api *api = tr_api->api; -   struct pipe_texture *result; - -   /* TODO trace call */ - -   result = api->texture_from_shared_handle(api, screen, templ, name, stride, handle); - -   result = trace_texture_create(trace_screen(_screen), result); - -   return result; -} - -static boolean -trace_drm_shared_handle_from_texture(struct drm_api *_api, -                                     struct pipe_screen *_screen, -                                     struct pipe_texture *_texture, -                                     unsigned *stride, -                                     unsigned *handle) -{ -   struct trace_screen *tr_screen = trace_screen(_screen); -   struct trace_texture *tr_texture = trace_texture(_texture); -   struct trace_drm_api *tr_api = trace_drm_api(_api); -   struct pipe_screen *screen = tr_screen->screen; -   struct pipe_texture *texture = tr_texture->texture; -   struct drm_api *api = tr_api->api; - -   /* TODO trace call */ - -   return api->shared_handle_from_texture(api, screen, texture, stride, handle); -} -static boolean -trace_drm_local_handle_from_texture(struct drm_api *_api, -                                    struct pipe_screen *_screen, -                                    struct pipe_texture *_texture, -                                    unsigned *stride, -                                    unsigned *handle) -{ -   struct trace_screen *tr_screen = trace_screen(_screen); -   struct trace_texture *tr_texture = trace_texture(_texture); -   struct trace_drm_api *tr_api = trace_drm_api(_api); -   struct pipe_screen *screen = tr_screen->screen; -   struct pipe_texture *texture = tr_texture->texture; -   struct drm_api *api = tr_api->api; - -   /* TODO trace call */ - -   return api->local_handle_from_texture(api, screen, texture, stride, handle); +   return trace_screen_create(screen);  }  static void @@ -158,9 +95,6 @@ trace_drm_create(struct drm_api *api)     tr_api->base.name = api->name;     tr_api->base.driver_name = api->driver_name;     tr_api->base.create_screen = trace_drm_create_screen; -   tr_api->base.texture_from_shared_handle = trace_drm_texture_from_shared_handle; -   tr_api->base.shared_handle_from_texture = trace_drm_shared_handle_from_texture; -   tr_api->base.local_handle_from_texture = trace_drm_local_handle_from_texture;     tr_api->base.destroy = trace_drm_destroy;     tr_api->api = api; diff --git a/src/gallium/drivers/trace/tr_dump.c b/src/gallium/drivers/trace/tr_dump.c index 1affafdddc..51a4ea9633 100644 --- a/src/gallium/drivers/trace/tr_dump.c +++ b/src/gallium/drivers/trace/tr_dump.c @@ -50,11 +50,12 @@  #include "util/u_debug.h"  #include "util/u_memory.h"  #include "util/u_string.h" +#include "util/u_math.h" +#include "util/u_format.h"  #include "tr_dump.h"  #include "tr_screen.h"  #include "tr_texture.h" -#include "tr_buffer.h"  static struct os_stream *stream = NULL; @@ -471,6 +472,25 @@ void trace_dump_bytes(const void *data,     trace_dump_writes("</bytes>");  } +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); +} +  void trace_dump_string(const char *str)  {     if (!dumping) @@ -574,27 +594,15 @@ void trace_dump_ptr(const void *value)        trace_dump_null();  } -void trace_dump_buffer_ptr(struct pipe_buffer *_buffer) -{ -   if (!dumping) -      return; - -   if (_buffer) { -      struct trace_buffer *tr_buf = trace_buffer(_buffer); -      trace_dump_ptr(tr_buf->buffer); -   } else { -      trace_dump_null(); -   } -} -void trace_dump_texture_ptr(struct pipe_texture *_texture) +void trace_dump_resource_ptr(struct pipe_resource *_resource)  {     if (!dumping)        return; -   if (_texture) { -      struct trace_texture *tr_tex = trace_texture(_texture); -      trace_dump_ptr(tr_tex->texture); +   if (_resource) { +      struct trace_resource *tr_resource = trace_resource(_resource); +      trace_dump_ptr(tr_resource->resource);     } else {        trace_dump_null();     } diff --git a/src/gallium/drivers/trace/tr_dump.h b/src/gallium/drivers/trace/tr_dump.h index 32592bab12..f21f72b0c7 100644 --- a/src/gallium/drivers/trace/tr_dump.h +++ b/src/gallium/drivers/trace/tr_dump.h @@ -35,12 +35,13 @@  #include "pipe/p_compiler.h" - +#include "pipe/p_format.h"  struct pipe_buffer; -struct pipe_texture; +struct pipe_resource;  struct pipe_surface;  struct pipe_transfer; +struct pipe_box;  /*   * Call before use. @@ -92,6 +93,11 @@ void trace_dump_int(long long int value);  void trace_dump_uint(long long unsigned value);  void trace_dump_float(double value);  void trace_dump_bytes(const void *data, size_t size); +void trace_dump_box_bytes(const void *data, +			  enum pipe_format format, +			  const struct pipe_box *box, +			  unsigned stride, +			  unsigned slice_stride);  void trace_dump_string(const char *str);  void trace_dump_enum(const char *value);  void trace_dump_array_begin(void); @@ -105,8 +111,7 @@ void trace_dump_member_end(void);  void trace_dump_null(void);  void trace_dump_ptr(const void *value);  /* will turn a wrapped object into the real one and dump ptr */ -void trace_dump_buffer_ptr(struct pipe_buffer *_buffer); -void trace_dump_texture_ptr(struct pipe_texture *_texture); +void trace_dump_resource_ptr(struct pipe_resource *_texture);  void trace_dump_surface_ptr(struct pipe_surface *_surface);  void trace_dump_transfer_ptr(struct pipe_transfer *_transfer); @@ -121,6 +126,13 @@ void trace_dump_transfer_ptr(struct pipe_transfer *_transfer);        trace_dump_arg_end(); \     } while(0) +#define trace_dump_arg_struct(_type, _arg) \ +   do { \ +      trace_dump_arg_begin(#_arg); \ +      trace_dump_##_type(&_arg); \ +      trace_dump_arg_end(); \ +   } while(0) +  #define trace_dump_ret(_type, _arg) \     do { \        trace_dump_ret_begin(); \ diff --git a/src/gallium/drivers/trace/tr_dump_state.c b/src/gallium/drivers/trace/tr_dump_state.c index f97d963dba..f148a859ff 100644 --- a/src/gallium/drivers/trace/tr_dump_state.c +++ b/src/gallium/drivers/trace/tr_dump_state.c @@ -44,7 +44,7 @@ void trace_dump_format(enum pipe_format format)  } -void trace_dump_template(const struct pipe_texture *templat) +void trace_dump_resource_template(const struct pipe_resource *templat)  {     if (!trace_dumping_enabled_locked())        return; @@ -54,7 +54,7 @@ void trace_dump_template(const struct pipe_texture *templat)        return;     } -   trace_dump_struct_begin("pipe_texture"); +   trace_dump_struct_begin("pipe_resource");     trace_dump_member(int, templat, target);     trace_dump_member(format, templat, format); @@ -72,7 +72,51 @@ void trace_dump_template(const struct pipe_texture *templat)     trace_dump_member_end();     trace_dump_member(uint, templat, last_level); -   trace_dump_member(uint, templat, tex_usage); +   trace_dump_member(uint, templat, usage); +   trace_dump_member(uint, templat, bind); +   trace_dump_member(uint, templat, flags); + +   trace_dump_struct_end(); +} + + +void trace_dump_subresource(const struct pipe_subresource *subresource) +{ +   if (!trace_dumping_enabled_locked()) +      return; + +   if(!subresource) { +      trace_dump_null(); +      return; +   } + +   trace_dump_struct_begin("pipe_subresource"); + +   trace_dump_member(uint, subresource, face); +   trace_dump_member(uint, subresource, level); + +   trace_dump_struct_end(); +} + + +void trace_dump_box(const struct pipe_box *box) +{ +   if (!trace_dumping_enabled_locked()) +      return; + +   if(!box) { +      trace_dump_null(); +      return; +   } + +   trace_dump_struct_begin("pipe_box"); + +   trace_dump_member(uint, box, x); +   trace_dump_member(uint, box, y); +   trace_dump_member(uint, box, z); +   trace_dump_member(uint, box, width); +   trace_dump_member(uint, box, height); +   trace_dump_member(uint, box, depth);     trace_dump_struct_end();  } @@ -387,6 +431,30 @@ void trace_dump_sampler_state(const struct pipe_sampler_state *state)  } +void trace_dump_sampler_view_template(const struct pipe_sampler_view *state) +{ +   if (!trace_dumping_enabled_locked()) +      return; + +   if(!state) { +      trace_dump_null(); +      return; +   } + +   trace_dump_struct_begin("pipe_sampler_view"); + +   trace_dump_member(format, state, format); +   trace_dump_member(uint, state, first_level); +   trace_dump_member(uint, state, last_level); +   trace_dump_member(uint, state, swizzle_r); +   trace_dump_member(uint, state, swizzle_g); +   trace_dump_member(uint, state, swizzle_b); +   trace_dump_member(uint, state, swizzle_a); + +   trace_dump_struct_end(); +} + +  void trace_dump_surface(const struct pipe_surface *state)  {     if (!trace_dumping_enabled_locked()) @@ -428,16 +496,16 @@ void trace_dump_transfer(const struct pipe_transfer *state)     trace_dump_struct_begin("pipe_transfer"); -   trace_dump_member(uint, state, width); -   trace_dump_member(uint, state, height); +   trace_dump_member(uint, state, box.width); +   trace_dump_member(uint, state, box.height);     trace_dump_member(uint, state, stride);     trace_dump_member(uint, state, usage); -   trace_dump_member(ptr, state, texture); -   trace_dump_member(uint, state, face); -   trace_dump_member(uint, state, level); -   trace_dump_member(uint, state, zslice); +   trace_dump_member(ptr, state, resource); +   trace_dump_member(uint, state, sr.face); +   trace_dump_member(uint, state, sr.level); +   trace_dump_member(uint, state, box.z);     trace_dump_struct_end();  } @@ -458,7 +526,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(buffer_ptr, state, buffer); +   trace_dump_member(resource_ptr, state, buffer);     trace_dump_struct_end();  } @@ -479,7 +547,6 @@ void trace_dump_vertex_element(const struct pipe_vertex_element *state)     trace_dump_member(uint, state, src_offset);     trace_dump_member(uint, state, vertex_buffer_index); -   trace_dump_member(uint, state, nr_components);     trace_dump_member(format, state, src_format); diff --git a/src/gallium/drivers/trace/tr_dump_state.h b/src/gallium/drivers/trace/tr_dump_state.h index 3400367d82..e614e8355e 100644 --- a/src/gallium/drivers/trace/tr_dump_state.h +++ b/src/gallium/drivers/trace/tr_dump_state.h @@ -35,7 +35,11 @@  void trace_dump_format(enum pipe_format format); -void trace_dump_template(const struct pipe_texture *templat); +void trace_dump_resource_template(const struct pipe_resource *templat); + +void trace_dump_subresource(const struct pipe_subresource *subresource); + +void trace_dump_box(const struct pipe_box *box);  void trace_dump_rasterizer_state(const struct pipe_rasterizer_state *state); @@ -63,6 +67,8 @@ void trace_dump_framebuffer_state(const struct pipe_framebuffer_state *state);  void trace_dump_sampler_state(const struct pipe_sampler_state *state); +void trace_dump_sampler_view_template(const struct pipe_sampler_view *view); +  void trace_dump_surface(const struct pipe_surface *state);  void trace_dump_transfer(const struct pipe_transfer *state); diff --git a/src/gallium/drivers/trace/tr_public.h b/src/gallium/drivers/trace/tr_public.h new file mode 100644 index 0000000000..62e217097d --- /dev/null +++ b/src/gallium/drivers/trace/tr_public.h @@ -0,0 +1,45 @@ +/************************************************************************** + * + * Copyright 2010 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 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 + * THE COPYRIGHT HOLDERS, AUTHORS 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. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + **************************************************************************/ + +#ifndef TR_PUBLIC_H +#define TR_PUBLIC_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct pipe_screen; +struct pipe_context; + +struct pipe_screen * +trace_screen_create(struct pipe_screen *screen); + +#ifdef __cplusplus +} +#endif + +#endif /* TR_PUBLIC_H */ diff --git a/src/gallium/drivers/trace/tr_rbug.c b/src/gallium/drivers/trace/tr_rbug.c index a43adac694..3ce1b85854 100644 --- a/src/gallium/drivers/trace/tr_rbug.c +++ b/src/gallium/drivers/trace/tr_rbug.c @@ -29,6 +29,7 @@  #include "os/os_thread.h"  #include "util/u_format.h"  #include "util/u_string.h" +#include "util/u_inlines.h"  #include "util/u_memory.h"  #include "util/u_simple_list.h"  #include "util/u_network.h" @@ -38,7 +39,6 @@  #include "tr_dump.h"  #include "tr_state.h" -#include "tr_buffer.h"  #include "tr_texture.h"  #include "rbug/rbug.h" @@ -150,7 +150,7 @@ static int  trace_rbug_texture_list(struct trace_rbug *tr_rbug, struct rbug_header *header, uint32_t serial)  {     struct trace_screen *tr_scr = tr_rbug->tr_scr; -   struct trace_texture *tr_tex = NULL; +   struct trace_resource *tr_tex = NULL;     struct tr_list *ptr;     rbug_texture_t *texs;     int i = 0; @@ -158,7 +158,7 @@ trace_rbug_texture_list(struct trace_rbug *tr_rbug, struct rbug_header *header,     pipe_mutex_lock(tr_scr->list_mutex);     texs = MALLOC(tr_scr->num_textures * sizeof(rbug_texture_t));     foreach(ptr, &tr_scr->textures) { -      tr_tex = (struct trace_texture *)((char*)ptr - offsetof(struct trace_texture, list)); +      tr_tex = (struct trace_resource *)((char*)ptr - offsetof(struct trace_resource, list));        texs[i++] = VOID2U64(tr_tex);     }     pipe_mutex_unlock(tr_scr->list_mutex); @@ -173,14 +173,14 @@ static int  trace_rbug_texture_info(struct trace_rbug *tr_rbug, struct rbug_header *header, uint32_t serial)  {     struct trace_screen *tr_scr = tr_rbug->tr_scr; -   struct trace_texture *tr_tex = NULL; +   struct trace_resource *tr_tex = NULL;     struct rbug_proto_texture_info *gpti = (struct rbug_proto_texture_info *)header;     struct tr_list *ptr; -   struct pipe_texture *t; +   struct pipe_resource *t;     pipe_mutex_lock(tr_scr->list_mutex);     foreach(ptr, &tr_scr->textures) { -      tr_tex = (struct trace_texture *)((char*)ptr - offsetof(struct trace_texture, list)); +      tr_tex = (struct trace_resource *)((char*)ptr - offsetof(struct trace_resource, list));        if (gpti->texture == VOID2U64(tr_tex))           break;        tr_tex = NULL; @@ -191,7 +191,7 @@ trace_rbug_texture_info(struct trace_rbug *tr_rbug, struct rbug_header *header,        return -ESRCH;     } -   t = tr_tex->texture; +   t = tr_tex->resource;     rbug_send_texture_info_reply(tr_rbug->con, serial,                                 t->target, t->format,                                 &t->width0, 1, @@ -202,7 +202,7 @@ trace_rbug_texture_info(struct trace_rbug *tr_rbug, struct rbug_header *header,                                 util_format_get_blocksize(t->format),                                 t->last_level,                                 t->nr_samples, -                               t->tex_usage, +                               t->bind,                                 NULL);     pipe_mutex_unlock(tr_scr->list_mutex); @@ -216,18 +216,18 @@ trace_rbug_texture_read(struct trace_rbug *tr_rbug, struct rbug_header *header,     struct rbug_proto_texture_read *gptr = (struct rbug_proto_texture_read *)header;     struct trace_screen *tr_scr = tr_rbug->tr_scr; -   struct trace_texture *tr_tex = NULL; +   struct trace_resource *tr_tex = NULL;     struct tr_list *ptr; -   struct pipe_screen *screen = tr_scr->screen; -   struct pipe_texture *tex; +   struct pipe_context *context = tr_scr->private_context; +   struct pipe_resource *tex;     struct pipe_transfer *t;     void *map;     pipe_mutex_lock(tr_scr->list_mutex);     foreach(ptr, &tr_scr->textures) { -      tr_tex = (struct trace_texture *)((char*)ptr - offsetof(struct trace_texture, list)); +      tr_tex = (struct trace_resource *)((char*)ptr - offsetof(struct trace_resource, list));        if (gptr->texture == VOID2U64(tr_tex))           break;        tr_tex = NULL; @@ -238,26 +238,27 @@ trace_rbug_texture_read(struct trace_rbug *tr_rbug, struct rbug_header *header,        return -ESRCH;     } -   tex = tr_tex->texture; -   t = screen->get_tex_transfer(tr_scr->screen, tex, -                                gptr->face, gptr->level, gptr->zslice, -                                PIPE_TRANSFER_READ, -                                gptr->x, gptr->y, gptr->w, gptr->h); +   tex = tr_tex->resource; +   t = pipe_get_transfer(context, tex, +				 gptr->face, gptr->level, gptr->zslice, +				 PIPE_TRANSFER_READ, +				 gptr->x, gptr->y, gptr->w, gptr->h); -   map = screen->transfer_map(screen, t); +   map = context->transfer_map(context, t);     rbug_send_texture_read_reply(tr_rbug->con, serial, -                                t->texture->format, -                                util_format_get_blockwidth(t->texture->format), -                                util_format_get_blockheight(t->texture->format), -                                util_format_get_blocksize(t->texture->format), +                                t->resource->format, +                                util_format_get_blockwidth(t->resource->format), +                                util_format_get_blockheight(t->resource->format), +                                util_format_get_blocksize(t->resource->format),                                  (uint8_t*)map, -                                t->stride * util_format_get_nblocksy(t->texture->format, t->height), +                                t->stride * util_format_get_nblocksy(t->resource->format, +								     t->box.height),                                  t->stride,                                  NULL); -   screen->transfer_unmap(screen, t); -   screen->tex_transfer_destroy(t); +   context->transfer_unmap(context, t); +   context->transfer_destroy(context, t);     pipe_mutex_unlock(tr_scr->list_mutex); @@ -313,12 +314,12 @@ trace_rbug_context_info(struct trace_rbug *tr_rbug, struct rbug_header *header,     for (i = 0; i < tr_ctx->curr.nr_cbufs; i++)        cbufs[i] = VOID2U64(tr_ctx->curr.cbufs[i]); -   for (i = 0; i < tr_ctx->curr.num_texs; i++) -      texs[i] = VOID2U64(tr_ctx->curr.tex[i]); +   for (i = 0; i < tr_ctx->curr.num_sampler_views; i++) +      texs[i] = VOID2U64(tr_ctx->curr.sampler_views[i]);     rbug_send_context_info_reply(tr_rbug->con, serial,                                  VOID2U64(tr_ctx->curr.vs), VOID2U64(tr_ctx->curr.fs), -                                texs, tr_ctx->curr.num_texs, +                                texs, tr_ctx->curr.num_sampler_views,                                  cbufs, tr_ctx->curr.nr_cbufs,                                  VOID2U64(tr_ctx->curr.zsbuf),                                  tr_ctx->draw_blocker, tr_ctx->draw_blocked, NULL); @@ -444,7 +445,7 @@ trace_rbug_context_draw_rule(struct trace_rbug *tr_rbug, struct rbug_header *hea     pipe_mutex_lock(tr_ctx->draw_mutex);     tr_ctx->draw_rule.vs = U642VOID(rule->vertex);     tr_ctx->draw_rule.fs = U642VOID(rule->fragment); -   tr_ctx->draw_rule.tex = U642VOID(rule->texture); +   tr_ctx->draw_rule.sampler_view = U642VOID(rule->texture);     tr_ctx->draw_rule.surf = U642VOID(rule->surface);     tr_ctx->draw_rule.blocker = rule->block;     tr_ctx->draw_blocker |= RBUG_BLOCK_RULE; diff --git a/src/gallium/drivers/trace/tr_screen.c b/src/gallium/drivers/trace/tr_screen.c index 388d83eb5c..63a45d7e51 100644 --- a/src/gallium/drivers/trace/tr_screen.c +++ b/src/gallium/drivers/trace/tr_screen.c @@ -29,14 +29,13 @@  #include "util/u_memory.h"  #include "util/u_simple_list.h" -#include "tr_buffer.h"  #include "tr_dump.h"  #include "tr_dump_state.h"  #include "tr_texture.h"  #include "tr_context.h"  #include "tr_screen.h" +#include "tr_public.h" -#include "util/u_inlines.h"  #include "pipe/p_format.h" @@ -212,70 +211,73 @@ trace_screen_flush_frontbuffer(struct pipe_screen *_screen,   */ -static struct pipe_texture * -trace_screen_texture_create(struct pipe_screen *_screen, -                            const struct pipe_texture *templat) +static struct pipe_resource * +trace_screen_resource_create(struct pipe_screen *_screen, +                            const struct pipe_resource *templat)  {     struct trace_screen *tr_scr = trace_screen(_screen);     struct pipe_screen *screen = tr_scr->screen; -   struct pipe_texture *result; +   struct pipe_resource *result; -   trace_dump_call_begin("pipe_screen", "texture_create"); +   trace_dump_call_begin("pipe_screen", "resource_create");     trace_dump_arg(ptr, screen); -   trace_dump_arg(template, templat); +   trace_dump_arg(resource_template, templat); -   result = screen->texture_create(screen, templat); +   result = screen->resource_create(screen, templat);     trace_dump_ret(ptr, result);     trace_dump_call_end(); -   result = trace_texture_create(tr_scr, result); +   result = trace_resource_create(tr_scr, result);     return result;  } - -static struct pipe_texture * -trace_screen_texture_blanket(struct pipe_screen *_screen, -                             const struct pipe_texture *templat, -                             const unsigned *ppitch, -                             struct pipe_buffer *_buffer) +static struct pipe_resource * +trace_screen_resource_from_handle(struct pipe_screen *_screen, +                                 const struct pipe_resource *templ, +                                 struct winsys_handle *handle)  { -   struct trace_screen *tr_scr = trace_screen(_screen); -   struct trace_buffer *tr_buf = trace_buffer(_buffer); -   struct pipe_screen *screen = tr_scr->screen; -   struct pipe_buffer *buffer = tr_buf->buffer; -   unsigned pitch = *ppitch; -   struct pipe_texture *result; +   struct trace_screen *tr_screen = trace_screen(_screen); +   struct pipe_screen *screen = tr_screen->screen; +   struct pipe_resource *result; -   trace_dump_call_begin("pipe_screen", "texture_blanket"); +   /* TODO trace call */ -   trace_dump_arg(ptr, screen); -   trace_dump_arg(template, templat); -   trace_dump_arg(uint, pitch); -   trace_dump_arg(ptr, buffer); +   result = screen->resource_from_handle(screen, templ, handle); -   result = screen->texture_blanket(screen, templat, ppitch, buffer); +   result = trace_resource_create(trace_screen(_screen), result); -   trace_dump_ret(ptr, result); +   return result; +} -   trace_dump_call_end(); +static boolean +trace_screen_resource_get_handle(struct pipe_screen *_screen, +                                struct pipe_resource *_texture, +                                struct winsys_handle *handle) +{ +   struct trace_screen *tr_screen = trace_screen(_screen); +   struct trace_resource *tr_texture = trace_resource(_texture); +   struct pipe_screen *screen = tr_screen->screen; +   struct pipe_resource *texture = tr_texture->resource; -   result = trace_texture_create(tr_scr, result); +   /* TODO trace call */ -   return result; +   return screen->resource_get_handle(screen, texture, handle);  } +  static void -trace_screen_texture_destroy(struct pipe_texture *_texture) +trace_screen_resource_destroy(struct pipe_screen *_screen, +			      struct pipe_resource *_texture)  { -   struct trace_screen *tr_scr = trace_screen(_texture->screen); -   struct trace_texture *tr_tex = trace_texture(_texture); +   struct trace_screen *tr_scr = trace_screen(_screen); +   struct trace_resource *tr_tex = trace_resource(_texture);     struct pipe_screen *screen = tr_scr->screen; -   struct pipe_texture *texture = tr_tex->texture; +   struct pipe_resource *texture = tr_tex->resource;     assert(texture->screen == screen); @@ -286,7 +288,7 @@ trace_screen_texture_destroy(struct pipe_texture *_texture)     trace_dump_call_end(); -   trace_texture_destroy(tr_tex); +   trace_resource_destroy(tr_scr, tr_tex);  } @@ -297,15 +299,15 @@ trace_screen_texture_destroy(struct pipe_texture *_texture)  static struct pipe_surface *  trace_screen_get_tex_surface(struct pipe_screen *_screen, -                             struct pipe_texture *_texture, +                             struct pipe_resource *_texture,                               unsigned face, unsigned level,                               unsigned zslice,                               unsigned usage)  {     struct trace_screen *tr_scr = trace_screen(_screen); -   struct trace_texture *tr_tex = trace_texture(_texture); +   struct trace_resource *tr_tex = trace_resource(_texture);     struct pipe_screen *screen = tr_scr->screen; -   struct pipe_texture *texture = tr_tex->texture; +   struct pipe_resource *texture = tr_tex->resource;     struct pipe_surface *result = NULL;     assert(texture->screen == screen); @@ -350,133 +352,7 @@ trace_screen_tex_surface_destroy(struct pipe_surface *_surface)  } -/******************************************************************** - * transfer - */ - - -static struct pipe_transfer * -trace_screen_get_tex_transfer(struct pipe_screen *_screen, -                              struct pipe_texture *_texture, -                              unsigned face, unsigned level, -                              unsigned zslice, -                              enum pipe_transfer_usage usage, -                              unsigned x, unsigned y, unsigned w, unsigned h) -{ -   struct trace_screen *tr_scr = trace_screen(_screen); -   struct trace_texture *tr_tex = trace_texture(_texture); -   struct pipe_screen *screen = tr_scr->screen; -   struct pipe_texture *texture = tr_tex->texture; -   struct pipe_transfer *result = NULL; - -   assert(texture->screen == screen); - -   trace_dump_call_begin("pipe_screen", "get_tex_transfer"); - -   trace_dump_arg(ptr, screen); -   trace_dump_arg(ptr, texture); -   trace_dump_arg(uint, face); -   trace_dump_arg(uint, level); -   trace_dump_arg(uint, zslice); -   trace_dump_arg(uint, usage); - -   trace_dump_arg(uint, x); -   trace_dump_arg(uint, y); -   trace_dump_arg(uint, w); -   trace_dump_arg(uint, h); - -   result = screen->get_tex_transfer(screen, texture, face, level, zslice, usage, -                                     x, y, w, h); - -   trace_dump_ret(ptr, result); - -   trace_dump_call_end(); - -   if (result) -      result = trace_transfer_create(tr_tex, result); - -   return result; -} - - -static void -trace_screen_tex_transfer_destroy(struct pipe_transfer *_transfer) -{ -   struct trace_screen *tr_scr = trace_screen(_transfer->texture->screen); -   struct trace_transfer *tr_trans = trace_transfer(_transfer); -   struct pipe_screen *screen = tr_scr->screen; -   struct pipe_transfer *transfer = tr_trans->transfer; - -   trace_dump_call_begin("pipe_screen", "tex_transfer_destroy"); - -   trace_dump_arg(ptr, screen); -   trace_dump_arg(ptr, transfer); - -   trace_dump_call_end(); - -   trace_transfer_destroy(tr_trans); -} - - -static void * -trace_screen_transfer_map(struct pipe_screen *_screen, -                          struct pipe_transfer *_transfer) -{ -   struct trace_screen *tr_scr = trace_screen(_screen); -   struct trace_transfer *tr_trans = trace_transfer(_transfer); -   struct pipe_screen *screen = tr_scr->screen; -   struct pipe_transfer *transfer = tr_trans->transfer; -   void *map; - -   map = screen->transfer_map(screen, transfer); -   if(map) { -      if(transfer->usage & PIPE_TRANSFER_WRITE) { -         assert(!tr_trans->map); -         tr_trans->map = map; -      } -   } - -   return map; -} - - -static void -trace_screen_transfer_unmap(struct pipe_screen *_screen, -                           struct pipe_transfer *_transfer) -{ -   struct trace_screen *tr_scr = trace_screen(_screen); -   struct trace_transfer *tr_trans = trace_transfer(_transfer); -   struct pipe_screen *screen = tr_scr->screen; -   struct pipe_transfer *transfer = tr_trans->transfer; - -   if(tr_trans->map) { -      size_t size = util_format_get_nblocksy(transfer->texture->format, transfer->height) * transfer->stride; - -      trace_dump_call_begin("pipe_screen", "transfer_write"); - -      trace_dump_arg(ptr, screen); - -      trace_dump_arg(ptr, transfer); - -      trace_dump_arg_begin("stride"); -      trace_dump_uint(transfer->stride); -      trace_dump_arg_end(); - -      trace_dump_arg_begin("data"); -      trace_dump_bytes(tr_trans->map, size); -      trace_dump_arg_end(); - -      trace_dump_arg_begin("size"); -      trace_dump_uint(size); -      trace_dump_arg_end(); - -      trace_dump_call_end(); -      tr_trans->map = NULL; -   } - -   screen->transfer_unmap(screen, transfer); -}  /******************************************************************** @@ -484,92 +360,16 @@ trace_screen_transfer_unmap(struct pipe_screen *_screen,   */ -static struct pipe_buffer * -trace_screen_surface_buffer_create(struct pipe_screen *_screen, -                                   unsigned width, unsigned height, -                                   enum pipe_format format, -                                   unsigned usage, -                                   unsigned tex_usage, -                                   unsigned *pstride) -{ -   struct trace_screen *tr_scr = trace_screen(_screen); -   struct pipe_screen *screen = tr_scr->screen; -   unsigned stride; -   struct pipe_buffer *result; - -   trace_dump_call_begin("pipe_screen", "surface_buffer_create"); - -   trace_dump_arg(ptr, screen); -   trace_dump_arg(uint, width); -   trace_dump_arg(uint, height); -   trace_dump_arg(format, format); -   trace_dump_arg(uint, usage); -   trace_dump_arg(uint, tex_usage); - -   result = screen->surface_buffer_create(screen, -                                          width, height, -                                          format, -                                          usage, -                                          tex_usage, -                                          pstride); - -   stride = *pstride; - -   trace_dump_arg(uint, stride); - -   trace_dump_ret(ptr, result); - -   trace_dump_call_end(); - -   return trace_buffer_create(tr_scr, result); -} - - -static struct pipe_buffer * -trace_screen_buffer_create(struct pipe_screen *_screen, -                           unsigned alignment, -                           unsigned usage, -                           unsigned size) -{ -   struct trace_screen *tr_scr = trace_screen(_screen); -   struct pipe_screen *screen = tr_scr->screen; -   struct pipe_buffer *result; - -   trace_dump_call_begin("pipe_screen", "buffer_create"); - -   trace_dump_arg(ptr, screen); -   trace_dump_arg(uint, alignment); -   trace_dump_arg(uint, usage); -   trace_dump_arg(uint, size); - -   result = screen->buffer_create(screen, alignment, usage, size); - -   trace_dump_ret(ptr, result); - -   trace_dump_call_end(); - -   /* Zero the buffer to avoid dumping uninitialized memory */ -   if(result->usage & PIPE_BUFFER_USAGE_CPU_WRITE) { -      void *map; -      map = pipe_buffer_map(screen, result, PIPE_BUFFER_USAGE_CPU_WRITE); -      if(map) { -         memset(map, 0, result->size); -         screen->buffer_unmap(screen, result); -      } -   } -   return trace_buffer_create(tr_scr, result); -} - - -static struct pipe_buffer * +static struct pipe_resource *  trace_screen_user_buffer_create(struct pipe_screen *_screen,                                  void *data, -                                unsigned size) +                                unsigned size, +				unsigned usage)  {     struct trace_screen *tr_scr = trace_screen(_screen);     struct pipe_screen *screen = tr_scr->screen; -   struct pipe_buffer *result; +   struct pipe_resource *result;     trace_dump_call_begin("pipe_screen", "user_buffer_create"); @@ -578,189 +378,23 @@ trace_screen_user_buffer_create(struct pipe_screen *_screen,     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); +   result = screen->user_buffer_create(screen, data, size, usage);     trace_dump_ret(ptr, result);     trace_dump_call_end();     if(result) { -      assert(!(result->usage & TRACE_BUFFER_USAGE_USER)); -      result->usage |= TRACE_BUFFER_USAGE_USER; -   } - -   return trace_buffer_create(tr_scr, result); -} - - -/** - * This function is used to track if data has been changed on a user buffer - * without map/unmap being called. - */ -void -trace_screen_user_buffer_update(struct pipe_screen *_screen, -                                struct pipe_buffer *_buffer) -{ -#if 0 -   struct trace_screen *tr_scr = trace_screen(_screen); -   struct pipe_screen *screen = tr_scr->screen; -   const void *map; - -   if(buffer && buffer->usage & TRACE_BUFFER_USAGE_USER) { -      map = screen->buffer_map(screen, buffer, PIPE_BUFFER_USAGE_CPU_READ); -      if(map) { -         trace_dump_call_begin("pipe_winsys", "buffer_write"); - -         trace_dump_arg(ptr, screen); - -         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(); - -         screen->buffer_unmap(screen, buffer); -      } -   } -#endif -} - - -static void * -trace_screen_buffer_map(struct pipe_screen *_screen, -                        struct pipe_buffer *_buffer, -                        unsigned usage) -{ -   struct trace_screen *tr_scr = trace_screen(_screen); -   struct trace_buffer *tr_buf = trace_buffer(_buffer); -   struct pipe_screen *screen = tr_scr->screen; -   struct pipe_buffer *buffer = tr_buf->buffer; -   void *map; - -   assert(screen->buffer_map); -   map = screen->buffer_map(screen, buffer, usage); -   if(map) { -      if(usage & PIPE_BUFFER_USAGE_CPU_WRITE) { -         tr_buf->map = map; -      } -   } - -   return map; -} - - -static void * -trace_screen_buffer_map_range(struct pipe_screen *_screen, -                              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(_buffer); -   struct pipe_screen *screen = tr_scr->screen; -   struct pipe_buffer *buffer = tr_buf->buffer; -   void *map; - -   assert(screen->buffer_map_range); -   map = screen->buffer_map_range(screen, buffer, offset, length, usage); -   if(map) { -      if(usage & PIPE_BUFFER_USAGE_CPU_WRITE) { -         tr_buf->map = map; -      } +      assert(!(result->flags & TRACE_FLAG_USER_BUFFER)); +      result->flags |= TRACE_FLAG_USER_BUFFER;     } -   return map; -} - - -static void -buffer_write(struct pipe_screen *screen, -             struct pipe_buffer *buffer, -             unsigned offset, -             const char *map, -             unsigned size) -{ -   assert(map); - -   trace_dump_call_begin("pipe_screen", "buffer_write"); - -   trace_dump_arg(ptr, screen); - -   trace_dump_arg(ptr, buffer); - -   trace_dump_arg(uint, offset); - -   trace_dump_arg_begin("data"); -   trace_dump_bytes(map + offset, size); -   trace_dump_arg_end(); - -   trace_dump_arg(uint, size); - -   trace_dump_call_end(); - -} - - -static void -trace_screen_buffer_flush_mapped_range(struct pipe_screen *_screen, -                                       struct pipe_buffer *_buffer, -                                       unsigned offset, -                                       unsigned length) -{ -   struct trace_screen *tr_scr = trace_screen(_screen); -   struct trace_buffer *tr_buf = trace_buffer(_buffer); -   struct pipe_screen *screen = tr_scr->screen; -   struct pipe_buffer *buffer = tr_buf->buffer; - -   assert(tr_buf->map); -   buffer_write(screen, buffer, offset, tr_buf->map, length); -   tr_buf->range_flushed = TRUE; -   screen->buffer_flush_mapped_range(screen, buffer, offset, length); +   return trace_resource_create(tr_scr, result);  } -static void -trace_screen_buffer_unmap(struct pipe_screen *_screen, -                          struct pipe_buffer *_buffer) -{ -   struct trace_screen *tr_scr = trace_screen(_screen); -   struct trace_buffer *tr_buf = trace_buffer(_buffer); -   struct pipe_screen *screen = tr_scr->screen; -   struct pipe_buffer *buffer = tr_buf->buffer; - -   if (tr_buf->map && !tr_buf->range_flushed) -      buffer_write(screen, buffer, 0, tr_buf->map, buffer->size); -   tr_buf->map = NULL; -   tr_buf->range_flushed = FALSE; -   screen->buffer_unmap(screen, buffer); -} - - -static void -trace_screen_buffer_destroy(struct pipe_buffer *_buffer) -{ -   struct trace_screen *tr_scr = trace_screen(_buffer->screen); -   struct trace_buffer *tr_buf = trace_buffer(_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); - -   trace_dump_call_end(); - -   trace_buffer_destroy(tr_scr, _buffer); -}  /******************************************************************** @@ -930,32 +564,22 @@ trace_screen_create(struct pipe_screen *screen)     tr_scr->base.is_format_supported = trace_screen_is_format_supported;     assert(screen->context_create);     tr_scr->base.context_create = trace_screen_context_create; -   tr_scr->base.texture_create = trace_screen_texture_create; -   tr_scr->base.texture_blanket = trace_screen_texture_blanket; -   tr_scr->base.texture_destroy = trace_screen_texture_destroy; +   tr_scr->base.resource_create = trace_screen_resource_create; +   tr_scr->base.resource_from_handle = trace_screen_resource_from_handle; +   tr_scr->base.resource_get_handle = trace_screen_resource_get_handle; +   tr_scr->base.resource_destroy = trace_screen_resource_destroy;     tr_scr->base.get_tex_surface = trace_screen_get_tex_surface;     tr_scr->base.tex_surface_destroy = trace_screen_tex_surface_destroy; -   tr_scr->base.get_tex_transfer = trace_screen_get_tex_transfer; -   tr_scr->base.tex_transfer_destroy = trace_screen_tex_transfer_destroy; -   tr_scr->base.transfer_map = trace_screen_transfer_map; -   tr_scr->base.transfer_unmap = trace_screen_transfer_unmap; -   tr_scr->base.buffer_create = trace_screen_buffer_create;     tr_scr->base.user_buffer_create = trace_screen_user_buffer_create; -   tr_scr->base.surface_buffer_create = trace_screen_surface_buffer_create; -   if (screen->buffer_map) -      tr_scr->base.buffer_map = trace_screen_buffer_map; -   if (screen->buffer_map_range) -      tr_scr->base.buffer_map_range = trace_screen_buffer_map_range; -   if (screen->buffer_flush_mapped_range) -      tr_scr->base.buffer_flush_mapped_range = trace_screen_buffer_flush_mapped_range; -   if (screen->buffer_unmap) -      tr_scr->base.buffer_unmap = trace_screen_buffer_unmap; -   tr_scr->base.buffer_destroy = trace_screen_buffer_destroy;     tr_scr->base.fence_reference = trace_screen_fence_reference;     tr_scr->base.fence_signalled = trace_screen_fence_signalled;     tr_scr->base.fence_finish = trace_screen_fence_finish;     tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer; +     tr_scr->screen = screen; +   tr_scr->private_context = screen->context_create(screen, NULL); +   if (tr_scr->private_context == NULL) +      goto error3;     trace_dump_ret(ptr, screen);     trace_dump_call_end(); @@ -965,10 +589,8 @@ trace_screen_create(struct pipe_screen *screen)     return &tr_scr->base; -#if 0  error3:     FREE(tr_scr); -#endif  error2:     trace_dump_ret(ptr, screen);     trace_dump_call_end(); diff --git a/src/gallium/drivers/trace/tr_screen.h b/src/gallium/drivers/trace/tr_screen.h index fe5a0fa190..05ff9ef61f 100644 --- a/src/gallium/drivers/trace/tr_screen.h +++ b/src/gallium/drivers/trace/tr_screen.h @@ -48,7 +48,7 @@ struct tr_list {   * without mapping/unmapping. This flag marks user buffers, so that their   * contents can be dumpped before being used by the pipe context.   */ -#define TRACE_BUFFER_USAGE_USER  (1 << 31) +#define TRACE_FLAG_USER_BUFFER  (1 << 31)  struct trace_screen @@ -56,6 +56,7 @@ struct trace_screen     struct pipe_screen base;     struct pipe_screen *screen; +   struct pipe_context *private_context;     /* remote debugger */     struct trace_rbug *rbug; @@ -99,13 +100,6 @@ trace_enabled(void);  struct trace_screen *  trace_screen(struct pipe_screen *screen); -struct pipe_screen * -trace_screen_create(struct pipe_screen *screen); - -void -trace_screen_user_buffer_update(struct pipe_screen *screen, -                                struct pipe_buffer *buffer); -  #define trace_screen_add_to_list(tr_scr, name, obj) \     do {                                             \        pipe_mutex_lock(tr_scr->list_mutex);          \ diff --git a/src/gallium/drivers/trace/tr_texture.c b/src/gallium/drivers/trace/tr_texture.c index 5321d68ec0..1132dc9272 100644 --- a/src/gallium/drivers/trace/tr_texture.c +++ b/src/gallium/drivers/trace/tr_texture.c @@ -31,54 +31,54 @@  #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_texture *tr_tex) +trace_resource_destroy(struct trace_screen *tr_scr, +		       struct trace_resource *tr_tex)  { -   struct trace_screen *tr_scr = trace_screen(tr_tex->base.screen); -     trace_screen_remove_from_list(tr_scr, textures, tr_tex); -   pipe_texture_reference(&tr_tex->texture, NULL); +   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); @@ -87,7 +87,7 @@ trace_surface_create(struct trace_texture *tr_tex,     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) @@ -97,7 +97,7 @@ trace_surface_create(struct trace_texture *tr_tex,     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); @@ -117,15 +117,16 @@ trace_surface_destroy(struct trace_surface *tr_surf)     trace_screen_remove_from_list(tr_scr, surfaces, tr_surf); -   pipe_texture_reference(&tr_surf->base.texture, NULL); +   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_texture *tr_tex, -                     struct pipe_transfer *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; @@ -133,7 +134,7 @@ trace_transfer_create(struct trace_texture *tr_tex,     if(!transfer)        goto error; -   assert(transfer->texture == tr_tex->texture); +   assert(transfer->resource == tr_tex->resource);     tr_trans = CALLOC_STRUCT(trace_transfer);     if(!tr_trans) @@ -141,31 +142,34 @@ trace_transfer_create(struct trace_texture *tr_tex,     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->base.resource = NULL;     tr_trans->transfer = transfer; -   assert(tr_trans->base.texture == &tr_tex->base); + +   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: -   transfer->texture->screen->tex_transfer_destroy(transfer); +   tr_ctx->pipe->transfer_destroy(tr_ctx->pipe, transfer);     return NULL;  }  void -trace_transfer_destroy(struct trace_transfer *tr_trans) +trace_transfer_destroy(struct trace_context *tr_context, +                       struct trace_transfer *tr_trans)  { -   struct trace_screen *tr_scr = trace_screen(tr_trans->base.texture->screen); -   struct pipe_screen *screen = tr_trans->transfer->texture->screen; +   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_texture_reference(&tr_trans->base.texture, NULL); -   screen->tex_transfer_destroy(tr_trans->transfer); +   pipe_resource_reference(&tr_trans->base.resource, NULL); +   context->transfer_destroy(context, transfer);     FREE(tr_trans);  } diff --git a/src/gallium/drivers/trace/tr_texture.h b/src/gallium/drivers/trace/tr_texture.h index 395e523e73..6513995d50 100644 --- a/src/gallium/drivers/trace/tr_texture.h +++ b/src/gallium/drivers/trace/tr_texture.h @@ -34,12 +34,13 @@  #include "tr_screen.h" +struct trace_context; -struct trace_texture +struct trace_resource  { -   struct pipe_texture base; +   struct pipe_resource base; -   struct pipe_texture *texture; +   struct pipe_resource *resource;     struct tr_list list;  }; @@ -55,11 +56,20 @@ struct trace_surface  }; +struct trace_sampler_view +{ +   struct pipe_sampler_view base; + +   struct pipe_sampler_view *sampler_view; +}; + +  struct trace_transfer  {     struct pipe_transfer base;     struct pipe_transfer *transfer; +   struct pipe_context *pipe;     struct tr_list list; @@ -67,13 +77,13 @@ struct trace_transfer  }; -static INLINE struct trace_texture * -trace_texture(struct pipe_texture *texture) +static INLINE struct trace_resource * +trace_resource(struct pipe_resource *texture)  {     if(!texture)        return NULL;     (void)trace_screen(texture->screen); -   return (struct trace_texture *)texture; +   return (struct trace_resource *)texture;  } @@ -82,41 +92,53 @@ trace_surface(struct pipe_surface *surface)  {     if(!surface)        return NULL; -   (void)trace_texture(surface->texture); +   (void)trace_resource(surface->texture);     return (struct trace_surface *)surface;  } +static INLINE struct trace_sampler_view * +trace_sampler_view(struct pipe_sampler_view *sampler_view) +{ +   if (!sampler_view) +      return NULL; +   return (struct trace_sampler_view *)sampler_view; +} + +  static INLINE struct trace_transfer *  trace_transfer(struct pipe_transfer *transfer)  {     if(!transfer)        return NULL; -   (void)trace_texture(transfer->texture); +   (void)trace_resource(transfer->resource);     return (struct trace_transfer *)transfer;  } -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);  void -trace_texture_destroy(struct trace_texture *tr_tex); +trace_resource_destroy(struct trace_screen *tr_scr, +		       struct trace_resource *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);  void  trace_surface_destroy(struct trace_surface *tr_surf);  struct pipe_transfer * -trace_transfer_create(struct trace_texture *tr_tex, -                      struct pipe_transfer *transfer); +trace_transfer_create(struct trace_context *tr_ctx, +		      struct trace_resource *tr_tex, +		      struct pipe_transfer *transfer);  void -trace_transfer_destroy(struct trace_transfer *tr_trans); +trace_transfer_destroy(struct trace_context *tr_ctx, +                       struct trace_transfer *tr_trans);  #endif /* TR_TEXTURE_H_ */  | 
