174 lines
5.5 KiB
C
174 lines
5.5 KiB
C
/*
|
|
* Copyright © 2009 Pauli Nieminen
|
|
* 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.
|
|
*/
|
|
/*
|
|
* Authors:
|
|
* Pauli Nieminen <suokkos@gmail.com>
|
|
*/
|
|
|
|
#ifndef RADEON_DEBUG_H_INCLUDED
|
|
#define RADEON_DEBUG_H_INCLUDED
|
|
|
|
#include <stdlib.h>
|
|
|
|
typedef enum radeon_debug_levels {
|
|
RADEON_CRITICAL = 0, /* Only errors */
|
|
RADEON_IMPORTANT = 1, /* Important warnings and messages */
|
|
RADEON_NORMAL = 2, /* Normal log messages usefull for debugging */
|
|
RADEON_VERBOSE = 3, /* Extra details to debugging */
|
|
RADEON_TRACE = 4 /* Log about everything that happens */
|
|
} radeon_debug_level_t;
|
|
|
|
/**
|
|
* Compile time option to change level of debugging compiled to dri driver.
|
|
* Selecting critical level is not recommended because perfromance gains are
|
|
* going to minimal but you will lose a lot of important warnings in case of
|
|
* errors.
|
|
*/
|
|
#ifndef RADEON_DEBUG_LEVEL
|
|
# ifdef DEBUG
|
|
# define RADEON_DEBUG_LEVEL RADEON_TRACE
|
|
# else
|
|
# define RADEON_DEBUG_LEVEL RADEON_VERBOSE
|
|
# endif
|
|
#endif
|
|
|
|
typedef enum radeon_debug_types {
|
|
RADEON_TEXTURE = 0x00001,
|
|
RADEON_STATE = 0x00002,
|
|
RADEON_IOCTL = 0x00004,
|
|
RADEON_RENDER = 0x00008,
|
|
RADEON_SWRENDER = 0x00010,
|
|
RADEON_FALLBACKS = 0x00020,
|
|
RADEON_VFMT = 0x00040,
|
|
RADEON_SHADER = 0x00080,
|
|
RADEON_CS = 0x00100,
|
|
RADEON_DRI = 0x00200,
|
|
RADEON_DMA = 0x00400,
|
|
RADEON_SANITY = 0x00800,
|
|
RADEON_SYNC = 0x01000,
|
|
RADEON_PIXEL = 0x02000,
|
|
RADEON_MEMORY = 0x04000,
|
|
RADEON_VERTS = 0x08000,
|
|
RADEON_GENERAL = 0x10000 /* Used for errors and warnings */
|
|
} radeon_debug_type_t;
|
|
|
|
#define RADEON_MAX_INDENT 5
|
|
|
|
struct radeon_debug {
|
|
size_t indent_depth;
|
|
char indent[RADEON_MAX_INDENT];
|
|
};
|
|
|
|
/**
|
|
* Compabibility layer for old debug code
|
|
**/
|
|
#if defined(RADEON_R200)
|
|
extern radeon_debug_type_t r200_enabled_debug_types;
|
|
#define RADEON_DEBUG r200_enabled_debug_types
|
|
#elif defined(RADEON_R100)
|
|
extern radeon_debug_type_t r100_enabled_debug_types;
|
|
#define RADEON_DEBUG r100_enabled_debug_types
|
|
#else
|
|
#error "Neither RADEON_R100 nor RADEON_R200 are defined."
|
|
#endif
|
|
|
|
static inline int radeon_is_debug_enabled(const radeon_debug_type_t type,
|
|
const radeon_debug_level_t level)
|
|
{
|
|
return RADEON_DEBUG_LEVEL >= level
|
|
&& (type & RADEON_DEBUG);
|
|
}
|
|
|
|
extern void _radeon_print(const radeon_debug_type_t type,
|
|
const radeon_debug_level_t level,
|
|
const char* message,
|
|
...) PRINTFLIKE(3, 4);
|
|
/**
|
|
* Print out debug message if channel specified by type is enabled
|
|
* and compile time debugging level is at least as high as level parameter
|
|
*/
|
|
#define radeon_print(type, level, ...) do { \
|
|
const radeon_debug_level_t _debug_level = (level); \
|
|
const radeon_debug_type_t _debug_type = (type); \
|
|
/* Compile out if level of message is too high */ \
|
|
if (radeon_is_debug_enabled(type, level)) { \
|
|
_radeon_print(_debug_type, _debug_level, \
|
|
__VA_ARGS__); \
|
|
} \
|
|
} while(0)
|
|
|
|
/**
|
|
* printf style function for writing error messages.
|
|
*/
|
|
#define radeon_error(...) do { \
|
|
radeon_print(RADEON_GENERAL, RADEON_CRITICAL, \
|
|
__VA_ARGS__); \
|
|
} while(0)
|
|
|
|
/**
|
|
* printf style function for writing warnings.
|
|
*/
|
|
#define radeon_warning(...) do { \
|
|
radeon_print(RADEON_GENERAL, RADEON_IMPORTANT, \
|
|
__VA_ARGS__); \
|
|
} while(0)
|
|
|
|
extern void radeon_init_debug(void);
|
|
extern void _radeon_debug_add_indent(void);
|
|
extern void _radeon_debug_remove_indent(void);
|
|
|
|
static inline void radeon_debug_add_indent(void)
|
|
{
|
|
if (RADEON_DEBUG_LEVEL >= RADEON_VERBOSE) {
|
|
_radeon_debug_add_indent();
|
|
}
|
|
}
|
|
static inline void radeon_debug_remove_indent(void)
|
|
{
|
|
if (RADEON_DEBUG_LEVEL >= RADEON_VERBOSE) {
|
|
_radeon_debug_remove_indent();
|
|
}
|
|
}
|
|
|
|
|
|
/* From http://gcc. gnu.org/onlinedocs/gcc-3.2.3/gcc/Variadic-Macros.html .
|
|
I suppose we could inline this and use macro to fetch out __LINE__ and stuff in case we run into trouble
|
|
with other compilers ... GLUE!
|
|
*/
|
|
#define WARN_ONCE(...) do { \
|
|
static int __warn_once=1; \
|
|
if(__warn_once){ \
|
|
radeon_warning("*********************************WARN_ONCE*********************************\n"); \
|
|
radeon_warning("File %s function %s line %d\n", \
|
|
__FILE__, __func__, __LINE__); \
|
|
radeon_warning(__VA_ARGS__);\
|
|
radeon_warning("***************************************************************************\n"); \
|
|
__warn_once=0;\
|
|
} \
|
|
} while(0)
|
|
|
|
|
|
#endif
|