daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 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.cpp: Debugging utilities. |
| 8 | |
| 9 | #include "common/debug.h" |
Geoff Lang | 44fa759 | 2014-05-30 11:50:07 -0400 | [diff] [blame] | 10 | |
Geoff Lang | 8321779 | 2014-01-16 09:52:38 -0500 | [diff] [blame] | 11 | #include <stdarg.h> |
Jamie Madill | e31fd87 | 2016-05-27 08:35:36 -0400 | [diff] [blame^] | 12 | |
Geoff Lang | feee44b | 2014-03-05 11:34:31 -0500 | [diff] [blame] | 13 | #include <cstdio> |
Jamie Madill | e31fd87 | 2016-05-27 08:35:36 -0400 | [diff] [blame^] | 14 | #include <fstream> |
| 15 | #include <iostream> |
| 16 | #include <vector> |
| 17 | |
| 18 | #include "common/angleutils.h" |
| 19 | #include "common/platform.h" |
| 20 | #include "common/Optional.h" |
Geoff Lang | 6850947 | 2013-10-07 17:06:30 -0400 | [diff] [blame] | 21 | |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 22 | namespace gl |
| 23 | { |
Jamie Madill | 2c7c625 | 2015-03-12 14:15:38 -0400 | [diff] [blame] | 24 | |
| 25 | namespace |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 26 | { |
Jamie Madill | e31fd87 | 2016-05-27 08:35:36 -0400 | [diff] [blame^] | 27 | |
| 28 | class FormattedString final : angle::NonCopyable |
| 29 | { |
| 30 | public: |
| 31 | FormattedString(const char *format, va_list vararg) : mFormat(format) |
| 32 | { |
| 33 | va_copy(mVarArg, vararg); |
| 34 | } |
| 35 | |
| 36 | const char *c_str() { return str().c_str(); } |
| 37 | |
| 38 | const std::string &str() |
| 39 | { |
| 40 | if (!mMessage.valid()) |
| 41 | { |
| 42 | mMessage = FormatString(mFormat, mVarArg); |
| 43 | } |
| 44 | return mMessage.value(); |
| 45 | } |
| 46 | |
| 47 | size_t length() |
| 48 | { |
| 49 | c_str(); |
| 50 | return mMessage.value().length(); |
| 51 | } |
| 52 | |
| 53 | private: |
| 54 | const char *mFormat; |
| 55 | va_list mVarArg; |
| 56 | Optional<std::string> mMessage; |
| 57 | }; |
Austin Kinross | 922a9fb | 2014-10-21 14:26:33 -0700 | [diff] [blame] | 58 | enum DebugTraceOutputType |
| 59 | { |
| 60 | DebugTraceOutputTypeNone, |
| 61 | DebugTraceOutputTypeSetMarker, |
| 62 | DebugTraceOutputTypeBeginEvent |
| 63 | }; |
| 64 | |
Jamie Madill | 2c7c625 | 2015-03-12 14:15:38 -0400 | [diff] [blame] | 65 | DebugAnnotator *g_debugAnnotator = nullptr; |
| 66 | |
| 67 | void output(bool traceInDebugOnly, MessageType messageType, DebugTraceOutputType outputType, |
| 68 | const char *format, va_list vararg) |
Austin Kinross | 922a9fb | 2014-10-21 14:26:33 -0700 | [diff] [blame] | 69 | { |
Jamie Madill | 2c7c625 | 2015-03-12 14:15:38 -0400 | [diff] [blame] | 70 | if (DebugAnnotationsActive()) |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 71 | { |
Geoff Lang | 8bc361e | 2014-11-20 16:23:31 -0500 | [diff] [blame] | 72 | static std::vector<char> buffer(512); |
Austin Kinross | 922a9fb | 2014-10-21 14:26:33 -0700 | [diff] [blame] | 73 | size_t len = FormatStringIntoVector(format, vararg, buffer); |
| 74 | std::wstring formattedWideMessage(buffer.begin(), buffer.begin() + len); |
| 75 | |
Jamie Madill | 2c7c625 | 2015-03-12 14:15:38 -0400 | [diff] [blame] | 76 | ASSERT(g_debugAnnotator != nullptr); |
Austin Kinross | 922a9fb | 2014-10-21 14:26:33 -0700 | [diff] [blame] | 77 | switch (outputType) |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 78 | { |
Geoff Lang | 8bc361e | 2014-11-20 16:23:31 -0500 | [diff] [blame] | 79 | case DebugTraceOutputTypeNone: |
| 80 | break; |
| 81 | case DebugTraceOutputTypeBeginEvent: |
Austin Kinross | 6ee1e78 | 2015-05-29 17:05:37 -0700 | [diff] [blame] | 82 | g_debugAnnotator->beginEvent(formattedWideMessage.c_str()); |
Geoff Lang | 8bc361e | 2014-11-20 16:23:31 -0500 | [diff] [blame] | 83 | break; |
| 84 | case DebugTraceOutputTypeSetMarker: |
Austin Kinross | 6ee1e78 | 2015-05-29 17:05:37 -0700 | [diff] [blame] | 85 | g_debugAnnotator->setMarker(formattedWideMessage.c_str()); |
Geoff Lang | 8bc361e | 2014-11-20 16:23:31 -0500 | [diff] [blame] | 86 | break; |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 87 | } |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 88 | } |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 89 | |
Jamie Madill | e31fd87 | 2016-05-27 08:35:36 -0400 | [diff] [blame^] | 90 | FormattedString formattedMessage(format, vararg); |
Jamie Madill | 14aa40f | 2015-01-07 15:12:47 -0500 | [diff] [blame] | 91 | |
Jamie Madill | 14aa40f | 2015-01-07 15:12:47 -0500 | [diff] [blame] | 92 | if (messageType == MESSAGE_ERR) |
| 93 | { |
Jamie Madill | e31fd87 | 2016-05-27 08:35:36 -0400 | [diff] [blame^] | 94 | std::cerr << formattedMessage.c_str(); |
| 95 | #if !defined(NDEBUG) && defined(_MSC_VER) |
Cooper Partin | 7318b7c | 2015-01-08 09:15:35 -0800 | [diff] [blame] | 96 | OutputDebugStringA(formattedMessage.c_str()); |
Jamie Madill | e31fd87 | 2016-05-27 08:35:36 -0400 | [diff] [blame^] | 97 | #endif // !defined(NDEBUG) && defined(_MSC_VER) |
Jamie Madill | 14aa40f | 2015-01-07 15:12:47 -0500 | [diff] [blame] | 98 | } |
Jamie Madill | 14aa40f | 2015-01-07 15:12:47 -0500 | [diff] [blame] | 99 | |
Austin Kinross | f0360c6 | 2014-10-20 14:26:13 -0700 | [diff] [blame] | 100 | #if defined(ANGLE_ENABLE_DEBUG_TRACE) |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 101 | #if defined(NDEBUG) |
Austin Kinross | fe14d45 | 2014-10-20 14:36:18 -0700 | [diff] [blame] | 102 | if (traceInDebugOnly) |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 103 | { |
| 104 | return; |
| 105 | } |
Jamie Madill | e31fd87 | 2016-05-27 08:35:36 -0400 | [diff] [blame^] | 106 | #endif // NDEBUG |
Geoff Lang | feee44b | 2014-03-05 11:34:31 -0500 | [diff] [blame] | 107 | static std::ofstream file(TRACE_OUTPUT_FILE, std::ofstream::app); |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 108 | if (file) |
| 109 | { |
Geoff Lang | da5777c | 2014-07-11 09:52:58 -0400 | [diff] [blame] | 110 | file.write(formattedMessage.c_str(), formattedMessage.length()); |
Geoff Lang | feee44b | 2014-03-05 11:34:31 -0500 | [diff] [blame] | 111 | file.flush(); |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 112 | } |
Geoff Lang | feee44b | 2014-03-05 11:34:31 -0500 | [diff] [blame] | 113 | |
Austin Kinross | fe14d45 | 2014-10-20 14:36:18 -0700 | [diff] [blame] | 114 | #if defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER) |
| 115 | OutputDebugStringA(formattedMessage.c_str()); |
Jamie Madill | e31fd87 | 2016-05-27 08:35:36 -0400 | [diff] [blame^] | 116 | #endif // ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER |
Austin Kinross | fe14d45 | 2014-10-20 14:36:18 -0700 | [diff] [blame] | 117 | |
Jamie Madill | e31fd87 | 2016-05-27 08:35:36 -0400 | [diff] [blame^] | 118 | #endif // ANGLE_ENABLE_DEBUG_TRACE |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 119 | } |
| 120 | |
Jamie Madill | 2c7c625 | 2015-03-12 14:15:38 -0400 | [diff] [blame] | 121 | } // namespace |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 122 | |
Jamie Madill | 2c7c625 | 2015-03-12 14:15:38 -0400 | [diff] [blame] | 123 | bool DebugAnnotationsActive() |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 124 | { |
Austin Kinross | 570e83c | 2014-10-20 14:13:58 -0700 | [diff] [blame] | 125 | #if defined(ANGLE_ENABLE_DEBUG_ANNOTATIONS) |
Jamie Madill | 2c7c625 | 2015-03-12 14:15:38 -0400 | [diff] [blame] | 126 | return g_debugAnnotator != nullptr && g_debugAnnotator->getStatus(); |
Geoff Lang | f571312 | 2013-10-07 17:06:30 -0400 | [diff] [blame] | 127 | #else |
| 128 | return false; |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 129 | #endif |
| 130 | } |
| 131 | |
Jamie Madill | 2c7c625 | 2015-03-12 14:15:38 -0400 | [diff] [blame] | 132 | void InitializeDebugAnnotations(DebugAnnotator *debugAnnotator) |
| 133 | { |
| 134 | UninitializeDebugAnnotations(); |
| 135 | g_debugAnnotator = debugAnnotator; |
| 136 | } |
| 137 | |
| 138 | void UninitializeDebugAnnotations() |
| 139 | { |
| 140 | // Pointer is not managed. |
| 141 | g_debugAnnotator = nullptr; |
| 142 | } |
| 143 | |
| 144 | void trace(bool traceInDebugOnly, MessageType messageType, const char *format, ...) |
| 145 | { |
| 146 | va_list vararg; |
| 147 | va_start(vararg, format); |
| 148 | output(traceInDebugOnly, messageType, DebugTraceOutputTypeSetMarker, format, vararg); |
| 149 | va_end(vararg); |
| 150 | } |
| 151 | |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 152 | ScopedPerfEventHelper::ScopedPerfEventHelper(const char* format, ...) |
| 153 | { |
Austin Kinross | f0360c6 | 2014-10-20 14:26:13 -0700 | [diff] [blame] | 154 | #if !defined(ANGLE_ENABLE_DEBUG_TRACE) |
Jamie Madill | 2c7c625 | 2015-03-12 14:15:38 -0400 | [diff] [blame] | 155 | if (!DebugAnnotationsActive()) |
daniel@transgaming.com | 5dc3b8b | 2012-11-28 19:43:49 +0000 | [diff] [blame] | 156 | { |
| 157 | return; |
| 158 | } |
Austin Kinross | f0360c6 | 2014-10-20 14:26:13 -0700 | [diff] [blame] | 159 | #endif // !ANGLE_ENABLE_DEBUG_TRACE |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 160 | va_list vararg; |
| 161 | va_start(vararg, format); |
Jamie Madill | 14aa40f | 2015-01-07 15:12:47 -0500 | [diff] [blame] | 162 | output(true, MESSAGE_EVENT, DebugTraceOutputTypeBeginEvent, format, vararg); |
Jamie Madill | b60fe31 | 2014-09-26 14:56:41 -0400 | [diff] [blame] | 163 | va_end(vararg); |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 164 | } |
| 165 | |
| 166 | ScopedPerfEventHelper::~ScopedPerfEventHelper() |
| 167 | { |
Jamie Madill | 2c7c625 | 2015-03-12 14:15:38 -0400 | [diff] [blame] | 168 | if (DebugAnnotationsActive()) |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 169 | { |
Jamie Madill | 2c7c625 | 2015-03-12 14:15:38 -0400 | [diff] [blame] | 170 | g_debugAnnotator->endEvent(); |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 171 | } |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 172 | } |
Jamie Madill | 2c7c625 | 2015-03-12 14:15:38 -0400 | [diff] [blame] | 173 | |
daniel@transgaming.com | 95a758f | 2012-07-12 15:17:06 +0000 | [diff] [blame] | 174 | } |