Merge branch 'mesa_7_5_branch'
[mesa.git] / src / gallium / drivers / trace / tr_screen.c
index 8e7e033d5145317b8a7853fbdf8eb481486b5b60..920f418ebf0665a0a3bcb4b1998c683ce6825c41 100644 (file)
  **************************************************************************/
 
 #include "util/u_memory.h"
+#include "util/u_simple_list.h"
 
+#include "tr_buffer.h"
 #include "tr_dump.h"
-#include "tr_state.h"
+#include "tr_dump_state.h"
 #include "tr_texture.h"
 #include "tr_screen.h"
 
 #include "pipe/p_inlines.h"
 
+
+static boolean trace = FALSE;
+
 static const char *
 trace_screen_get_name(struct pipe_screen *_screen)
 {
@@ -157,12 +162,11 @@ trace_screen_flush_frontbuffer(struct pipe_screen *_screen,
                                void *context_private)
 {
    struct trace_screen *tr_scr = trace_screen(_screen);
-   struct trace_texture *tr_tex = trace_texture(tr_scr, _surface->texture);
-   struct trace_surface *tr_surf = trace_surface(tr_tex, _surface);
+   struct trace_surface *tr_surf = trace_surface(_surface);
    struct pipe_screen *screen = tr_scr->screen;
    struct pipe_surface *surface = tr_surf->surface;
 
-   trace_dump_call_begin("pipe_winsys", "flush_frontbuffer");
+   trace_dump_call_begin("pipe_screen", "flush_frontbuffer");
 
    trace_dump_arg(ptr, screen);
    trace_dump_arg(ptr, surface);
@@ -210,10 +214,12 @@ static struct pipe_texture *
 trace_screen_texture_blanket(struct pipe_screen *_screen,
                              const struct pipe_texture *templat,
                              const unsigned *ppitch,
-                             struct pipe_buffer *buffer)
+                             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;
    unsigned pitch = *ppitch;
    struct pipe_texture *result;
 
@@ -240,7 +246,7 @@ static void
 trace_screen_texture_destroy(struct pipe_texture *_texture)
 {
    struct trace_screen *tr_scr = trace_screen(_texture->screen);
-   struct trace_texture *tr_tex = trace_texture(tr_scr, _texture);
+   struct trace_texture *tr_tex = trace_texture(_texture);
    struct pipe_screen *screen = tr_scr->screen;
    struct pipe_texture *texture = tr_tex->texture;
 
@@ -253,7 +259,7 @@ trace_screen_texture_destroy(struct pipe_texture *_texture)
 
    trace_dump_call_end();
 
-   trace_texture_destroy(tr_scr, _texture);
+   trace_texture_destroy(tr_tex);
 }
 
 
@@ -270,7 +276,7 @@ trace_screen_get_tex_surface(struct pipe_screen *_screen,
                              unsigned usage)
 {
    struct trace_screen *tr_scr = trace_screen(_screen);
-   struct trace_texture *tr_tex = trace_texture(tr_scr, _texture);
+   struct trace_texture *tr_tex = trace_texture(_texture);
    struct pipe_screen *screen = tr_scr->screen;
    struct pipe_texture *texture = tr_tex->texture;
    struct pipe_surface *result = NULL;
@@ -302,8 +308,7 @@ static void
 trace_screen_tex_surface_destroy(struct pipe_surface *_surface)
 {
    struct trace_screen *tr_scr = trace_screen(_surface->texture->screen);
-   struct trace_texture *tr_tex = trace_texture(tr_scr, _surface->texture);
-   struct trace_surface *tr_surf = trace_surface(tr_tex, _surface);
+   struct trace_surface *tr_surf = trace_surface(_surface);
    struct pipe_screen *screen = tr_scr->screen;
    struct pipe_surface *surface = tr_surf->surface;
 
@@ -314,7 +319,7 @@ trace_screen_tex_surface_destroy(struct pipe_surface *_surface)
 
    trace_dump_call_end();
 
-   trace_surface_destroy(tr_tex, _surface);
+   trace_surface_destroy(tr_surf);
 }
 
 
@@ -332,7 +337,7 @@ trace_screen_get_tex_transfer(struct pipe_screen *_screen,
                               unsigned x, unsigned y, unsigned w, unsigned h)
 {
    struct trace_screen *tr_scr = trace_screen(_screen);
-   struct trace_texture *tr_tex = trace_texture(tr_scr, _texture);
+   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;
@@ -370,10 +375,9 @@ static void
 trace_screen_tex_transfer_destroy(struct pipe_transfer *_transfer)
 {
    struct trace_screen *tr_scr = trace_screen(_transfer->texture->screen);
-   struct trace_texture *tr_tex = trace_texture(tr_scr, _transfer->texture);
-   struct trace_transfer *tr_tran = trace_transfer(tr_tex, _transfer);
+   struct trace_transfer *tr_trans = trace_transfer(_transfer);
    struct pipe_screen *screen = tr_scr->screen;
-   struct pipe_transfer *transfer = tr_tran->transfer;
+   struct pipe_transfer *transfer = tr_trans->transfer;
 
    trace_dump_call_begin("pipe_screen", "tex_transfer_destroy");
 
@@ -382,7 +386,7 @@ trace_screen_tex_transfer_destroy(struct pipe_transfer *_transfer)
 
    trace_dump_call_end();
 
-   trace_transfer_destroy(tr_tex, _transfer);
+   trace_transfer_destroy(tr_trans);
 }
 
 
@@ -391,8 +395,7 @@ trace_screen_transfer_map(struct pipe_screen *_screen,
                           struct pipe_transfer *_transfer)
 {
    struct trace_screen *tr_scr = trace_screen(_screen);
-   struct trace_texture *tr_tex = trace_texture(tr_scr, _transfer->texture);
-   struct trace_transfer *tr_trans = trace_transfer(tr_tex, _transfer);
+   struct trace_transfer *tr_trans = trace_transfer(_transfer);
    struct pipe_screen *screen = tr_scr->screen;
    struct pipe_transfer *transfer = tr_trans->transfer;
    void *map;
@@ -414,8 +417,7 @@ trace_screen_transfer_unmap(struct pipe_screen *_screen,
                            struct pipe_transfer *_transfer)
 {
    struct trace_screen *tr_scr = trace_screen(_screen);
-   struct trace_texture *tr_tex = trace_texture(tr_scr, _transfer->texture);
-   struct trace_transfer *tr_trans = trace_transfer(tr_tex, _transfer);
+   struct trace_transfer *tr_trans = trace_transfer(_transfer);
    struct pipe_screen *screen = tr_scr->screen;
    struct pipe_transfer *transfer = tr_trans->transfer;
 
@@ -428,14 +430,14 @@ trace_screen_transfer_unmap(struct pipe_screen *_screen,
 
       trace_dump_arg(ptr, transfer);
 
-      trace_dump_arg_begin("data");
-      trace_dump_bytes(tr_trans->map, size);
-      trace_dump_arg_end();
-
       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();
@@ -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);
 }
 
 
@@ -552,14 +554,12 @@ trace_screen_user_buffer_create(struct pipe_screen *_screen,
 
    trace_dump_call_end();
 
-   /* XXX: Mark the user buffers. (we should wrap pipe_buffers, but is is
-    * impossible to do so while texture-less surfaces are still around */
    if(result) {
       assert(!(result->usage & TRACE_BUFFER_USAGE_USER));
       result->usage |= TRACE_BUFFER_USAGE_USER;
    }
 
-   return result;
+   return trace_buffer_create(tr_scr, result);
 }
 
 
@@ -569,7 +569,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,31 +604,22 @@ 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(_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");
-
-   trace_dump_arg(ptr, screen);
-   trace_dump_arg(ptr, buffer);
-   trace_dump_arg(uint, usage);
-
    assert(screen->buffer_map);
    map = screen->buffer_map(screen, buffer, usage);
-
-   trace_dump_ret(ptr, map);
-#if 0
    if(map) {
       if(usage & PIPE_BUFFER_USAGE_CPU_WRITE) {
-         assert(!hash_table_get(tr_ws->buffer_maps, buffer));
-         hash_table_set(tr_ws->buffer_maps, buffer, map);
+         tr_buf->map = map;
       }
    }
-#endif
 
    return map;
 }
@@ -636,133 +627,135 @@ 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(_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");
+   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;
+      }
+   }
+
+   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(uint, length);
-   trace_dump_arg(uint, usage);
 
-   assert(screen->buffer_map_range);
-   map = screen->buffer_map_range(screen, buffer, offset, length, usage);
+   trace_dump_arg_begin("data");
+   trace_dump_bytes(map + offset, size);
+   trace_dump_arg_end();
 
-   trace_dump_ret(ptr, map);
+   trace_dump_arg(uint, size);
 
    trace_dump_call_end();
 
-   return map;
 }
 
 
 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(_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");
-
-   trace_dump_arg(ptr, screen);
-   trace_dump_arg(ptr, buffer);
-   trace_dump_arg(uint, offset);
-   trace_dump_arg(uint, length);
-
-   assert(screen->buffer_flush_mapped_range);
+   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);
-
-   trace_dump_call_end();
 }
 
 
 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(_buffer);
    struct pipe_screen *screen = tr_scr->screen;
-#if 0
-   const void *map;
-
-   map = hash_table_get(tr_ws->buffer_maps, buffer);
-   if(map) {
-      trace_dump_call_begin("pipe_winsys", "buffer_write");
-
-      trace_dump_arg(ptr, winsys);
-
-      trace_dump_arg(ptr, buffer);
-
-      trace_dump_arg_begin("data");
-      trace_dump_bytes(map, buffer->size);
-      trace_dump_arg_end();
-
-      trace_dump_arg_begin("size");
-      trace_dump_uint(buffer->size);
-      trace_dump_arg_end();
-
-      trace_dump_call_end();
-
-      hash_table_remove(tr_ws->buffer_maps, buffer);
-   }
-#endif
-
-   trace_dump_call_begin("pipe_screen", "buffer_flush_mapped_range");
-
-   trace_dump_arg(ptr, screen);
-   trace_dump_arg(ptr, buffer);
+   struct pipe_buffer *buffer = tr_buf->buffer;
 
-   assert(screen->buffer_unmap);
+   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);
-
-   trace_dump_call_end();
 }
 
 
 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(_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,
+                             struct pipe_fence_handle **pdst,
                              struct pipe_fence_handle *src)
 {
    struct trace_screen *tr_scr = trace_screen(_screen);
    struct pipe_screen *screen = tr_scr->screen;
+   struct pipe_fence_handle *dst;
 
+   assert(pdst);
+   dst = *pdst;
+   
    trace_dump_call_begin("pipe_screen", "fence_reference");
 
    trace_dump_arg(ptr, screen);
    trace_dump_arg(ptr, dst);
    trace_dump_arg(ptr, src);
 
-   screen->fence_reference(screen, dst, src);
+   screen->fence_reference(screen, pdst, src);
 
    trace_dump_call_end();
 }
@@ -771,7 +764,7 @@ trace_screen_fence_reference(struct pipe_screen *_screen,
 static int
 trace_screen_fence_signalled(struct pipe_screen *_screen,
                              struct pipe_fence_handle *fence,
-                             unsigned flag)
+                             unsigned flags)
 {
    struct trace_screen *tr_scr = trace_screen(_screen);
    struct pipe_screen *screen = tr_scr->screen;
@@ -781,9 +774,9 @@ trace_screen_fence_signalled(struct pipe_screen *_screen,
 
    trace_dump_arg(ptr, screen);
    trace_dump_arg(ptr, fence);
-   trace_dump_arg(uint, flag);
+   trace_dump_arg(uint, flags);
 
-   result = screen->fence_signalled(screen, fence, flag);
+   result = screen->fence_signalled(screen, fence, flags);
 
    trace_dump_ret(int, result);
 
@@ -796,7 +789,7 @@ trace_screen_fence_signalled(struct pipe_screen *_screen,
 static int
 trace_screen_fence_finish(struct pipe_screen *_screen,
                           struct pipe_fence_handle *fence,
-                          unsigned flag)
+                          unsigned flags)
 {
    struct trace_screen *tr_scr = trace_screen(_screen);
    struct pipe_screen *screen = tr_scr->screen;
@@ -806,9 +799,9 @@ trace_screen_fence_finish(struct pipe_screen *_screen,
 
    trace_dump_arg(ptr, screen);
    trace_dump_arg(ptr, fence);
-   trace_dump_arg(uint, flag);
+   trace_dump_arg(uint, flags);
 
-   result = screen->fence_finish(screen, fence, flag);
+   result = screen->fence_finish(screen, fence, flags);
 
    trace_dump_ret(int, result);
 
@@ -829,29 +822,47 @@ trace_screen_destroy(struct pipe_screen *_screen)
    struct pipe_screen *screen = tr_scr->screen;
 
    trace_dump_call_begin("pipe_screen", "destroy");
-
    trace_dump_arg(ptr, screen);
-
-   screen->destroy(screen);
-
    trace_dump_call_end();
-
    trace_dump_trace_end();
 
+   if (tr_scr->rbug)
+      trace_rbug_stop(tr_scr->rbug);
+
+   screen->destroy(screen);
+
    FREE(tr_scr);
 }
 
+boolean
+trace_enabled(void)
+{
+   return trace;
+}
 
 struct pipe_screen *
 trace_screen_create(struct pipe_screen *screen)
 {
    struct trace_screen *tr_scr;
    struct pipe_winsys *winsys;
+   boolean rbug = FALSE;
 
    if(!screen)
       goto error1;
 
-   if(!trace_dump_trace_begin())
+   trace_dump_init();
+
+   if(trace_dump_trace_begin()) {
+      trace_dumping_start();
+      trace = TRUE;
+   }
+
+   if (debug_get_bool_option("GALLIUM_RBUG", FALSE)) {
+      trace = TRUE;
+      rbug = TRUE;
+   }
+
+   if (!trace)
       goto error1;
 
    trace_dump_call_begin("", "pipe_screen_create");
@@ -867,6 +878,12 @@ trace_screen_create(struct pipe_screen *screen)
 #else
    winsys = screen->winsys;
 #endif
+   pipe_mutex_init(tr_scr->list_mutex);
+   make_empty_list(&tr_scr->buffers);
+   make_empty_list(&tr_scr->contexts);
+   make_empty_list(&tr_scr->textures);
+   make_empty_list(&tr_scr->surfaces);
+   make_empty_list(&tr_scr->transfers);
 
    tr_scr->base.winsys = winsys;
    tr_scr->base.destroy = trace_screen_destroy;
@@ -905,6 +922,9 @@ trace_screen_create(struct pipe_screen *screen)
    trace_dump_ret(ptr, screen);
    trace_dump_call_end();
 
+   if (rbug)
+      tr_scr->rbug = trace_rbug_start(tr_scr);
+
    return &tr_scr->base;
 
 #if 0