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