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 #if defined(ANGLE_PLATFORM_WINDOWS)
184
185 template <>
186 void PackParameter<EGLNativeDisplayType>(ParamBuffer ¶ms,
187 const Token &token,
188 const TraceStringMap &strings);
189 #endif // defined(ANGLE_PLATFORM_WINDOWS)
190
191 #if defined(ANGLE_PLATFORM_WINDOWS) || defined(ANGLE_PLATFORM_ANDROID)
192 template <>
193 void PackParameter<EGLNativeWindowType>(ParamBuffer ¶ms,
194 const Token &token,
195 const TraceStringMap &strings);
196
197 template <>
198 void PackParameter<EGLNativePixmapType>(ParamBuffer ¶ms,
199 const Token &token,
200 const TraceStringMap &strings);
201 #endif // defined(ANGLE_PLATFORM_WINDOWS) || defined(ANGLE_PLATFORM_ANDROID)
202
203 // On Apple platforms, std::is_same<uint64_t, long> is false despite being both 8 bits.
204 #if defined(ANGLE_PLATFORM_APPLE) || !defined(ANGLE_IS_64_BIT_CPU)
205 template <>
206 void PackParameter<const long *>(ParamBuffer ¶ms,
207 const Token &token,
208 const TraceStringMap &strings);
209 template <>
210 void PackParameter<long *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
211
212 template <>
213 void PackParameter<long>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings);
214
215 template <>
216 void PackParameter<unsigned long>(ParamBuffer ¶ms,
217 const Token &token,
218 const TraceStringMap &strings);
219 #endif // defined(ANGLE_PLATFORM_APPLE) || !defined(ANGLE_IS_64_BIT_CPU)
220
221 template <typename T>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)222 void PackParameter(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
223 {
224 static_assert(AssertFalse<T>::value, "No specialization for type.");
225 }
226
227 template <typename T>
228 struct ParameterPacker;
229
230 template <typename Ret>
231 struct ParameterPacker<Ret()>
232 {
233 static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings) {}
234 };
235
236 template <typename Ret, typename Arg>
237 struct ParameterPacker<Ret(Arg)>
238 {
239 static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings)
240 {
241 PackParameter<Arg>(params, tokens[0], strings);
242 }
243 };
244
245 template <typename Ret, typename Arg, typename... Args>
246 struct ParameterPacker<Ret(Arg, Args...)>
247 {
248 static void Pack(ParamBuffer ¶ms, const Token *tokens, const TraceStringMap &strings)
249 {
250 PackParameter<Arg>(params, tokens[0], strings);
251 ParameterPacker<Ret(Args...)>::Pack(params, &tokens[1], 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 Func>
266 struct RemoveStdCall;
267
268 template <typename Ret, typename... Args>
269 struct RemoveStdCall<Ret KHRONOS_APIENTRY(Args...)>
270 {
271 using Type = Ret(Args...);
272 };
273
274 template <typename Func>
275 struct RemoveStdCall
276 {
277 using Type = Func;
278 };
279
280 template <typename Func>
281 ParamBuffer ParseParameters(const Token *paramTokens, const TraceStringMap &strings)
282 {
283 ParamBuffer params;
284 ParameterPacker<typename RemoveStdCall<Func>::Type>::Pack(params, paramTokens, strings);
285 return params;
286 }
287 } // namespace angle
288
289 extern "C" {
290 void SetupReplay();
291 void ReplayFrame(uint32_t frameIndex);
292 void ResetReplay();
293 ANGLE_REPLAY_EXPORT const char *GetSerializedContextState(uint32_t frameIndex);
294 } // extern "C"
295
296 #endif // ANGLE_TRACE_INTERPRETER_H_
297