@@ -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: |
@@ -237,8 +237,6 @@ struct i915_context | |||
struct i915_state current; | |||
unsigned hardware_dirty; | |||
unsigned debug; | |||
}; | |||
/* A flag for each state_tracker state object: |
@@ -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"); | |||
} |
@@ -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 |
@@ -28,6 +28,7 @@ | |||
#include "i915_reg.h" | |||
#include "i915_debug.h" | |||
#include "i915_debug_private.h" | |||
#include "util/u_debug.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 |
@@ -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 ) | |||
{ |
@@ -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; | |||
} |
@@ -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); |
@@ -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. |
@@ -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; | |||
} |