xref: /aosp_15_r20/external/angle/util/capture/trace_interpreter.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 template <>
184 void PackParameter<GLGETBLOBPROCANGLE>(ParamBuffer &params,
185                                        const Token &token,
186                                        const TraceStringMap &strings);
187 
188 template <>
189 void PackParameter<GLSETBLOBPROCANGLE>(ParamBuffer &params,
190                                        const Token &token,
191                                        const TraceStringMap &strings);
192 
193 #if defined(ANGLE_PLATFORM_WINDOWS)
194 
195 template <>
196 void PackParameter<EGLNativeDisplayType>(ParamBuffer &params,
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 &params,
204                                         const Token &token,
205                                         const TraceStringMap &strings);
206 
207 template <>
208 void PackParameter<EGLNativePixmapType>(ParamBuffer &params,
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 &params,
217                                  const Token &token,
218                                  const TraceStringMap &strings);
219 template <>
220 void PackParameter<long *>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
221 
222 template <>
223 void PackParameter<long>(ParamBuffer &params, const Token &token, const TraceStringMap &strings);
224 
225 template <>
226 void PackParameter<unsigned long>(ParamBuffer &params,
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 &params, 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 &params, 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 &params, 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 &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 Ret, typename Arg, typename... Args>
266 struct ParameterPacker<Ret (*)(Arg, Args...)>
267 {
268     static void Pack(ParamBuffer &params, 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