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" 10 #include "common/system.h" 11 #include <d3d9.h> 12 13 namespace gl 14 { 15 16 typedef void (WINAPI *PerfOutputFunction)(D3DCOLOR, LPCWSTR); 17 18 static void output(bool traceFileDebugOnly, PerfOutputFunction perfFunc, const char *format, va_list vararg) 19 { 20 #if !defined(ANGLE_DISABLE_PERF) 21 if (perfActive()) 22 { 23 char message[32768]; 24 int len = vsprintf_s(message, format, vararg); 25 if (len < 0) 26 { 27 return; 28 } 29 30 // There are no ASCII variants of these D3DPERF functions. 31 wchar_t wideMessage[32768]; 32 for (int i = 0; i < len; ++i) 33 { 34 wideMessage[i] = message[i]; 35 } 36 wideMessage[len] = 0; 37 38 perfFunc(0, wideMessage); 39 } 40 #endif 41 42 #if !defined(ANGLE_DISABLE_TRACE) 43 #if defined(NDEBUG) 44 if (traceFileDebugOnly) 45 { 46 return; 47 } 48 #endif 49 50 FILE* file = fopen(TRACE_OUTPUT_FILE, "a"); 51 if (file) 52 { 53 vfprintf(file, format, vararg); 54 fclose(file); 55 } 56 #endif 57 } 58 59 void trace(bool traceFileDebugOnly, const char *format, ...) 60 { 61 va_list vararg; 62 va_start(vararg, format); 63 #if defined(ANGLE_DISABLE_PERF) 64 output(traceFileDebugOnly, NULL, format, vararg); 65 #else 66 output(traceFileDebugOnly, D3DPERF_SetMarker, format, vararg); 67 #endif 68 va_end(vararg); 69 } 70 71 bool perfActive() 72 { 73 #if defined(ANGLE_DISABLE_PERF) 74 return false; 75 #else 76 static bool active = D3DPERF_GetStatus() != 0; 77 return active; 78 #endif 79 } 80 81 ScopedPerfEventHelper::ScopedPerfEventHelper(const char* format, ...) 82 { 83 #if !defined(ANGLE_DISABLE_PERF) 84 #if defined(ANGLE_DISABLE_TRACE) 85 if (!perfActive()) 86 { 87 return; 88 } 89 #endif 90 va_list vararg; 91 va_start(vararg, format); 92 output(true, reinterpret_cast<PerfOutputFunction>(D3DPERF_BeginEvent), format, vararg); 93 va_end(vararg); 94 #endif 95 } 96 97 ScopedPerfEventHelper::~ScopedPerfEventHelper() 98 { 99 #if !defined(ANGLE_DISABLE_PERF) 100 if (perfActive()) 101 { 102 D3DPERF_EndEvent(); 103 } 104 #endif 105 } 106 } 107