blob: 17c4a55fa219a596eb7a317a18910aa830b4619e [file] [log] [blame]
Nicolas Capens0bac2852016-05-07 06:09:58 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
Nicolas Capensee16f0d2015-07-16 17:40:10 -04002//
Nicolas Capens0bac2852016-05-07 06:09:58 -04003// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
Nicolas Capensee16f0d2015-07-16 17:40:10 -04006//
Nicolas Capens0bac2852016-05-07 06:09:58 -04007// http://www.apache.org/licenses/LICENSE-2.0
Nicolas Capensee16f0d2015-07-16 17:40:10 -04008//
Nicolas Capens0bac2852016-05-07 06:09:58 -04009// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
Nicolas Capensee16f0d2015-07-16 17:40:10 -040014
15#ifndef Debug_hpp
16#define Debug_hpp
17
18#ifndef WIN32_LEAN_AND_MEAN
19 #define WIN32_LEAN_AND_MEAN
20#endif
21#include <windows.h>
22#include <d3d9.h>
23#include <stdio.h>
24#include <guiddef.h>
25#include <assert.h>
26
27#define APPEND(x, y) x ## y
28#define MACRO_APPEND(x, y) APPEND(x, y)
29#define UNIQUE_IDENTIFIER(prefix) MACRO_APPEND(prefix, __COUNTER__)
30
31struct Trace
32{
33 Trace(const char *format, ...)
34 {
35 if(false)
36 {
37 FILE *file = fopen("debug.txt", "a");
38
39 if(file)
40 {
41 for(int i = 0; i < indent; i++) fprintf(file, " ");
42
43 va_list vararg;
44 va_start(vararg, format);
45 vfprintf(file, format, vararg);
46 va_end(vararg);
47
48 fclose(file);
49 }
50 }
51
52 indent++;
53 }
54
55 ~Trace()
56 {
57 indent--;
58 }
59
60 static int indent;
61};
62
63#ifndef NDEBUG
64 #define TRACE(format, ...) Trace UNIQUE_IDENTIFIER(_tracer_)("[0x%0.8X]%s("format")\n", this, __FUNCTION__, __VA_ARGS__)
65 #define GTRACE(format, ...) Trace("%s("format")\n", __FUNCTION__, __VA_ARGS__)
66#else
67 #define TRACE(...) ((void)0)
68 #define GTRACE(...) ((void)0)
69#endif
70
71#ifndef NDEBUG
72 #define ASSERT(expression) {if(!(expression)) Trace("\t! Assert failed in %s(%d): "#expression"\n", __FUNCTION__, __LINE__); assert(expression);}
73#else
74 #define ASSERT assert
75#endif
76
77#ifndef NDEBUG
78 #define UNIMPLEMENTED() {Trace("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__); ASSERT(false);}
79#else
80 #define UNIMPLEMENTED() ((void)0)
81#endif
82
83#ifndef NDEBUG
84 #define NOINTERFACE(iid) _NOINTERFACE(__FUNCTION__, iid)
85
86 inline long _NOINTERFACE(const char *function, const IID &iid)
87 {
88 Trace("\t! No interface {0x%0.8X, 0x%0.4X, 0x%0.4X, 0x%0.2X, 0x%0.2X, 0x%0.2X, 0x%0.2X, 0x%0.2X, 0x%0.2X, 0x%0.2X, 0x%0.2X} for %s\n", iid.Data1, iid.Data2, iid.Data3, iid.Data4[0], iid.Data4[1], iid.Data4[2], iid.Data4[3], iid.Data4[4], iid.Data4[5], iid.Data4[6], iid.Data4[7], function);
89
90 return E_NOINTERFACE;
91 }
92#else
93 #define NOINTERFACE(iid) E_NOINTERFACE
94#endif
95
96#ifndef NDEBUG
97 inline long INVALIDCALL()
98 {
99 Trace("\t! D3DERR_INVALIDCALL\n");
100
101 return D3DERR_INVALIDCALL;
102 }
103#else
104 #define INVALIDCALL() D3DERR_INVALIDCALL
105#endif
106
107#ifndef NDEBUG
108 inline long OUTOFMEMORY()
109 {
110 Trace("\t! E_OUTOFMEMORY\n");
111
112 return E_OUTOFMEMORY;
113 }
114#else
115 #define OUTOFMEMORY() E_OUTOFMEMORY
116#endif
117
118#ifndef NDEBUG
119 inline long OUTOFVIDEOMEMORY()
120 {
121 Trace("\t! D3DERR_OUTOFVIDEOMEMORY\n");
122
123 return D3DERR_OUTOFVIDEOMEMORY;
124 }
125#else
126 #define OUTOFVIDEOMEMORY() D3DERR_OUTOFVIDEOMEMORY
127#endif
128
129#ifndef NDEBUG
130 inline long NOTAVAILABLE()
131 {
132 Trace("\t! D3DERR_NOTAVAILABLE\n");
133
134 return D3DERR_NOTAVAILABLE;
135 }
136#else
137 #define NOTAVAILABLE() D3DERR_NOTAVAILABLE
138#endif
139
140#ifndef NDEBUG
141 inline long NOTFOUND()
142 {
143 Trace("\t! D3DERR_NOTFOUND\n");
144
145 return D3DERR_NOTFOUND;
146 }
147#else
148 #define NOTFOUND() D3DERR_NOTFOUND
149#endif
150
151#ifndef NDEBUG
152 inline long MOREDATA()
153 {
154 Trace("\t! D3DERR_MOREDATA\n");
155
156 return D3DERR_MOREDATA;
157 }
158#else
159 #define MOREDATA() D3DERR_MOREDATA
160#endif
161
162#ifndef NDEBUG
163 inline long FAIL()
164 {
165 Trace("\t! E_FAIL\n");
166
167 return E_FAIL;
168 }
169#else
170 #define FAIL() E_FAIL
171#endif
172
173#endif // Debug_hpp