blob: 23337405ed16ca9fd05dd7822942df5f30655085 [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"
shannon.woods@transgaming.coma9b96d02013-01-25 21:56:18 +000010#include "common/system.h"
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000011#include <d3d9.h>
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000012
13namespace gl
14{
15
16typedef void (WINAPI *PerfOutputFunction)(D3DCOLOR, LPCWSTR);
17
18static 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
59void 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
71bool 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
81ScopedPerfEventHelper::ScopedPerfEventHelper(const char* format, ...)
82{
83#if !defined(ANGLE_DISABLE_PERF)
daniel@transgaming.com5dc3b8b2012-11-28 19:43:49 +000084#if defined(ANGLE_DISABLE_TRACE)
85 if (!perfActive())
86 {
87 return;
88 }
89#endif
daniel@transgaming.com95a758f2012-07-12 15:17:06 +000090 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
97ScopedPerfEventHelper::~ScopedPerfEventHelper()
98{
99#if !defined(ANGLE_DISABLE_PERF)
100 if (perfActive())
101 {
102 D3DPERF_EndEvent();
103 }
104#endif
105}
106}