Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

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