• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &params, const Token &token, const TraceStringMap &strings);
37 
38 template <>
39 void PackParameter<uint32_t>(ParamBuffer &params,
40                              const Token &token,
41                              const TraceStringMap &strings);
42 
43 template <>
44 void PackParameter<int32_t>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
45 
46 template <>
47 void PackParameter<void *>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
48 
49 template <>
50 void PackParameter<const int32_t *>(ParamBuffer &params,
51                                     const Token &token,
52                                     const TraceStringMap &strings);
53 
54 template <>
55 void PackParameter<void **>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
56 
57 template <>
58 void PackParameter<int32_t *>(ParamBuffer &params,
59                               const Token &token,
60                               const TraceStringMap &strings);
61 
62 template <>
63 void PackParameter<uint64_t>(ParamBuffer &params,
64                              const Token &token,
65                              const TraceStringMap &strings);
66 
67 template <>
68 void PackParameter<int64_t>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
69 
70 template <>
71 void PackParameter<const int64_t *>(ParamBuffer &params,
72                                     const Token &token,
73                                     const TraceStringMap &strings);
74 
75 template <>
76 void PackParameter<int64_t *>(ParamBuffer &params,
77                               const Token &token,
78                               const TraceStringMap &strings);
79 
80 template <>
81 void PackParameter<uint64_t *>(ParamBuffer &params,
82                                const Token &token,
83                                const TraceStringMap &strings);
84 
85 template <>
86 void PackParameter<const char *>(ParamBuffer &params,
87                                  const Token &token,
88                                  const TraceStringMap &strings);
89 
90 template <>
91 void PackParameter<const void *>(ParamBuffer &params,
92                                  const Token &token,
93                                  const TraceStringMap &strings);
94 
95 template <>
96 void PackParameter<uint32_t *>(ParamBuffer &params,
97                                const Token &token,
98                                const TraceStringMap &strings);
99 
100 template <>
101 void PackParameter<const uint32_t *>(ParamBuffer &params,
102                                      const Token &token,
103                                      const TraceStringMap &strings);
104 
105 template <>
106 void PackParameter<float>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
107 
108 template <>
109 void PackParameter<uint8_t>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
110 
111 template <>
112 void PackParameter<float *>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
113 
114 template <>
115 void PackParameter<const float *>(ParamBuffer &params,
116                                   const Token &token,
117                                   const TraceStringMap &strings);
118 
119 template <>
120 void PackParameter<GLsync>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
121 
122 template <>
123 void PackParameter<const char *const *>(ParamBuffer &params,
124                                         const Token &token,
125                                         const TraceStringMap &strings);
126 
127 template <>
128 void PackParameter<const char **>(ParamBuffer &params,
129                                   const Token &token,
130                                   const TraceStringMap &strings);
131 
132 template <>
133 void PackParameter<GLDEBUGPROCKHR>(ParamBuffer &params,
134                                    const Token &token,
135                                    const TraceStringMap &strings);
136 
137 template <>
138 void PackParameter<EGLDEBUGPROCKHR>(ParamBuffer &params,
139                                     const Token &token,
140                                     const TraceStringMap &strings);
141 
142 template <>
143 void PackParameter<const struct AHardwareBuffer *>(ParamBuffer &params,
144                                                    const Token &token,
145                                                    const TraceStringMap &strings);
146 
147 template <>
148 void PackParameter<EGLSetBlobFuncANDROID>(ParamBuffer &params,
149                                           const Token &token,
150                                           const TraceStringMap &strings);
151 
152 template <>
153 void PackParameter<EGLGetBlobFuncANDROID>(ParamBuffer &params,
154                                           const Token &token,
155                                           const TraceStringMap &strings);
156 
157 template <>
158 void PackParameter<int16_t>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
159 
160 template <>
161 void PackParameter<const int16_t *>(ParamBuffer &params,
162                                     const Token &token,
163                                     const TraceStringMap &strings);
164 
165 template <>
166 void PackParameter<char *>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
167 
168 template <>
169 void PackParameter<unsigned char *>(ParamBuffer &params,
170                                     const Token &token,
171                                     const TraceStringMap &strings);
172 
173 template <>
174 void PackParameter<const void *const *>(ParamBuffer &params,
175                                         const Token &token,
176                                         const TraceStringMap &strings);
177 
178 template <>
179 void PackParameter<const uint64_t *>(ParamBuffer &params,
180                                      const Token &token,
181                                      const TraceStringMap &strings);
182 
183 #if defined(ANGLE_PLATFORM_WINDOWS)
184 
185 template <>
186 void PackParameter<EGLNativeDisplayType>(ParamBuffer &params,
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 &params,
194                                         const Token &token,
195                                         const TraceStringMap &strings);
196 
197 template <>
198 void PackParameter<EGLNativePixmapType>(ParamBuffer &params,
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 &params,
207                                  const Token &token,
208                                  const TraceStringMap &strings);
209 template <>
210 void PackParameter<long *>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
211 
212 template <>
213 void PackParameter<long>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
214 
215 template <>
216 void PackParameter<unsigned long>(ParamBuffer &params,
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 &params, 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 &params, 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 &params, 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 &params, 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 &params, 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