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.cpp: Debugging utilities.
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #include <stdarg.h>
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker #include <array>
14*8975f5c5SAndroid Build Coastguard Worker #include <cstdio>
15*8975f5c5SAndroid Build Coastguard Worker #include <cstring>
16*8975f5c5SAndroid Build Coastguard Worker #include <fstream>
17*8975f5c5SAndroid Build Coastguard Worker #include <ostream>
18*8975f5c5SAndroid Build Coastguard Worker #include <vector>
19*8975f5c5SAndroid Build Coastguard Worker
20*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_ANDROID)
21*8975f5c5SAndroid Build Coastguard Worker # include <android/log.h>
22*8975f5c5SAndroid Build Coastguard Worker #endif
23*8975f5c5SAndroid Build Coastguard Worker
24*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_APPLE)
25*8975f5c5SAndroid Build Coastguard Worker # include <os/log.h>
26*8975f5c5SAndroid Build Coastguard Worker #endif
27*8975f5c5SAndroid Build Coastguard Worker
28*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_WINDOWS)
29*8975f5c5SAndroid Build Coastguard Worker # include <windows.h>
30*8975f5c5SAndroid Build Coastguard Worker #endif
31*8975f5c5SAndroid Build Coastguard Worker
32*8975f5c5SAndroid Build Coastguard Worker #include "anglebase/no_destructor.h"
33*8975f5c5SAndroid Build Coastguard Worker #include "common/Optional.h"
34*8975f5c5SAndroid Build Coastguard Worker #include "common/SimpleMutex.h"
35*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
36*8975f5c5SAndroid Build Coastguard Worker #include "common/entry_points_enum_autogen.h"
37*8975f5c5SAndroid Build Coastguard Worker #include "common/system_utils.h"
38*8975f5c5SAndroid Build Coastguard Worker
39*8975f5c5SAndroid Build Coastguard Worker namespace gl
40*8975f5c5SAndroid Build Coastguard Worker {
41*8975f5c5SAndroid Build Coastguard Worker
42*8975f5c5SAndroid Build Coastguard Worker namespace
43*8975f5c5SAndroid Build Coastguard Worker {
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Worker DebugAnnotator *g_debugAnnotator = nullptr;
46*8975f5c5SAndroid Build Coastguard Worker
47*8975f5c5SAndroid Build Coastguard Worker angle::SimpleMutex *g_debugMutex = nullptr;
48*8975f5c5SAndroid Build Coastguard Worker
49*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<const char *, LOG_NUM_SEVERITIES> g_logSeverityNames = {
50*8975f5c5SAndroid Build Coastguard Worker {"EVENT", "INFO", "WARN", "ERR", "FATAL"}};
51*8975f5c5SAndroid Build Coastguard Worker
LogSeverityName(int severity)52*8975f5c5SAndroid Build Coastguard Worker constexpr const char *LogSeverityName(int severity)
53*8975f5c5SAndroid Build Coastguard Worker {
54*8975f5c5SAndroid Build Coastguard Worker return (severity >= 0 && severity < LOG_NUM_SEVERITIES) ? g_logSeverityNames[severity]
55*8975f5c5SAndroid Build Coastguard Worker : "UNKNOWN";
56*8975f5c5SAndroid Build Coastguard Worker }
57*8975f5c5SAndroid Build Coastguard Worker
ShouldCreateLogMessage(LogSeverity severity)58*8975f5c5SAndroid Build Coastguard Worker bool ShouldCreateLogMessage(LogSeverity severity)
59*8975f5c5SAndroid Build Coastguard Worker {
60*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_TRACE_ENABLED)
61*8975f5c5SAndroid Build Coastguard Worker return true;
62*8975f5c5SAndroid Build Coastguard Worker #elif defined(ANGLE_ALWAYS_LOG_INFO)
63*8975f5c5SAndroid Build Coastguard Worker return severity == LOG_FATAL || severity == LOG_ERR || severity == LOG_WARN ||
64*8975f5c5SAndroid Build Coastguard Worker severity == LOG_INFO;
65*8975f5c5SAndroid Build Coastguard Worker #elif defined(ANGLE_ENABLE_ASSERTS)
66*8975f5c5SAndroid Build Coastguard Worker return severity == LOG_FATAL || severity == LOG_ERR || severity == LOG_WARN;
67*8975f5c5SAndroid Build Coastguard Worker #else
68*8975f5c5SAndroid Build Coastguard Worker return severity == LOG_FATAL || severity == LOG_ERR;
69*8975f5c5SAndroid Build Coastguard Worker #endif
70*8975f5c5SAndroid Build Coastguard Worker }
71*8975f5c5SAndroid Build Coastguard Worker
72*8975f5c5SAndroid Build Coastguard Worker } // namespace
73*8975f5c5SAndroid Build Coastguard Worker
74*8975f5c5SAndroid Build Coastguard Worker namespace priv
75*8975f5c5SAndroid Build Coastguard Worker {
76*8975f5c5SAndroid Build Coastguard Worker
ShouldCreatePlatformLogMessage(LogSeverity severity)77*8975f5c5SAndroid Build Coastguard Worker bool ShouldCreatePlatformLogMessage(LogSeverity severity)
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_TRACE_ENABLED)
80*8975f5c5SAndroid Build Coastguard Worker return true;
81*8975f5c5SAndroid Build Coastguard Worker #else
82*8975f5c5SAndroid Build Coastguard Worker return severity != LOG_EVENT;
83*8975f5c5SAndroid Build Coastguard Worker #endif
84*8975f5c5SAndroid Build Coastguard Worker }
85*8975f5c5SAndroid Build Coastguard Worker
86*8975f5c5SAndroid Build Coastguard Worker // This is never instantiated, it's just used for EAT_STREAM_PARAMETERS to an object of the correct
87*8975f5c5SAndroid Build Coastguard Worker // type on the LHS of the unused part of the ternary operator.
88*8975f5c5SAndroid Build Coastguard Worker std::ostream *gSwallowStream;
89*8975f5c5SAndroid Build Coastguard Worker } // namespace priv
90*8975f5c5SAndroid Build Coastguard Worker
DebugAnnotationsActive(const gl::Context * context)91*8975f5c5SAndroid Build Coastguard Worker bool DebugAnnotationsActive(const gl::Context *context)
92*8975f5c5SAndroid Build Coastguard Worker {
93*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_DEBUG_ANNOTATIONS) || defined(ANGLE_ENABLE_DEBUG_TRACE)
94*8975f5c5SAndroid Build Coastguard Worker return g_debugAnnotator != nullptr && g_debugAnnotator->getStatus(context);
95*8975f5c5SAndroid Build Coastguard Worker #else
96*8975f5c5SAndroid Build Coastguard Worker return false;
97*8975f5c5SAndroid Build Coastguard Worker #endif
98*8975f5c5SAndroid Build Coastguard Worker }
99*8975f5c5SAndroid Build Coastguard Worker
ShouldBeginScopedEvent(const gl::Context * context)100*8975f5c5SAndroid Build Coastguard Worker bool ShouldBeginScopedEvent(const gl::Context *context)
101*8975f5c5SAndroid Build Coastguard Worker {
102*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_ANNOTATOR_RUN_TIME_CHECKS)
103*8975f5c5SAndroid Build Coastguard Worker return DebugAnnotationsActive(context);
104*8975f5c5SAndroid Build Coastguard Worker #else
105*8975f5c5SAndroid Build Coastguard Worker return true;
106*8975f5c5SAndroid Build Coastguard Worker #endif // defined(ANGLE_ENABLE_ANNOTATOR_RUN_TIME_CHECKS)
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker
DebugAnnotationsInitialized()109*8975f5c5SAndroid Build Coastguard Worker bool DebugAnnotationsInitialized()
110*8975f5c5SAndroid Build Coastguard Worker {
111*8975f5c5SAndroid Build Coastguard Worker return g_debugAnnotator != nullptr;
112*8975f5c5SAndroid Build Coastguard Worker }
113*8975f5c5SAndroid Build Coastguard Worker
InitializeDebugAnnotations(DebugAnnotator * debugAnnotator)114*8975f5c5SAndroid Build Coastguard Worker void InitializeDebugAnnotations(DebugAnnotator *debugAnnotator)
115*8975f5c5SAndroid Build Coastguard Worker {
116*8975f5c5SAndroid Build Coastguard Worker UninitializeDebugAnnotations();
117*8975f5c5SAndroid Build Coastguard Worker g_debugAnnotator = debugAnnotator;
118*8975f5c5SAndroid Build Coastguard Worker }
119*8975f5c5SAndroid Build Coastguard Worker
UninitializeDebugAnnotations()120*8975f5c5SAndroid Build Coastguard Worker void UninitializeDebugAnnotations()
121*8975f5c5SAndroid Build Coastguard Worker {
122*8975f5c5SAndroid Build Coastguard Worker // Pointer is not managed.
123*8975f5c5SAndroid Build Coastguard Worker g_debugAnnotator = nullptr;
124*8975f5c5SAndroid Build Coastguard Worker }
125*8975f5c5SAndroid Build Coastguard Worker
InitializeDebugMutexIfNeeded()126*8975f5c5SAndroid Build Coastguard Worker void InitializeDebugMutexIfNeeded()
127*8975f5c5SAndroid Build Coastguard Worker {
128*8975f5c5SAndroid Build Coastguard Worker if (g_debugMutex == nullptr)
129*8975f5c5SAndroid Build Coastguard Worker {
130*8975f5c5SAndroid Build Coastguard Worker g_debugMutex = new angle::SimpleMutex();
131*8975f5c5SAndroid Build Coastguard Worker }
132*8975f5c5SAndroid Build Coastguard Worker }
133*8975f5c5SAndroid Build Coastguard Worker
GetDebugMutex()134*8975f5c5SAndroid Build Coastguard Worker angle::SimpleMutex &GetDebugMutex()
135*8975f5c5SAndroid Build Coastguard Worker {
136*8975f5c5SAndroid Build Coastguard Worker ASSERT(g_debugMutex);
137*8975f5c5SAndroid Build Coastguard Worker return *g_debugMutex;
138*8975f5c5SAndroid Build Coastguard Worker }
139*8975f5c5SAndroid Build Coastguard Worker
ScopedPerfEventHelper(gl::Context * context,angle::EntryPoint entryPoint)140*8975f5c5SAndroid Build Coastguard Worker ScopedPerfEventHelper::ScopedPerfEventHelper(gl::Context *context, angle::EntryPoint entryPoint)
141*8975f5c5SAndroid Build Coastguard Worker : mContext(context), mEntryPoint(entryPoint), mFunctionName(nullptr), mCalledBeginEvent(false)
142*8975f5c5SAndroid Build Coastguard Worker {}
143*8975f5c5SAndroid Build Coastguard Worker
~ScopedPerfEventHelper()144*8975f5c5SAndroid Build Coastguard Worker ScopedPerfEventHelper::~ScopedPerfEventHelper()
145*8975f5c5SAndroid Build Coastguard Worker {
146*8975f5c5SAndroid Build Coastguard Worker // EGL_Initialize() and EGL_Terminate() can change g_debugAnnotator. Must check the value of
147*8975f5c5SAndroid Build Coastguard Worker // g_debugAnnotator and whether ScopedPerfEventHelper::begin() initiated a begine that must be
148*8975f5c5SAndroid Build Coastguard Worker // ended now.
149*8975f5c5SAndroid Build Coastguard Worker if (DebugAnnotationsInitialized() && mCalledBeginEvent)
150*8975f5c5SAndroid Build Coastguard Worker {
151*8975f5c5SAndroid Build Coastguard Worker g_debugAnnotator->endEvent(mContext, mFunctionName, mEntryPoint);
152*8975f5c5SAndroid Build Coastguard Worker }
153*8975f5c5SAndroid Build Coastguard Worker }
154*8975f5c5SAndroid Build Coastguard Worker
begin(const char * format,...)155*8975f5c5SAndroid Build Coastguard Worker void ScopedPerfEventHelper::begin(const char *format, ...)
156*8975f5c5SAndroid Build Coastguard Worker {
157*8975f5c5SAndroid Build Coastguard Worker mFunctionName = GetEntryPointName(mEntryPoint);
158*8975f5c5SAndroid Build Coastguard Worker
159*8975f5c5SAndroid Build Coastguard Worker va_list vararg;
160*8975f5c5SAndroid Build Coastguard Worker va_start(vararg, format);
161*8975f5c5SAndroid Build Coastguard Worker
162*8975f5c5SAndroid Build Coastguard Worker std::vector<char> buffer;
163*8975f5c5SAndroid Build Coastguard Worker size_t len = FormatStringIntoVector(format, vararg, buffer);
164*8975f5c5SAndroid Build Coastguard Worker va_end(vararg);
165*8975f5c5SAndroid Build Coastguard Worker
166*8975f5c5SAndroid Build Coastguard Worker ANGLE_LOG(EVENT) << std::string(&buffer[0], len);
167*8975f5c5SAndroid Build Coastguard Worker if (DebugAnnotationsInitialized())
168*8975f5c5SAndroid Build Coastguard Worker {
169*8975f5c5SAndroid Build Coastguard Worker mCalledBeginEvent = true;
170*8975f5c5SAndroid Build Coastguard Worker g_debugAnnotator->beginEvent(mContext, mEntryPoint, mFunctionName, buffer.data());
171*8975f5c5SAndroid Build Coastguard Worker }
172*8975f5c5SAndroid Build Coastguard Worker }
173*8975f5c5SAndroid Build Coastguard Worker
LogMessage(const char * file,const char * function,int line,LogSeverity severity)174*8975f5c5SAndroid Build Coastguard Worker LogMessage::LogMessage(const char *file, const char *function, int line, LogSeverity severity)
175*8975f5c5SAndroid Build Coastguard Worker : mFile(file), mFunction(function), mLine(line), mSeverity(severity)
176*8975f5c5SAndroid Build Coastguard Worker {
177*8975f5c5SAndroid Build Coastguard Worker // INFO() and EVENT() do not require additional function(line) info.
178*8975f5c5SAndroid Build Coastguard Worker if (mSeverity > LOG_INFO)
179*8975f5c5SAndroid Build Coastguard Worker {
180*8975f5c5SAndroid Build Coastguard Worker const char *slash = std::max(strrchr(mFile, '/'), strrchr(mFile, '\\'));
181*8975f5c5SAndroid Build Coastguard Worker mStream << (slash ? (slash + 1) : mFile) << ":" << mLine << " (" << mFunction << "): ";
182*8975f5c5SAndroid Build Coastguard Worker }
183*8975f5c5SAndroid Build Coastguard Worker }
184*8975f5c5SAndroid Build Coastguard Worker
~LogMessage()185*8975f5c5SAndroid Build Coastguard Worker LogMessage::~LogMessage()
186*8975f5c5SAndroid Build Coastguard Worker {
187*8975f5c5SAndroid Build Coastguard Worker {
188*8975f5c5SAndroid Build Coastguard Worker std::unique_lock<angle::SimpleMutex> lock;
189*8975f5c5SAndroid Build Coastguard Worker if (g_debugMutex != nullptr)
190*8975f5c5SAndroid Build Coastguard Worker {
191*8975f5c5SAndroid Build Coastguard Worker lock = std::unique_lock<angle::SimpleMutex>(*g_debugMutex);
192*8975f5c5SAndroid Build Coastguard Worker }
193*8975f5c5SAndroid Build Coastguard Worker
194*8975f5c5SAndroid Build Coastguard Worker if (DebugAnnotationsInitialized() && (mSeverity > LOG_INFO))
195*8975f5c5SAndroid Build Coastguard Worker {
196*8975f5c5SAndroid Build Coastguard Worker g_debugAnnotator->logMessage(*this);
197*8975f5c5SAndroid Build Coastguard Worker }
198*8975f5c5SAndroid Build Coastguard Worker else
199*8975f5c5SAndroid Build Coastguard Worker {
200*8975f5c5SAndroid Build Coastguard Worker Trace(getSeverity(), getMessage().c_str());
201*8975f5c5SAndroid Build Coastguard Worker }
202*8975f5c5SAndroid Build Coastguard Worker }
203*8975f5c5SAndroid Build Coastguard Worker
204*8975f5c5SAndroid Build Coastguard Worker if (mSeverity == LOG_FATAL)
205*8975f5c5SAndroid Build Coastguard Worker {
206*8975f5c5SAndroid Build Coastguard Worker if (angle::IsDebuggerAttached())
207*8975f5c5SAndroid Build Coastguard Worker {
208*8975f5c5SAndroid Build Coastguard Worker angle::BreakDebugger();
209*8975f5c5SAndroid Build Coastguard Worker }
210*8975f5c5SAndroid Build Coastguard Worker else
211*8975f5c5SAndroid Build Coastguard Worker {
212*8975f5c5SAndroid Build Coastguard Worker ANGLE_CRASH();
213*8975f5c5SAndroid Build Coastguard Worker }
214*8975f5c5SAndroid Build Coastguard Worker }
215*8975f5c5SAndroid Build Coastguard Worker }
216*8975f5c5SAndroid Build Coastguard Worker
Trace(LogSeverity severity,const char * message)217*8975f5c5SAndroid Build Coastguard Worker void Trace(LogSeverity severity, const char *message)
218*8975f5c5SAndroid Build Coastguard Worker {
219*8975f5c5SAndroid Build Coastguard Worker if (!ShouldCreateLogMessage(severity))
220*8975f5c5SAndroid Build Coastguard Worker {
221*8975f5c5SAndroid Build Coastguard Worker return;
222*8975f5c5SAndroid Build Coastguard Worker }
223*8975f5c5SAndroid Build Coastguard Worker
224*8975f5c5SAndroid Build Coastguard Worker std::string str(message);
225*8975f5c5SAndroid Build Coastguard Worker
226*8975f5c5SAndroid Build Coastguard Worker if (DebugAnnotationsActive(/*context=*/nullptr))
227*8975f5c5SAndroid Build Coastguard Worker {
228*8975f5c5SAndroid Build Coastguard Worker
229*8975f5c5SAndroid Build Coastguard Worker switch (severity)
230*8975f5c5SAndroid Build Coastguard Worker {
231*8975f5c5SAndroid Build Coastguard Worker case LOG_EVENT:
232*8975f5c5SAndroid Build Coastguard Worker // Debugging logging done in ScopedPerfEventHelper
233*8975f5c5SAndroid Build Coastguard Worker break;
234*8975f5c5SAndroid Build Coastguard Worker default:
235*8975f5c5SAndroid Build Coastguard Worker g_debugAnnotator->setMarker(/*context=*/nullptr, message);
236*8975f5c5SAndroid Build Coastguard Worker break;
237*8975f5c5SAndroid Build Coastguard Worker }
238*8975f5c5SAndroid Build Coastguard Worker }
239*8975f5c5SAndroid Build Coastguard Worker
240*8975f5c5SAndroid Build Coastguard Worker if (severity == LOG_FATAL || severity == LOG_ERR || severity == LOG_WARN ||
241*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_TRACE_ANDROID_LOGCAT) || defined(ANGLE_ENABLE_TRACE_EVENTS)
242*8975f5c5SAndroid Build Coastguard Worker severity == LOG_EVENT ||
243*8975f5c5SAndroid Build Coastguard Worker #endif
244*8975f5c5SAndroid Build Coastguard Worker severity == LOG_INFO)
245*8975f5c5SAndroid Build Coastguard Worker {
246*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_ANDROID)
247*8975f5c5SAndroid Build Coastguard Worker android_LogPriority android_priority = ANDROID_LOG_ERROR;
248*8975f5c5SAndroid Build Coastguard Worker switch (severity)
249*8975f5c5SAndroid Build Coastguard Worker {
250*8975f5c5SAndroid Build Coastguard Worker case LOG_INFO:
251*8975f5c5SAndroid Build Coastguard Worker case LOG_EVENT:
252*8975f5c5SAndroid Build Coastguard Worker android_priority = ANDROID_LOG_INFO;
253*8975f5c5SAndroid Build Coastguard Worker break;
254*8975f5c5SAndroid Build Coastguard Worker case LOG_WARN:
255*8975f5c5SAndroid Build Coastguard Worker android_priority = ANDROID_LOG_WARN;
256*8975f5c5SAndroid Build Coastguard Worker break;
257*8975f5c5SAndroid Build Coastguard Worker case LOG_ERR:
258*8975f5c5SAndroid Build Coastguard Worker android_priority = ANDROID_LOG_ERROR;
259*8975f5c5SAndroid Build Coastguard Worker break;
260*8975f5c5SAndroid Build Coastguard Worker case LOG_FATAL:
261*8975f5c5SAndroid Build Coastguard Worker android_priority = ANDROID_LOG_FATAL;
262*8975f5c5SAndroid Build Coastguard Worker break;
263*8975f5c5SAndroid Build Coastguard Worker default:
264*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
265*8975f5c5SAndroid Build Coastguard Worker }
266*8975f5c5SAndroid Build Coastguard Worker __android_log_print(android_priority, "ANGLE", "%s: %s\n", LogSeverityName(severity),
267*8975f5c5SAndroid Build Coastguard Worker str.c_str());
268*8975f5c5SAndroid Build Coastguard Worker // Note: we also log to stdout/stderr below.
269*8975f5c5SAndroid Build Coastguard Worker #endif
270*8975f5c5SAndroid Build Coastguard Worker
271*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_APPLE)
272*8975f5c5SAndroid Build Coastguard Worker if (__builtin_available(macOS 10.12, iOS 10.0, *))
273*8975f5c5SAndroid Build Coastguard Worker {
274*8975f5c5SAndroid Build Coastguard Worker os_log_type_t apple_log_type = OS_LOG_TYPE_DEFAULT;
275*8975f5c5SAndroid Build Coastguard Worker switch (severity)
276*8975f5c5SAndroid Build Coastguard Worker {
277*8975f5c5SAndroid Build Coastguard Worker case LOG_INFO:
278*8975f5c5SAndroid Build Coastguard Worker case LOG_EVENT:
279*8975f5c5SAndroid Build Coastguard Worker apple_log_type = OS_LOG_TYPE_INFO;
280*8975f5c5SAndroid Build Coastguard Worker break;
281*8975f5c5SAndroid Build Coastguard Worker case LOG_WARN:
282*8975f5c5SAndroid Build Coastguard Worker apple_log_type = OS_LOG_TYPE_DEFAULT;
283*8975f5c5SAndroid Build Coastguard Worker break;
284*8975f5c5SAndroid Build Coastguard Worker case LOG_ERR:
285*8975f5c5SAndroid Build Coastguard Worker apple_log_type = OS_LOG_TYPE_ERROR;
286*8975f5c5SAndroid Build Coastguard Worker break;
287*8975f5c5SAndroid Build Coastguard Worker case LOG_FATAL:
288*8975f5c5SAndroid Build Coastguard Worker // OS_LOG_TYPE_FAULT is too severe - grabs the entire process tree.
289*8975f5c5SAndroid Build Coastguard Worker apple_log_type = OS_LOG_TYPE_ERROR;
290*8975f5c5SAndroid Build Coastguard Worker break;
291*8975f5c5SAndroid Build Coastguard Worker default:
292*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
293*8975f5c5SAndroid Build Coastguard Worker }
294*8975f5c5SAndroid Build Coastguard Worker os_log_with_type(OS_LOG_DEFAULT, apple_log_type, "ANGLE: %s: %s\n",
295*8975f5c5SAndroid Build Coastguard Worker LogSeverityName(severity), str.c_str());
296*8975f5c5SAndroid Build Coastguard Worker }
297*8975f5c5SAndroid Build Coastguard Worker #else
298*8975f5c5SAndroid Build Coastguard Worker // Note: we use fprintf because <iostream> includes static initializers.
299*8975f5c5SAndroid Build Coastguard Worker fprintf((severity >= LOG_WARN) ? stderr : stdout, "%s: %s\n", LogSeverityName(severity),
300*8975f5c5SAndroid Build Coastguard Worker str.c_str());
301*8975f5c5SAndroid Build Coastguard Worker #endif
302*8975f5c5SAndroid Build Coastguard Worker }
303*8975f5c5SAndroid Build Coastguard Worker
304*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_WINDOWS) && \
305*8975f5c5SAndroid Build Coastguard Worker (defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER) || !defined(NDEBUG))
306*8975f5c5SAndroid Build Coastguard Worker # if !defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER)
307*8975f5c5SAndroid Build Coastguard Worker if (severity >= LOG_ERR)
308*8975f5c5SAndroid Build Coastguard Worker # endif // !defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER)
309*8975f5c5SAndroid Build Coastguard Worker {
310*8975f5c5SAndroid Build Coastguard Worker OutputDebugStringA(str.c_str());
311*8975f5c5SAndroid Build Coastguard Worker OutputDebugStringA("\n");
312*8975f5c5SAndroid Build Coastguard Worker }
313*8975f5c5SAndroid Build Coastguard Worker #endif
314*8975f5c5SAndroid Build Coastguard Worker
315*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_DEBUG_TRACE)
316*8975f5c5SAndroid Build Coastguard Worker # if defined(NDEBUG)
317*8975f5c5SAndroid Build Coastguard Worker if (severity == LOG_EVENT || severity == LOG_WARN || severity == LOG_INFO)
318*8975f5c5SAndroid Build Coastguard Worker {
319*8975f5c5SAndroid Build Coastguard Worker return;
320*8975f5c5SAndroid Build Coastguard Worker }
321*8975f5c5SAndroid Build Coastguard Worker # endif // defined(NDEBUG)
322*8975f5c5SAndroid Build Coastguard Worker static angle::base::NoDestructor<std::ofstream> file(TRACE_OUTPUT_FILE, std::ofstream::app);
323*8975f5c5SAndroid Build Coastguard Worker if (file->good())
324*8975f5c5SAndroid Build Coastguard Worker {
325*8975f5c5SAndroid Build Coastguard Worker if (severity > LOG_EVENT)
326*8975f5c5SAndroid Build Coastguard Worker {
327*8975f5c5SAndroid Build Coastguard Worker *file << LogSeverityName(severity) << ": ";
328*8975f5c5SAndroid Build Coastguard Worker }
329*8975f5c5SAndroid Build Coastguard Worker *file << str << "\n";
330*8975f5c5SAndroid Build Coastguard Worker file->flush();
331*8975f5c5SAndroid Build Coastguard Worker }
332*8975f5c5SAndroid Build Coastguard Worker #endif // defined(ANGLE_ENABLE_DEBUG_TRACE)
333*8975f5c5SAndroid Build Coastguard Worker }
334*8975f5c5SAndroid Build Coastguard Worker
getSeverity() const335*8975f5c5SAndroid Build Coastguard Worker LogSeverity LogMessage::getSeverity() const
336*8975f5c5SAndroid Build Coastguard Worker {
337*8975f5c5SAndroid Build Coastguard Worker return mSeverity;
338*8975f5c5SAndroid Build Coastguard Worker }
339*8975f5c5SAndroid Build Coastguard Worker
getMessage() const340*8975f5c5SAndroid Build Coastguard Worker std::string LogMessage::getMessage() const
341*8975f5c5SAndroid Build Coastguard Worker {
342*8975f5c5SAndroid Build Coastguard Worker return mStream.str();
343*8975f5c5SAndroid Build Coastguard Worker }
344*8975f5c5SAndroid Build Coastguard Worker
345*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_WINDOWS)
FmtHR(HRESULT value)346*8975f5c5SAndroid Build Coastguard Worker priv::FmtHexHelper<HRESULT, char> FmtHR(HRESULT value)
347*8975f5c5SAndroid Build Coastguard Worker {
348*8975f5c5SAndroid Build Coastguard Worker return priv::FmtHexHelper<HRESULT, char>("HRESULT: ", value);
349*8975f5c5SAndroid Build Coastguard Worker }
350*8975f5c5SAndroid Build Coastguard Worker
FmtErr(DWORD value)351*8975f5c5SAndroid Build Coastguard Worker priv::FmtHexHelper<DWORD, char> FmtErr(DWORD value)
352*8975f5c5SAndroid Build Coastguard Worker {
353*8975f5c5SAndroid Build Coastguard Worker return priv::FmtHexHelper<DWORD, char>("error: ", value);
354*8975f5c5SAndroid Build Coastguard Worker }
355*8975f5c5SAndroid Build Coastguard Worker #endif // defined(ANGLE_PLATFORM_WINDOWS)
356*8975f5c5SAndroid Build Coastguard Worker
357*8975f5c5SAndroid Build Coastguard Worker } // namespace gl
358