Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / common / debug.h
1 //
2 // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // debug.h: Debugging utilities.
8
9 #ifndef COMMON_DEBUG_H_
10 #define COMMON_DEBUG_H_
11
12 #include <stdio.h>
13 #include <assert.h>
14
15 #include "common/angleutils.h"
16
17 #if !defined(TRACE_OUTPUT_FILE)
18 #define TRACE_OUTPUT_FILE "debug.txt"
19 #endif
20
21 namespace gl
22 {
23     // Outputs text to the debugging log, or the debugging window
24     void trace(bool traceInDebugOnly, const char *format, ...);
25
26     // Returns whether D3DPERF is active.
27     bool perfActive();
28
29     // Pairs a D3D begin event with an end event.
30     class ScopedPerfEventHelper
31     {
32       public:
33         ScopedPerfEventHelper(const char* format, ...);
34         ~ScopedPerfEventHelper();
35
36       private:
37         DISALLOW_COPY_AND_ASSIGN(ScopedPerfEventHelper);
38     };
39
40     void InitializeDebugAnnotations();
41     void UninitializeDebugAnnotations();
42 }
43
44 // A macro to output a trace of a function call and its arguments to the debugging log
45 #if defined(ANGLE_ENABLE_DEBUG_TRACE) || defined(ANGLE_ENABLE_DEBUG_ANNOTATIONS)
46 #define TRACE(message, ...) gl::trace(true, "trace: %s(%d): " message "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)
47 #else
48 #define TRACE(message, ...) (void(0))
49 #endif
50
51 // A macro to output a function call and its arguments to the debugging log, to denote an item in need of fixing.
52 #if defined(ANGLE_ENABLE_DEBUG_TRACE) || defined(ANGLE_ENABLE_DEBUG_ANNOTATIONS)
53 #define FIXME(message, ...) gl::trace(false, "fixme: %s(%d): " message "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)
54 #else
55 #define FIXME(message, ...) (void(0))
56 #endif
57
58 // A macro to output a function call and its arguments to the debugging log, in case of error.
59 #if defined(ANGLE_ENABLE_DEBUG_TRACE) || defined(ANGLE_ENABLE_DEBUG_ANNOTATIONS)
60 #define ERR(message, ...) gl::trace(false, "err: %s(%d): " message "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)
61 #else
62 #define ERR(message, ...) (void(0))
63 #endif
64
65 // A macro to log a performance event around a scope.
66 #if defined(ANGLE_ENABLE_DEBUG_TRACE) || defined(ANGLE_ENABLE_DEBUG_ANNOTATIONS)
67 #if defined(_MSC_VER)
68 #define EVENT(message, ...) gl::ScopedPerfEventHelper scopedPerfEventHelper ## __LINE__("%s" message "\n", __FUNCTION__, __VA_ARGS__);
69 #else
70 #define EVENT(message, ...) gl::ScopedPerfEventHelper scopedPerfEventHelper(message "\n", ##__VA_ARGS__);
71 #endif // _MSC_VER
72 #else
73 #define EVENT(message, ...) (void(0))
74 #endif
75
76 // A macro asserting a condition and outputting failures to the debug log
77 #if !defined(NDEBUG)
78 #define ASSERT(expression) do { \
79     if(!(expression)) \
80         ERR("\t! Assert failed in %s(%d): "#expression"\n", __FUNCTION__, __LINE__); \
81         assert(expression); \
82     } while(0)
83 #define UNUSED_ASSERTION_VARIABLE(variable)
84 #else
85 #define ASSERT(expression) (void(0))
86 #define UNUSED_ASSERTION_VARIABLE(variable) ((void)variable)
87 #endif
88
89 #ifndef ANGLE_ENABLE_DEBUG_TRACE
90 #define UNUSED_TRACE_VARIABLE(variable) ((void)variable)
91 #else
92 #define UNUSED_TRACE_VARIABLE(variable)
93 #endif
94
95 // A macro to indicate unimplemented functionality
96
97 #if defined (ANGLE_TEST_CONFIG)
98 #define NOASSERT_UNIMPLEMENTED 1
99 #endif
100
101 // Define NOASSERT_UNIMPLEMENTED to non zero to skip the assert fail in the unimplemented checks
102 // This will allow us to test with some automated test suites (eg dEQP) without crashing
103 #ifndef NOASSERT_UNIMPLEMENTED
104 #define NOASSERT_UNIMPLEMENTED 0
105 #endif
106
107 #if !defined(NDEBUG)
108 #define UNIMPLEMENTED() do { \
109     FIXME("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__); \
110     assert(NOASSERT_UNIMPLEMENTED); \
111     } while(0)
112 #else
113     #define UNIMPLEMENTED() FIXME("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__)
114 #endif
115
116 // A macro for code which is not expected to be reached under valid assumptions
117 #if !defined(NDEBUG)
118 #define UNREACHABLE() do { \
119     ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__); \
120     assert(false); \
121     } while(0)
122 #else
123     #define UNREACHABLE() ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__)
124 #endif
125
126 // A macro that determines whether an object has a given runtime type.
127 #if !defined(NDEBUG) && (!defined(_MSC_VER) || defined(_CPPRTTI)) && (!defined(__GNUC__) || __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) || defined(__GXX_RTTI))
128 #define HAS_DYNAMIC_TYPE(type, obj) (dynamic_cast<type >(obj) != NULL)
129 #else
130 #define HAS_DYNAMIC_TYPE(type, obj) true
131 #endif
132
133 // A macro functioning as a compile-time assert to validate constant conditions
134 #if (defined(_MSC_VER) && _MSC_VER >= 1600) || (defined(__GNUC__) && (__GNUC__ > 4 || __GNUC_MINOR__ >= 3))
135 #define META_ASSERT_MSG(condition, msg) static_assert(condition, msg)
136 #else
137 #define META_ASSERT_CONCAT(a, b) a ## b
138 #define META_ASSERT_CONCAT2(a, b) META_ASSERT_CONCAT(a, b)
139 #define META_ASSERT_MSG(condition, msg) typedef int META_ASSERT_CONCAT2(COMPILE_TIME_ASSERT_, __LINE__)[static_cast<bool>(condition)?1:-1]
140 #endif
141 #define META_ASSERT(condition) META_ASSERT_MSG(condition, "compile time assertion failed.")
142
143 #endif   // COMMON_DEBUG_H_