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