1a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca/**************************************************************************
2a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
3a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * All Rights Reserved.
5a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
6a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * copy of this software and associated documentation files (the
8a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * "Software"), to deal in the Software without restriction, including
9a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to
12a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * the following conditions:
13a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
14a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * The above copyright notice and this permission notice (including the
15a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * next paragraph) shall be included in all copies or substantial portions
16a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * of the Software.
17a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
18a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
26a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca **************************************************************************/
27a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
28a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca/**
29a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * @file
30a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * Cross-platform debugging helpers.
31a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
32a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * For now it just has assert and printf replacements, but it might be extended
33a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * with stack trace reports and more advanced logging in the near future.
34a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
35a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * @author Jose Fonseca <jrfonseca@tungstengraphics.com>
36a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca */
37a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
38ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#ifndef U_DEBUG_H_
39ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#define U_DEBUG_H_
40a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
41af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca
426b424a0550a5196818641857974f4cb04d61b933José Fonseca#include "os/os_misc.h"
4345c59895113f997e5f2b7e346f95e46099fa3566José Fonseca
44af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca
45a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef	__cplusplus
46a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonsecaextern "C" {
47a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif
48a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
49a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
50496137d8eb85e78fab748f184b392f99b17059eaNicolai Hähnle#if defined(__GNUC__)
51496137d8eb85e78fab748f184b392f99b17059eaNicolai Hähnle#define _util_printf_format(fmt, list) __attribute__ ((format (printf, fmt, list)))
52496137d8eb85e78fab748f184b392f99b17059eaNicolai Hähnle#else
53496137d8eb85e78fab748f184b392f99b17059eaNicolai Hähnle#define _util_printf_format(fmt, list)
54496137d8eb85e78fab748f184b392f99b17059eaNicolai Hähnle#endif
5555d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca
56dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecavoid _debug_vprintf(const char *format, va_list ap);
57dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
58dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
594654803e2595ea041ea83baf5e13e6c68890e9a7Brianstatic INLINE void
60dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca_debug_printf(const char *format, ...)
61dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca{
62dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   va_list ap;
63dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   va_start(ap, format);
64dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   _debug_vprintf(format, ap);
65dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   va_end(ap);
66dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca}
67dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
68dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
69fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca/**
70fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * Print debug messages.
71fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca *
72496137d8eb85e78fab748f184b392f99b17059eaNicolai Hähnle * The actual channel used to output debug message is platform specific. To
73496137d8eb85e78fab748f184b392f99b17059eaNicolai Hähnle * avoid misformating or truncation, follow these rules of thumb:
74fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * - output whole lines
75496137d8eb85e78fab748f184b392f99b17059eaNicolai Hähnle * - avoid outputing large strings (512 bytes is the current maximum length
76fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * that is guaranteed to be printed in all platforms)
77fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca */
78c6c44bf48124dd5b4661014a8d58482c5a54557faljen#if !defined(PIPE_OS_HAIKU)
794654803e2595ea041ea83baf5e13e6c68890e9a7Brianstatic INLINE void
80496137d8eb85e78fab748f184b392f99b17059eaNicolai Hähnledebug_printf(const char *format, ...) _util_printf_format(1,2);
81496137d8eb85e78fab748f184b392f99b17059eaNicolai Hähnle
82496137d8eb85e78fab748f184b392f99b17059eaNicolai Hähnlestatic INLINE void
83dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecadebug_printf(const char *format, ...)
84dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca{
85dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
86dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   va_list ap;
87dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   va_start(ap, format);
88dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   _debug_vprintf(format, ap);
89dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   va_end(ap);
90d355eee5cacac30e2b4c8ac2f10964e2861a539eBrian#else
91d355eee5cacac30e2b4c8ac2f10964e2861a539eBrian   (void) format; /* silence warning */
92dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
93dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca}
942ae591bdf13f02f23471ea302b55eaccbb810dd7Alexander von Gluck#else /* is Haiku */
952ae591bdf13f02f23471ea302b55eaccbb810dd7Alexander von Gluck/* Haiku provides debug_printf in libroot with OS.h */
962ae591bdf13f02f23471ea302b55eaccbb810dd7Alexander von Gluck#include <OS.h>
972ae591bdf13f02f23471ea302b55eaccbb810dd7Alexander von Gluck#endif
98dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
99dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
100b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty/*
101b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty * ... isn't portable so we need to pass arguments in parentheses.
102b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty *
103b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty * usage:
1044ab8403c25695535bfabd139cac9bf7012f56eaeBrian Paul *    debug_printf_once(("answer: %i\n", 42));
105b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty */
106b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty#define debug_printf_once(args) \
107b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty   do { \
108b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty      static boolean once = TRUE; \
109b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty      if (once) { \
110b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty         once = FALSE; \
111b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty         debug_printf args; \
112b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty      } \
113b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty   } while (0)
114b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty
115b618827fac84ca12a354da5808f30e96bedbc92aMicah Dowty
116dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
117dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_vprintf(_format, _ap) _debug_vprintf(_format, _ap)
118dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else
119dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_vprintf(_format, _ap) ((void)0)
120dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
121af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca
122a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwell
1239bfe1a3d505733489f7583fe603b7d192f38fa8cKeith Whitwell#ifdef DEBUG
124dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/**
125dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Dump a blob in hex to the same place that debug_printf sends its
126dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * messages.
127a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwell */
1289bfe1a3d505733489f7583fe603b7d192f38fa8cKeith Whitwellvoid debug_print_blob( const char *name, const void *blob, unsigned size );
1299bfe1a3d505733489f7583fe603b7d192f38fa8cKeith Whitwell
1309bfe1a3d505733489f7583fe603b7d192f38fa8cKeith Whitwell/* Print a message along with a prettified format string
1319bfe1a3d505733489f7583fe603b7d192f38fa8cKeith Whitwell */
1320d80f407f128f1a324e9dc0db2d0910bf32ba736Zack Rusinvoid debug_print_format(const char *msg, unsigned fmt );
133dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else
134dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_print_blob(_name, _blob, _size) ((void)0)
1359bfe1a3d505733489f7583fe603b7d192f38fa8cKeith Whitwell#define debug_print_format(_msg, _fmt) ((void)0)
136dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
137dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
138dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
139fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca/**
140dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Hard-coded breakpoint.
141fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca */
142dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
1436b424a0550a5196818641857974f4cb04d61b933José Fonseca#define debug_break() os_break()
144dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else /* !DEBUG */
145dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_break() ((void)0)
146dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif /* !DEBUG */
147af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca
148a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
1494654803e2595ea041ea83baf5e13e6c68890e9a7Brianlong
1504654803e2595ea041ea83baf5e13e6c68890e9a7Briandebug_get_num_option(const char *name, long dfault);
1514654803e2595ea041ea83baf5e13e6c68890e9a7Brian
152dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecavoid _debug_assert_fail(const char *expr,
153dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca                        const char *file,
154dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca                        unsigned line,
155dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca                        const char *function);
156af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca
157dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
158dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/**
159dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Assert macro
160dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca *
161dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Do not expect that the assert call terminates -- errors must be handled
162dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * regardless of assert behavior.
1637a2271c65963c86ec1e5d9523b2eecf9ee59fe9dJosé Fonseca *
1647a2271c65963c86ec1e5d9523b2eecf9ee59fe9dJosé Fonseca * For non debug builds the assert macro will expand to a no-op, so do not
1657a2271c65963c86ec1e5d9523b2eecf9ee59fe9dJosé Fonseca * call functions with side effects in the assert expression.
166dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */
167a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef DEBUG
168dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_assert(expr) ((expr) ? (void)0 : _debug_assert_fail(#expr, __FILE__, __LINE__, __FUNCTION__))
169a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#else
170f0ba7d897d1c22202531acb70f134f2edc30557dKeith Whitwell#define debug_assert(expr) do { } while (0 && (expr))
171a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif
172a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
173a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
174dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/** Override standard assert macro */
175a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef assert
176a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#undef assert
177a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif
178a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#define assert(expr) debug_assert(expr)
179a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
180a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
181dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/**
182dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Output the current function name.
183dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */
184dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
185dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_checkpoint() \
186dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   _debug_printf("%s\n", __FUNCTION__)
187dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else
188dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_checkpoint() \
189dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   ((void)0)
190dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
191dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
192dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
193dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/**
194dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Output the full source code position.
195dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */
196dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
197dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_checkpoint_full() \
198155cf15ce216c3b67c13da1041401cbcc1c43b1eMarcin Slusarz   _debug_printf("%s:%u:%s\n", __FILE__, __LINE__, __FUNCTION__)
199dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else
200dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_checkpoint_full() \
201dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   ((void)0)
202dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
203dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
204dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
205dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/**
206dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Output a warning message. Muted on release version.
207dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */
208d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#ifdef DEBUG
209d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#define debug_warning(__msg) \
210331a56136e96717704788b633c1b2e474b88d8baJosé Fonseca   _debug_printf("%s:%u:%s: warning: %s\n", __FILE__, __LINE__, __FUNCTION__, __msg)
211d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#else
212d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#define debug_warning(__msg) \
213d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca   ((void)0)
214d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#endif
215d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca
216d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca
217e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca/**
21894bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul * Emit a warning message, but only once.
21994bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul */
22094bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul#ifdef DEBUG
22194bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul#define debug_warn_once(__msg) \
22294bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul   do { \
22394bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul      static bool warned = FALSE; \
22494bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul      if (!warned) { \
22594bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul         _debug_printf("%s:%u:%s: one time warning: %s\n", \
22694bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul                       __FILE__, __LINE__, __FUNCTION__, __msg); \
22794bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul         warned = TRUE; \
22894bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul      } \
22994bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul   } while (0)
23094bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul#else
23194bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul#define debug_warn_once(__msg) \
23294bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul   ((void)0)
23394bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul#endif
23494bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul
23594bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul
23694bf2d48e19b86a4cfa4ff3bf3da97967f8a2793Brian Paul/**
237dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Output an error message. Not muted on release version.
238dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */
239dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
240dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_error(__msg) \
241331a56136e96717704788b633c1b2e474b88d8baJosé Fonseca   _debug_printf("%s:%u:%s: error: %s\n", __FILE__, __LINE__, __FUNCTION__, __msg)
242dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else
243dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_error(__msg) \
244331a56136e96717704788b633c1b2e474b88d8baJosé Fonseca   _debug_printf("error: %s\n", __msg)
245dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
246dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
247dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
248dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/**
249e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Used by debug_dump_enum and debug_dump_flags to describe symbols.
250e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca */
251e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecastruct debug_named_value
252e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca{
253e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca   const char *name;
254e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca   unsigned long value;
255fbeab4cbcea98db161aa5067c0bcef9ea44cb0deJoakim Sindholt   const char *desc;
256e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca};
257e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
258e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
259e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca/**
260e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Some C pre-processor magic to simplify creating named values.
261e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *
262e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Example:
263e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * @code
264e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * static const debug_named_value my_names[] = {
265e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    DEBUG_NAMED_VALUE(MY_ENUM_VALUE_X),
266e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Y),
267e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Z),
268e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    DEBUG_NAMED_VALUE_END
269e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * };
270e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *
271e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    ...
272e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    debug_printf("%s = %s\n",
273e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *                 name,
274e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *                 debug_dump_enum(my_names, my_value));
275e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    ...
276e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * @endcode
277e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca */
278fbeab4cbcea98db161aa5067c0bcef9ea44cb0deJoakim Sindholt#define DEBUG_NAMED_VALUE(__symbol) DEBUG_NAMED_VALUE_WITH_DESCRIPTION(__symbol, NULL)
279fbeab4cbcea98db161aa5067c0bcef9ea44cb0deJoakim Sindholt#define DEBUG_NAMED_VALUE_WITH_DESCRIPTION(__symbol, __desc) {#__symbol, (unsigned long)__symbol, __desc}
280fbeab4cbcea98db161aa5067c0bcef9ea44cb0deJoakim Sindholt#define DEBUG_NAMED_VALUE_END {NULL, 0, NULL}
281e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
282e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
283e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca/**
284e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Convert a enum value to a string.
285e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca */
286e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecaconst char *
287e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecadebug_dump_enum(const struct debug_named_value *names,
288e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca                unsigned long value);
289e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
2908f3fac6107460b6d9b011b5c76246468bb16004bKeith Whitwellconst char *
2918f3fac6107460b6d9b011b5c76246468bb16004bKeith Whitwelldebug_dump_enum_noprefix(const struct debug_named_value *names,
2928f3fac6107460b6d9b011b5c76246468bb16004bKeith Whitwell                         const char *prefix,
2938f3fac6107460b6d9b011b5c76246468bb16004bKeith Whitwell                         unsigned long value);
2948f3fac6107460b6d9b011b5c76246468bb16004bKeith Whitwell
295e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
296e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca/**
297e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Convert binary flags value to a string.
298e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca */
299e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecaconst char *
300e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecadebug_dump_flags(const struct debug_named_value *names,
301e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca                 unsigned long value);
302e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
303e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
304e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca/**
305b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz * Function enter exit loggers
306b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz */
307b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz#ifdef DEBUG
308b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantzint debug_funclog_enter(const char* f, const int line, const char* file);
309b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantzvoid debug_funclog_exit(const char* f, const int line, const char* file);
310b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantzvoid debug_funclog_enter_exit(const char* f, const int line, const char* file);
311b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz
312b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz#define DEBUG_FUNCLOG_ENTER() \
313b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz   int __debug_decleration_work_around = \
314b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz      debug_funclog_enter(__FUNCTION__, __LINE__, __FILE__)
315b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz#define DEBUG_FUNCLOG_EXIT() \
316b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz   do { \
317b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz      (void)__debug_decleration_work_around; \
318b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz      debug_funclog_exit(__FUNCTION__, __LINE__, __FILE__); \
319b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz      return; \
320b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz   } while(0)
321b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz#define DEBUG_FUNCLOG_EXIT_RET(ret) \
322b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz   do { \
323b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz      (void)__debug_decleration_work_around; \
324b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz      debug_funclog_exit(__FUNCTION__, __LINE__, __FILE__); \
325b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz      return ret; \
326b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz   } while(0)
327b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz#define DEBUG_FUNCLOG_ENTER_EXIT() \
328b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz   debug_funclog_enter_exit(__FUNCTION__, __LINE__, __FILE__)
329b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz
330b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz#else
331b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz#define DEBUG_FUNCLOG_ENTER() \
332b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz   int __debug_decleration_work_around
333b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz#define DEBUG_FUNCLOG_EXIT() \
334b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz   do { (void)__debug_decleration_work_around; return; } while(0)
335b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz#define DEBUG_FUNCLOG_EXIT_RET(ret) \
336b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz   do { (void)__debug_decleration_work_around; return ret; } while(0)
337b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz#define DEBUG_FUNCLOG_ENTER_EXIT()
338b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz#endif
339b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz
340b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz
341b7d2919e8e079f2ba77741a6b3f9d038b17cc799Jakob Bornecrantz/**
342e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca * Get option.
343e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca *
344e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca * It is an alias for getenv on Linux.
345e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca *
346e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca * On Windows it reads C:\gallium.cfg, which is a text file with CR+LF line
347e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca * endings with one option per line as
348e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca *
349e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca *   NAME=value
350e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca *
351e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca * This file must be terminated with an extra empty line.
352e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca */
353e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonsecaconst char *
354e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonsecadebug_get_option(const char *name, const char *dfault);
355e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca
356e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonsecaboolean
357e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonsecadebug_get_bool_option(const char *name, boolean dfault);
358e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca
359e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonsecalong
36023422d603ae002a1f368e20cd0f158e057876cb8José Fonsecadebug_get_num_option(const char *name, long dfault);
361e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca
362e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonsecaunsigned long
363e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonsecadebug_get_flags_option(const char *name,
364e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca                       const struct debug_named_value *flags,
365e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca                       unsigned long dfault);
366e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca
36789aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz#define DEBUG_GET_ONCE_BOOL_OPTION(sufix, name, dfault) \
36889aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantzstatic boolean \
36989aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantzdebug_get_option_ ## sufix (void) \
37089aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz{ \
37189aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz   static boolean first = TRUE; \
37289aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz   static boolean value; \
373c3c920ee2c0ae46e88554c9351f22455f8e8a623Vinson Lee   if (first) { \
374c3c920ee2c0ae46e88554c9351f22455f8e8a623Vinson Lee      first = FALSE; \
37589aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz      value = debug_get_bool_option(name, dfault); \
376c3c920ee2c0ae46e88554c9351f22455f8e8a623Vinson Lee   } \
37789aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz   return value; \
37889aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz}
37989aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz
38089aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz#define DEBUG_GET_ONCE_NUM_OPTION(sufix, name, dfault) \
38189aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantzstatic long \
38289aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantzdebug_get_option_ ## sufix (void) \
38389aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz{ \
38489aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz   static boolean first = TRUE; \
38589aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz   static long value; \
386c3c920ee2c0ae46e88554c9351f22455f8e8a623Vinson Lee   if (first) { \
387c3c920ee2c0ae46e88554c9351f22455f8e8a623Vinson Lee      first = FALSE; \
38889aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz      value = debug_get_num_option(name, dfault); \
389c3c920ee2c0ae46e88554c9351f22455f8e8a623Vinson Lee   } \
39089aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz   return value; \
39189aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz}
39289aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz
39389aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz#define DEBUG_GET_ONCE_FLAGS_OPTION(sufix, name, flags, dfault) \
39489aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantzstatic unsigned long \
39589aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantzdebug_get_option_ ## sufix (void) \
39689aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz{ \
39789aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz   static boolean first = TRUE; \
39889aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz   static unsigned long value; \
399c3c920ee2c0ae46e88554c9351f22455f8e8a623Vinson Lee   if (first) { \
400c3c920ee2c0ae46e88554c9351f22455f8e8a623Vinson Lee      first = FALSE; \
40189aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz      value = debug_get_flags_option(name, flags, dfault); \
402c3c920ee2c0ae46e88554c9351f22455f8e8a623Vinson Lee   } \
40389aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz   return value; \
40489aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz}
40589aaaab79f407dd691e0a98167f48a0860ec791aJakob Bornecrantz
406e8c6ea4f608296ed976f1597ffd46ac0b42fc84aJosé Fonseca
4074e2127b0e5cb6411123e16dd562626cd70814a9aJosé Fonsecaunsigned long
4084e2127b0e5cb6411123e16dd562626cd70814a9aJosé Fonsecadebug_memory_begin(void);
409732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca
410732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid
4114e2127b0e5cb6411123e16dd562626cd70814a9aJosé Fonsecadebug_memory_end(unsigned long beginning);
412732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca
413732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca
414a6ad4927740e5699f1a047f4c78f069f6a91c6eaJosé Fonseca#ifdef DEBUG
415b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwellstruct pipe_context;
41672a5e479789febb552ec783a1cba0ed628dfa427José Fonsecastruct pipe_surface;
417da96767c8971e792285e3190c708438d65802379Jakob Bornecrantzstruct pipe_transfer;
418287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource;
4194f5675e94b936d012b89937aac8a16c28143d5ecBrian Paul
420a6ad4927740e5699f1a047f4c78f069f6a91c6eaJosé Fonsecavoid debug_dump_image(const char *prefix,
421a6ad4927740e5699f1a047f4c78f069f6a91c6eaJosé Fonseca                      unsigned format, unsigned cpp,
422a6ad4927740e5699f1a047f4c78f069f6a91c6eaJosé Fonseca                      unsigned width, unsigned height,
42372a5e479789febb552ec783a1cba0ed628dfa427José Fonseca                      unsigned stride,
424a6ad4927740e5699f1a047f4c78f069f6a91c6eaJosé Fonseca                      const void *data);
425b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwellvoid debug_dump_surface(struct pipe_context *pipe,
426b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell			const char *prefix,
42772a5e479789febb552ec783a1cba0ed628dfa427José Fonseca                        struct pipe_surface *surface);
428b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwellvoid debug_dump_texture(struct pipe_context *pipe,
429b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell			const char *prefix,
430287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                        struct pipe_resource *texture);
431b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwellvoid debug_dump_surface_bmp(struct pipe_context *pipe,
432b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell                            const char *filename,
4331da0a13389ce9709586058a8807c0c4120e520a2José Fonseca                            struct pipe_surface *surface);
434d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwellvoid debug_dump_transfer_bmp(struct pipe_context *pipe,
435d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell                             const char *filename,
436da96767c8971e792285e3190c708438d65802379Jakob Bornecrantz                             struct pipe_transfer *transfer);
437f4a286e5f5ac11b2e5266ef39db5d1d1cb5f77ceJakob Bornecrantzvoid debug_dump_float_rgba_bmp(const char *filename,
438f4a286e5f5ac11b2e5266ef39db5d1d1cb5f77ceJakob Bornecrantz                               unsigned width, unsigned height,
439f4a286e5f5ac11b2e5266ef39db5d1d1cb5f77ceJakob Bornecrantz                               float *rgba, unsigned stride);
440a6ad4927740e5699f1a047f4c78f069f6a91c6eaJosé Fonseca#else
44172a5e479789febb552ec783a1cba0ed628dfa427José Fonseca#define debug_dump_image(prefix, format, cpp, width, height, stride, data) ((void)0)
442b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell#define debug_dump_surface(pipe, prefix, surface) ((void)0)
443b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell#define debug_dump_surface_bmp(pipe, filename, surface) ((void)0)
444f4a286e5f5ac11b2e5266ef39db5d1d1cb5f77ceJakob Bornecrantz#define debug_dump_transfer_bmp(filename, transfer) ((void)0)
4459f5640d10b3c29260418c0acd0b5466b112f6ecdVinson Lee#define debug_dump_float_rgba_bmp(filename, width, height, rgba, stride) ((void)0)
446a6ad4927740e5699f1a047f4c78f069f6a91c6eaJosé Fonseca#endif
447a6ad4927740e5699f1a047f4c78f069f6a91c6eaJosé Fonseca
448a6ad4927740e5699f1a047f4c78f069f6a91c6eaJosé Fonseca
449a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef	__cplusplus
450a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca}
451a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif
452a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
453ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#endif /* U_DEBUG_H_ */
454