xref: /aosp_15_r20/external/angle/util/capture/trace_interpreter.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 &params, 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 &params, 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 &params, 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 &params, 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 &params, 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 &params, 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 &params, 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 &params, 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 &params,
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 &params, 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 &params,
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 &params, 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 &params, 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 &params,
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 &params,
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 &params,
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 &params,
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 &params,
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 &params,
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 &params,
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 &params, 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 &params, 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 &params, 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 &params,
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 &params, 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 &params,
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 &params,
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 &params,
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 &params,
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 &params,
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 &params,
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 &params,
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 &params, 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 &params,
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 &params, 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 &params,
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 &params,
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 &params,
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 &params,
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 &params,
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 &params,
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 &params,
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 &params,
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 &params,
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 &params, 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 &params, 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 &params,
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