1 //
2 // Copyright 2022 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 // trace_interpreter.h:
7 // Parser and interpreter for the C-based replays.
8 //
9
10 #ifndef ANGLE_TRACE_INTERPRETER_H_
11 #define ANGLE_TRACE_INTERPRETER_H_
12
13 #include "common/frame_capture_utils.h"
14 #include "frame_capture_test_utils.h"
15 #include "traces_export.h"
16
17 namespace angle
18 {
19 struct TraceString
20 {
21 std::vector<std::string> strings;
22 std::vector<const char *> pointers;
23 };
24 using TraceStringMap = std::map<std::string, TraceString>;
25
26 constexpr size_t kMaxTokenSize = 200;
27 constexpr size_t kMaxParameters = 32;
28 using Token = char[kMaxTokenSize];
29
30 CallCapture ParseCallCapture(const Token &nameToken,
31 size_t numParamTokens,
32 const Token *paramTokens,
33 const TraceStringMap &strings);
34
35 template <typename T>
36 void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
37
38 template <>
39 void PackParameter<uint32_t>(ParamBuffer ¶ms,
40 const Token &token,
41 const TraceStringMap &strings);
42
43 template <>
44 void PackParameter<int32_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
45
46 template <>
47 void PackParameter<void *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
48
49 template <>
50 void PackParameter<const int32_t *>(ParamBuffer ¶ms,
51 const Token &token,
52 const TraceStringMap &strings);
53
54 template <>
55 void PackParameter<void **>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
56
57 template <>
58 void PackParameter<int32_t *>(ParamBuffer ¶ms,
59 const Token &token,
60 const TraceStringMap &strings);
61
62 template <>
63 void PackParameter<uint64_t>(ParamBuffer ¶ms,
64 const Token &token,
65 const TraceStringMap &strings);
66
67 template <>
68 void PackParameter<int64_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
69
70 template <>
71 void PackParameter<const int64_t *>(ParamBuffer ¶ms,
72 const Token &token,
73 const TraceStringMap &strings);
74
75 template <>
76 void PackParameter<int64_t *>(ParamBuffer ¶ms,
77 const Token &token,
78 const TraceStringMap &strings);
79
80 template <>
81 void PackParameter<uint64_t *>(ParamBuffer ¶ms,
82 const Token &token,
83 const TraceStringMap &strings);
84
85 template <>
86 void PackParameter<const char *>(ParamBuffer ¶ms,
87 const Token &token,
88 const TraceStringMap &strings);
89
90 template <>
91 void PackParameter<const void *>(ParamBuffer ¶ms,
92 const Token &token,
93 const TraceStringMap &strings);
94
95 template <>
96 void PackParameter<uint32_t *>(ParamBuffer ¶ms,
97 const Token &token,
98 const TraceStringMap &strings);
99
100 template <>
101 void PackParameter<const uint32_t *>(ParamBuffer ¶ms,
102 const Token &token,
103 const TraceStringMap &strings);
104
105 template <>
106 void PackParameter<float>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
107
108 template <>
109 void PackParameter<uint8_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
110
111 template <>
112 void PackParameter<float *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
113
114 template <>
115 void PackParameter<const float *>(ParamBuffer ¶ms,
116 const Token &token,
117 const TraceStringMap &strings);
118
119 template <>
120 void PackParameter<GLsync>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
121
122 template <>
123 void PackParameter<const char *const *>(ParamBuffer ¶ms,
124 const Token &token,
125 const TraceStringMap &strings);
126
127 template <>
128 void PackParameter<const char **>(ParamBuffer ¶ms,
129 const Token &token,
130 const TraceStringMap &strings);
131
132 template <>
133 void PackParameter<GLDEBUGPROCKHR>(ParamBuffer ¶ms,
134 const Token &token,
135 const TraceStringMap &strings);
136
137 template <>
138 void PackParameter<EGLDEBUGPROCKHR>(ParamBuffer ¶ms,
139 const Token &token,
140 const TraceStringMap &strings);
141
142 template <>
143 void PackParameter<const struct AHardwareBuffer *>(ParamBuffer ¶ms,
144 const Token &token,
145 const TraceStringMap &strings);
146
147 template <>
148 void PackParameter<EGLSetBlobFuncANDROID>(ParamBuffer ¶ms,
149 const Token &token,
150 const TraceStringMap &strings);
151
152 template <>
153 void PackParameter<EGLGetBlobFuncANDROID>(ParamBuffer ¶ms,
154 const Token &token,
155 const TraceStringMap &strings);
156
157 template <>
158 void PackParameter<int16_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
159
160 template <>
161 void PackParameter<const int16_t *>(ParamBuffer ¶ms,
162 const Token &token,
163 const TraceStringMap &strings);
164
165 template <>
166 void PackParameter<char *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
167
168 template <>
169 void PackParameter<unsigned char *>(ParamBuffer ¶ms,
170 const Token &token,
171 const TraceStringMap &strings);
172
173 template <>
174 void PackParameter<const void *const *>(ParamBuffer ¶ms,
175 const Token &token,
176 const TraceStringMap &strings);
177
178 template <>
179 void PackParameter<const uint64_t *>(ParamBuffer ¶ms,
180 const Token &token,
181 const TraceStringMap &strings);
182
183 template <>
184 void PackParameter<GLGETBLOBPROCANGLE>(ParamBuffer ¶ms,
185 const Token &token,
186 const TraceStringMap &strings);
187
188 template <>
189 void PackParameter<GLSETBLOBPROCANGLE>(ParamBuffer ¶ms,
190 const Token &token,
191 const TraceStringMap &strings);
192
193 #if defined(ANGLE_PLATFORM_WINDOWS)
194
195 template <>
196 void PackParameter<EGLNativeDisplayType>(ParamBuffer ¶ms,
197 const Token &token,
198 const TraceStringMap &strings);
199 #endif // defined(ANGLE_PLATFORM_WINDOWS)
200
201 #if defined(ANGLE_PLATFORM_WINDOWS) || defined(ANGLE_PLATFORM_ANDROID)
202 template <>
203 void PackParameter<EGLNativeWindowType>(ParamBuffer ¶ms,
204 const Token &token,
205 const TraceStringMap &strings);
206
207 template <>
208 void PackParameter<EGLNativePixmapType>(ParamBuffer ¶ms,
209 const Token &token,
210 const TraceStringMap &strings);
211 #endif // defined(ANGLE_PLATFORM_WINDOWS) || defined(ANGLE_PLATFORM_ANDROID)
212
213 // On Apple platforms, std::is_same<uint64_t, long> is false despite being both 8 bits.
214 #if defined(ANGLE_PLATFORM_APPLE) || !defined(ANGLE_IS_64_BIT_CPU)
215 template <>
216 void PackParameter<const long *>(ParamBuffer ¶ms,
217 const Token &token,
218 const TraceStringMap &strings);
219 template <>
220 void PackParameter<long *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
221
222 template <>
223 void PackParameter<long>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
224
225 template <>
226 void PackParameter<unsigned long>(ParamBuffer ¶ms,
227 const Token &token,
228 const TraceStringMap &strings);
229 #endif // defined(ANGLE_PLATFORM_APPLE) || !defined(ANGLE_IS_64_BIT_CPU)
230
231 template <typename T>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)232 void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
233 {
234 static_assert(AssertFalse<T>::value, "No specialization for type.");
235 }
236
237 template <typename T>
238 struct ParameterPacker;
239
240 template <typename Ret>
241 struct ParameterPacker<Ret()>
242 {
243 static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings) {}
244 };
245
246 template <typename Ret, typename Arg>
247 struct ParameterPacker<Ret(Arg)>
248 {
249 static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings)
250 {
251 PackParameter<Arg>(params, tokens[0], strings);
252 }
253 };
254
255 template <typename Ret, typename Arg, typename... Args>
256 struct ParameterPacker<Ret(Arg, Args...)>
257 {
258 static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings)
259 {
260 PackParameter<Arg>(params, tokens[0], strings);
261 ParameterPacker<Ret(Args...)>::Pack(params, &tokens[1], strings);
262 }
263 };
264
265 template <typename Ret, typename Arg, typename... Args>
266 struct ParameterPacker<Ret (*)(Arg, Args...)>
267 {
268 static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings)
269 {
270 PackParameter<Arg>(params, tokens[0], strings);
271 ParameterPacker<Ret(Args...)>::Pack(params, &tokens[1], strings);
272 }
273 };
274
275 template <typename Func>
276 struct RemoveStdCall;
277
278 template <typename Ret, typename... Args>
279 struct RemoveStdCall<Ret KHRONOS_APIENTRY(Args...)>
280 {
281 using Type = Ret(Args...);
282 };
283
284 template <typename Func>
285 struct RemoveStdCall
286 {
287 using Type = Func;
288 };
289
290 template <typename Func>
291 ParamBuffer ParseParameters(const Token *paramTokens, const TraceStringMap &strings)
292 {
293 ParamBuffer params;
294 ParameterPacker<typename RemoveStdCall<Func>::Type>::Pack(params, paramTokens, strings);
295 return params;
296 }
297 } // namespace angle
298
299 extern "C" {
300 void SetupReplay();
301 void ReplayFrame(uint32_t frameIndex);
302 void ResetReplay();
303 ANGLE_REPLAY_EXPORT const char *GetSerializedContextState(uint32_t frameIndex);
304 } // extern "C"
305
306 #endif // ANGLE_TRACE_INTERPRETER_H_
307