From abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4f Mon Sep 17 00:00:00 2001
From: Jakob Bornecrantz <wallbraker@gmail.com>
Date: Sat, 12 Jun 2010 14:09:59 +0200
Subject: i915g: Rework debug print code

---
 src/gallium/drivers/i915/i915_blit.c          | 17 +++--
 src/gallium/drivers/i915/i915_context.h       |  2 -
 src/gallium/drivers/i915/i915_debug.c         | 89 +++++++++++++++++++++++++++
 src/gallium/drivers/i915/i915_debug.h         | 88 ++++++++------------------
 src/gallium/drivers/i915/i915_debug_fp.c      |  1 +
 src/gallium/drivers/i915/i915_debug_private.h | 45 ++++++++++++++
 src/gallium/drivers/i915/i915_flush.c         |  5 +-
 src/gallium/drivers/i915/i915_screen.c        |  3 +
 src/gallium/drivers/i915/i915_state_derived.c |  4 ++
 src/gallium/drivers/i915/i915_state_dynamic.c |  1 -
 src/gallium/drivers/i915/i915_state_emit.c    | 17 +++--
 11 files changed, 190 insertions(+), 82 deletions(-)
 create mode 100644 src/gallium/drivers/i915/i915_debug_private.h

(limited to 'src/gallium')

diff --git a/src/gallium/drivers/i915/i915_blit.c b/src/gallium/drivers/i915/i915_blit.c
index c5b5979bf98..0a1b3e0d66b 100644
--- a/src/gallium/drivers/i915/i915_blit.c
+++ b/src/gallium/drivers/i915/i915_blit.c
@@ -31,7 +31,6 @@
 #include "i915_batch.h"
 #include "i915_debug.h"
 
-#define FILE_DEBUG_FLAG DEBUG_BLIT
 
 void
 i915_fill_blit(struct i915_context *i915,
@@ -47,10 +46,8 @@ i915_fill_blit(struct i915_context *i915,
    unsigned BR13, CMD;
 
 
-   I915_DBG(i915,
-      "%s dst:buf(%p)/%d+%d %d,%d sz:%dx%d\n",
-      __FUNCTION__,
-      dst_buffer, dst_pitch, dst_offset, x, y, w, h);
+   I915_DBG(DBG_BLIT, "%s dst:buf(%p)/%d+%d %d,%d sz:%dx%d\n",
+            __FUNCTION__, dst_buffer, dst_pitch, dst_offset, x, y, w, h);
 
    switch (cpp) {
    case 1:
@@ -100,11 +97,11 @@ i915_copy_blit(struct i915_context *i915,
    int dst_x2 = dst_x + w;
 
 
-   I915_DBG(i915,
-      "%s src:buf(%p)/%d+%d %d,%d dst:buf(%p)/%d+%d %d,%d sz:%dx%d\n",
-      __FUNCTION__,
-      src_buffer, src_pitch, src_offset, src_x, src_y,
-      dst_buffer, dst_pitch, dst_offset, dst_x, dst_y, w, h);
+   I915_DBG(DBG_BLIT,
+            "%s src:buf(%p)/%d+%d %d,%d dst:buf(%p)/%d+%d %d,%d sz:%dx%d\n",
+            __FUNCTION__,
+            src_buffer, src_pitch, src_offset, src_x, src_y,
+            dst_buffer, dst_pitch, dst_offset, dst_x, dst_y, w, h);
 
    switch (cpp) {
    case 1:
diff --git a/src/gallium/drivers/i915/i915_context.h b/src/gallium/drivers/i915/i915_context.h
index acc0ffe037f..ac02ab23325 100644
--- a/src/gallium/drivers/i915/i915_context.h
+++ b/src/gallium/drivers/i915/i915_context.h
@@ -237,8 +237,6 @@ struct i915_context
 
    struct i915_state current;
    unsigned hardware_dirty;
-   
-   unsigned debug;
 };
 
 /* A flag for each state_tracker state object:
diff --git a/src/gallium/drivers/i915/i915_debug.c b/src/gallium/drivers/i915/i915_debug.c
index 663fac3055c..57d3390dea3 100644
--- a/src/gallium/drivers/i915/i915_debug.c
+++ b/src/gallium/drivers/i915/i915_debug.c
@@ -27,11 +27,37 @@
 
 #include "i915_reg.h"
 #include "i915_context.h"
+#include "i915_screen.h"
 #include "i915_debug.h"
+#include "i915_debug_private.h"
 #include "i915_batch.h"
 #include "util/u_debug.h"
 
 
+
+static const struct debug_named_value debug_options[] = {
+   {"blit",      DBG_BLIT,      "Print when using the 2d blitter"},
+   {"emit",      DBG_EMIT,      "State emit information"},
+   {"atoms",     DBG_ATOMS,     "Print dirty state atoms"},
+   {"flush",     DBG_FLUSH,     "Flushing information"},
+   {"texture",   DBG_TEXTURE,   "Texture information"},
+   {"constants", DBG_CONSTANTS, "Constant buffers"},
+   DEBUG_NAMED_VALUE_END
+};
+
+unsigned i915_debug = 0;
+
+void i915_debug_init(struct i915_screen *screen)
+{
+   i915_debug = debug_get_flags_option("I915_DEBUG", debug_options, 0);
+}
+
+
+
+/***********************************************************************
+ * Batchbuffer dumping
+ */
+
 static void
 PRINTF(
    struct debug_stream  *stream,
@@ -896,3 +922,66 @@ i915_dump_batchbuffer( struct i915_winsys_batchbuffer *batch )
 }
 
 
+
+/***********************************************************************
+ * Dirty state atom dumping
+ */
+
+void
+i915_dump_dirty(struct i915_context *i915, const char *func)
+{
+   struct {
+      unsigned dirty;
+      const char *name;
+   } l[] = {
+      {I915_NEW_VIEWPORT,      "viewport"},
+      {I915_NEW_RASTERIZER,    "rasterizer"},
+      {I915_NEW_FS,            "fs"},
+      {I915_NEW_BLEND,         "blend"},
+      {I915_NEW_CLIP,          "clip"},
+      {I915_NEW_SCISSOR,       "scissor"},
+      {I915_NEW_STIPPLE,       "stipple"},
+      {I915_NEW_FRAMEBUFFER,   "framebuffer"},
+      {I915_NEW_ALPHA_TEST,    "alpha_test"},
+      {I915_NEW_DEPTH_STENCIL, "depth_stencil"},
+      {I915_NEW_SAMPLER,       "sampler"},
+      {I915_NEW_SAMPLER_VIEW,  "sampler_view"},
+      {I915_NEW_CONSTANTS,     "constants"},
+      {I915_NEW_VBO,           "vbo"},
+      {I915_NEW_VS,            "vs"},
+      {0, NULL},
+   };
+   int i;
+
+   debug_printf("%s: ", func);
+   for (i = 0; l[i].name; i++)
+      if (i915->dirty & l[i].dirty)
+         debug_printf("%s ", l[i].name);
+   debug_printf("\n");
+}
+
+void
+i915_dump_hardware_dirty(struct i915_context *i915, const char *func)
+{
+   struct {
+      unsigned dirty;
+      const char *name;
+   } l[] = {
+      {I915_HW_STATIC,    "static"},
+      {I915_HW_DYNAMIC,   "dynamic"},
+      {I915_HW_SAMPLER,   "sampler"},
+      {I915_HW_MAP,       "map"},
+      {I915_HW_PROGRAM,   "program"},
+      {I915_HW_CONSTANTS, "constants"},
+      {I915_HW_IMMEDIATE, "immediate"},
+      {I915_HW_INVARIENT, "invarient"},
+      {0, NULL},
+   };
+   int i;
+
+   debug_printf("%s: ", func);
+   for (i = 0; l[i].name; i++)
+      if (i915->hardware_dirty & l[i].dirty)
+         debug_printf("%s ", l[i].name);
+   debug_printf("\n");
+}
diff --git a/src/gallium/drivers/i915/i915_debug.h b/src/gallium/drivers/i915/i915_debug.h
index 67b8d9c2f63..8aa09f9c1f2 100644
--- a/src/gallium/drivers/i915/i915_debug.h
+++ b/src/gallium/drivers/i915/i915_debug.h
@@ -26,89 +26,51 @@
  **************************************************************************/
 
 /* Authors:  Keith Whitwell <keith@tungstengraphics.com>
+ *           Jakob Bornecrantz <wallbraker@gmail.com>
  */
 
 #ifndef I915_DEBUG_H
 #define I915_DEBUG_H
 
-#include <stdarg.h>
+#include "util/u_debug.h"
 
+struct i915_screen;
 struct i915_context;
+struct i915_winsys_batchbuffer;
 
-struct debug_stream 
-{
-   unsigned offset;		/* current gtt offset */
-   char *ptr;		/* pointer to gtt offset zero */
-   char *end;		/* pointer to gtt offset zero */
-   unsigned print_addresses;
-};
-
-
-/* Internal functions
- */
-void i915_disassemble_program(struct debug_stream *stream, 
-			      const unsigned *program, unsigned sz);
-
-void i915_print_ureg(const char *msg, unsigned ureg);
-
-
-#define DEBUG_BATCH	 0x1
-#define DEBUG_BLIT       0x2
-#define DEBUG_BUFFER     0x4
-#define DEBUG_CONSTANTS  0x8
-#define DEBUG_CONTEXT    0x10
-#define DEBUG_DRAW	 0x20
-#define DEBUG_DYNAMIC	 0x40
-#define DEBUG_FLUSH      0x80
-#define DEBUG_MAP	 0x100
-#define DEBUG_PROGRAM	 0x200
-#define DEBUG_REGIONS    0x400
-#define DEBUG_SAMPLER	 0x800
-#define DEBUG_STATIC	 0x1000
-#define DEBUG_SURFACE    0x2000
-#define DEBUG_WINSYS     0x4000
-
-#include "pipe/p_compiler.h"
+#define DBG_BLIT      0x1
+#define DBG_EMIT      0x2
+#define DBG_ATOMS     0x4
+#define DBG_FLUSH     0x8
+#define DBG_TEXTURE   0x10
+#define DBG_CONSTANTS 0x20
 
-#if defined(DEBUG) && defined(FILE_DEBUG_FLAG)
+extern unsigned i915_debug;
 
-#include "util/u_simple_screen.h"
+static INLINE boolean
+I915_DBG_ON(unsigned flags)
+{
+   return i915_debug & flags;
+}
 
 static INLINE void
-I915_DBG(
-   struct i915_context  *i915,
-   const char           *fmt,
-                        ... )
+I915_DBG(unsigned flags, const char *fmt, ...)
 {
-   if ((i915)->debug & FILE_DEBUG_FLAG) {
+   if (I915_DBG_ON(flags)) {
       va_list  args;
 
-      va_start( args, fmt );
-      debug_vprintf( fmt, args );
-      va_end( args );
+      va_start(args, fmt);
+      debug_vprintf(fmt, args);
+      va_end(args);
    }
 }
 
-#else
-
-static INLINE void
-I915_DBG(
-   struct i915_context  *i915,
-   const char           *fmt,
-                        ... )
-{
-   (void) i915;
-   (void) fmt;
-}
-
-#endif
-
-
-struct i915_winsys_batchbuffer;
+void i915_debug_init(struct i915_screen *i915);
 
-void i915_dump_batchbuffer( struct i915_winsys_batchbuffer *i915 );
+void i915_dump_batchbuffer(struct i915_winsys_batchbuffer *i915);
 
-void i915_debug_init( struct i915_context *i915 );
+void i915_dump_dirty(struct i915_context *i915, const char *func);
 
+void i915_dump_hardware_dirty(struct i915_context *i915, const char *func);
 
 #endif
diff --git a/src/gallium/drivers/i915/i915_debug_fp.c b/src/gallium/drivers/i915/i915_debug_fp.c
index f41c51f2991..50f49c540fe 100644
--- a/src/gallium/drivers/i915/i915_debug_fp.c
+++ b/src/gallium/drivers/i915/i915_debug_fp.c
@@ -28,6 +28,7 @@
 
 #include "i915_reg.h"
 #include "i915_debug.h"
+#include "i915_debug_private.h"
 #include "util/u_debug.h"
 
 
diff --git a/src/gallium/drivers/i915/i915_debug_private.h b/src/gallium/drivers/i915/i915_debug_private.h
new file mode 100644
index 00000000000..b3668d08482
--- /dev/null
+++ b/src/gallium/drivers/i915/i915_debug_private.h
@@ -0,0 +1,45 @@
+/**************************************************************************
+ * 
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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.
+ * 
+ **************************************************************************/
+
+/* Authors:  Keith Whitwell <keith@tungstengraphics.com>
+ */
+
+#ifndef I915_DEBUG_PRIVATE_H
+#define I915_DEBUG_PRIVATE_H
+
+struct debug_stream 
+{
+   unsigned offset;		/* current gtt offset */
+   char *ptr;		/* pointer to gtt offset zero */
+   char *end;		/* pointer to gtt offset zero */
+   unsigned print_addresses;
+};
+
+void i915_disassemble_program(struct debug_stream *stream, 
+			      const unsigned *program, unsigned sz);
+
+#endif
diff --git a/src/gallium/drivers/i915/i915_flush.c b/src/gallium/drivers/i915/i915_flush.c
index 1582168eba5..967146479d1 100644
--- a/src/gallium/drivers/i915/i915_flush.c
+++ b/src/gallium/drivers/i915/i915_flush.c
@@ -35,6 +35,7 @@
 #include "i915_context.h"
 #include "i915_reg.h"
 #include "i915_batch.h"
+#include "i915_debug.h"
 
 
 static void i915_flush( struct pipe_context *pipe,
@@ -76,9 +77,9 @@ static void i915_flush( struct pipe_context *pipe,
     */
    FLUSH_BATCH(fence);
    i915->vbo_flushed = 1;
-}
-
 
+   I915_DBG(DBG_FLUSH, "%s: #####\n", __FUNCTION__);
+}
 
 void i915_init_flush_functions( struct i915_context *i915 )
 {
diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
index f82426520cd..255538ebaa4 100644
--- a/src/gallium/drivers/i915/i915_screen.c
+++ b/src/gallium/drivers/i915/i915_screen.c
@@ -31,6 +31,7 @@
 #include "util/u_string.h"
 
 #include "i915_reg.h"
+#include "i915_debug.h"
 #include "i915_context.h"
 #include "i915_screen.h"
 #include "i915_surface.h"
@@ -330,5 +331,7 @@ i915_screen_create(struct i915_winsys *iws)
    i915_init_screen_resource_functions(is);
    i915_init_screen_surface_functions(is);
 
+   i915_debug_init(is);
+
    return &is->base;
 }
diff --git a/src/gallium/drivers/i915/i915_state_derived.c b/src/gallium/drivers/i915/i915_state_derived.c
index 5ebda94f6c4..c0595403571 100644
--- a/src/gallium/drivers/i915/i915_state_derived.c
+++ b/src/gallium/drivers/i915/i915_state_derived.c
@@ -32,6 +32,7 @@
 #include "draw/draw_vertex.h"
 #include "i915_context.h"
 #include "i915_state.h"
+#include "i915_debug.h"
 #include "i915_reg.h"
 
 
@@ -205,6 +206,9 @@ void i915_update_derived(struct i915_context *i915)
 {
    int i;
 
+   if (I915_DBG_ON(DBG_ATOMS))
+      i915_dump_dirty(i915, __FUNCTION__);
+
    for (i = 0; atoms[i]; i++)
       if (atoms[i]->dirty & i915->dirty)
          atoms[i]->update(i915);
diff --git a/src/gallium/drivers/i915/i915_state_dynamic.c b/src/gallium/drivers/i915/i915_state_dynamic.c
index d63d4a98ddc..d964483ac7e 100644
--- a/src/gallium/drivers/i915/i915_state_dynamic.c
+++ b/src/gallium/drivers/i915/i915_state_dynamic.c
@@ -34,7 +34,6 @@
 #include "util/u_memory.h"
 #include "util/u_pack_color.h"
 
-#define FILE_DEBUG_FLAG DEBUG_STATE
 
 /* State that we have chosen to store in the DYNAMIC segment of the
  * i915 indirect state mechanism.
diff --git a/src/gallium/drivers/i915/i915_state_emit.c b/src/gallium/drivers/i915/i915_state_emit.c
index 22082fece82..bbf9ff51f5f 100644
--- a/src/gallium/drivers/i915/i915_state_emit.c
+++ b/src/gallium/drivers/i915/i915_state_emit.c
@@ -29,6 +29,7 @@
 #include "i915_reg.h"
 #include "i915_context.h"
 #include "i915_batch.h"
+#include "i915_debug.h"
 #include "i915_reg.h"
 #include "i915_resource.h"
 
@@ -111,15 +112,20 @@ i915_emit_hardware_state(struct i915_context *i915 )
                              3
                            ) * 3/2; /* plus 50% margin */
 
-#if 0
-   debug_printf("i915_emit_hardware_state: %d dwords, %d relocs\n", dwords, relocs);
-#endif
-   
+   uintptr_t save_ptr;
+   size_t save_relocs;
+
+   if (I915_DBG_ON(DBG_ATOMS))
+      i915_dump_hardware_dirty(i915, __FUNCTION__);
+
    if(!BEGIN_BATCH(dwords, relocs)) {
       FLUSH_BATCH(NULL);
       assert(BEGIN_BATCH(dwords, relocs));
    }
 
+   save_ptr = (uintptr_t)i915->batch->ptr;
+   save_relocs = i915->batch->relocs;
+
    /* 14 dwords, 0 relocs */
    if (i915->hardware_dirty & I915_HW_INVARIENT)
    {
@@ -399,6 +405,9 @@ i915_emit_hardware_state(struct i915_context *i915 )
       OUT_BATCH(0);
    }
 
+   I915_DBG(DBG_EMIT, "%s: used %d dwords, %d relocs\n", __FUNCTION__,
+            ((uintptr_t)i915->batch->ptr - save_ptr) / 4,
+            i915->batch->relocs - save_relocs);
 
    i915->hardware_dirty = 0;
 }
-- 
cgit v1.2.3