xref: /aosp_15_r20/external/angle/src/common/debug.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // debug.h: Debugging utilities. A lot of the logging code is adapted from Chromium's
8*8975f5c5SAndroid Build Coastguard Worker // base/logging.h.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef COMMON_DEBUG_H_
11*8975f5c5SAndroid Build Coastguard Worker #define COMMON_DEBUG_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include <assert.h>
14*8975f5c5SAndroid Build Coastguard Worker #include <stdio.h>
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker #include <iomanip>
17*8975f5c5SAndroid Build Coastguard Worker #include <ios>
18*8975f5c5SAndroid Build Coastguard Worker #include <mutex>
19*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
20*8975f5c5SAndroid Build Coastguard Worker #include <string>
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker #include "common/SimpleMutex.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
24*8975f5c5SAndroid Build Coastguard Worker #include "common/entry_points_enum_autogen.h"
25*8975f5c5SAndroid Build Coastguard Worker #include "common/log_utils.h"
26*8975f5c5SAndroid Build Coastguard Worker #include "common/platform.h"
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_WINDOWS)
29*8975f5c5SAndroid Build Coastguard Worker #    include <sal.h>
30*8975f5c5SAndroid Build Coastguard Worker typedef unsigned long DWORD;
31*8975f5c5SAndroid Build Coastguard Worker typedef _Return_type_success_(return >= 0) long HRESULT;
32*8975f5c5SAndroid Build Coastguard Worker #endif
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker #if !defined(TRACE_OUTPUT_FILE)
35*8975f5c5SAndroid Build Coastguard Worker #    define TRACE_OUTPUT_FILE "angle_debug.txt"
36*8975f5c5SAndroid Build Coastguard Worker #endif
37*8975f5c5SAndroid Build Coastguard Worker 
38*8975f5c5SAndroid Build Coastguard Worker namespace gl
39*8975f5c5SAndroid Build Coastguard Worker {
40*8975f5c5SAndroid Build Coastguard Worker class Context;
41*8975f5c5SAndroid Build Coastguard Worker 
42*8975f5c5SAndroid Build Coastguard Worker // Pairs a begin event with an end event.
43*8975f5c5SAndroid Build Coastguard Worker class [[nodiscard]] ScopedPerfEventHelper : angle::NonCopyable
44*8975f5c5SAndroid Build Coastguard Worker {
45*8975f5c5SAndroid Build Coastguard Worker   public:
46*8975f5c5SAndroid Build Coastguard Worker     ScopedPerfEventHelper(Context *context, angle::EntryPoint entryPoint);
47*8975f5c5SAndroid Build Coastguard Worker     ~ScopedPerfEventHelper();
48*8975f5c5SAndroid Build Coastguard Worker     ANGLE_FORMAT_PRINTF(2, 3)
49*8975f5c5SAndroid Build Coastguard Worker     void begin(const char *format, ...);
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker   private:
52*8975f5c5SAndroid Build Coastguard Worker     gl::Context *mContext;
53*8975f5c5SAndroid Build Coastguard Worker     const angle::EntryPoint mEntryPoint;
54*8975f5c5SAndroid Build Coastguard Worker     const char *mFunctionName;
55*8975f5c5SAndroid Build Coastguard Worker     bool mCalledBeginEvent;
56*8975f5c5SAndroid Build Coastguard Worker };
57*8975f5c5SAndroid Build Coastguard Worker 
58*8975f5c5SAndroid Build Coastguard Worker // Wraps the API/Platform-specific debug annotation functions.
59*8975f5c5SAndroid Build Coastguard Worker // Also handles redirecting logging destination.
60*8975f5c5SAndroid Build Coastguard Worker class DebugAnnotator : angle::NonCopyable
61*8975f5c5SAndroid Build Coastguard Worker {
62*8975f5c5SAndroid Build Coastguard Worker   public:
DebugAnnotator()63*8975f5c5SAndroid Build Coastguard Worker     DebugAnnotator() {}
~DebugAnnotator()64*8975f5c5SAndroid Build Coastguard Worker     virtual ~DebugAnnotator() {}
65*8975f5c5SAndroid Build Coastguard Worker     virtual void beginEvent(gl::Context *context,
66*8975f5c5SAndroid Build Coastguard Worker                             angle::EntryPoint entryPoint,
67*8975f5c5SAndroid Build Coastguard Worker                             const char *eventName,
68*8975f5c5SAndroid Build Coastguard Worker                             const char *eventMessage)                    = 0;
69*8975f5c5SAndroid Build Coastguard Worker     virtual void endEvent(gl::Context *context,
70*8975f5c5SAndroid Build Coastguard Worker                           const char *eventName,
71*8975f5c5SAndroid Build Coastguard Worker                           angle::EntryPoint entryPoint)                  = 0;
72*8975f5c5SAndroid Build Coastguard Worker     virtual void setMarker(gl::Context *context, const char *markerName) = 0;
73*8975f5c5SAndroid Build Coastguard Worker     virtual bool getStatus(const gl::Context *context)                   = 0;
74*8975f5c5SAndroid Build Coastguard Worker     // Log Message Handler that gets passed every log message,
75*8975f5c5SAndroid Build Coastguard Worker     // when debug annotations are initialized,
76*8975f5c5SAndroid Build Coastguard Worker     // replacing default handling by LogMessage.
77*8975f5c5SAndroid Build Coastguard Worker     virtual void logMessage(const LogMessage &msg) const = 0;
78*8975f5c5SAndroid Build Coastguard Worker };
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker void InitializeDebugAnnotations(DebugAnnotator *debugAnnotator);
81*8975f5c5SAndroid Build Coastguard Worker void UninitializeDebugAnnotations();
82*8975f5c5SAndroid Build Coastguard Worker bool DebugAnnotationsActive(const gl::Context *context);
83*8975f5c5SAndroid Build Coastguard Worker bool DebugAnnotationsInitialized();
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker void InitializeDebugMutexIfNeeded();
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker angle::SimpleMutex &GetDebugMutex();
88*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
89*8975f5c5SAndroid Build Coastguard Worker 
90*8975f5c5SAndroid Build Coastguard Worker // The state tracked by ANGLE will be validated with the driver state before each call
91*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_DEBUG_TRACE)
92*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_STATE_VALIDATION_ENABLED
93*8975f5c5SAndroid Build Coastguard Worker #endif
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker #if defined(__GNUC__)
96*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_CRASH() __builtin_trap()
97*8975f5c5SAndroid Build Coastguard Worker #else
98*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_CRASH() ((void)(*(volatile char *)0 = 0)), __assume(0)
99*8975f5c5SAndroid Build Coastguard Worker #endif
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_UNUSED_VARIABLE(variable) (static_cast<void>(variable))
102*8975f5c5SAndroid Build Coastguard Worker 
103*8975f5c5SAndroid Build Coastguard Worker // Defining ANGLE_ENABLE_STRUCT_PADDING_WARNINGS will enable warnings when members are added to
104*8975f5c5SAndroid Build Coastguard Worker // structs to enforce packing. This is helpful for diagnosing unexpected struct sizes when making
105*8975f5c5SAndroid Build Coastguard Worker // fast cache variables.
106*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__)
107*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \
108*8975f5c5SAndroid Build Coastguard Worker         _Pragma("clang diagnostic push") _Pragma("clang diagnostic error \"-Wpadded\"")
109*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS _Pragma("clang diagnostic pop")
110*8975f5c5SAndroid Build Coastguard Worker #elif defined(__GNUC__)
111*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \
112*8975f5c5SAndroid Build Coastguard Worker         _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic error \"-Wpadded\"")
113*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS _Pragma("GCC diagnostic pop")
114*8975f5c5SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
115*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS \
116*8975f5c5SAndroid Build Coastguard Worker         __pragma(warning(push)) __pragma(warning(error : 4820))
117*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS __pragma(warning(pop))
118*8975f5c5SAndroid Build Coastguard Worker #else
119*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_ENABLE_STRUCT_PADDING_WARNINGS
120*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_STRUCT_PADDING_WARNINGS
121*8975f5c5SAndroid Build Coastguard Worker #endif
122*8975f5c5SAndroid Build Coastguard Worker 
123*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__)
124*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_SUGGEST_OVERRIDE_WARNINGS                               \
125*8975f5c5SAndroid Build Coastguard Worker         _Pragma("clang diagnostic push")                                          \
126*8975f5c5SAndroid Build Coastguard Worker             _Pragma("clang diagnostic ignored \"-Wsuggest-destructor-override\"") \
127*8975f5c5SAndroid Build Coastguard Worker                 _Pragma("clang diagnostic ignored \"-Wsuggest-override\"")
128*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REENABLE_SUGGEST_OVERRIDE_WARNINGS _Pragma("clang diagnostic pop")
129*8975f5c5SAndroid Build Coastguard Worker #else
130*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_SUGGEST_OVERRIDE_WARNINGS
131*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REENABLE_SUGGEST_OVERRIDE_WARNINGS
132*8975f5c5SAndroid Build Coastguard Worker #endif
133*8975f5c5SAndroid Build Coastguard Worker 
134*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__)
135*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_EXTRA_SEMI_WARNING \
136*8975f5c5SAndroid Build Coastguard Worker         _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wextra-semi\"")
137*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REENABLE_EXTRA_SEMI_WARNING _Pragma("clang diagnostic pop")
138*8975f5c5SAndroid Build Coastguard Worker #else
139*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_EXTRA_SEMI_WARNING
140*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REENABLE_EXTRA_SEMI_WARNING
141*8975f5c5SAndroid Build Coastguard Worker #endif
142*8975f5c5SAndroid Build Coastguard Worker 
143*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__)
144*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_EXTRA_SEMI_STMT_WARNING \
145*8975f5c5SAndroid Build Coastguard Worker         _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wextra-semi-stmt\"")
146*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REENABLE_EXTRA_SEMI_STMT_WARNING _Pragma("clang diagnostic pop")
147*8975f5c5SAndroid Build Coastguard Worker #else
148*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_EXTRA_SEMI_STMT_WARNING
149*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REENABLE_EXTRA_SEMI_STMT_WARNING
150*8975f5c5SAndroid Build Coastguard Worker #endif
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__)
153*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_SHADOWING_WARNING \
154*8975f5c5SAndroid Build Coastguard Worker         _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wshadow-field\"")
155*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REENABLE_SHADOWING_WARNING _Pragma("clang diagnostic pop")
156*8975f5c5SAndroid Build Coastguard Worker #else
157*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_SHADOWING_WARNING
158*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REENABLE_SHADOWING_WARNING
159*8975f5c5SAndroid Build Coastguard Worker #endif
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__)
162*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_DESTRUCTOR_OVERRIDE_WARNING \
163*8975f5c5SAndroid Build Coastguard Worker         _Pragma("clang diagnostic push")              \
164*8975f5c5SAndroid Build Coastguard Worker             _Pragma("clang diagnostic ignored \"-Winconsistent-missing-destructor-override\"")
165*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REENABLE_DESTRUCTOR_OVERRIDE_WARNING _Pragma("clang diagnostic pop")
166*8975f5c5SAndroid Build Coastguard Worker #else
167*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_DESTRUCTOR_OVERRIDE_WARNING
168*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REENABLE_DESTRUCTOR_OVERRIDE_WARNING
169*8975f5c5SAndroid Build Coastguard Worker #endif
170*8975f5c5SAndroid Build Coastguard Worker 
171*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__)
172*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_UNUSED_FUNCTION_WARNING \
173*8975f5c5SAndroid Build Coastguard Worker         _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wunused-function\"")
174*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REENABLE_UNUSED_FUNCTION_WARNING _Pragma("clang diagnostic pop")
175*8975f5c5SAndroid Build Coastguard Worker #else
176*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DISABLE_UNUSED_FUNCTION_WARNING
177*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REENABLE_UNUSED_FUNCTION_WARNING
178*8975f5c5SAndroid Build Coastguard Worker #endif
179*8975f5c5SAndroid Build Coastguard Worker 
180*8975f5c5SAndroid Build Coastguard Worker #endif  // COMMON_DEBUG_H_
181