blob: 466eb6d86c552af835679b8d07c755fcc9b1a3c3 [file] [log] [blame]
daniel@transgaming.com95a758f2012-07-12 15:17:06 +00001//
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.cpp: Debugging utilities.
8
9#include "common/debug.h"
Geoff Lang44fa7592014-05-30 11:50:07 -040010#include "common/platform.h"
Geoff Langda5777c2014-07-11 09:52:58 -040011#include "common/angleutils.h"
Geoff Lang44fa7592014-05-30 11:50:07 -040012
Geoff Lang83217792014-01-16 09:52:38 -050013#include <stdarg.h>
Geoff Langfeee44b2014-03-05 11:34:31 -050014#include <vector>
15#include <fstream>
16#include <cstdio>
Geoff Lang68509472013-10-07 17:06:30 -040017
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000018namespace gl
19{
Jamie Madill2c7c6252015-03-12 14:15:38 -040020
21namespace
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000022{
Austin Kinross922a9fb2014-10-21 14:26:33 -070023enum DebugTraceOutputType
24{
25 DebugTraceOutputTypeNone,
26 DebugTraceOutputTypeSetMarker,
27 DebugTraceOutputTypeBeginEvent
28};
29
Jamie Madill2c7c6252015-03-12 14:15:38 -040030DebugAnnotator *g_debugAnnotator = nullptr;
31
32void output(bool traceInDebugOnly, MessageType messageType, DebugTraceOutputType outputType,
33 const char *format, va_list vararg)
Austin Kinross922a9fb2014-10-21 14:26:33 -070034{
Jamie Madill2c7c6252015-03-12 14:15:38 -040035 if (DebugAnnotationsActive())
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000036 {
Geoff Lang8bc361e2014-11-20 16:23:31 -050037 static std::vector<char> buffer(512);
Austin Kinross922a9fb2014-10-21 14:26:33 -070038 size_t len = FormatStringIntoVector(format, vararg, buffer);
39 std::wstring formattedWideMessage(buffer.begin(), buffer.begin() + len);
40
Jamie Madill2c7c6252015-03-12 14:15:38 -040041 ASSERT(g_debugAnnotator != nullptr);
Austin Kinross922a9fb2014-10-21 14:26:33 -070042 switch (outputType)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000043 {
Geoff Lang8bc361e2014-11-20 16:23:31 -050044 case DebugTraceOutputTypeNone:
45 break;
46 case DebugTraceOutputTypeBeginEvent:
Austin Kinross6ee1e782015-05-29 17:05:37 -070047 g_debugAnnotator->beginEvent(formattedWideMessage.c_str());
Geoff Lang8bc361e2014-11-20 16:23:31 -050048 break;
49 case DebugTraceOutputTypeSetMarker:
Austin Kinross6ee1e782015-05-29 17:05:37 -070050 g_debugAnnotator->setMarker(formattedWideMessage.c_str());
Geoff Lang8bc361e2014-11-20 16:23:31 -050051 break;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000052 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000053 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000054
Jamie Madill14aa40f2015-01-07 15:12:47 -050055 std::string formattedMessage;
56 UNUSED_TRACE_VARIABLE(formattedMessage);
57
58#if !defined(NDEBUG) && defined(_MSC_VER)
59 if (messageType == MESSAGE_ERR)
60 {
61 if (formattedMessage.empty())
62 {
63 formattedMessage = FormatString(format, vararg);
64 }
Cooper Partin7318b7c2015-01-08 09:15:35 -080065 OutputDebugStringA(formattedMessage.c_str());
Jamie Madill14aa40f2015-01-07 15:12:47 -050066 }
67#endif
68
Austin Kinrossf0360c62014-10-20 14:26:13 -070069#if defined(ANGLE_ENABLE_DEBUG_TRACE)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000070#if defined(NDEBUG)
Austin Kinrossfe14d452014-10-20 14:36:18 -070071 if (traceInDebugOnly)
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000072 {
73 return;
74 }
Geoff Langf5713122013-10-07 17:06:30 -040075#endif // NDEBUG
Jamie Madill14aa40f2015-01-07 15:12:47 -050076 if (formattedMessage.empty())
77 {
78 formattedMessage = FormatString(format, vararg);
79 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000080
Geoff Langfeee44b2014-03-05 11:34:31 -050081 static std::ofstream file(TRACE_OUTPUT_FILE, std::ofstream::app);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000082 if (file)
83 {
Geoff Langda5777c2014-07-11 09:52:58 -040084 file.write(formattedMessage.c_str(), formattedMessage.length());
Geoff Langfeee44b2014-03-05 11:34:31 -050085 file.flush();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000086 }
Geoff Langfeee44b2014-03-05 11:34:31 -050087
Austin Kinrossfe14d452014-10-20 14:36:18 -070088#if defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER)
89 OutputDebugStringA(formattedMessage.c_str());
90#endif // ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER
91
Austin Kinrossf0360c62014-10-20 14:26:13 -070092#endif // ANGLE_ENABLE_DEBUG_TRACE
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000093}
94
Jamie Madill2c7c6252015-03-12 14:15:38 -040095} // namespace
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000096
Jamie Madill2c7c6252015-03-12 14:15:38 -040097bool DebugAnnotationsActive()
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000098{
Austin Kinross570e83c2014-10-20 14:13:58 -070099#if defined(ANGLE_ENABLE_DEBUG_ANNOTATIONS)
Jamie Madill2c7c6252015-03-12 14:15:38 -0400100 return g_debugAnnotator != nullptr && g_debugAnnotator->getStatus();
Geoff Langf5713122013-10-07 17:06:30 -0400101#else
102 return false;
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000103#endif
104}
105
Jamie Madill2c7c6252015-03-12 14:15:38 -0400106void InitializeDebugAnnotations(DebugAnnotator *debugAnnotator)
107{
108 UninitializeDebugAnnotations();
109 g_debugAnnotator = debugAnnotator;
110}
111
112void UninitializeDebugAnnotations()
113{
114 // Pointer is not managed.
115 g_debugAnnotator = nullptr;
116}
117
118void trace(bool traceInDebugOnly, MessageType messageType, const char *format, ...)
119{
120 va_list vararg;
121 va_start(vararg, format);
122 output(traceInDebugOnly, messageType, DebugTraceOutputTypeSetMarker, format, vararg);
123 va_end(vararg);
124}
125
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000126ScopedPerfEventHelper::ScopedPerfEventHelper(const char* format, ...)
127{
Austin Kinrossf0360c62014-10-20 14:26:13 -0700128#if !defined(ANGLE_ENABLE_DEBUG_TRACE)
Jamie Madill2c7c6252015-03-12 14:15:38 -0400129 if (!DebugAnnotationsActive())
daniel@transgaming.com5dc3b8b2012-11-28 19:43:49 +0000130 {
131 return;
132 }
Austin Kinrossf0360c62014-10-20 14:26:13 -0700133#endif // !ANGLE_ENABLE_DEBUG_TRACE
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000134 va_list vararg;
135 va_start(vararg, format);
Jamie Madill14aa40f2015-01-07 15:12:47 -0500136 output(true, MESSAGE_EVENT, DebugTraceOutputTypeBeginEvent, format, vararg);
Jamie Madillb60fe312014-09-26 14:56:41 -0400137 va_end(vararg);
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000138}
139
140ScopedPerfEventHelper::~ScopedPerfEventHelper()
141{
Jamie Madill2c7c6252015-03-12 14:15:38 -0400142 if (DebugAnnotationsActive())
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000143 {
Jamie Madill2c7c6252015-03-12 14:15:38 -0400144 g_debugAnnotator->endEvent();
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000145 }
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000146}
Jamie Madill2c7c6252015-03-12 14:15:38 -0400147
daniel@transgaming.com95a758f2012-07-12 15:17:06 +0000148}