1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2022 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // trace_interpreter.cpp:
7*8975f5c5SAndroid Build Coastguard Worker // Parser and interpreter for the C-based replays.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "trace_interpreter.h"
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker #include "anglebase/no_destructor.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "common/gl_enum_utils.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "common/string_utils.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "trace_fixture.h"
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Worker #define USE_SYSTEM_ZLIB
18*8975f5c5SAndroid Build Coastguard Worker #include "compression_utils_portable.h"
19*8975f5c5SAndroid Build Coastguard Worker
20*8975f5c5SAndroid Build Coastguard Worker namespace angle
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker namespace
23*8975f5c5SAndroid Build Coastguard Worker {
ShouldParseFile(const std::string & file)24*8975f5c5SAndroid Build Coastguard Worker bool ShouldParseFile(const std::string &file)
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker return EndsWith(file, ".c") || EndsWith(file, ".cpp");
27*8975f5c5SAndroid Build Coastguard Worker }
28*8975f5c5SAndroid Build Coastguard Worker
ReplayTraceFunction(const TraceFunction & func,const TraceFunctionMap & customFunctions)29*8975f5c5SAndroid Build Coastguard Worker void ReplayTraceFunction(const TraceFunction &func, const TraceFunctionMap &customFunctions)
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker for (const CallCapture &call : func)
32*8975f5c5SAndroid Build Coastguard Worker {
33*8975f5c5SAndroid Build Coastguard Worker ReplayTraceFunctionCall(call, customFunctions);
34*8975f5c5SAndroid Build Coastguard Worker }
35*8975f5c5SAndroid Build Coastguard Worker }
36*8975f5c5SAndroid Build Coastguard Worker
37*8975f5c5SAndroid Build Coastguard Worker class Parser : angle::NonCopyable
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker public:
Parser(const std::string & stream,TraceFunctionMap & functionsIn,TraceStringMap & stringsIn,bool verboseLogging)40*8975f5c5SAndroid Build Coastguard Worker Parser(const std::string &stream,
41*8975f5c5SAndroid Build Coastguard Worker TraceFunctionMap &functionsIn,
42*8975f5c5SAndroid Build Coastguard Worker TraceStringMap &stringsIn,
43*8975f5c5SAndroid Build Coastguard Worker bool verboseLogging)
44*8975f5c5SAndroid Build Coastguard Worker : mStream(stream),
45*8975f5c5SAndroid Build Coastguard Worker mFunctions(functionsIn),
46*8975f5c5SAndroid Build Coastguard Worker mStrings(stringsIn),
47*8975f5c5SAndroid Build Coastguard Worker mIndex(0),
48*8975f5c5SAndroid Build Coastguard Worker mVerboseLogging(verboseLogging)
49*8975f5c5SAndroid Build Coastguard Worker {}
50*8975f5c5SAndroid Build Coastguard Worker
parse()51*8975f5c5SAndroid Build Coastguard Worker void parse()
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker while (mIndex < mStream.size())
54*8975f5c5SAndroid Build Coastguard Worker {
55*8975f5c5SAndroid Build Coastguard Worker if (peek() == '#' || peek() == '/')
56*8975f5c5SAndroid Build Coastguard Worker {
57*8975f5c5SAndroid Build Coastguard Worker skipLine();
58*8975f5c5SAndroid Build Coastguard Worker }
59*8975f5c5SAndroid Build Coastguard Worker else if (peek() == 'v')
60*8975f5c5SAndroid Build Coastguard Worker {
61*8975f5c5SAndroid Build Coastguard Worker ASSERT(check("void "));
62*8975f5c5SAndroid Build Coastguard Worker readFunction();
63*8975f5c5SAndroid Build Coastguard Worker }
64*8975f5c5SAndroid Build Coastguard Worker else if (peek() == 'c')
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker ASSERT(check("const "));
67*8975f5c5SAndroid Build Coastguard Worker readMultilineString();
68*8975f5c5SAndroid Build Coastguard Worker }
69*8975f5c5SAndroid Build Coastguard Worker else
70*8975f5c5SAndroid Build Coastguard Worker {
71*8975f5c5SAndroid Build Coastguard Worker printf("Unexpected character: '%c'\n", peek());
72*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
73*8975f5c5SAndroid Build Coastguard Worker }
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker }
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker private:
peek() const78*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE char peek() const { return mStream[mIndex]; }
79*8975f5c5SAndroid Build Coastguard Worker
look(size_t ahead) const80*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE char look(size_t ahead) const { return mStream[mIndex + ahead]; }
81*8975f5c5SAndroid Build Coastguard Worker
advance()82*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE void advance() { mIndex++; }
83*8975f5c5SAndroid Build Coastguard Worker
advanceTo(char delim)84*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE void advanceTo(char delim)
85*8975f5c5SAndroid Build Coastguard Worker {
86*8975f5c5SAndroid Build Coastguard Worker while (peek() != delim)
87*8975f5c5SAndroid Build Coastguard Worker {
88*8975f5c5SAndroid Build Coastguard Worker advance();
89*8975f5c5SAndroid Build Coastguard Worker }
90*8975f5c5SAndroid Build Coastguard Worker }
91*8975f5c5SAndroid Build Coastguard Worker
check(const char * forString) const92*8975f5c5SAndroid Build Coastguard Worker bool check(const char *forString) const
93*8975f5c5SAndroid Build Coastguard Worker {
94*8975f5c5SAndroid Build Coastguard Worker return mStream.substr(mIndex, strlen(forString)) == forString;
95*8975f5c5SAndroid Build Coastguard Worker }
96*8975f5c5SAndroid Build Coastguard Worker
skipLine()97*8975f5c5SAndroid Build Coastguard Worker void skipLine()
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker advanceTo('\n');
100*8975f5c5SAndroid Build Coastguard Worker skipWhitespace();
101*8975f5c5SAndroid Build Coastguard Worker }
102*8975f5c5SAndroid Build Coastguard Worker
skipWhitespace()103*8975f5c5SAndroid Build Coastguard Worker void skipWhitespace()
104*8975f5c5SAndroid Build Coastguard Worker {
105*8975f5c5SAndroid Build Coastguard Worker while (isspace(peek()))
106*8975f5c5SAndroid Build Coastguard Worker {
107*8975f5c5SAndroid Build Coastguard Worker advance();
108*8975f5c5SAndroid Build Coastguard Worker }
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker
skipNonWhitespace()111*8975f5c5SAndroid Build Coastguard Worker void skipNonWhitespace()
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker while (!isspace(peek()))
114*8975f5c5SAndroid Build Coastguard Worker {
115*8975f5c5SAndroid Build Coastguard Worker advance();
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker }
118*8975f5c5SAndroid Build Coastguard Worker
119*8975f5c5SAndroid Build Coastguard Worker // In our simplified trace C, every line that begins with a } either ends a function or a
120*8975f5c5SAndroid Build Coastguard Worker // string. All lines inside the function begin with whitespace. So to find the end of the
121*8975f5c5SAndroid Build Coastguard Worker // function we just need to scan for a line beginning with }.
skipFunction()122*8975f5c5SAndroid Build Coastguard Worker void skipFunction()
123*8975f5c5SAndroid Build Coastguard Worker {
124*8975f5c5SAndroid Build Coastguard Worker while (peek() != '}')
125*8975f5c5SAndroid Build Coastguard Worker {
126*8975f5c5SAndroid Build Coastguard Worker advanceTo('\n');
127*8975f5c5SAndroid Build Coastguard Worker advance();
128*8975f5c5SAndroid Build Coastguard Worker }
129*8975f5c5SAndroid Build Coastguard Worker advance();
130*8975f5c5SAndroid Build Coastguard Worker skipWhitespace();
131*8975f5c5SAndroid Build Coastguard Worker }
132*8975f5c5SAndroid Build Coastguard Worker
readStringAppend(std::string * stringOut,char delim)133*8975f5c5SAndroid Build Coastguard Worker void readStringAppend(std::string *stringOut, char delim)
134*8975f5c5SAndroid Build Coastguard Worker {
135*8975f5c5SAndroid Build Coastguard Worker while (peek() != delim)
136*8975f5c5SAndroid Build Coastguard Worker {
137*8975f5c5SAndroid Build Coastguard Worker if (peek() == '\\')
138*8975f5c5SAndroid Build Coastguard Worker {
139*8975f5c5SAndroid Build Coastguard Worker advance();
140*8975f5c5SAndroid Build Coastguard Worker switch (peek())
141*8975f5c5SAndroid Build Coastguard Worker {
142*8975f5c5SAndroid Build Coastguard Worker case 'n':
143*8975f5c5SAndroid Build Coastguard Worker *stringOut += '\n';
144*8975f5c5SAndroid Build Coastguard Worker break;
145*8975f5c5SAndroid Build Coastguard Worker case '\"':
146*8975f5c5SAndroid Build Coastguard Worker *stringOut += '\"';
147*8975f5c5SAndroid Build Coastguard Worker break;
148*8975f5c5SAndroid Build Coastguard Worker case '\\':
149*8975f5c5SAndroid Build Coastguard Worker *stringOut += '\\';
150*8975f5c5SAndroid Build Coastguard Worker break;
151*8975f5c5SAndroid Build Coastguard Worker default:
152*8975f5c5SAndroid Build Coastguard Worker printf("Unrecognized escape character: \\%c\n", peek());
153*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
154*8975f5c5SAndroid Build Coastguard Worker break;
155*8975f5c5SAndroid Build Coastguard Worker }
156*8975f5c5SAndroid Build Coastguard Worker }
157*8975f5c5SAndroid Build Coastguard Worker else
158*8975f5c5SAndroid Build Coastguard Worker {
159*8975f5c5SAndroid Build Coastguard Worker *stringOut += peek();
160*8975f5c5SAndroid Build Coastguard Worker }
161*8975f5c5SAndroid Build Coastguard Worker advance();
162*8975f5c5SAndroid Build Coastguard Worker }
163*8975f5c5SAndroid Build Coastguard Worker }
164*8975f5c5SAndroid Build Coastguard Worker
readToken(Token & token,char delim)165*8975f5c5SAndroid Build Coastguard Worker void readToken(Token &token, char delim)
166*8975f5c5SAndroid Build Coastguard Worker {
167*8975f5c5SAndroid Build Coastguard Worker size_t startIndex = mIndex;
168*8975f5c5SAndroid Build Coastguard Worker advanceTo(delim);
169*8975f5c5SAndroid Build Coastguard Worker size_t tokenSize = mIndex - startIndex;
170*8975f5c5SAndroid Build Coastguard Worker ASSERT(tokenSize < kMaxTokenSize);
171*8975f5c5SAndroid Build Coastguard Worker memcpy(token, &mStream[startIndex], tokenSize);
172*8975f5c5SAndroid Build Coastguard Worker token[mIndex - startIndex] = 0;
173*8975f5c5SAndroid Build Coastguard Worker }
174*8975f5c5SAndroid Build Coastguard Worker
skipCast()175*8975f5c5SAndroid Build Coastguard Worker void skipCast()
176*8975f5c5SAndroid Build Coastguard Worker {
177*8975f5c5SAndroid Build Coastguard Worker if (peek() == '(')
178*8975f5c5SAndroid Build Coastguard Worker {
179*8975f5c5SAndroid Build Coastguard Worker advanceTo(')');
180*8975f5c5SAndroid Build Coastguard Worker advance();
181*8975f5c5SAndroid Build Coastguard Worker }
182*8975f5c5SAndroid Build Coastguard Worker }
183*8975f5c5SAndroid Build Coastguard Worker
skipComments()184*8975f5c5SAndroid Build Coastguard Worker void skipComments()
185*8975f5c5SAndroid Build Coastguard Worker {
186*8975f5c5SAndroid Build Coastguard Worker while (peek() == '/')
187*8975f5c5SAndroid Build Coastguard Worker {
188*8975f5c5SAndroid Build Coastguard Worker skipLine();
189*8975f5c5SAndroid Build Coastguard Worker }
190*8975f5c5SAndroid Build Coastguard Worker }
191*8975f5c5SAndroid Build Coastguard Worker
readFunction()192*8975f5c5SAndroid Build Coastguard Worker void readFunction()
193*8975f5c5SAndroid Build Coastguard Worker {
194*8975f5c5SAndroid Build Coastguard Worker std::string funcName;
195*8975f5c5SAndroid Build Coastguard Worker TraceFunction func;
196*8975f5c5SAndroid Build Coastguard Worker
197*8975f5c5SAndroid Build Coastguard Worker // Skip past the "void" return value.
198*8975f5c5SAndroid Build Coastguard Worker skipNonWhitespace();
199*8975f5c5SAndroid Build Coastguard Worker advance();
200*8975f5c5SAndroid Build Coastguard Worker readStringAppend(&funcName, '(');
201*8975f5c5SAndroid Build Coastguard Worker if (mVerboseLogging)
202*8975f5c5SAndroid Build Coastguard Worker {
203*8975f5c5SAndroid Build Coastguard Worker printf("function: %s\n", funcName.c_str());
204*8975f5c5SAndroid Build Coastguard Worker }
205*8975f5c5SAndroid Build Coastguard Worker
206*8975f5c5SAndroid Build Coastguard Worker // Skip this function because of the switch statements.
207*8975f5c5SAndroid Build Coastguard Worker if (funcName == "ReplayFrame")
208*8975f5c5SAndroid Build Coastguard Worker {
209*8975f5c5SAndroid Build Coastguard Worker skipFunction();
210*8975f5c5SAndroid Build Coastguard Worker return;
211*8975f5c5SAndroid Build Coastguard Worker }
212*8975f5c5SAndroid Build Coastguard Worker
213*8975f5c5SAndroid Build Coastguard Worker skipLine();
214*8975f5c5SAndroid Build Coastguard Worker ASSERT(peek() == '{');
215*8975f5c5SAndroid Build Coastguard Worker skipLine();
216*8975f5c5SAndroid Build Coastguard Worker while (peek() != '}')
217*8975f5c5SAndroid Build Coastguard Worker {
218*8975f5c5SAndroid Build Coastguard Worker skipComments();
219*8975f5c5SAndroid Build Coastguard Worker
220*8975f5c5SAndroid Build Coastguard Worker Token nameToken;
221*8975f5c5SAndroid Build Coastguard Worker readToken(nameToken, '(');
222*8975f5c5SAndroid Build Coastguard Worker advance();
223*8975f5c5SAndroid Build Coastguard Worker ParamBuffer params;
224*8975f5c5SAndroid Build Coastguard Worker Token paramTokens[kMaxParameters];
225*8975f5c5SAndroid Build Coastguard Worker size_t numParams = 0;
226*8975f5c5SAndroid Build Coastguard Worker skipCast();
227*8975f5c5SAndroid Build Coastguard Worker size_t tokenStart = mIndex;
228*8975f5c5SAndroid Build Coastguard Worker while (peek() != ';')
229*8975f5c5SAndroid Build Coastguard Worker {
230*8975f5c5SAndroid Build Coastguard Worker // Skip casts.
231*8975f5c5SAndroid Build Coastguard Worker if (peek() == ',' || (peek() == ')' && mIndex != tokenStart))
232*8975f5c5SAndroid Build Coastguard Worker {
233*8975f5c5SAndroid Build Coastguard Worker ASSERT(numParams < kMaxParameters);
234*8975f5c5SAndroid Build Coastguard Worker size_t tokenSize = mIndex - tokenStart;
235*8975f5c5SAndroid Build Coastguard Worker ASSERT(tokenSize < kMaxTokenSize);
236*8975f5c5SAndroid Build Coastguard Worker Token &token = paramTokens[numParams++];
237*8975f5c5SAndroid Build Coastguard Worker
238*8975f5c5SAndroid Build Coastguard Worker memcpy(token, &mStream[tokenStart], tokenSize);
239*8975f5c5SAndroid Build Coastguard Worker token[tokenSize] = 0;
240*8975f5c5SAndroid Build Coastguard Worker advance();
241*8975f5c5SAndroid Build Coastguard Worker skipWhitespace();
242*8975f5c5SAndroid Build Coastguard Worker skipCast();
243*8975f5c5SAndroid Build Coastguard Worker tokenStart = mIndex;
244*8975f5c5SAndroid Build Coastguard Worker }
245*8975f5c5SAndroid Build Coastguard Worker else
246*8975f5c5SAndroid Build Coastguard Worker {
247*8975f5c5SAndroid Build Coastguard Worker advance();
248*8975f5c5SAndroid Build Coastguard Worker }
249*8975f5c5SAndroid Build Coastguard Worker }
250*8975f5c5SAndroid Build Coastguard Worker
251*8975f5c5SAndroid Build Coastguard Worker // Turn on if you want more spam.
252*8975f5c5SAndroid Build Coastguard Worker // if (mVerboseLogging)
253*8975f5c5SAndroid Build Coastguard Worker //{
254*8975f5c5SAndroid Build Coastguard Worker // printf("call: %s(", nameToken);
255*8975f5c5SAndroid Build Coastguard Worker // for (size_t paramIndex = 0; paramIndex < numParams; ++paramIndex)
256*8975f5c5SAndroid Build Coastguard Worker // {
257*8975f5c5SAndroid Build Coastguard Worker // if (paramIndex > 0)
258*8975f5c5SAndroid Build Coastguard Worker // {
259*8975f5c5SAndroid Build Coastguard Worker // printf(", ");
260*8975f5c5SAndroid Build Coastguard Worker // }
261*8975f5c5SAndroid Build Coastguard Worker // printf("%s", paramTokens[paramIndex]);
262*8975f5c5SAndroid Build Coastguard Worker // }
263*8975f5c5SAndroid Build Coastguard Worker // printf(")\n");
264*8975f5c5SAndroid Build Coastguard Worker //}
265*8975f5c5SAndroid Build Coastguard Worker
266*8975f5c5SAndroid Build Coastguard Worker // We pass in the strings for specific use with C string array parameters.
267*8975f5c5SAndroid Build Coastguard Worker CallCapture call = ParseCallCapture(nameToken, numParams, paramTokens, mStrings);
268*8975f5c5SAndroid Build Coastguard Worker func.push_back(std::move(call));
269*8975f5c5SAndroid Build Coastguard Worker skipLine();
270*8975f5c5SAndroid Build Coastguard Worker }
271*8975f5c5SAndroid Build Coastguard Worker skipLine();
272*8975f5c5SAndroid Build Coastguard Worker
273*8975f5c5SAndroid Build Coastguard Worker addFunction(funcName, func);
274*8975f5c5SAndroid Build Coastguard Worker }
275*8975f5c5SAndroid Build Coastguard Worker
readMultilineString()276*8975f5c5SAndroid Build Coastguard Worker void readMultilineString()
277*8975f5c5SAndroid Build Coastguard Worker {
278*8975f5c5SAndroid Build Coastguard Worker std::string name;
279*8975f5c5SAndroid Build Coastguard Worker TraceString traceStr;
280*8975f5c5SAndroid Build Coastguard Worker
281*8975f5c5SAndroid Build Coastguard Worker while (peek() != 'g')
282*8975f5c5SAndroid Build Coastguard Worker {
283*8975f5c5SAndroid Build Coastguard Worker advance();
284*8975f5c5SAndroid Build Coastguard Worker }
285*8975f5c5SAndroid Build Coastguard Worker ASSERT(check("glShaderSource") || check("glTransformFeedbackVaryings"));
286*8975f5c5SAndroid Build Coastguard Worker
287*8975f5c5SAndroid Build Coastguard Worker readStringAppend(&name, '[');
288*8975f5c5SAndroid Build Coastguard Worker if (mVerboseLogging)
289*8975f5c5SAndroid Build Coastguard Worker {
290*8975f5c5SAndroid Build Coastguard Worker printf("string: %s\n", name.c_str());
291*8975f5c5SAndroid Build Coastguard Worker }
292*8975f5c5SAndroid Build Coastguard Worker skipLine();
293*8975f5c5SAndroid Build Coastguard Worker std::string str;
294*8975f5c5SAndroid Build Coastguard Worker while (peek() != '}')
295*8975f5c5SAndroid Build Coastguard Worker {
296*8975f5c5SAndroid Build Coastguard Worker advance();
297*8975f5c5SAndroid Build Coastguard Worker readStringAppend(&str, '\"');
298*8975f5c5SAndroid Build Coastguard Worker advance();
299*8975f5c5SAndroid Build Coastguard Worker if (peek() == ',')
300*8975f5c5SAndroid Build Coastguard Worker {
301*8975f5c5SAndroid Build Coastguard Worker traceStr.strings.push_back(std::move(str));
302*8975f5c5SAndroid Build Coastguard Worker }
303*8975f5c5SAndroid Build Coastguard Worker skipLine();
304*8975f5c5SAndroid Build Coastguard Worker }
305*8975f5c5SAndroid Build Coastguard Worker skipLine();
306*8975f5c5SAndroid Build Coastguard Worker
307*8975f5c5SAndroid Build Coastguard Worker for (const std::string &cppstr : traceStr.strings)
308*8975f5c5SAndroid Build Coastguard Worker {
309*8975f5c5SAndroid Build Coastguard Worker traceStr.pointers.push_back(cppstr.c_str());
310*8975f5c5SAndroid Build Coastguard Worker }
311*8975f5c5SAndroid Build Coastguard Worker
312*8975f5c5SAndroid Build Coastguard Worker mStrings[name] = std::move(traceStr);
313*8975f5c5SAndroid Build Coastguard Worker }
314*8975f5c5SAndroid Build Coastguard Worker
addFunction(const std::string & funcName,TraceFunction & func)315*8975f5c5SAndroid Build Coastguard Worker void addFunction(const std::string &funcName, TraceFunction &func)
316*8975f5c5SAndroid Build Coastguard Worker {
317*8975f5c5SAndroid Build Coastguard Worker // Run initialize immediately so we can load the binary data.
318*8975f5c5SAndroid Build Coastguard Worker if (funcName == "InitReplay")
319*8975f5c5SAndroid Build Coastguard Worker {
320*8975f5c5SAndroid Build Coastguard Worker ReplayTraceFunction(func, {});
321*8975f5c5SAndroid Build Coastguard Worker func.clear();
322*8975f5c5SAndroid Build Coastguard Worker }
323*8975f5c5SAndroid Build Coastguard Worker mFunctions[funcName] = std::move(func);
324*8975f5c5SAndroid Build Coastguard Worker }
325*8975f5c5SAndroid Build Coastguard Worker
326*8975f5c5SAndroid Build Coastguard Worker const std::string &mStream;
327*8975f5c5SAndroid Build Coastguard Worker TraceFunctionMap &mFunctions;
328*8975f5c5SAndroid Build Coastguard Worker TraceStringMap &mStrings;
329*8975f5c5SAndroid Build Coastguard Worker size_t mIndex;
330*8975f5c5SAndroid Build Coastguard Worker bool mVerboseLogging = false;
331*8975f5c5SAndroid Build Coastguard Worker };
332*8975f5c5SAndroid Build Coastguard Worker
PackResourceID(ParamBuffer & params,const Token & token)333*8975f5c5SAndroid Build Coastguard Worker void PackResourceID(ParamBuffer ¶ms, const Token &token)
334*8975f5c5SAndroid Build Coastguard Worker {
335*8975f5c5SAndroid Build Coastguard Worker ASSERT(token[0] == 'g');
336*8975f5c5SAndroid Build Coastguard Worker const char *start = strrchr(token, '[');
337*8975f5c5SAndroid Build Coastguard Worker ASSERT(start != nullptr && EndsWith(token, "]"));
338*8975f5c5SAndroid Build Coastguard Worker uint32_t value = static_cast<uint32_t>(atoi(start + 1));
339*8975f5c5SAndroid Build Coastguard Worker if (BeginsWith(token, "gShaderProgramMap"))
340*8975f5c5SAndroid Build Coastguard Worker {
341*8975f5c5SAndroid Build Coastguard Worker gl::ShaderProgramID id = {value};
342*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TShaderProgramID, id);
343*8975f5c5SAndroid Build Coastguard Worker }
344*8975f5c5SAndroid Build Coastguard Worker else if (BeginsWith(token, "gBufferMap"))
345*8975f5c5SAndroid Build Coastguard Worker {
346*8975f5c5SAndroid Build Coastguard Worker gl::BufferID id = {value};
347*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TBufferID, id);
348*8975f5c5SAndroid Build Coastguard Worker }
349*8975f5c5SAndroid Build Coastguard Worker else if (BeginsWith(token, "gTextureMap"))
350*8975f5c5SAndroid Build Coastguard Worker {
351*8975f5c5SAndroid Build Coastguard Worker gl::TextureID id = {value};
352*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TTextureID, id);
353*8975f5c5SAndroid Build Coastguard Worker }
354*8975f5c5SAndroid Build Coastguard Worker else if (BeginsWith(token, "gRenderbufferMap"))
355*8975f5c5SAndroid Build Coastguard Worker {
356*8975f5c5SAndroid Build Coastguard Worker gl::RenderbufferID id = {value};
357*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TRenderbufferID, id);
358*8975f5c5SAndroid Build Coastguard Worker }
359*8975f5c5SAndroid Build Coastguard Worker else if (BeginsWith(token, "gFramebufferMap"))
360*8975f5c5SAndroid Build Coastguard Worker {
361*8975f5c5SAndroid Build Coastguard Worker gl::FramebufferID id = {value};
362*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TFramebufferID, id);
363*8975f5c5SAndroid Build Coastguard Worker }
364*8975f5c5SAndroid Build Coastguard Worker else if (BeginsWith(token, "gSyncMap"))
365*8975f5c5SAndroid Build Coastguard Worker {
366*8975f5c5SAndroid Build Coastguard Worker gl::SyncID id = {value};
367*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TSyncID, id);
368*8975f5c5SAndroid Build Coastguard Worker }
369*8975f5c5SAndroid Build Coastguard Worker else if (BeginsWith(token, "gTransformFeedbackMap"))
370*8975f5c5SAndroid Build Coastguard Worker {
371*8975f5c5SAndroid Build Coastguard Worker gl::TransformFeedbackID id = {value};
372*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TTransformFeedbackID, id);
373*8975f5c5SAndroid Build Coastguard Worker }
374*8975f5c5SAndroid Build Coastguard Worker else if (BeginsWith(token, "gVertexArrayMap"))
375*8975f5c5SAndroid Build Coastguard Worker {
376*8975f5c5SAndroid Build Coastguard Worker gl::VertexArrayID id = {value};
377*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TVertexArrayID, id);
378*8975f5c5SAndroid Build Coastguard Worker }
379*8975f5c5SAndroid Build Coastguard Worker else if (BeginsWith(token, "gQueryMap"))
380*8975f5c5SAndroid Build Coastguard Worker {
381*8975f5c5SAndroid Build Coastguard Worker gl::QueryID id = {value};
382*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TQueryID, id);
383*8975f5c5SAndroid Build Coastguard Worker }
384*8975f5c5SAndroid Build Coastguard Worker else if (BeginsWith(token, "gSamplerMap"))
385*8975f5c5SAndroid Build Coastguard Worker {
386*8975f5c5SAndroid Build Coastguard Worker gl::SamplerID id = {value};
387*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TSamplerID, id);
388*8975f5c5SAndroid Build Coastguard Worker }
389*8975f5c5SAndroid Build Coastguard Worker else
390*8975f5c5SAndroid Build Coastguard Worker {
391*8975f5c5SAndroid Build Coastguard Worker printf("Unknown resource map: %s\n", token);
392*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
393*8975f5c5SAndroid Build Coastguard Worker }
394*8975f5c5SAndroid Build Coastguard Worker }
395*8975f5c5SAndroid Build Coastguard Worker
396*8975f5c5SAndroid Build Coastguard Worker template <typename IntT>
PackIntParameter(ParamBuffer & params,ParamType paramType,const Token & token)397*8975f5c5SAndroid Build Coastguard Worker void PackIntParameter(ParamBuffer ¶ms, ParamType paramType, const Token &token)
398*8975f5c5SAndroid Build Coastguard Worker {
399*8975f5c5SAndroid Build Coastguard Worker IntT value;
400*8975f5c5SAndroid Build Coastguard Worker
401*8975f5c5SAndroid Build Coastguard Worker if (token[0] == 'G')
402*8975f5c5SAndroid Build Coastguard Worker {
403*8975f5c5SAndroid Build Coastguard Worker ASSERT(BeginsWith(token, "GL_"));
404*8975f5c5SAndroid Build Coastguard Worker if (strchr(token, '|') == 0)
405*8975f5c5SAndroid Build Coastguard Worker {
406*8975f5c5SAndroid Build Coastguard Worker value = static_cast<IntT>(gl::StringToGLenum(token));
407*8975f5c5SAndroid Build Coastguard Worker }
408*8975f5c5SAndroid Build Coastguard Worker else
409*8975f5c5SAndroid Build Coastguard Worker {
410*8975f5c5SAndroid Build Coastguard Worker value = static_cast<IntT>(gl::StringToGLbitfield(token));
411*8975f5c5SAndroid Build Coastguard Worker }
412*8975f5c5SAndroid Build Coastguard Worker }
413*8975f5c5SAndroid Build Coastguard Worker else
414*8975f5c5SAndroid Build Coastguard Worker {
415*8975f5c5SAndroid Build Coastguard Worker if (!isdigit(token[0]) && !(token[0] == '-' && isdigit(token[1])))
416*8975f5c5SAndroid Build Coastguard Worker {
417*8975f5c5SAndroid Build Coastguard Worker printf("Expected number, got %s\n", token);
418*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
419*8975f5c5SAndroid Build Coastguard Worker }
420*8975f5c5SAndroid Build Coastguard Worker if (token[0] == '0' && token[1] == 'x')
421*8975f5c5SAndroid Build Coastguard Worker {
422*8975f5c5SAndroid Build Coastguard Worker value = static_cast<IntT>(strtol(token, nullptr, 16));
423*8975f5c5SAndroid Build Coastguard Worker }
424*8975f5c5SAndroid Build Coastguard Worker else
425*8975f5c5SAndroid Build Coastguard Worker {
426*8975f5c5SAndroid Build Coastguard Worker value = static_cast<IntT>(atoi(token));
427*8975f5c5SAndroid Build Coastguard Worker }
428*8975f5c5SAndroid Build Coastguard Worker }
429*8975f5c5SAndroid Build Coastguard Worker
430*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(paramType, value);
431*8975f5c5SAndroid Build Coastguard Worker }
432*8975f5c5SAndroid Build Coastguard Worker
GetStringArrayOffset(const Token & token,const char * prefixString)433*8975f5c5SAndroid Build Coastguard Worker uint32_t GetStringArrayOffset(const Token &token, const char *prefixString)
434*8975f5c5SAndroid Build Coastguard Worker {
435*8975f5c5SAndroid Build Coastguard Worker const char *offsetString = &token[strlen(prefixString)];
436*8975f5c5SAndroid Build Coastguard Worker return atoi(offsetString);
437*8975f5c5SAndroid Build Coastguard Worker }
438*8975f5c5SAndroid Build Coastguard Worker
439*8975f5c5SAndroid Build Coastguard Worker template <typename PointerT>
PackMemPointer(ParamBuffer & params,ParamType paramType,uint32_t offset,uint8_t * mem)440*8975f5c5SAndroid Build Coastguard Worker void PackMemPointer(ParamBuffer ¶ms, ParamType paramType, uint32_t offset, uint8_t *mem)
441*8975f5c5SAndroid Build Coastguard Worker {
442*8975f5c5SAndroid Build Coastguard Worker ASSERT(gBinaryData);
443*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(paramType, reinterpret_cast<PointerT>(&mem[offset]));
444*8975f5c5SAndroid Build Coastguard Worker }
445*8975f5c5SAndroid Build Coastguard Worker
446*8975f5c5SAndroid Build Coastguard Worker template <typename T>
PackMutablePointerParameter(ParamBuffer & params,ParamType paramType,const Token & token)447*8975f5c5SAndroid Build Coastguard Worker void PackMutablePointerParameter(ParamBuffer ¶ms, ParamType paramType, const Token &token)
448*8975f5c5SAndroid Build Coastguard Worker {
449*8975f5c5SAndroid Build Coastguard Worker if (token[0] == '0' && token[1] == 0)
450*8975f5c5SAndroid Build Coastguard Worker {
451*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(paramType, reinterpret_cast<T *>(0));
452*8975f5c5SAndroid Build Coastguard Worker }
453*8975f5c5SAndroid Build Coastguard Worker else if (token[0] == '&')
454*8975f5c5SAndroid Build Coastguard Worker {
455*8975f5c5SAndroid Build Coastguard Worker ASSERT(BeginsWith(token, "&gReadBuffer[") && EndsWith(token, "]"));
456*8975f5c5SAndroid Build Coastguard Worker uint32_t offset = GetStringArrayOffset(token, "&gReadBuffer[");
457*8975f5c5SAndroid Build Coastguard Worker PackMemPointer<T *>(params, paramType, offset, gReadBuffer);
458*8975f5c5SAndroid Build Coastguard Worker }
459*8975f5c5SAndroid Build Coastguard Worker else if (token[0] == 'g')
460*8975f5c5SAndroid Build Coastguard Worker {
461*8975f5c5SAndroid Build Coastguard Worker ASSERT(strcmp(token, "gReadBuffer") == 0);
462*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(paramType, reinterpret_cast<T *>(gReadBuffer));
463*8975f5c5SAndroid Build Coastguard Worker }
464*8975f5c5SAndroid Build Coastguard Worker else
465*8975f5c5SAndroid Build Coastguard Worker {
466*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
467*8975f5c5SAndroid Build Coastguard Worker }
468*8975f5c5SAndroid Build Coastguard Worker }
469*8975f5c5SAndroid Build Coastguard Worker
470*8975f5c5SAndroid Build Coastguard Worker template <typename T>
PackConstPointerParameter(ParamBuffer & params,ParamType paramType,const Token & token)471*8975f5c5SAndroid Build Coastguard Worker void PackConstPointerParameter(ParamBuffer ¶ms, ParamType paramType, const Token &token)
472*8975f5c5SAndroid Build Coastguard Worker {
473*8975f5c5SAndroid Build Coastguard Worker // Handle nullptr, the literal "0".
474*8975f5c5SAndroid Build Coastguard Worker if (token[0] == '0' && token[1] == 0)
475*8975f5c5SAndroid Build Coastguard Worker {
476*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(paramType, reinterpret_cast<const T *>(0));
477*8975f5c5SAndroid Build Coastguard Worker }
478*8975f5c5SAndroid Build Coastguard Worker else if (token[0] == '&')
479*8975f5c5SAndroid Build Coastguard Worker {
480*8975f5c5SAndroid Build Coastguard Worker ASSERT(BeginsWith(token, "&gBinaryData[") && EndsWith(token, "]"));
481*8975f5c5SAndroid Build Coastguard Worker uint32_t offset = GetStringArrayOffset(token, "&gReadBuffer[");
482*8975f5c5SAndroid Build Coastguard Worker PackMemPointer<const T *>(params, paramType, offset, gBinaryData);
483*8975f5c5SAndroid Build Coastguard Worker }
484*8975f5c5SAndroid Build Coastguard Worker else if (token[0] == 'g')
485*8975f5c5SAndroid Build Coastguard Worker {
486*8975f5c5SAndroid Build Coastguard Worker if (strcmp(token, "gResourceIDBuffer") == 0)
487*8975f5c5SAndroid Build Coastguard Worker {
488*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(paramType, reinterpret_cast<const T *>(gResourceIDBuffer));
489*8975f5c5SAndroid Build Coastguard Worker }
490*8975f5c5SAndroid Build Coastguard Worker else if (BeginsWith(token, "gClientArrays"))
491*8975f5c5SAndroid Build Coastguard Worker {
492*8975f5c5SAndroid Build Coastguard Worker uint32_t offset = GetStringArrayOffset(token, "gClientArrays[");
493*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(paramType, reinterpret_cast<const T *>(gClientArrays[offset]));
494*8975f5c5SAndroid Build Coastguard Worker }
495*8975f5c5SAndroid Build Coastguard Worker else
496*8975f5c5SAndroid Build Coastguard Worker {
497*8975f5c5SAndroid Build Coastguard Worker printf("Unexpected token: %s\n", token);
498*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
499*8975f5c5SAndroid Build Coastguard Worker }
500*8975f5c5SAndroid Build Coastguard Worker }
501*8975f5c5SAndroid Build Coastguard Worker else
502*8975f5c5SAndroid Build Coastguard Worker {
503*8975f5c5SAndroid Build Coastguard Worker ASSERT(isdigit(token[0]));
504*8975f5c5SAndroid Build Coastguard Worker uint32_t offset = atoi(token);
505*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(paramType,
506*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<const T *>(static_cast<uintptr_t>(offset)));
507*8975f5c5SAndroid Build Coastguard Worker }
508*8975f5c5SAndroid Build Coastguard Worker }
509*8975f5c5SAndroid Build Coastguard Worker
510*8975f5c5SAndroid Build Coastguard Worker class TraceInterpreter : angle::NonCopyable
511*8975f5c5SAndroid Build Coastguard Worker {
512*8975f5c5SAndroid Build Coastguard Worker public:
513*8975f5c5SAndroid Build Coastguard Worker TraceInterpreter() = default;
514*8975f5c5SAndroid Build Coastguard Worker ~TraceInterpreter() = default;
515*8975f5c5SAndroid Build Coastguard Worker
516*8975f5c5SAndroid Build Coastguard Worker void replayFrame(uint32_t frameIndex);
517*8975f5c5SAndroid Build Coastguard Worker void setupReplay();
518*8975f5c5SAndroid Build Coastguard Worker void resetReplay();
519*8975f5c5SAndroid Build Coastguard Worker const char *getSerializedContextState(uint32_t frameIndex);
520*8975f5c5SAndroid Build Coastguard Worker
521*8975f5c5SAndroid Build Coastguard Worker private:
522*8975f5c5SAndroid Build Coastguard Worker void runTraceFunction(const char *name) const;
523*8975f5c5SAndroid Build Coastguard Worker void parseTraceUncompressed();
524*8975f5c5SAndroid Build Coastguard Worker void parseTraceGz();
525*8975f5c5SAndroid Build Coastguard Worker
526*8975f5c5SAndroid Build Coastguard Worker TraceFunctionMap mTraceFunctions;
527*8975f5c5SAndroid Build Coastguard Worker TraceStringMap mTraceStrings;
528*8975f5c5SAndroid Build Coastguard Worker bool mVerboseLogging = true;
529*8975f5c5SAndroid Build Coastguard Worker };
530*8975f5c5SAndroid Build Coastguard Worker
replayFrame(uint32_t frameIndex)531*8975f5c5SAndroid Build Coastguard Worker void TraceInterpreter::replayFrame(uint32_t frameIndex)
532*8975f5c5SAndroid Build Coastguard Worker {
533*8975f5c5SAndroid Build Coastguard Worker char funcName[kMaxTokenSize];
534*8975f5c5SAndroid Build Coastguard Worker snprintf(funcName, kMaxTokenSize, "ReplayFrame%u", frameIndex);
535*8975f5c5SAndroid Build Coastguard Worker runTraceFunction(funcName);
536*8975f5c5SAndroid Build Coastguard Worker }
537*8975f5c5SAndroid Build Coastguard Worker
parseTraceUncompressed()538*8975f5c5SAndroid Build Coastguard Worker void TraceInterpreter::parseTraceUncompressed()
539*8975f5c5SAndroid Build Coastguard Worker {
540*8975f5c5SAndroid Build Coastguard Worker for (const std::string &file : gTraceInfo.traceFiles)
541*8975f5c5SAndroid Build Coastguard Worker {
542*8975f5c5SAndroid Build Coastguard Worker if (!ShouldParseFile(file))
543*8975f5c5SAndroid Build Coastguard Worker {
544*8975f5c5SAndroid Build Coastguard Worker if (mVerboseLogging)
545*8975f5c5SAndroid Build Coastguard Worker {
546*8975f5c5SAndroid Build Coastguard Worker printf("Skipping function parsing for %s.\n", file.c_str());
547*8975f5c5SAndroid Build Coastguard Worker }
548*8975f5c5SAndroid Build Coastguard Worker continue;
549*8975f5c5SAndroid Build Coastguard Worker }
550*8975f5c5SAndroid Build Coastguard Worker
551*8975f5c5SAndroid Build Coastguard Worker if (mVerboseLogging)
552*8975f5c5SAndroid Build Coastguard Worker {
553*8975f5c5SAndroid Build Coastguard Worker printf("Parsing functions from %s\n", file.c_str());
554*8975f5c5SAndroid Build Coastguard Worker }
555*8975f5c5SAndroid Build Coastguard Worker std::stringstream pathStream;
556*8975f5c5SAndroid Build Coastguard Worker pathStream << gBinaryDataDir << GetPathSeparator() << file;
557*8975f5c5SAndroid Build Coastguard Worker std::string path = pathStream.str();
558*8975f5c5SAndroid Build Coastguard Worker
559*8975f5c5SAndroid Build Coastguard Worker std::string fileData;
560*8975f5c5SAndroid Build Coastguard Worker if (!ReadFileToString(path, &fileData))
561*8975f5c5SAndroid Build Coastguard Worker {
562*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
563*8975f5c5SAndroid Build Coastguard Worker }
564*8975f5c5SAndroid Build Coastguard Worker
565*8975f5c5SAndroid Build Coastguard Worker Parser parser(fileData, mTraceFunctions, mTraceStrings, mVerboseLogging);
566*8975f5c5SAndroid Build Coastguard Worker parser.parse();
567*8975f5c5SAndroid Build Coastguard Worker }
568*8975f5c5SAndroid Build Coastguard Worker }
569*8975f5c5SAndroid Build Coastguard Worker
parseTraceGz()570*8975f5c5SAndroid Build Coastguard Worker void TraceInterpreter::parseTraceGz()
571*8975f5c5SAndroid Build Coastguard Worker {
572*8975f5c5SAndroid Build Coastguard Worker if (mVerboseLogging)
573*8975f5c5SAndroid Build Coastguard Worker {
574*8975f5c5SAndroid Build Coastguard Worker printf("Parsing functions from %s\n", gTraceGzPath.c_str());
575*8975f5c5SAndroid Build Coastguard Worker }
576*8975f5c5SAndroid Build Coastguard Worker
577*8975f5c5SAndroid Build Coastguard Worker FILE *fp = fopen(gTraceGzPath.c_str(), "rb");
578*8975f5c5SAndroid Build Coastguard Worker if (fp == 0)
579*8975f5c5SAndroid Build Coastguard Worker {
580*8975f5c5SAndroid Build Coastguard Worker printf("Error loading trace (gz) from: %s\n", gTraceGzPath.c_str());
581*8975f5c5SAndroid Build Coastguard Worker exit(1);
582*8975f5c5SAndroid Build Coastguard Worker }
583*8975f5c5SAndroid Build Coastguard Worker
584*8975f5c5SAndroid Build Coastguard Worker fseek(fp, 0, SEEK_END);
585*8975f5c5SAndroid Build Coastguard Worker long size = ftell(fp);
586*8975f5c5SAndroid Build Coastguard Worker fseek(fp, 0, SEEK_SET);
587*8975f5c5SAndroid Build Coastguard Worker
588*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> compressedData(size);
589*8975f5c5SAndroid Build Coastguard Worker (void)fread(compressedData.data(), 1, size, fp);
590*8975f5c5SAndroid Build Coastguard Worker
591*8975f5c5SAndroid Build Coastguard Worker uint32_t uncompressedSize =
592*8975f5c5SAndroid Build Coastguard Worker zlib_internal::GetGzipUncompressedSize(compressedData.data(), compressedData.size());
593*8975f5c5SAndroid Build Coastguard Worker
594*8975f5c5SAndroid Build Coastguard Worker std::string uncompressedData(uncompressedSize, 0);
595*8975f5c5SAndroid Build Coastguard Worker uLong destLen = uncompressedSize;
596*8975f5c5SAndroid Build Coastguard Worker int zResult = zlib_internal::GzipUncompressHelper((uint8_t *)uncompressedData.data(), &destLen,
597*8975f5c5SAndroid Build Coastguard Worker compressedData.data(),
598*8975f5c5SAndroid Build Coastguard Worker static_cast<uLong>(compressedData.size()));
599*8975f5c5SAndroid Build Coastguard Worker
600*8975f5c5SAndroid Build Coastguard Worker if (zResult != Z_OK)
601*8975f5c5SAndroid Build Coastguard Worker {
602*8975f5c5SAndroid Build Coastguard Worker printf("Failure to decompress gz trace: %s\n", gTraceGzPath.c_str());
603*8975f5c5SAndroid Build Coastguard Worker exit(1);
604*8975f5c5SAndroid Build Coastguard Worker }
605*8975f5c5SAndroid Build Coastguard Worker
606*8975f5c5SAndroid Build Coastguard Worker Parser parser(uncompressedData, mTraceFunctions, mTraceStrings, mVerboseLogging);
607*8975f5c5SAndroid Build Coastguard Worker parser.parse();
608*8975f5c5SAndroid Build Coastguard Worker }
609*8975f5c5SAndroid Build Coastguard Worker
setupReplay()610*8975f5c5SAndroid Build Coastguard Worker void TraceInterpreter::setupReplay()
611*8975f5c5SAndroid Build Coastguard Worker {
612*8975f5c5SAndroid Build Coastguard Worker if (!gTraceGzPath.empty())
613*8975f5c5SAndroid Build Coastguard Worker {
614*8975f5c5SAndroid Build Coastguard Worker parseTraceGz();
615*8975f5c5SAndroid Build Coastguard Worker }
616*8975f5c5SAndroid Build Coastguard Worker else
617*8975f5c5SAndroid Build Coastguard Worker {
618*8975f5c5SAndroid Build Coastguard Worker parseTraceUncompressed();
619*8975f5c5SAndroid Build Coastguard Worker }
620*8975f5c5SAndroid Build Coastguard Worker
621*8975f5c5SAndroid Build Coastguard Worker if (mTraceFunctions.count("SetupReplay") == 0)
622*8975f5c5SAndroid Build Coastguard Worker {
623*8975f5c5SAndroid Build Coastguard Worker printf("Did not find a SetupReplay function to run among %zu parsed functions.\n",
624*8975f5c5SAndroid Build Coastguard Worker mTraceFunctions.size());
625*8975f5c5SAndroid Build Coastguard Worker exit(1);
626*8975f5c5SAndroid Build Coastguard Worker }
627*8975f5c5SAndroid Build Coastguard Worker
628*8975f5c5SAndroid Build Coastguard Worker runTraceFunction("SetupReplay");
629*8975f5c5SAndroid Build Coastguard Worker }
630*8975f5c5SAndroid Build Coastguard Worker
resetReplay()631*8975f5c5SAndroid Build Coastguard Worker void TraceInterpreter::resetReplay()
632*8975f5c5SAndroid Build Coastguard Worker {
633*8975f5c5SAndroid Build Coastguard Worker runTraceFunction("ResetReplay");
634*8975f5c5SAndroid Build Coastguard Worker }
635*8975f5c5SAndroid Build Coastguard Worker
getSerializedContextState(uint32_t frameIndex)636*8975f5c5SAndroid Build Coastguard Worker const char *TraceInterpreter::getSerializedContextState(uint32_t frameIndex)
637*8975f5c5SAndroid Build Coastguard Worker {
638*8975f5c5SAndroid Build Coastguard Worker // TODO: Necessary for complete self-testing. http://anglebug.com/42266250
639*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
640*8975f5c5SAndroid Build Coastguard Worker return nullptr;
641*8975f5c5SAndroid Build Coastguard Worker }
642*8975f5c5SAndroid Build Coastguard Worker
runTraceFunction(const char * name) const643*8975f5c5SAndroid Build Coastguard Worker void TraceInterpreter::runTraceFunction(const char *name) const
644*8975f5c5SAndroid Build Coastguard Worker {
645*8975f5c5SAndroid Build Coastguard Worker auto iter = mTraceFunctions.find(name);
646*8975f5c5SAndroid Build Coastguard Worker if (iter == mTraceFunctions.end())
647*8975f5c5SAndroid Build Coastguard Worker {
648*8975f5c5SAndroid Build Coastguard Worker printf("Cannot find function: %s\n", name);
649*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
650*8975f5c5SAndroid Build Coastguard Worker }
651*8975f5c5SAndroid Build Coastguard Worker const TraceFunction &func = iter->second;
652*8975f5c5SAndroid Build Coastguard Worker ReplayTraceFunction(func, mTraceFunctions);
653*8975f5c5SAndroid Build Coastguard Worker }
654*8975f5c5SAndroid Build Coastguard Worker
GetInterpreter()655*8975f5c5SAndroid Build Coastguard Worker TraceInterpreter &GetInterpreter()
656*8975f5c5SAndroid Build Coastguard Worker {
657*8975f5c5SAndroid Build Coastguard Worker static angle::base::NoDestructor<std::unique_ptr<TraceInterpreter>> sTraceInterpreter(
658*8975f5c5SAndroid Build Coastguard Worker new TraceInterpreter());
659*8975f5c5SAndroid Build Coastguard Worker return *sTraceInterpreter.get()->get();
660*8975f5c5SAndroid Build Coastguard Worker }
661*8975f5c5SAndroid Build Coastguard Worker } // anonymous namespace
662*8975f5c5SAndroid Build Coastguard Worker
663*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)664*8975f5c5SAndroid Build Coastguard Worker void PackParameter<uint32_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
665*8975f5c5SAndroid Build Coastguard Worker {
666*8975f5c5SAndroid Build Coastguard Worker if (token[0] == 'g')
667*8975f5c5SAndroid Build Coastguard Worker {
668*8975f5c5SAndroid Build Coastguard Worker PackResourceID(params, token);
669*8975f5c5SAndroid Build Coastguard Worker }
670*8975f5c5SAndroid Build Coastguard Worker else
671*8975f5c5SAndroid Build Coastguard Worker {
672*8975f5c5SAndroid Build Coastguard Worker PackIntParameter<uint32_t>(params, ParamType::TGLuint, token);
673*8975f5c5SAndroid Build Coastguard Worker }
674*8975f5c5SAndroid Build Coastguard Worker }
675*8975f5c5SAndroid Build Coastguard Worker
676*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)677*8975f5c5SAndroid Build Coastguard Worker void PackParameter<int32_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
678*8975f5c5SAndroid Build Coastguard Worker {
679*8975f5c5SAndroid Build Coastguard Worker if (BeginsWith(token, "gUniformLocations"))
680*8975f5c5SAndroid Build Coastguard Worker {
681*8975f5c5SAndroid Build Coastguard Worker const char *start = strrchr(token, '[');
682*8975f5c5SAndroid Build Coastguard Worker ASSERT(start != nullptr && EndsWith(token, "]"));
683*8975f5c5SAndroid Build Coastguard Worker int32_t value = atoi(start + 1);
684*8975f5c5SAndroid Build Coastguard Worker gl::UniformLocation loc = {value};
685*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TUniformLocation, loc);
686*8975f5c5SAndroid Build Coastguard Worker }
687*8975f5c5SAndroid Build Coastguard Worker else
688*8975f5c5SAndroid Build Coastguard Worker {
689*8975f5c5SAndroid Build Coastguard Worker PackIntParameter<int32_t>(params, ParamType::TGLint, token);
690*8975f5c5SAndroid Build Coastguard Worker }
691*8975f5c5SAndroid Build Coastguard Worker }
692*8975f5c5SAndroid Build Coastguard Worker
693*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)694*8975f5c5SAndroid Build Coastguard Worker void PackParameter<void *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
695*8975f5c5SAndroid Build Coastguard Worker {
696*8975f5c5SAndroid Build Coastguard Worker void *value = 0;
697*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TvoidPointer, value);
698*8975f5c5SAndroid Build Coastguard Worker }
699*8975f5c5SAndroid Build Coastguard Worker
700*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)701*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const int32_t *>(ParamBuffer ¶ms,
702*8975f5c5SAndroid Build Coastguard Worker const Token &token,
703*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
704*8975f5c5SAndroid Build Coastguard Worker {
705*8975f5c5SAndroid Build Coastguard Worker PackConstPointerParameter<int32_t>(params, ParamType::TGLintConstPointer, token);
706*8975f5c5SAndroid Build Coastguard Worker }
707*8975f5c5SAndroid Build Coastguard Worker
708*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)709*8975f5c5SAndroid Build Coastguard Worker void PackParameter<void **>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
710*8975f5c5SAndroid Build Coastguard Worker {
711*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
712*8975f5c5SAndroid Build Coastguard Worker }
713*8975f5c5SAndroid Build Coastguard Worker
714*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)715*8975f5c5SAndroid Build Coastguard Worker void PackParameter<int32_t *>(ParamBuffer ¶ms,
716*8975f5c5SAndroid Build Coastguard Worker const Token &token,
717*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
718*8975f5c5SAndroid Build Coastguard Worker {
719*8975f5c5SAndroid Build Coastguard Worker PackMutablePointerParameter<int32_t>(params, ParamType::TGLintPointer, token);
720*8975f5c5SAndroid Build Coastguard Worker }
721*8975f5c5SAndroid Build Coastguard Worker
722*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)723*8975f5c5SAndroid Build Coastguard Worker void PackParameter<uint64_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
724*8975f5c5SAndroid Build Coastguard Worker {
725*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TGLuint64,
726*8975f5c5SAndroid Build Coastguard Worker static_cast<GLuint64>(std::strtoull(token, nullptr, 10)));
727*8975f5c5SAndroid Build Coastguard Worker }
728*8975f5c5SAndroid Build Coastguard Worker
729*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)730*8975f5c5SAndroid Build Coastguard Worker void PackParameter<int64_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
731*8975f5c5SAndroid Build Coastguard Worker {
732*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TGLint64,
733*8975f5c5SAndroid Build Coastguard Worker static_cast<GLint64>(std::strtoll(token, nullptr, 10)));
734*8975f5c5SAndroid Build Coastguard Worker }
735*8975f5c5SAndroid Build Coastguard Worker
736*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)737*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const int64_t *>(ParamBuffer ¶ms,
738*8975f5c5SAndroid Build Coastguard Worker const Token &token,
739*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
740*8975f5c5SAndroid Build Coastguard Worker {
741*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
742*8975f5c5SAndroid Build Coastguard Worker }
743*8975f5c5SAndroid Build Coastguard Worker
744*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)745*8975f5c5SAndroid Build Coastguard Worker void PackParameter<int64_t *>(ParamBuffer ¶ms,
746*8975f5c5SAndroid Build Coastguard Worker const Token &token,
747*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
748*8975f5c5SAndroid Build Coastguard Worker {
749*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
750*8975f5c5SAndroid Build Coastguard Worker }
751*8975f5c5SAndroid Build Coastguard Worker
752*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)753*8975f5c5SAndroid Build Coastguard Worker void PackParameter<uint64_t *>(ParamBuffer ¶ms,
754*8975f5c5SAndroid Build Coastguard Worker const Token &token,
755*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
756*8975f5c5SAndroid Build Coastguard Worker {
757*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
758*8975f5c5SAndroid Build Coastguard Worker }
759*8975f5c5SAndroid Build Coastguard Worker
760*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)761*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const char *>(ParamBuffer ¶ms,
762*8975f5c5SAndroid Build Coastguard Worker const Token &token,
763*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
764*8975f5c5SAndroid Build Coastguard Worker {
765*8975f5c5SAndroid Build Coastguard Worker if (token[0] == '"')
766*8975f5c5SAndroid Build Coastguard Worker {
767*8975f5c5SAndroid Build Coastguard Worker ASSERT(EndsWith(token, "\""));
768*8975f5c5SAndroid Build Coastguard Worker
769*8975f5c5SAndroid Build Coastguard Worker ParamCapture param(params.getNextParamName(), ParamType::TGLcharConstPointer);
770*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> data(&token[1], &token[strlen(token) - 1]);
771*8975f5c5SAndroid Build Coastguard Worker data.push_back(0);
772*8975f5c5SAndroid Build Coastguard Worker param.data.push_back(std::move(data));
773*8975f5c5SAndroid Build Coastguard Worker param.value.GLcharConstPointerVal = reinterpret_cast<const char *>(param.data[0].data());
774*8975f5c5SAndroid Build Coastguard Worker params.addParam(std::move(param));
775*8975f5c5SAndroid Build Coastguard Worker }
776*8975f5c5SAndroid Build Coastguard Worker else
777*8975f5c5SAndroid Build Coastguard Worker {
778*8975f5c5SAndroid Build Coastguard Worker PackConstPointerParameter<char>(params, ParamType::TGLcharConstPointer, token);
779*8975f5c5SAndroid Build Coastguard Worker }
780*8975f5c5SAndroid Build Coastguard Worker }
781*8975f5c5SAndroid Build Coastguard Worker
782*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)783*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const void *>(ParamBuffer ¶ms,
784*8975f5c5SAndroid Build Coastguard Worker const Token &token,
785*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
786*8975f5c5SAndroid Build Coastguard Worker {
787*8975f5c5SAndroid Build Coastguard Worker PackConstPointerParameter<void>(params, ParamType::TvoidConstPointer, token);
788*8975f5c5SAndroid Build Coastguard Worker }
789*8975f5c5SAndroid Build Coastguard Worker
790*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)791*8975f5c5SAndroid Build Coastguard Worker void PackParameter<uint32_t *>(ParamBuffer ¶ms,
792*8975f5c5SAndroid Build Coastguard Worker const Token &token,
793*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
794*8975f5c5SAndroid Build Coastguard Worker {
795*8975f5c5SAndroid Build Coastguard Worker PackMutablePointerParameter<uint32_t>(params, ParamType::TGLuintPointer, token);
796*8975f5c5SAndroid Build Coastguard Worker }
797*8975f5c5SAndroid Build Coastguard Worker
798*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)799*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const uint32_t *>(ParamBuffer ¶ms,
800*8975f5c5SAndroid Build Coastguard Worker const Token &token,
801*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
802*8975f5c5SAndroid Build Coastguard Worker {
803*8975f5c5SAndroid Build Coastguard Worker PackConstPointerParameter<uint32_t>(params, ParamType::TGLuintConstPointer, token);
804*8975f5c5SAndroid Build Coastguard Worker }
805*8975f5c5SAndroid Build Coastguard Worker
806*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)807*8975f5c5SAndroid Build Coastguard Worker void PackParameter<float>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
808*8975f5c5SAndroid Build Coastguard Worker {
809*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TGLfloat, std::stof(token));
810*8975f5c5SAndroid Build Coastguard Worker }
811*8975f5c5SAndroid Build Coastguard Worker
812*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)813*8975f5c5SAndroid Build Coastguard Worker void PackParameter<uint8_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
814*8975f5c5SAndroid Build Coastguard Worker {
815*8975f5c5SAndroid Build Coastguard Worker PackIntParameter<uint8_t>(params, ParamType::TGLubyte, token);
816*8975f5c5SAndroid Build Coastguard Worker }
817*8975f5c5SAndroid Build Coastguard Worker
818*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)819*8975f5c5SAndroid Build Coastguard Worker void PackParameter<float *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
820*8975f5c5SAndroid Build Coastguard Worker {
821*8975f5c5SAndroid Build Coastguard Worker PackMutablePointerParameter<float>(params, ParamType::TGLfloatPointer, token);
822*8975f5c5SAndroid Build Coastguard Worker }
823*8975f5c5SAndroid Build Coastguard Worker
824*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)825*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const float *>(ParamBuffer ¶ms,
826*8975f5c5SAndroid Build Coastguard Worker const Token &token,
827*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
828*8975f5c5SAndroid Build Coastguard Worker {
829*8975f5c5SAndroid Build Coastguard Worker PackConstPointerParameter<float>(params, ParamType::TGLfloatConstPointer, token);
830*8975f5c5SAndroid Build Coastguard Worker }
831*8975f5c5SAndroid Build Coastguard Worker
832*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)833*8975f5c5SAndroid Build Coastguard Worker void PackParameter<GLsync>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
834*8975f5c5SAndroid Build Coastguard Worker {
835*8975f5c5SAndroid Build Coastguard Worker PackResourceID(params, token);
836*8975f5c5SAndroid Build Coastguard Worker }
837*8975f5c5SAndroid Build Coastguard Worker
838*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)839*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const char *const *>(ParamBuffer ¶ms,
840*8975f5c5SAndroid Build Coastguard Worker const Token &token,
841*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
842*8975f5c5SAndroid Build Coastguard Worker {
843*8975f5c5SAndroid Build Coastguard Worker // Find the string that corresponds to "token". Currently we only support string arrays.
844*8975f5c5SAndroid Build Coastguard Worker auto iter = strings.find(token);
845*8975f5c5SAndroid Build Coastguard Worker if (iter == strings.end())
846*8975f5c5SAndroid Build Coastguard Worker {
847*8975f5c5SAndroid Build Coastguard Worker printf("Could not find string: %s\n", token);
848*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
849*8975f5c5SAndroid Build Coastguard Worker }
850*8975f5c5SAndroid Build Coastguard Worker const TraceString &traceStr = iter->second;
851*8975f5c5SAndroid Build Coastguard Worker params.addUnnamedParam(ParamType::TGLcharConstPointerPointer, traceStr.pointers.data());
852*8975f5c5SAndroid Build Coastguard Worker }
853*8975f5c5SAndroid Build Coastguard Worker
854*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)855*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const char **>(ParamBuffer ¶ms,
856*8975f5c5SAndroid Build Coastguard Worker const Token &token,
857*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
858*8975f5c5SAndroid Build Coastguard Worker {
859*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
860*8975f5c5SAndroid Build Coastguard Worker }
861*8975f5c5SAndroid Build Coastguard Worker
862*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)863*8975f5c5SAndroid Build Coastguard Worker void PackParameter<GLDEBUGPROCKHR>(ParamBuffer ¶ms,
864*8975f5c5SAndroid Build Coastguard Worker const Token &token,
865*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
866*8975f5c5SAndroid Build Coastguard Worker {
867*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
868*8975f5c5SAndroid Build Coastguard Worker }
869*8975f5c5SAndroid Build Coastguard Worker
870*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)871*8975f5c5SAndroid Build Coastguard Worker void PackParameter<EGLDEBUGPROCKHR>(ParamBuffer ¶ms,
872*8975f5c5SAndroid Build Coastguard Worker const Token &token,
873*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
874*8975f5c5SAndroid Build Coastguard Worker {
875*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
876*8975f5c5SAndroid Build Coastguard Worker }
877*8975f5c5SAndroid Build Coastguard Worker
878*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)879*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const struct AHardwareBuffer *>(ParamBuffer ¶ms,
880*8975f5c5SAndroid Build Coastguard Worker const Token &token,
881*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
882*8975f5c5SAndroid Build Coastguard Worker {
883*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
884*8975f5c5SAndroid Build Coastguard Worker }
885*8975f5c5SAndroid Build Coastguard Worker
886*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)887*8975f5c5SAndroid Build Coastguard Worker void PackParameter<EGLSetBlobFuncANDROID>(ParamBuffer ¶ms,
888*8975f5c5SAndroid Build Coastguard Worker const Token &token,
889*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
890*8975f5c5SAndroid Build Coastguard Worker {
891*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
892*8975f5c5SAndroid Build Coastguard Worker }
893*8975f5c5SAndroid Build Coastguard Worker
894*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)895*8975f5c5SAndroid Build Coastguard Worker void PackParameter<EGLGetBlobFuncANDROID>(ParamBuffer ¶ms,
896*8975f5c5SAndroid Build Coastguard Worker const Token &token,
897*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
898*8975f5c5SAndroid Build Coastguard Worker {
899*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
900*8975f5c5SAndroid Build Coastguard Worker }
901*8975f5c5SAndroid Build Coastguard Worker
902*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)903*8975f5c5SAndroid Build Coastguard Worker void PackParameter<int16_t>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
904*8975f5c5SAndroid Build Coastguard Worker {
905*8975f5c5SAndroid Build Coastguard Worker PackIntParameter<int16_t>(params, ParamType::TGLshort, token);
906*8975f5c5SAndroid Build Coastguard Worker }
907*8975f5c5SAndroid Build Coastguard Worker
908*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)909*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const int16_t *>(ParamBuffer ¶ms,
910*8975f5c5SAndroid Build Coastguard Worker const Token &token,
911*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
912*8975f5c5SAndroid Build Coastguard Worker {
913*8975f5c5SAndroid Build Coastguard Worker PackConstPointerParameter<int16_t>(params, ParamType::TGLshortConstPointer, token);
914*8975f5c5SAndroid Build Coastguard Worker }
915*8975f5c5SAndroid Build Coastguard Worker
916*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)917*8975f5c5SAndroid Build Coastguard Worker void PackParameter<char *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
918*8975f5c5SAndroid Build Coastguard Worker {
919*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
920*8975f5c5SAndroid Build Coastguard Worker }
921*8975f5c5SAndroid Build Coastguard Worker
922*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)923*8975f5c5SAndroid Build Coastguard Worker void PackParameter<unsigned char *>(ParamBuffer ¶ms,
924*8975f5c5SAndroid Build Coastguard Worker const Token &token,
925*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
926*8975f5c5SAndroid Build Coastguard Worker {
927*8975f5c5SAndroid Build Coastguard Worker PackMutablePointerParameter<GLubyte>(params, ParamType::TGLubytePointer, token);
928*8975f5c5SAndroid Build Coastguard Worker }
929*8975f5c5SAndroid Build Coastguard Worker
930*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)931*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const void *const *>(ParamBuffer ¶ms,
932*8975f5c5SAndroid Build Coastguard Worker const Token &token,
933*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
934*8975f5c5SAndroid Build Coastguard Worker {
935*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
936*8975f5c5SAndroid Build Coastguard Worker }
937*8975f5c5SAndroid Build Coastguard Worker
938*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)939*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const uint64_t *>(ParamBuffer ¶ms,
940*8975f5c5SAndroid Build Coastguard Worker const Token &token,
941*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
942*8975f5c5SAndroid Build Coastguard Worker {
943*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
944*8975f5c5SAndroid Build Coastguard Worker }
945*8975f5c5SAndroid Build Coastguard Worker
946*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)947*8975f5c5SAndroid Build Coastguard Worker void PackParameter<GLGETBLOBPROCANGLE>(ParamBuffer ¶ms,
948*8975f5c5SAndroid Build Coastguard Worker const Token &token,
949*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
950*8975f5c5SAndroid Build Coastguard Worker {
951*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
952*8975f5c5SAndroid Build Coastguard Worker }
953*8975f5c5SAndroid Build Coastguard Worker
954*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)955*8975f5c5SAndroid Build Coastguard Worker void PackParameter<GLSETBLOBPROCANGLE>(ParamBuffer ¶ms,
956*8975f5c5SAndroid Build Coastguard Worker const Token &token,
957*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
958*8975f5c5SAndroid Build Coastguard Worker {
959*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
960*8975f5c5SAndroid Build Coastguard Worker }
961*8975f5c5SAndroid Build Coastguard Worker
962*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_WINDOWS)
963*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)964*8975f5c5SAndroid Build Coastguard Worker void PackParameter<EGLNativeDisplayType>(ParamBuffer ¶ms,
965*8975f5c5SAndroid Build Coastguard Worker const Token &token,
966*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
967*8975f5c5SAndroid Build Coastguard Worker {
968*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
969*8975f5c5SAndroid Build Coastguard Worker }
970*8975f5c5SAndroid Build Coastguard Worker #endif // defined(ANGLE_PLATFORM_WINDOWS)
971*8975f5c5SAndroid Build Coastguard Worker
972*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_WINDOWS) || defined(ANGLE_PLATFORM_ANDROID)
973*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)974*8975f5c5SAndroid Build Coastguard Worker void PackParameter<EGLNativeWindowType>(ParamBuffer ¶ms,
975*8975f5c5SAndroid Build Coastguard Worker const Token &token,
976*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
977*8975f5c5SAndroid Build Coastguard Worker {
978*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
979*8975f5c5SAndroid Build Coastguard Worker }
980*8975f5c5SAndroid Build Coastguard Worker
981*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)982*8975f5c5SAndroid Build Coastguard Worker void PackParameter<EGLNativePixmapType>(ParamBuffer ¶ms,
983*8975f5c5SAndroid Build Coastguard Worker const Token &token,
984*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
985*8975f5c5SAndroid Build Coastguard Worker {
986*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
987*8975f5c5SAndroid Build Coastguard Worker }
988*8975f5c5SAndroid Build Coastguard Worker #endif // defined(ANGLE_PLATFORM_WINDOWS) || defined(ANGLE_PLATFORM_ANDROID)
989*8975f5c5SAndroid Build Coastguard Worker
990*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_APPLE) || !defined(ANGLE_IS_64_BIT_CPU)
991*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)992*8975f5c5SAndroid Build Coastguard Worker void PackParameter<const long *>(ParamBuffer ¶ms,
993*8975f5c5SAndroid Build Coastguard Worker const Token &token,
994*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
995*8975f5c5SAndroid Build Coastguard Worker {
996*8975f5c5SAndroid Build Coastguard Worker PackConstPointerParameter<int64_t>(params, ParamType::TGLuint64ConstPointer, token);
997*8975f5c5SAndroid Build Coastguard Worker }
998*8975f5c5SAndroid Build Coastguard Worker
999*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)1000*8975f5c5SAndroid Build Coastguard Worker void PackParameter<long *>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
1001*8975f5c5SAndroid Build Coastguard Worker {
1002*8975f5c5SAndroid Build Coastguard Worker PackMutablePointerParameter<int64_t>(params, ParamType::TGLint64Pointer, token);
1003*8975f5c5SAndroid Build Coastguard Worker }
1004*8975f5c5SAndroid Build Coastguard Worker
1005*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)1006*8975f5c5SAndroid Build Coastguard Worker void PackParameter<long>(ParamBuffer ¶ms, const Token &token, const TraceStringMap &strings)
1007*8975f5c5SAndroid Build Coastguard Worker {
1008*8975f5c5SAndroid Build Coastguard Worker PackIntParameter<int64_t>(params, ParamType::TGLint64, token);
1009*8975f5c5SAndroid Build Coastguard Worker }
1010*8975f5c5SAndroid Build Coastguard Worker
1011*8975f5c5SAndroid Build Coastguard Worker template <>
PackParameter(ParamBuffer & params,const Token & token,const TraceStringMap & strings)1012*8975f5c5SAndroid Build Coastguard Worker void PackParameter<unsigned long>(ParamBuffer ¶ms,
1013*8975f5c5SAndroid Build Coastguard Worker const Token &token,
1014*8975f5c5SAndroid Build Coastguard Worker const TraceStringMap &strings)
1015*8975f5c5SAndroid Build Coastguard Worker {
1016*8975f5c5SAndroid Build Coastguard Worker PackIntParameter<uint64_t>(params, ParamType::TGLuint64, token);
1017*8975f5c5SAndroid Build Coastguard Worker }
1018*8975f5c5SAndroid Build Coastguard Worker #endif // defined(ANGLE_PLATFORM_APPLE) || !defined(ANGLE_IS_64_BIT_CPU)
1019*8975f5c5SAndroid Build Coastguard Worker
GetResourceIDMapValue(ResourceIDType resourceIDType,GLuint key)1020*8975f5c5SAndroid Build Coastguard Worker GLuint GetResourceIDMapValue(ResourceIDType resourceIDType, GLuint key)
1021*8975f5c5SAndroid Build Coastguard Worker {
1022*8975f5c5SAndroid Build Coastguard Worker switch (resourceIDType)
1023*8975f5c5SAndroid Build Coastguard Worker {
1024*8975f5c5SAndroid Build Coastguard Worker case ResourceIDType::Buffer:
1025*8975f5c5SAndroid Build Coastguard Worker return gBufferMap[key];
1026*8975f5c5SAndroid Build Coastguard Worker case ResourceIDType::FenceNV:
1027*8975f5c5SAndroid Build Coastguard Worker return gFenceNVMap[key];
1028*8975f5c5SAndroid Build Coastguard Worker case ResourceIDType::Framebuffer:
1029*8975f5c5SAndroid Build Coastguard Worker return gFramebufferMap[key];
1030*8975f5c5SAndroid Build Coastguard Worker case ResourceIDType::ProgramPipeline:
1031*8975f5c5SAndroid Build Coastguard Worker return gProgramPipelineMap[key];
1032*8975f5c5SAndroid Build Coastguard Worker case ResourceIDType::Query:
1033*8975f5c5SAndroid Build Coastguard Worker return gQueryMap[key];
1034*8975f5c5SAndroid Build Coastguard Worker case ResourceIDType::Renderbuffer:
1035*8975f5c5SAndroid Build Coastguard Worker return gRenderbufferMap[key];
1036*8975f5c5SAndroid Build Coastguard Worker case ResourceIDType::Sampler:
1037*8975f5c5SAndroid Build Coastguard Worker return gSamplerMap[key];
1038*8975f5c5SAndroid Build Coastguard Worker case ResourceIDType::Semaphore:
1039*8975f5c5SAndroid Build Coastguard Worker return gSemaphoreMap[key];
1040*8975f5c5SAndroid Build Coastguard Worker case ResourceIDType::ShaderProgram:
1041*8975f5c5SAndroid Build Coastguard Worker return gShaderProgramMap[key];
1042*8975f5c5SAndroid Build Coastguard Worker case ResourceIDType::Texture:
1043*8975f5c5SAndroid Build Coastguard Worker return gTextureMap[key];
1044*8975f5c5SAndroid Build Coastguard Worker case ResourceIDType::TransformFeedback:
1045*8975f5c5SAndroid Build Coastguard Worker return gTransformFeedbackMap[key];
1046*8975f5c5SAndroid Build Coastguard Worker case ResourceIDType::VertexArray:
1047*8975f5c5SAndroid Build Coastguard Worker return gVertexArrayMap[key];
1048*8975f5c5SAndroid Build Coastguard Worker default:
1049*8975f5c5SAndroid Build Coastguard Worker printf("Incompatible resource ID type: %d\n", static_cast<int>(resourceIDType));
1050*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
1051*8975f5c5SAndroid Build Coastguard Worker return 0;
1052*8975f5c5SAndroid Build Coastguard Worker }
1053*8975f5c5SAndroid Build Coastguard Worker }
1054*8975f5c5SAndroid Build Coastguard Worker
1055*8975f5c5SAndroid Build Coastguard Worker } // namespace angle
1056*8975f5c5SAndroid Build Coastguard Worker
1057*8975f5c5SAndroid Build Coastguard Worker extern "C" {
SetupReplay()1058*8975f5c5SAndroid Build Coastguard Worker void SetupReplay()
1059*8975f5c5SAndroid Build Coastguard Worker {
1060*8975f5c5SAndroid Build Coastguard Worker angle::GetInterpreter().setupReplay();
1061*8975f5c5SAndroid Build Coastguard Worker }
1062*8975f5c5SAndroid Build Coastguard Worker
ReplayFrame(uint32_t frameIndex)1063*8975f5c5SAndroid Build Coastguard Worker void ReplayFrame(uint32_t frameIndex)
1064*8975f5c5SAndroid Build Coastguard Worker {
1065*8975f5c5SAndroid Build Coastguard Worker angle::GetInterpreter().replayFrame(frameIndex);
1066*8975f5c5SAndroid Build Coastguard Worker }
1067*8975f5c5SAndroid Build Coastguard Worker
ResetReplay()1068*8975f5c5SAndroid Build Coastguard Worker void ResetReplay()
1069*8975f5c5SAndroid Build Coastguard Worker {
1070*8975f5c5SAndroid Build Coastguard Worker angle::GetInterpreter().resetReplay();
1071*8975f5c5SAndroid Build Coastguard Worker }
1072*8975f5c5SAndroid Build Coastguard Worker
GetSerializedContextState(uint32_t frameIndex)1073*8975f5c5SAndroid Build Coastguard Worker const char *GetSerializedContextState(uint32_t frameIndex)
1074*8975f5c5SAndroid Build Coastguard Worker {
1075*8975f5c5SAndroid Build Coastguard Worker return angle::GetInterpreter().getSerializedContextState(frameIndex);
1076*8975f5c5SAndroid Build Coastguard Worker }
1077*8975f5c5SAndroid Build Coastguard Worker } // extern "C"
1078