1f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen/*
2f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * Copyright © 2009 Pauli Nieminen
3f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * All Rights Reserved.
4f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen *
5f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * Permission is hereby granted, free of charge, to any person obtaining a
6f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * copy of this software and associated documentation files (the
7f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * "Software"), to deal in the Software without restriction, including
8f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * without limitation the rights to use, copy, modify, merge, publish,
9f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * distribute, sub license, and/or sell copies of the Software, and to
10f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * permit persons to whom the Software is furnished to do so, subject to
11f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * the following conditions:
12f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen *
13f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
16f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
17f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
18f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
19f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * USE OR OTHER DEALINGS IN THE SOFTWARE.
20f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen *
21f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * The above copyright notice and this permission notice (including the
22f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * next paragraph) shall be included in all copies or substantial portions
23f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * of the Software.
24f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen */
25f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen/*
26f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * Authors:
27f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen *      Pauli Nieminen <suokkos@gmail.com>
28f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen */
29f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
30f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen#ifndef RADEON_DEBUG_H_INCLUDED
31f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen#define RADEON_DEBUG_H_INCLUDED
32f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
333d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen#include <stdlib.h>
34f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
35f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminentypedef enum radeon_debug_levels {
36f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen	RADEON_CRITICAL  = 0, /* Only errors */
37f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen	RADEON_IMPORTANT = 1, /* Important warnings and messages */
38f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen	RADEON_NORMAL    = 2, /* Normal log messages usefull for debugging */
39f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen	RADEON_VERBOSE   = 3, /* Extra details to debugging */
40f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen	RADEON_TRACE     = 4  /* Log about everything that happens */
41f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen} radeon_debug_level_t;
42f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
43f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen/**
44f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * Compile time option to change level of debugging compiled to dri driver.
457870edc778338556a65a4d4167d20ad01d6a1995Pauli Nieminen * Selecting critical level is not recommended because perfromance gains are
467870edc778338556a65a4d4167d20ad01d6a1995Pauli Nieminen * going to minimal but you will lose a lot of important warnings in case of
477870edc778338556a65a4d4167d20ad01d6a1995Pauli Nieminen * errors.
48f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen */
49f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen#ifndef RADEON_DEBUG_LEVEL
5066229ea1845a6c19fd292c16e6dafeb9be94173dPauli Nieminen# ifdef DEBUG
5166229ea1845a6c19fd292c16e6dafeb9be94173dPauli Nieminen#  define RADEON_DEBUG_LEVEL RADEON_TRACE
5266229ea1845a6c19fd292c16e6dafeb9be94173dPauli Nieminen# else
5366229ea1845a6c19fd292c16e6dafeb9be94173dPauli Nieminen#  define RADEON_DEBUG_LEVEL RADEON_VERBOSE
5466229ea1845a6c19fd292c16e6dafeb9be94173dPauli Nieminen# endif
55f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen#endif
56f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
57f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminentypedef enum radeon_debug_types {
584e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_TEXTURE   = 0x00001,
594e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_STATE     = 0x00002,
604e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_IOCTL     = 0x00004,
614e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_RENDER    = 0x00008,
624e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_SWRENDER  = 0x00010,
634e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_FALLBACKS = 0x00020,
644e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_VFMT      = 0x00040,
654e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_SHADER    = 0x00080,
664e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_CS        = 0x00100,
674e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_DRI       = 0x00200,
684e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_DMA       = 0x00400,
694e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_SANITY    = 0x00800,
704e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_SYNC      = 0x01000,
714e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_PIXEL     = 0x02000,
724e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_MEMORY    = 0x04000,
734e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_VERTS     = 0x08000,
744e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	RADEON_GENERAL   = 0x10000   /* Used for errors and warnings */
75f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen} radeon_debug_type_t;
76f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
77fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen#define RADEON_MAX_INDENT 5
78fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen
79fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminenstruct radeon_debug {
80fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen       size_t indent_depth;
81fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen       char indent[RADEON_MAX_INDENT];
82fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen};
83fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen
84f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminenextern radeon_debug_type_t radeon_enabled_debug_types;
85f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
86f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen/**
87f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * Compabibility layer for old debug code
88f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen **/
89f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen#define RADEON_DEBUG radeon_enabled_debug_types
90f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
91f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminenstatic inline int radeon_is_debug_enabled(const radeon_debug_type_t type,
92f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen	   const radeon_debug_level_t level)
93f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen{
949f650e19dda3809e87c838b50b39669ea844a3b1Pauli Nieminen       return RADEON_DEBUG_LEVEL >= level
95f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen		&& (type & radeon_enabled_debug_types);
96f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen}
97b6ebcf8156c4735c2e96e5aad26c3a8dc29f50a6Pauli Nieminen/*
98b6ebcf8156c4735c2e96e5aad26c3a8dc29f50a6Pauli Nieminen * define macro for gcc specific __attribute__ if using alternative compiler
99b6ebcf8156c4735c2e96e5aad26c3a8dc29f50a6Pauli Nieminen */
100b6ebcf8156c4735c2e96e5aad26c3a8dc29f50a6Pauli Nieminen#ifndef __GNUC__
101b6ebcf8156c4735c2e96e5aad26c3a8dc29f50a6Pauli Nieminen#define  __attribute__(x)  /*empty*/
102b6ebcf8156c4735c2e96e5aad26c3a8dc29f50a6Pauli Nieminen#endif
103b6ebcf8156c4735c2e96e5aad26c3a8dc29f50a6Pauli Nieminen
104fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen
105fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminenextern void _radeon_print(const radeon_debug_type_t type,
106fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen	   const radeon_debug_level_t level,
107fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen	   const char* message,
1083d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen	   ...)  __attribute__((format(printf,3,4)));
109f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen/**
110f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * Print out debug message if channel specified by type is enabled
111f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * and compile time debugging level is at least as high as level parameter
112f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen */
113c22a7f9045ff7a4a9505225a133b25e262958e1cIain Hibbert#define radeon_print(type, level, ...) do {			\
1143d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen	const radeon_debug_level_t _debug_level = (level);	\
1153d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen	const radeon_debug_type_t _debug_type = (type);		\
1163d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen	/* Compile out if level of message is too high */	\
1173d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen	if (radeon_is_debug_enabled(type, level)) {		\
1183d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen		_radeon_print(_debug_type, _debug_level,	\
119c22a7f9045ff7a4a9505225a133b25e262958e1cIain Hibbert			__VA_ARGS__);				\
1203d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen	}							\
1213d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen} while(0)
122f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
123f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen/**
124f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * printf style function for writing error messages.
125f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen */
126c22a7f9045ff7a4a9505225a133b25e262958e1cIain Hibbert#define radeon_error(...) do {					\
1273d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen	radeon_print(RADEON_GENERAL, RADEON_CRITICAL,		\
128c22a7f9045ff7a4a9505225a133b25e262958e1cIain Hibbert		__VA_ARGS__);					\
1293d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen} while(0)
130f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
131f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen/**
132f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen * printf style function for writing warnings.
133f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen */
134c22a7f9045ff7a4a9505225a133b25e262958e1cIain Hibbert#define radeon_warning(...) do {				\
1353d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen	radeon_print(RADEON_GENERAL, RADEON_IMPORTANT,		\
136c22a7f9045ff7a4a9505225a133b25e262958e1cIain Hibbert		__VA_ARGS__);					\
1373d1324a66a3b8927a400d167ba92f851b464c57aPauli Nieminen} while(0)
138f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
139f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminenextern void radeon_init_debug(void);
140fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminenextern void _radeon_debug_add_indent(void);
141fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminenextern void _radeon_debug_remove_indent(void);
142fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen
143fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminenstatic inline void radeon_debug_add_indent(void)
144fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen{
145fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen       if (RADEON_DEBUG_LEVEL >= RADEON_VERBOSE) {
146fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen	      _radeon_debug_add_indent();
147fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen       }
148fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen}
149fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminenstatic inline void radeon_debug_remove_indent(void)
150fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen{
151fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen       if (RADEON_DEBUG_LEVEL >= RADEON_VERBOSE) {
152fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen	      _radeon_debug_remove_indent();
153fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen       }
154fde929c4fdee2e998542f071ff7165d87f572593Pauli Nieminen}
155f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
1565fa9a7a9a9cb87c8a86402981cc1b4affde95777Pauli Nieminen
157f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen/* From http://gcc. gnu.org/onlinedocs/gcc-3.2.3/gcc/Variadic-Macros.html .
158f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen   I suppose we could inline this and use macro to fetch out __LINE__ and stuff in case we run into trouble
159f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen   with other compilers ... GLUE!
160f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen*/
161c22a7f9045ff7a4a9505225a133b25e262958e1cIain Hibbert#define WARN_ONCE(...)      do { \
1625fa9a7a9a9cb87c8a86402981cc1b4affde95777Pauli Nieminen       static int __warn_once=1; \
1633640e4acde2fb050b1659271d1687a8a5f90365dPauli Nieminen       if(__warn_once){ \
164f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen               radeon_warning("*********************************WARN_ONCE*********************************\n"); \
165f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen               radeon_warning("File %s function %s line %d\n", \
166f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen                       __FILE__, __FUNCTION__, __LINE__); \
167c22a7f9045ff7a4a9505225a133b25e262958e1cIain Hibbert               radeon_warning(__VA_ARGS__);\
168f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen               radeon_warning("***************************************************************************\n"); \
1695fa9a7a9a9cb87c8a86402981cc1b4affde95777Pauli Nieminen               __warn_once=0;\
170f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen               } \
1715fa9a7a9a9cb87c8a86402981cc1b4affde95777Pauli Nieminen       } while(0)
172f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
173f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen
174f9a4a0a9710c23a2041673eec290ff2f9260cbd0Pauli Nieminen#endif
175