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
output(bool traceFileDebugOnly,PerfOutputFunction perfFunc,const char * format,va_list vararg)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
trace(bool traceFileDebugOnly,const char * format,...)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
perfActive()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
ScopedPerfEventHelper(const char * format,...)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
~ScopedPerfEventHelper()97 ScopedPerfEventHelper::~ScopedPerfEventHelper()
98 {
99 #if !defined(ANGLE_DISABLE_PERF)
100 if (perfActive())
101 {
102 D3DPERF_EndEvent();
103 }
104 #endif
105 }
106 }
107