xref: /aosp_15_r20/external/angle/util/capture/trace_fixture.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 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_fixture.cpp:
7*8975f5c5SAndroid Build Coastguard Worker //   Common code for the ANGLE trace replays.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "trace_fixture.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "angle_trace_gl.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include <string>
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker namespace
17*8975f5c5SAndroid Build Coastguard Worker {
UpdateResourceMap(GLuint * resourceMap,GLuint id,GLsizei readBufferOffset)18*8975f5c5SAndroid Build Coastguard Worker void UpdateResourceMap(GLuint *resourceMap, GLuint id, GLsizei readBufferOffset)
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker     GLuint returnedID;
21*8975f5c5SAndroid Build Coastguard Worker     memcpy(&returnedID, &gReadBuffer[readBufferOffset], sizeof(GLuint));
22*8975f5c5SAndroid Build Coastguard Worker     resourceMap[id] = returnedID;
23*8975f5c5SAndroid Build Coastguard Worker }
24*8975f5c5SAndroid Build Coastguard Worker 
UpdateResourceMapPerContext(GLuint ** resourceArray,GLuint contextId,GLuint id,GLsizei readBufferOffset)25*8975f5c5SAndroid Build Coastguard Worker void UpdateResourceMapPerContext(GLuint **resourceArray,
26*8975f5c5SAndroid Build Coastguard Worker                                  GLuint contextId,
27*8975f5c5SAndroid Build Coastguard Worker                                  GLuint id,
28*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei readBufferOffset)
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker     GLuint returnedID;
31*8975f5c5SAndroid Build Coastguard Worker     memcpy(&returnedID, &gReadBuffer[readBufferOffset], sizeof(GLuint));
32*8975f5c5SAndroid Build Coastguard Worker     resourceArray[contextId][id] = returnedID;
33*8975f5c5SAndroid Build Coastguard Worker }
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker uint32_t gMaxContexts                  = 0;
36*8975f5c5SAndroid Build Coastguard Worker angle::TraceCallbacks *gTraceCallbacks = nullptr;
37*8975f5c5SAndroid Build Coastguard Worker 
GetClientBuffer(EGLenum target,uintptr_t key)38*8975f5c5SAndroid Build Coastguard Worker EGLClientBuffer GetClientBuffer(EGLenum target, uintptr_t key)
39*8975f5c5SAndroid Build Coastguard Worker {
40*8975f5c5SAndroid Build Coastguard Worker     switch (target)
41*8975f5c5SAndroid Build Coastguard Worker     {
42*8975f5c5SAndroid Build Coastguard Worker         case EGL_GL_TEXTURE_2D:
43*8975f5c5SAndroid Build Coastguard Worker         case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X:
44*8975f5c5SAndroid Build Coastguard Worker         case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
45*8975f5c5SAndroid Build Coastguard Worker         case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
46*8975f5c5SAndroid Build Coastguard Worker         case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
47*8975f5c5SAndroid Build Coastguard Worker         case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
48*8975f5c5SAndroid Build Coastguard Worker         case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
49*8975f5c5SAndroid Build Coastguard Worker         case EGL_GL_TEXTURE_3D:
50*8975f5c5SAndroid Build Coastguard Worker         {
51*8975f5c5SAndroid Build Coastguard Worker             uintptr_t id = static_cast<uintptr_t>(gTextureMap[key]);
52*8975f5c5SAndroid Build Coastguard Worker             return reinterpret_cast<EGLClientBuffer>(id);
53*8975f5c5SAndroid Build Coastguard Worker         }
54*8975f5c5SAndroid Build Coastguard Worker         case EGL_GL_RENDERBUFFER:
55*8975f5c5SAndroid Build Coastguard Worker         {
56*8975f5c5SAndroid Build Coastguard Worker             uintptr_t id = static_cast<uintptr_t>(gRenderbufferMap[key]);
57*8975f5c5SAndroid Build Coastguard Worker             return reinterpret_cast<EGLClientBuffer>(id);
58*8975f5c5SAndroid Build Coastguard Worker         }
59*8975f5c5SAndroid Build Coastguard Worker         default:
60*8975f5c5SAndroid Build Coastguard Worker         {
61*8975f5c5SAndroid Build Coastguard Worker             const auto &iData = gClientBufferMap.find(key);
62*8975f5c5SAndroid Build Coastguard Worker             return iData != gClientBufferMap.end() ? iData->second : nullptr;
63*8975f5c5SAndroid Build Coastguard Worker         }
64*8975f5c5SAndroid Build Coastguard Worker     }
65*8975f5c5SAndroid Build Coastguard Worker }
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker ValidateSerializedStateCallback gValidateSerializedStateCallback;
68*8975f5c5SAndroid Build Coastguard Worker std::unordered_map<GLuint, std::vector<GLint>> gInternalUniformLocationsMap;
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kMaxClientArrays = 16;
71*8975f5c5SAndroid Build Coastguard Worker }  // namespace
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker GLint **gUniformLocations;
74*8975f5c5SAndroid Build Coastguard Worker GLuint gCurrentProgram = 0;
75*8975f5c5SAndroid Build Coastguard Worker 
76*8975f5c5SAndroid Build Coastguard Worker // TODO(jmadill): Hide from the traces. http://anglebug.com/42266223
77*8975f5c5SAndroid Build Coastguard Worker BlockIndexesMap gUniformBlockIndexes;
78*8975f5c5SAndroid Build Coastguard Worker 
UpdateUniformLocation(GLuint program,const char * name,GLint location,GLint count)79*8975f5c5SAndroid Build Coastguard Worker void UpdateUniformLocation(GLuint program, const char *name, GLint location, GLint count)
80*8975f5c5SAndroid Build Coastguard Worker {
81*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLint> &programLocations = gInternalUniformLocationsMap[program];
82*8975f5c5SAndroid Build Coastguard Worker     if (static_cast<GLint>(programLocations.size()) < location + count)
83*8975f5c5SAndroid Build Coastguard Worker     {
84*8975f5c5SAndroid Build Coastguard Worker         programLocations.resize(location + count, 0);
85*8975f5c5SAndroid Build Coastguard Worker     }
86*8975f5c5SAndroid Build Coastguard Worker     GLuint mappedProgramID = gShaderProgramMap[program];
87*8975f5c5SAndroid Build Coastguard Worker     for (GLint arrayIndex = 0; arrayIndex < count; ++arrayIndex)
88*8975f5c5SAndroid Build Coastguard Worker     {
89*8975f5c5SAndroid Build Coastguard Worker         programLocations[location + arrayIndex] =
90*8975f5c5SAndroid Build Coastguard Worker             glGetUniformLocation(mappedProgramID, name) + arrayIndex;
91*8975f5c5SAndroid Build Coastguard Worker     }
92*8975f5c5SAndroid Build Coastguard Worker     gUniformLocations[program] = programLocations.data();
93*8975f5c5SAndroid Build Coastguard Worker }
94*8975f5c5SAndroid Build Coastguard Worker 
DeleteUniformLocations(GLuint program)95*8975f5c5SAndroid Build Coastguard Worker void DeleteUniformLocations(GLuint program)
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker     // No-op. We leave uniform locations around so deleted current programs can still use them.
98*8975f5c5SAndroid Build Coastguard Worker }
99*8975f5c5SAndroid Build Coastguard Worker 
UpdateUniformBlockIndex(GLuint program,const char * name,GLuint index)100*8975f5c5SAndroid Build Coastguard Worker void UpdateUniformBlockIndex(GLuint program, const char *name, GLuint index)
101*8975f5c5SAndroid Build Coastguard Worker {
102*8975f5c5SAndroid Build Coastguard Worker     gUniformBlockIndexes[program][index] = glGetUniformBlockIndex(program, name);
103*8975f5c5SAndroid Build Coastguard Worker }
104*8975f5c5SAndroid Build Coastguard Worker 
UniformBlockBinding(GLuint program,GLuint uniformblockIndex,GLuint binding)105*8975f5c5SAndroid Build Coastguard Worker void UniformBlockBinding(GLuint program, GLuint uniformblockIndex, GLuint binding)
106*8975f5c5SAndroid Build Coastguard Worker {
107*8975f5c5SAndroid Build Coastguard Worker     glUniformBlockBinding(gShaderProgramMap[program],
108*8975f5c5SAndroid Build Coastguard Worker                           gUniformBlockIndexes[gShaderProgramMap[program]][uniformblockIndex],
109*8975f5c5SAndroid Build Coastguard Worker                           binding);
110*8975f5c5SAndroid Build Coastguard Worker }
111*8975f5c5SAndroid Build Coastguard Worker 
UpdateCurrentProgram(GLuint program)112*8975f5c5SAndroid Build Coastguard Worker void UpdateCurrentProgram(GLuint program)
113*8975f5c5SAndroid Build Coastguard Worker {
114*8975f5c5SAndroid Build Coastguard Worker     gCurrentProgram = program;
115*8975f5c5SAndroid Build Coastguard Worker }
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker uint8_t *gBinaryData;
118*8975f5c5SAndroid Build Coastguard Worker uint8_t *gReadBuffer;
119*8975f5c5SAndroid Build Coastguard Worker uint8_t *gClientArrays[kMaxClientArrays];
120*8975f5c5SAndroid Build Coastguard Worker GLuint *gResourceIDBuffer;
121*8975f5c5SAndroid Build Coastguard Worker SyncResourceMap gSyncMap;
122*8975f5c5SAndroid Build Coastguard Worker ContextMap gContextMap;
123*8975f5c5SAndroid Build Coastguard Worker GLuint gShareContextId;
124*8975f5c5SAndroid Build Coastguard Worker GLuint *gBufferMap;
125*8975f5c5SAndroid Build Coastguard Worker GLuint *gFenceNVMap;
126*8975f5c5SAndroid Build Coastguard Worker GLuint *gFramebufferMap;
127*8975f5c5SAndroid Build Coastguard Worker GLuint **gFramebufferMapPerContext;
128*8975f5c5SAndroid Build Coastguard Worker GLuint *gMemoryObjectMap;
129*8975f5c5SAndroid Build Coastguard Worker GLuint *gProgramPipelineMap;
130*8975f5c5SAndroid Build Coastguard Worker GLuint *gQueryMap;
131*8975f5c5SAndroid Build Coastguard Worker GLuint *gRenderbufferMap;
132*8975f5c5SAndroid Build Coastguard Worker GLuint *gSamplerMap;
133*8975f5c5SAndroid Build Coastguard Worker GLuint *gSemaphoreMap;
134*8975f5c5SAndroid Build Coastguard Worker GLuint *gShaderProgramMap;
135*8975f5c5SAndroid Build Coastguard Worker GLuint *gTextureMap;
136*8975f5c5SAndroid Build Coastguard Worker GLuint *gTransformFeedbackMap;
137*8975f5c5SAndroid Build Coastguard Worker GLuint *gVertexArrayMap;
138*8975f5c5SAndroid Build Coastguard Worker 
139*8975f5c5SAndroid Build Coastguard Worker // TODO(jmadill): Consolidate. http://anglebug.com/42266223
140*8975f5c5SAndroid Build Coastguard Worker ClientBufferMap gClientBufferMap;
141*8975f5c5SAndroid Build Coastguard Worker EGLImageMap gEGLImageMap;
142*8975f5c5SAndroid Build Coastguard Worker SurfaceMap gSurfaceMap;
143*8975f5c5SAndroid Build Coastguard Worker 
144*8975f5c5SAndroid Build Coastguard Worker GLeglImageOES *gEGLImageMap2;
145*8975f5c5SAndroid Build Coastguard Worker GLuint *gEGLImageMap2Resources;
146*8975f5c5SAndroid Build Coastguard Worker EGLSurface *gSurfaceMap2;
147*8975f5c5SAndroid Build Coastguard Worker EGLContext *gContextMap2;
148*8975f5c5SAndroid Build Coastguard Worker GLsync *gSyncMap2;
149*8975f5c5SAndroid Build Coastguard Worker EGLSync *gEGLSyncMap;
150*8975f5c5SAndroid Build Coastguard Worker EGLDisplay gEGLDisplay;
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker std::string gBinaryDataDir = ".";
153*8975f5c5SAndroid Build Coastguard Worker 
154*8975f5c5SAndroid Build Coastguard Worker angle::ReplayResourceMode gReplayResourceMode = angle::ReplayResourceMode::Active;
155*8975f5c5SAndroid Build Coastguard Worker 
156*8975f5c5SAndroid Build Coastguard Worker template <typename T>
AllocateZeroedValues(size_t count)157*8975f5c5SAndroid Build Coastguard Worker T *AllocateZeroedValues(size_t count)
158*8975f5c5SAndroid Build Coastguard Worker {
159*8975f5c5SAndroid Build Coastguard Worker     T *mem = new T[count + 1];
160*8975f5c5SAndroid Build Coastguard Worker     memset(mem, 0, sizeof(T) * (count + 1));
161*8975f5c5SAndroid Build Coastguard Worker     return mem;
162*8975f5c5SAndroid Build Coastguard Worker }
163*8975f5c5SAndroid Build Coastguard Worker 
AllocateZeroedUints(size_t count)164*8975f5c5SAndroid Build Coastguard Worker GLuint *AllocateZeroedUints(size_t count)
165*8975f5c5SAndroid Build Coastguard Worker {
166*8975f5c5SAndroid Build Coastguard Worker     return AllocateZeroedValues<GLuint>(count);
167*8975f5c5SAndroid Build Coastguard Worker }
168*8975f5c5SAndroid Build Coastguard Worker 
InitializeReplay4(const char * binaryDataFileName,size_t maxClientArraySize,size_t readBufferSize,size_t resourceIDBufferSize,GLuint contextId,uint32_t maxBuffer,uint32_t maxContext,uint32_t maxFenceNV,uint32_t maxFramebuffer,uint32_t maxImage,uint32_t maxMemoryObject,uint32_t maxProgramPipeline,uint32_t maxQuery,uint32_t maxRenderbuffer,uint32_t maxSampler,uint32_t maxSemaphore,uint32_t maxShaderProgram,uint32_t maxSurface,uint32_t maxSync,uint32_t maxTexture,uint32_t maxTransformFeedback,uint32_t maxVertexArray,GLuint maxEGLSyncID)169*8975f5c5SAndroid Build Coastguard Worker void InitializeReplay4(const char *binaryDataFileName,
170*8975f5c5SAndroid Build Coastguard Worker                        size_t maxClientArraySize,
171*8975f5c5SAndroid Build Coastguard Worker                        size_t readBufferSize,
172*8975f5c5SAndroid Build Coastguard Worker                        size_t resourceIDBufferSize,
173*8975f5c5SAndroid Build Coastguard Worker                        GLuint contextId,
174*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxBuffer,
175*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxContext,
176*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxFenceNV,
177*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxFramebuffer,
178*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxImage,
179*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxMemoryObject,
180*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxProgramPipeline,
181*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxQuery,
182*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxRenderbuffer,
183*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxSampler,
184*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxSemaphore,
185*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxShaderProgram,
186*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxSurface,
187*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxSync,
188*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxTexture,
189*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxTransformFeedback,
190*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxVertexArray,
191*8975f5c5SAndroid Build Coastguard Worker                        GLuint maxEGLSyncID)
192*8975f5c5SAndroid Build Coastguard Worker {
193*8975f5c5SAndroid Build Coastguard Worker     InitializeReplay3(binaryDataFileName, maxClientArraySize, readBufferSize, resourceIDBufferSize,
194*8975f5c5SAndroid Build Coastguard Worker                       contextId, maxBuffer, maxContext, maxFenceNV, maxFramebuffer, maxImage,
195*8975f5c5SAndroid Build Coastguard Worker                       maxMemoryObject, maxProgramPipeline, maxQuery, maxRenderbuffer, maxSampler,
196*8975f5c5SAndroid Build Coastguard Worker                       maxSemaphore, maxShaderProgram, maxSurface, maxSync, maxTexture,
197*8975f5c5SAndroid Build Coastguard Worker                       maxTransformFeedback, maxVertexArray);
198*8975f5c5SAndroid Build Coastguard Worker     gEGLSyncMap = AllocateZeroedValues<EGLSync>(maxEGLSyncID);
199*8975f5c5SAndroid Build Coastguard Worker     gEGLDisplay = eglGetCurrentDisplay();
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker     gMaxContexts              = maxContext + 1;
202*8975f5c5SAndroid Build Coastguard Worker     gFramebufferMapPerContext = new GLuint *[gMaxContexts];
203*8975f5c5SAndroid Build Coastguard Worker     memset(gFramebufferMapPerContext, 0, sizeof(GLuint *) * (gMaxContexts));
204*8975f5c5SAndroid Build Coastguard Worker     for (uint8_t i = 0; i < gMaxContexts; i++)
205*8975f5c5SAndroid Build Coastguard Worker     {
206*8975f5c5SAndroid Build Coastguard Worker         gFramebufferMapPerContext[i] = AllocateZeroedValues<GLuint>(maxFramebuffer);
207*8975f5c5SAndroid Build Coastguard Worker     }
208*8975f5c5SAndroid Build Coastguard Worker }
209*8975f5c5SAndroid Build Coastguard Worker 
InitializeReplay3(const char * binaryDataFileName,size_t maxClientArraySize,size_t readBufferSize,size_t resourceIDBufferSize,GLuint contextId,uint32_t maxBuffer,uint32_t maxContext,uint32_t maxFenceNV,uint32_t maxFramebuffer,uint32_t maxImage,uint32_t maxMemoryObject,uint32_t maxProgramPipeline,uint32_t maxQuery,uint32_t maxRenderbuffer,uint32_t maxSampler,uint32_t maxSemaphore,uint32_t maxShaderProgram,uint32_t maxSurface,uint32_t maxSync,uint32_t maxTexture,uint32_t maxTransformFeedback,uint32_t maxVertexArray)210*8975f5c5SAndroid Build Coastguard Worker void InitializeReplay3(const char *binaryDataFileName,
211*8975f5c5SAndroid Build Coastguard Worker                        size_t maxClientArraySize,
212*8975f5c5SAndroid Build Coastguard Worker                        size_t readBufferSize,
213*8975f5c5SAndroid Build Coastguard Worker                        size_t resourceIDBufferSize,
214*8975f5c5SAndroid Build Coastguard Worker                        GLuint contextId,
215*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxBuffer,
216*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxContext,
217*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxFenceNV,
218*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxFramebuffer,
219*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxImage,
220*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxMemoryObject,
221*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxProgramPipeline,
222*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxQuery,
223*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxRenderbuffer,
224*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxSampler,
225*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxSemaphore,
226*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxShaderProgram,
227*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxSurface,
228*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxSync,
229*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxTexture,
230*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxTransformFeedback,
231*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxVertexArray)
232*8975f5c5SAndroid Build Coastguard Worker {
233*8975f5c5SAndroid Build Coastguard Worker     InitializeReplay2(binaryDataFileName, maxClientArraySize, readBufferSize, contextId, maxBuffer,
234*8975f5c5SAndroid Build Coastguard Worker                       maxContext, maxFenceNV, maxFramebuffer, maxImage, maxMemoryObject,
235*8975f5c5SAndroid Build Coastguard Worker                       maxProgramPipeline, maxQuery, maxRenderbuffer, maxSampler, maxSemaphore,
236*8975f5c5SAndroid Build Coastguard Worker                       maxShaderProgram, maxSurface, maxTexture, maxTransformFeedback,
237*8975f5c5SAndroid Build Coastguard Worker                       maxVertexArray);
238*8975f5c5SAndroid Build Coastguard Worker 
239*8975f5c5SAndroid Build Coastguard Worker     gSyncMap2         = AllocateZeroedValues<GLsync>(maxSync);
240*8975f5c5SAndroid Build Coastguard Worker     gResourceIDBuffer = AllocateZeroedUints(resourceIDBufferSize);
241*8975f5c5SAndroid Build Coastguard Worker }
242*8975f5c5SAndroid Build Coastguard Worker 
InitializeReplay2(const char * binaryDataFileName,size_t maxClientArraySize,size_t readBufferSize,GLuint contextId,uint32_t maxBuffer,uint32_t maxContext,uint32_t maxFenceNV,uint32_t maxFramebuffer,uint32_t maxImage,uint32_t maxMemoryObject,uint32_t maxProgramPipeline,uint32_t maxQuery,uint32_t maxRenderbuffer,uint32_t maxSampler,uint32_t maxSemaphore,uint32_t maxShaderProgram,uint32_t maxSurface,uint32_t maxTexture,uint32_t maxTransformFeedback,uint32_t maxVertexArray)243*8975f5c5SAndroid Build Coastguard Worker void InitializeReplay2(const char *binaryDataFileName,
244*8975f5c5SAndroid Build Coastguard Worker                        size_t maxClientArraySize,
245*8975f5c5SAndroid Build Coastguard Worker                        size_t readBufferSize,
246*8975f5c5SAndroid Build Coastguard Worker                        GLuint contextId,
247*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxBuffer,
248*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxContext,
249*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxFenceNV,
250*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxFramebuffer,
251*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxImage,
252*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxMemoryObject,
253*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxProgramPipeline,
254*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxQuery,
255*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxRenderbuffer,
256*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxSampler,
257*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxSemaphore,
258*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxShaderProgram,
259*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxSurface,
260*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxTexture,
261*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxTransformFeedback,
262*8975f5c5SAndroid Build Coastguard Worker                        uint32_t maxVertexArray)
263*8975f5c5SAndroid Build Coastguard Worker {
264*8975f5c5SAndroid Build Coastguard Worker     InitializeReplay(binaryDataFileName, maxClientArraySize, readBufferSize, maxBuffer, maxFenceNV,
265*8975f5c5SAndroid Build Coastguard Worker                      maxFramebuffer, maxMemoryObject, maxProgramPipeline, maxQuery, maxRenderbuffer,
266*8975f5c5SAndroid Build Coastguard Worker                      maxSampler, maxSemaphore, maxShaderProgram, maxTexture, maxTransformFeedback,
267*8975f5c5SAndroid Build Coastguard Worker                      maxVertexArray);
268*8975f5c5SAndroid Build Coastguard Worker 
269*8975f5c5SAndroid Build Coastguard Worker     gContextMap2           = AllocateZeroedValues<EGLContext>(maxContext);
270*8975f5c5SAndroid Build Coastguard Worker     gEGLImageMap2          = AllocateZeroedValues<EGLImage>(maxImage);
271*8975f5c5SAndroid Build Coastguard Worker     gEGLImageMap2Resources = AllocateZeroedValues<GLuint>(maxImage);
272*8975f5c5SAndroid Build Coastguard Worker     gSurfaceMap2           = AllocateZeroedValues<EGLSurface>(maxSurface);
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker     gContextMap2[0]         = EGL_NO_CONTEXT;
275*8975f5c5SAndroid Build Coastguard Worker     gShareContextId         = contextId;
276*8975f5c5SAndroid Build Coastguard Worker     gContextMap2[contextId] = eglGetCurrentContext();
277*8975f5c5SAndroid Build Coastguard Worker }
278*8975f5c5SAndroid Build Coastguard Worker 
InitializeReplay(const char * binaryDataFileName,size_t maxClientArraySize,size_t readBufferSize,uint32_t maxBuffer,uint32_t maxFenceNV,uint32_t maxFramebuffer,uint32_t maxMemoryObject,uint32_t maxProgramPipeline,uint32_t maxQuery,uint32_t maxRenderbuffer,uint32_t maxSampler,uint32_t maxSemaphore,uint32_t maxShaderProgram,uint32_t maxTexture,uint32_t maxTransformFeedback,uint32_t maxVertexArray)279*8975f5c5SAndroid Build Coastguard Worker void InitializeReplay(const char *binaryDataFileName,
280*8975f5c5SAndroid Build Coastguard Worker                       size_t maxClientArraySize,
281*8975f5c5SAndroid Build Coastguard Worker                       size_t readBufferSize,
282*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxBuffer,
283*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxFenceNV,
284*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxFramebuffer,
285*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxMemoryObject,
286*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxProgramPipeline,
287*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxQuery,
288*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxRenderbuffer,
289*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxSampler,
290*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxSemaphore,
291*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxShaderProgram,
292*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxTexture,
293*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxTransformFeedback,
294*8975f5c5SAndroid Build Coastguard Worker                       uint32_t maxVertexArray)
295*8975f5c5SAndroid Build Coastguard Worker {
296*8975f5c5SAndroid Build Coastguard Worker     gBinaryData = gTraceCallbacks->LoadBinaryData(binaryDataFileName);
297*8975f5c5SAndroid Build Coastguard Worker 
298*8975f5c5SAndroid Build Coastguard Worker     for (uint8_t *&clientArray : gClientArrays)
299*8975f5c5SAndroid Build Coastguard Worker     {
300*8975f5c5SAndroid Build Coastguard Worker         clientArray = new uint8_t[maxClientArraySize];
301*8975f5c5SAndroid Build Coastguard Worker     }
302*8975f5c5SAndroid Build Coastguard Worker 
303*8975f5c5SAndroid Build Coastguard Worker     gReadBuffer = new uint8_t[readBufferSize];
304*8975f5c5SAndroid Build Coastguard Worker 
305*8975f5c5SAndroid Build Coastguard Worker     gBufferMap            = AllocateZeroedUints(maxBuffer);
306*8975f5c5SAndroid Build Coastguard Worker     gFenceNVMap           = AllocateZeroedUints(maxFenceNV);
307*8975f5c5SAndroid Build Coastguard Worker     gFramebufferMap       = AllocateZeroedUints(maxFramebuffer);
308*8975f5c5SAndroid Build Coastguard Worker     gMemoryObjectMap      = AllocateZeroedUints(maxMemoryObject);
309*8975f5c5SAndroid Build Coastguard Worker     gProgramPipelineMap   = AllocateZeroedUints(maxProgramPipeline);
310*8975f5c5SAndroid Build Coastguard Worker     gQueryMap             = AllocateZeroedUints(maxQuery);
311*8975f5c5SAndroid Build Coastguard Worker     gRenderbufferMap      = AllocateZeroedUints(maxRenderbuffer);
312*8975f5c5SAndroid Build Coastguard Worker     gSamplerMap           = AllocateZeroedUints(maxSampler);
313*8975f5c5SAndroid Build Coastguard Worker     gSemaphoreMap         = AllocateZeroedUints(maxSemaphore);
314*8975f5c5SAndroid Build Coastguard Worker     gShaderProgramMap     = AllocateZeroedUints(maxShaderProgram);
315*8975f5c5SAndroid Build Coastguard Worker     gTextureMap           = AllocateZeroedUints(maxTexture);
316*8975f5c5SAndroid Build Coastguard Worker     gTransformFeedbackMap = AllocateZeroedUints(maxTransformFeedback);
317*8975f5c5SAndroid Build Coastguard Worker     gVertexArrayMap       = AllocateZeroedUints(maxVertexArray);
318*8975f5c5SAndroid Build Coastguard Worker 
319*8975f5c5SAndroid Build Coastguard Worker     gUniformLocations = new GLint *[maxShaderProgram + 1];
320*8975f5c5SAndroid Build Coastguard Worker     memset(gUniformLocations, 0, sizeof(GLint *) * (maxShaderProgram + 1));
321*8975f5c5SAndroid Build Coastguard Worker 
322*8975f5c5SAndroid Build Coastguard Worker     gContextMap[0] = EGL_NO_CONTEXT;
323*8975f5c5SAndroid Build Coastguard Worker }
324*8975f5c5SAndroid Build Coastguard Worker 
FinishReplay()325*8975f5c5SAndroid Build Coastguard Worker void FinishReplay()
326*8975f5c5SAndroid Build Coastguard Worker {
327*8975f5c5SAndroid Build Coastguard Worker     for (uint8_t *&clientArray : gClientArrays)
328*8975f5c5SAndroid Build Coastguard Worker     {
329*8975f5c5SAndroid Build Coastguard Worker         delete[] clientArray;
330*8975f5c5SAndroid Build Coastguard Worker     }
331*8975f5c5SAndroid Build Coastguard Worker     delete[] gReadBuffer;
332*8975f5c5SAndroid Build Coastguard Worker     delete[] gResourceIDBuffer;
333*8975f5c5SAndroid Build Coastguard Worker     delete[] gBufferMap;
334*8975f5c5SAndroid Build Coastguard Worker     delete[] gContextMap2;
335*8975f5c5SAndroid Build Coastguard Worker     delete[] gEGLImageMap2;
336*8975f5c5SAndroid Build Coastguard Worker     delete[] gEGLSyncMap;
337*8975f5c5SAndroid Build Coastguard Worker     delete[] gRenderbufferMap;
338*8975f5c5SAndroid Build Coastguard Worker     delete[] gTextureMap;
339*8975f5c5SAndroid Build Coastguard Worker     delete[] gFramebufferMap;
340*8975f5c5SAndroid Build Coastguard Worker     delete[] gShaderProgramMap;
341*8975f5c5SAndroid Build Coastguard Worker     delete[] gFenceNVMap;
342*8975f5c5SAndroid Build Coastguard Worker     delete[] gMemoryObjectMap;
343*8975f5c5SAndroid Build Coastguard Worker     delete[] gProgramPipelineMap;
344*8975f5c5SAndroid Build Coastguard Worker     delete[] gQueryMap;
345*8975f5c5SAndroid Build Coastguard Worker     delete[] gSamplerMap;
346*8975f5c5SAndroid Build Coastguard Worker     delete[] gSemaphoreMap;
347*8975f5c5SAndroid Build Coastguard Worker     delete[] gSurfaceMap2;
348*8975f5c5SAndroid Build Coastguard Worker     delete[] gSyncMap2;
349*8975f5c5SAndroid Build Coastguard Worker     delete[] gTransformFeedbackMap;
350*8975f5c5SAndroid Build Coastguard Worker     delete[] gVertexArrayMap;
351*8975f5c5SAndroid Build Coastguard Worker 
352*8975f5c5SAndroid Build Coastguard Worker     for (uint8_t i = 0; i < gMaxContexts; i++)
353*8975f5c5SAndroid Build Coastguard Worker     {
354*8975f5c5SAndroid Build Coastguard Worker         delete[] gFramebufferMapPerContext[i];
355*8975f5c5SAndroid Build Coastguard Worker     }
356*8975f5c5SAndroid Build Coastguard Worker     delete[] gFramebufferMapPerContext;
357*8975f5c5SAndroid Build Coastguard Worker }
358*8975f5c5SAndroid Build Coastguard Worker 
SetValidateSerializedStateCallback(ValidateSerializedStateCallback callback)359*8975f5c5SAndroid Build Coastguard Worker void SetValidateSerializedStateCallback(ValidateSerializedStateCallback callback)
360*8975f5c5SAndroid Build Coastguard Worker {
361*8975f5c5SAndroid Build Coastguard Worker     gValidateSerializedStateCallback = callback;
362*8975f5c5SAndroid Build Coastguard Worker }
363*8975f5c5SAndroid Build Coastguard Worker 
364*8975f5c5SAndroid Build Coastguard Worker angle::TraceInfo gTraceInfo;
365*8975f5c5SAndroid Build Coastguard Worker std::string gTraceGzPath;
366*8975f5c5SAndroid Build Coastguard Worker 
367*8975f5c5SAndroid Build Coastguard Worker struct TraceFunctionsImpl : angle::TraceFunctions
368*8975f5c5SAndroid Build Coastguard Worker {
SetupReplayTraceFunctionsImpl369*8975f5c5SAndroid Build Coastguard Worker     void SetupReplay() override { ::SetupReplay(); }
370*8975f5c5SAndroid Build Coastguard Worker 
ReplayFrameTraceFunctionsImpl371*8975f5c5SAndroid Build Coastguard Worker     void ReplayFrame(uint32_t frameIndex) override { ::ReplayFrame(frameIndex); }
372*8975f5c5SAndroid Build Coastguard Worker 
ResetReplayTraceFunctionsImpl373*8975f5c5SAndroid Build Coastguard Worker     void ResetReplay() override { ::ResetReplay(); }
374*8975f5c5SAndroid Build Coastguard Worker 
FinishReplayTraceFunctionsImpl375*8975f5c5SAndroid Build Coastguard Worker     void FinishReplay() override { ::FinishReplay(); }
376*8975f5c5SAndroid Build Coastguard Worker 
SetBinaryDataDirTraceFunctionsImpl377*8975f5c5SAndroid Build Coastguard Worker     void SetBinaryDataDir(const char *dataDir) override { gBinaryDataDir = dataDir; }
378*8975f5c5SAndroid Build Coastguard Worker 
SetReplayResourceModeTraceFunctionsImpl379*8975f5c5SAndroid Build Coastguard Worker     void SetReplayResourceMode(const angle::ReplayResourceMode resourceMode) override
380*8975f5c5SAndroid Build Coastguard Worker     {
381*8975f5c5SAndroid Build Coastguard Worker         gReplayResourceMode = resourceMode;
382*8975f5c5SAndroid Build Coastguard Worker     }
383*8975f5c5SAndroid Build Coastguard Worker 
SetTraceInfoTraceFunctionsImpl384*8975f5c5SAndroid Build Coastguard Worker     void SetTraceInfo(const angle::TraceInfo &traceInfo) override { gTraceInfo = traceInfo; }
385*8975f5c5SAndroid Build Coastguard Worker 
SetTraceGzPathTraceFunctionsImpl386*8975f5c5SAndroid Build Coastguard Worker     void SetTraceGzPath(const std::string &traceGzPath) override { gTraceGzPath = traceGzPath; }
387*8975f5c5SAndroid Build Coastguard Worker };
388*8975f5c5SAndroid Build Coastguard Worker 
389*8975f5c5SAndroid Build Coastguard Worker TraceFunctionsImpl gTraceFunctionsImpl;
390*8975f5c5SAndroid Build Coastguard Worker 
SetupEntryPoints(angle::TraceCallbacks * traceCallbacks,angle::TraceFunctions ** traceFunctions)391*8975f5c5SAndroid Build Coastguard Worker void SetupEntryPoints(angle::TraceCallbacks *traceCallbacks, angle::TraceFunctions **traceFunctions)
392*8975f5c5SAndroid Build Coastguard Worker {
393*8975f5c5SAndroid Build Coastguard Worker     gTraceCallbacks = traceCallbacks;
394*8975f5c5SAndroid Build Coastguard Worker     *traceFunctions = &gTraceFunctionsImpl;
395*8975f5c5SAndroid Build Coastguard Worker }
396*8975f5c5SAndroid Build Coastguard Worker 
UpdateClientArrayPointer(int arrayIndex,const void * data,uint64_t size)397*8975f5c5SAndroid Build Coastguard Worker void UpdateClientArrayPointer(int arrayIndex, const void *data, uint64_t size)
398*8975f5c5SAndroid Build Coastguard Worker {
399*8975f5c5SAndroid Build Coastguard Worker     memcpy(gClientArrays[arrayIndex], data, static_cast<size_t>(size));
400*8975f5c5SAndroid Build Coastguard Worker }
401*8975f5c5SAndroid Build Coastguard Worker BufferHandleMap gMappedBufferData;
402*8975f5c5SAndroid Build Coastguard Worker 
UpdateClientBufferData(GLuint bufferID,const void * source,GLsizei size)403*8975f5c5SAndroid Build Coastguard Worker void UpdateClientBufferData(GLuint bufferID, const void *source, GLsizei size)
404*8975f5c5SAndroid Build Coastguard Worker {
405*8975f5c5SAndroid Build Coastguard Worker     memcpy(gMappedBufferData[gBufferMap[bufferID]], source, size);
406*8975f5c5SAndroid Build Coastguard Worker }
407*8975f5c5SAndroid Build Coastguard Worker 
UpdateClientBufferDataWithOffset(GLuint bufferID,const void * source,GLsizei size,GLsizei offset)408*8975f5c5SAndroid Build Coastguard Worker void UpdateClientBufferDataWithOffset(GLuint bufferID,
409*8975f5c5SAndroid Build Coastguard Worker                                       const void *source,
410*8975f5c5SAndroid Build Coastguard Worker                                       GLsizei size,
411*8975f5c5SAndroid Build Coastguard Worker                                       GLsizei offset)
412*8975f5c5SAndroid Build Coastguard Worker {
413*8975f5c5SAndroid Build Coastguard Worker     uintptr_t dest = reinterpret_cast<uintptr_t>(gMappedBufferData[gBufferMap[bufferID]]) + offset;
414*8975f5c5SAndroid Build Coastguard Worker     memcpy(reinterpret_cast<void *>(dest), source, size);
415*8975f5c5SAndroid Build Coastguard Worker }
416*8975f5c5SAndroid Build Coastguard Worker 
UpdateResourceIDBuffer(int resourceIndex,GLuint id)417*8975f5c5SAndroid Build Coastguard Worker void UpdateResourceIDBuffer(int resourceIndex, GLuint id)
418*8975f5c5SAndroid Build Coastguard Worker {
419*8975f5c5SAndroid Build Coastguard Worker     gResourceIDBuffer[resourceIndex] = id;
420*8975f5c5SAndroid Build Coastguard Worker }
421*8975f5c5SAndroid Build Coastguard Worker 
UpdateBufferID(GLuint id,GLsizei readBufferOffset)422*8975f5c5SAndroid Build Coastguard Worker void UpdateBufferID(GLuint id, GLsizei readBufferOffset)
423*8975f5c5SAndroid Build Coastguard Worker {
424*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gBufferMap, id, readBufferOffset);
425*8975f5c5SAndroid Build Coastguard Worker }
426*8975f5c5SAndroid Build Coastguard Worker 
UpdateFenceNVID(GLuint id,GLsizei readBufferOffset)427*8975f5c5SAndroid Build Coastguard Worker void UpdateFenceNVID(GLuint id, GLsizei readBufferOffset)
428*8975f5c5SAndroid Build Coastguard Worker {
429*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gFenceNVMap, id, readBufferOffset);
430*8975f5c5SAndroid Build Coastguard Worker }
431*8975f5c5SAndroid Build Coastguard Worker 
UpdateFramebufferID(GLuint id,GLsizei readBufferOffset)432*8975f5c5SAndroid Build Coastguard Worker void UpdateFramebufferID(GLuint id, GLsizei readBufferOffset)
433*8975f5c5SAndroid Build Coastguard Worker {
434*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gFramebufferMap, id, readBufferOffset);
435*8975f5c5SAndroid Build Coastguard Worker }
436*8975f5c5SAndroid Build Coastguard Worker 
UpdateFramebufferID2(GLuint contextId,GLuint id,GLsizei readBufferOffset)437*8975f5c5SAndroid Build Coastguard Worker void UpdateFramebufferID2(GLuint contextId, GLuint id, GLsizei readBufferOffset)
438*8975f5c5SAndroid Build Coastguard Worker {
439*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMapPerContext(gFramebufferMapPerContext, contextId, id, readBufferOffset);
440*8975f5c5SAndroid Build Coastguard Worker }
441*8975f5c5SAndroid Build Coastguard Worker 
UpdateMemoryObjectID(GLuint id,GLsizei readBufferOffset)442*8975f5c5SAndroid Build Coastguard Worker void UpdateMemoryObjectID(GLuint id, GLsizei readBufferOffset)
443*8975f5c5SAndroid Build Coastguard Worker {
444*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gMemoryObjectMap, id, readBufferOffset);
445*8975f5c5SAndroid Build Coastguard Worker }
446*8975f5c5SAndroid Build Coastguard Worker 
UpdateProgramPipelineID(GLuint id,GLsizei readBufferOffset)447*8975f5c5SAndroid Build Coastguard Worker void UpdateProgramPipelineID(GLuint id, GLsizei readBufferOffset)
448*8975f5c5SAndroid Build Coastguard Worker {
449*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gProgramPipelineMap, id, readBufferOffset);
450*8975f5c5SAndroid Build Coastguard Worker }
451*8975f5c5SAndroid Build Coastguard Worker 
UpdateQueryID(GLuint id,GLsizei readBufferOffset)452*8975f5c5SAndroid Build Coastguard Worker void UpdateQueryID(GLuint id, GLsizei readBufferOffset)
453*8975f5c5SAndroid Build Coastguard Worker {
454*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gQueryMap, id, readBufferOffset);
455*8975f5c5SAndroid Build Coastguard Worker }
456*8975f5c5SAndroid Build Coastguard Worker 
UpdateRenderbufferID(GLuint id,GLsizei readBufferOffset)457*8975f5c5SAndroid Build Coastguard Worker void UpdateRenderbufferID(GLuint id, GLsizei readBufferOffset)
458*8975f5c5SAndroid Build Coastguard Worker {
459*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gRenderbufferMap, id, readBufferOffset);
460*8975f5c5SAndroid Build Coastguard Worker }
461*8975f5c5SAndroid Build Coastguard Worker 
UpdateSamplerID(GLuint id,GLsizei readBufferOffset)462*8975f5c5SAndroid Build Coastguard Worker void UpdateSamplerID(GLuint id, GLsizei readBufferOffset)
463*8975f5c5SAndroid Build Coastguard Worker {
464*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gSamplerMap, id, readBufferOffset);
465*8975f5c5SAndroid Build Coastguard Worker }
466*8975f5c5SAndroid Build Coastguard Worker 
UpdateSemaphoreID(GLuint id,GLsizei readBufferOffset)467*8975f5c5SAndroid Build Coastguard Worker void UpdateSemaphoreID(GLuint id, GLsizei readBufferOffset)
468*8975f5c5SAndroid Build Coastguard Worker {
469*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gSemaphoreMap, id, readBufferOffset);
470*8975f5c5SAndroid Build Coastguard Worker }
471*8975f5c5SAndroid Build Coastguard Worker 
UpdateShaderProgramID(GLuint id,GLsizei readBufferOffset)472*8975f5c5SAndroid Build Coastguard Worker void UpdateShaderProgramID(GLuint id, GLsizei readBufferOffset)
473*8975f5c5SAndroid Build Coastguard Worker {
474*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gShaderProgramMap, id, readBufferOffset);
475*8975f5c5SAndroid Build Coastguard Worker }
476*8975f5c5SAndroid Build Coastguard Worker 
UpdateTextureID(GLuint id,GLsizei readBufferOffset)477*8975f5c5SAndroid Build Coastguard Worker void UpdateTextureID(GLuint id, GLsizei readBufferOffset)
478*8975f5c5SAndroid Build Coastguard Worker {
479*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gTextureMap, id, readBufferOffset);
480*8975f5c5SAndroid Build Coastguard Worker }
481*8975f5c5SAndroid Build Coastguard Worker 
UpdateTransformFeedbackID(GLuint id,GLsizei readBufferOffset)482*8975f5c5SAndroid Build Coastguard Worker void UpdateTransformFeedbackID(GLuint id, GLsizei readBufferOffset)
483*8975f5c5SAndroid Build Coastguard Worker {
484*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gTransformFeedbackMap, id, readBufferOffset);
485*8975f5c5SAndroid Build Coastguard Worker }
486*8975f5c5SAndroid Build Coastguard Worker 
UpdateVertexArrayID(GLuint id,GLsizei readBufferOffset)487*8975f5c5SAndroid Build Coastguard Worker void UpdateVertexArrayID(GLuint id, GLsizei readBufferOffset)
488*8975f5c5SAndroid Build Coastguard Worker {
489*8975f5c5SAndroid Build Coastguard Worker     UpdateResourceMap(gVertexArrayMap, id, readBufferOffset);
490*8975f5c5SAndroid Build Coastguard Worker }
491*8975f5c5SAndroid Build Coastguard Worker 
SetFramebufferID(GLuint id)492*8975f5c5SAndroid Build Coastguard Worker void SetFramebufferID(GLuint id)
493*8975f5c5SAndroid Build Coastguard Worker {
494*8975f5c5SAndroid Build Coastguard Worker     glGenFramebuffers(1, &gFramebufferMap[id]);
495*8975f5c5SAndroid Build Coastguard Worker }
496*8975f5c5SAndroid Build Coastguard Worker 
SetFramebufferID2(GLuint contextID,GLuint id)497*8975f5c5SAndroid Build Coastguard Worker void SetFramebufferID2(GLuint contextID, GLuint id)
498*8975f5c5SAndroid Build Coastguard Worker {
499*8975f5c5SAndroid Build Coastguard Worker     glGenFramebuffers(1, &gFramebufferMapPerContext[contextID][id]);
500*8975f5c5SAndroid Build Coastguard Worker }
501*8975f5c5SAndroid Build Coastguard Worker 
SetBufferID(GLuint id)502*8975f5c5SAndroid Build Coastguard Worker void SetBufferID(GLuint id)
503*8975f5c5SAndroid Build Coastguard Worker {
504*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &gBufferMap[id]);
505*8975f5c5SAndroid Build Coastguard Worker }
506*8975f5c5SAndroid Build Coastguard Worker 
SetRenderbufferID(GLuint id)507*8975f5c5SAndroid Build Coastguard Worker void SetRenderbufferID(GLuint id)
508*8975f5c5SAndroid Build Coastguard Worker {
509*8975f5c5SAndroid Build Coastguard Worker     glGenRenderbuffers(1, &gRenderbufferMap[id]);
510*8975f5c5SAndroid Build Coastguard Worker }
511*8975f5c5SAndroid Build Coastguard Worker 
SetTextureID(GLuint id)512*8975f5c5SAndroid Build Coastguard Worker void SetTextureID(GLuint id)
513*8975f5c5SAndroid Build Coastguard Worker {
514*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &gTextureMap[id]);
515*8975f5c5SAndroid Build Coastguard Worker }
516*8975f5c5SAndroid Build Coastguard Worker 
ValidateSerializedState(const char * serializedState,const char * fileName,uint32_t line)517*8975f5c5SAndroid Build Coastguard Worker void ValidateSerializedState(const char *serializedState, const char *fileName, uint32_t line)
518*8975f5c5SAndroid Build Coastguard Worker {
519*8975f5c5SAndroid Build Coastguard Worker     if (gValidateSerializedStateCallback)
520*8975f5c5SAndroid Build Coastguard Worker     {
521*8975f5c5SAndroid Build Coastguard Worker         gValidateSerializedStateCallback(serializedState, fileName, line);
522*8975f5c5SAndroid Build Coastguard Worker     }
523*8975f5c5SAndroid Build Coastguard Worker }
524*8975f5c5SAndroid Build Coastguard Worker 
MapBufferRange(GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access,GLuint buffer)525*8975f5c5SAndroid Build Coastguard Worker void MapBufferRange(GLenum target,
526*8975f5c5SAndroid Build Coastguard Worker                     GLintptr offset,
527*8975f5c5SAndroid Build Coastguard Worker                     GLsizeiptr length,
528*8975f5c5SAndroid Build Coastguard Worker                     GLbitfield access,
529*8975f5c5SAndroid Build Coastguard Worker                     GLuint buffer)
530*8975f5c5SAndroid Build Coastguard Worker {
531*8975f5c5SAndroid Build Coastguard Worker     gMappedBufferData[gBufferMap[buffer]] = glMapBufferRange(target, offset, length, access);
532*8975f5c5SAndroid Build Coastguard Worker }
533*8975f5c5SAndroid Build Coastguard Worker 
MapBufferRangeEXT(GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access,GLuint buffer)534*8975f5c5SAndroid Build Coastguard Worker void MapBufferRangeEXT(GLenum target,
535*8975f5c5SAndroid Build Coastguard Worker                        GLintptr offset,
536*8975f5c5SAndroid Build Coastguard Worker                        GLsizeiptr length,
537*8975f5c5SAndroid Build Coastguard Worker                        GLbitfield access,
538*8975f5c5SAndroid Build Coastguard Worker                        GLuint buffer)
539*8975f5c5SAndroid Build Coastguard Worker {
540*8975f5c5SAndroid Build Coastguard Worker     gMappedBufferData[gBufferMap[buffer]] = glMapBufferRangeEXT(target, offset, length, access);
541*8975f5c5SAndroid Build Coastguard Worker }
542*8975f5c5SAndroid Build Coastguard Worker 
MapBufferOES(GLenum target,GLbitfield access,GLuint buffer)543*8975f5c5SAndroid Build Coastguard Worker void MapBufferOES(GLenum target, GLbitfield access, GLuint buffer)
544*8975f5c5SAndroid Build Coastguard Worker {
545*8975f5c5SAndroid Build Coastguard Worker     gMappedBufferData[gBufferMap[buffer]] = glMapBufferOES(target, access);
546*8975f5c5SAndroid Build Coastguard Worker }
547*8975f5c5SAndroid Build Coastguard Worker 
CreateShader(GLenum shaderType,GLuint shaderProgram)548*8975f5c5SAndroid Build Coastguard Worker void CreateShader(GLenum shaderType, GLuint shaderProgram)
549*8975f5c5SAndroid Build Coastguard Worker {
550*8975f5c5SAndroid Build Coastguard Worker     gShaderProgramMap[shaderProgram] = glCreateShader(shaderType);
551*8975f5c5SAndroid Build Coastguard Worker }
552*8975f5c5SAndroid Build Coastguard Worker 
CreateProgram(GLuint shaderProgram)553*8975f5c5SAndroid Build Coastguard Worker void CreateProgram(GLuint shaderProgram)
554*8975f5c5SAndroid Build Coastguard Worker {
555*8975f5c5SAndroid Build Coastguard Worker     gShaderProgramMap[shaderProgram] = glCreateProgram();
556*8975f5c5SAndroid Build Coastguard Worker }
557*8975f5c5SAndroid Build Coastguard Worker 
CreateShaderProgramv(GLenum type,GLsizei count,const GLchar * const * strings,GLuint shaderProgram)558*8975f5c5SAndroid Build Coastguard Worker void CreateShaderProgramv(GLenum type,
559*8975f5c5SAndroid Build Coastguard Worker                           GLsizei count,
560*8975f5c5SAndroid Build Coastguard Worker                           const GLchar *const *strings,
561*8975f5c5SAndroid Build Coastguard Worker                           GLuint shaderProgram)
562*8975f5c5SAndroid Build Coastguard Worker {
563*8975f5c5SAndroid Build Coastguard Worker     gShaderProgramMap[shaderProgram] = glCreateShaderProgramv(type, count, strings);
564*8975f5c5SAndroid Build Coastguard Worker }
565*8975f5c5SAndroid Build Coastguard Worker 
FenceSync(GLenum condition,GLbitfield flags,uintptr_t fenceSync)566*8975f5c5SAndroid Build Coastguard Worker void FenceSync(GLenum condition, GLbitfield flags, uintptr_t fenceSync)
567*8975f5c5SAndroid Build Coastguard Worker {
568*8975f5c5SAndroid Build Coastguard Worker     gSyncMap[fenceSync] = glFenceSync(condition, flags);
569*8975f5c5SAndroid Build Coastguard Worker }
570*8975f5c5SAndroid Build Coastguard Worker 
FenceSync2(GLenum condition,GLbitfield flags,uintptr_t fenceSync)571*8975f5c5SAndroid Build Coastguard Worker void FenceSync2(GLenum condition, GLbitfield flags, uintptr_t fenceSync)
572*8975f5c5SAndroid Build Coastguard Worker {
573*8975f5c5SAndroid Build Coastguard Worker     gSyncMap2[fenceSync] = glFenceSync(condition, flags);
574*8975f5c5SAndroid Build Coastguard Worker }
575*8975f5c5SAndroid Build Coastguard Worker 
CreateEGLImageResource(GLsizei width,GLsizei height)576*8975f5c5SAndroid Build Coastguard Worker GLuint CreateEGLImageResource(GLsizei width, GLsizei height)
577*8975f5c5SAndroid Build Coastguard Worker {
578*8975f5c5SAndroid Build Coastguard Worker     GLint previousTexId;
579*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_TEXTURE_BINDING_2D, &previousTexId);
580*8975f5c5SAndroid Build Coastguard Worker     GLint previousAlignment;
581*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_UNPACK_ALIGNMENT, &previousAlignment);
582*8975f5c5SAndroid Build Coastguard Worker 
583*8975f5c5SAndroid Build Coastguard Worker     // Create a texture and fill with a placeholder green value
584*8975f5c5SAndroid Build Coastguard Worker     GLuint stagingTexId;
585*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &stagingTexId);
586*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, stagingTexId);
587*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
588*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
589*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
590*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> pixels;
591*8975f5c5SAndroid Build Coastguard Worker     pixels.reserve(width * height * 3);
592*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < width * height; i++)
593*8975f5c5SAndroid Build Coastguard Worker     {
594*8975f5c5SAndroid Build Coastguard Worker         pixels.push_back(61);
595*8975f5c5SAndroid Build Coastguard Worker         pixels.push_back(220);
596*8975f5c5SAndroid Build Coastguard Worker         pixels.push_back(132);
597*8975f5c5SAndroid Build Coastguard Worker     }
598*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE,
599*8975f5c5SAndroid Build Coastguard Worker                  pixels.data());
600*8975f5c5SAndroid Build Coastguard Worker 
601*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ALIGNMENT, previousAlignment);
602*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, previousTexId);
603*8975f5c5SAndroid Build Coastguard Worker     return stagingTexId;
604*8975f5c5SAndroid Build Coastguard Worker }
605*8975f5c5SAndroid Build Coastguard Worker 
CreateEGLImage(EGLDisplay dpy,EGLContext ctx,EGLenum target,uintptr_t buffer,const EGLAttrib * attrib_list,GLsizei width,GLsizei height,GLuint imageID)606*8975f5c5SAndroid Build Coastguard Worker void CreateEGLImage(EGLDisplay dpy,
607*8975f5c5SAndroid Build Coastguard Worker                     EGLContext ctx,
608*8975f5c5SAndroid Build Coastguard Worker                     EGLenum target,
609*8975f5c5SAndroid Build Coastguard Worker                     uintptr_t buffer,
610*8975f5c5SAndroid Build Coastguard Worker                     const EGLAttrib *attrib_list,
611*8975f5c5SAndroid Build Coastguard Worker                     GLsizei width,
612*8975f5c5SAndroid Build Coastguard Worker                     GLsizei height,
613*8975f5c5SAndroid Build Coastguard Worker                     GLuint imageID)
614*8975f5c5SAndroid Build Coastguard Worker {
615*8975f5c5SAndroid Build Coastguard Worker     if (target == EGL_NATIVE_BUFFER_ANDROID || buffer == 0)
616*8975f5c5SAndroid Build Coastguard Worker     {
617*8975f5c5SAndroid Build Coastguard Worker         // If this image was created from an AHB or the backing resource was not
618*8975f5c5SAndroid Build Coastguard Worker         // captured, create a new GL texture during replay to use instead.
619*8975f5c5SAndroid Build Coastguard Worker         // Substituting a GL texture for an AHB allows the trace to run on
620*8975f5c5SAndroid Build Coastguard Worker         // non-Android systems.
621*8975f5c5SAndroid Build Coastguard Worker         gEGLImageMap2Resources[imageID] = CreateEGLImageResource(width, height);
622*8975f5c5SAndroid Build Coastguard Worker         gEGLImageMap2[imageID]          = eglCreateImage(
623*8975f5c5SAndroid Build Coastguard Worker             dpy, eglGetCurrentContext(), EGL_GL_TEXTURE_2D,
624*8975f5c5SAndroid Build Coastguard Worker             reinterpret_cast<EGLClientBuffer>(gEGLImageMap2Resources[imageID]), attrib_list);
625*8975f5c5SAndroid Build Coastguard Worker     }
626*8975f5c5SAndroid Build Coastguard Worker     else
627*8975f5c5SAndroid Build Coastguard Worker     {
628*8975f5c5SAndroid Build Coastguard Worker         EGLClientBuffer clientBuffer = GetClientBuffer(target, buffer);
629*8975f5c5SAndroid Build Coastguard Worker         gEGLImageMap2[imageID]       = eglCreateImage(dpy, ctx, target, clientBuffer, attrib_list);
630*8975f5c5SAndroid Build Coastguard Worker     }
631*8975f5c5SAndroid Build Coastguard Worker }
632*8975f5c5SAndroid Build Coastguard Worker 
CreateEGLImageKHR(EGLDisplay dpy,EGLContext ctx,EGLenum target,uintptr_t buffer,const EGLint * attrib_list,GLsizei width,GLsizei height,GLuint imageID)633*8975f5c5SAndroid Build Coastguard Worker void CreateEGLImageKHR(EGLDisplay dpy,
634*8975f5c5SAndroid Build Coastguard Worker                        EGLContext ctx,
635*8975f5c5SAndroid Build Coastguard Worker                        EGLenum target,
636*8975f5c5SAndroid Build Coastguard Worker                        uintptr_t buffer,
637*8975f5c5SAndroid Build Coastguard Worker                        const EGLint *attrib_list,
638*8975f5c5SAndroid Build Coastguard Worker                        GLsizei width,
639*8975f5c5SAndroid Build Coastguard Worker                        GLsizei height,
640*8975f5c5SAndroid Build Coastguard Worker                        GLuint imageID)
641*8975f5c5SAndroid Build Coastguard Worker {
642*8975f5c5SAndroid Build Coastguard Worker     if (target == EGL_NATIVE_BUFFER_ANDROID || buffer == 0)
643*8975f5c5SAndroid Build Coastguard Worker     {
644*8975f5c5SAndroid Build Coastguard Worker         gEGLImageMap2Resources[imageID] = CreateEGLImageResource(width, height);
645*8975f5c5SAndroid Build Coastguard Worker         gEGLImageMap2[imageID]          = eglCreateImageKHR(
646*8975f5c5SAndroid Build Coastguard Worker             dpy, eglGetCurrentContext(), EGL_GL_TEXTURE_2D,
647*8975f5c5SAndroid Build Coastguard Worker             reinterpret_cast<EGLClientBuffer>(gEGLImageMap2Resources[imageID]), attrib_list);
648*8975f5c5SAndroid Build Coastguard Worker     }
649*8975f5c5SAndroid Build Coastguard Worker     else
650*8975f5c5SAndroid Build Coastguard Worker     {
651*8975f5c5SAndroid Build Coastguard Worker         EGLClientBuffer clientBuffer = GetClientBuffer(target, buffer);
652*8975f5c5SAndroid Build Coastguard Worker         gEGLImageMap2[imageID] = eglCreateImageKHR(dpy, ctx, target, clientBuffer, attrib_list);
653*8975f5c5SAndroid Build Coastguard Worker     }
654*8975f5c5SAndroid Build Coastguard Worker }
655*8975f5c5SAndroid Build Coastguard Worker 
DestroyEGLImage(EGLDisplay dpy,EGLImage image,GLuint imageID)656*8975f5c5SAndroid Build Coastguard Worker void DestroyEGLImage(EGLDisplay dpy, EGLImage image, GLuint imageID)
657*8975f5c5SAndroid Build Coastguard Worker {
658*8975f5c5SAndroid Build Coastguard Worker     if (gEGLImageMap2Resources[imageID])
659*8975f5c5SAndroid Build Coastguard Worker     {
660*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &gEGLImageMap2Resources[imageID]);
661*8975f5c5SAndroid Build Coastguard Worker         gEGLImageMap2Resources[imageID] = 0;
662*8975f5c5SAndroid Build Coastguard Worker     }
663*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImage(dpy, image);
664*8975f5c5SAndroid Build Coastguard Worker }
665*8975f5c5SAndroid Build Coastguard Worker 
DestroyEGLImageKHR(EGLDisplay dpy,EGLImageKHR image,GLuint imageID)666*8975f5c5SAndroid Build Coastguard Worker void DestroyEGLImageKHR(EGLDisplay dpy, EGLImageKHR image, GLuint imageID)
667*8975f5c5SAndroid Build Coastguard Worker {
668*8975f5c5SAndroid Build Coastguard Worker     if (gEGLImageMap2Resources[imageID])
669*8975f5c5SAndroid Build Coastguard Worker     {
670*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(1, &gEGLImageMap2Resources[imageID]);
671*8975f5c5SAndroid Build Coastguard Worker         gEGLImageMap2Resources[imageID] = 0;
672*8975f5c5SAndroid Build Coastguard Worker     }
673*8975f5c5SAndroid Build Coastguard Worker     eglDestroyImageKHR(dpy, image);
674*8975f5c5SAndroid Build Coastguard Worker }
675*8975f5c5SAndroid Build Coastguard Worker 
CreateEGLSyncKHR(EGLDisplay dpy,EGLenum type,const EGLint * attrib_list,GLuint syncID)676*8975f5c5SAndroid Build Coastguard Worker void CreateEGLSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list, GLuint syncID)
677*8975f5c5SAndroid Build Coastguard Worker {
678*8975f5c5SAndroid Build Coastguard Worker     gEGLSyncMap[syncID] = eglCreateSyncKHR(dpy, type, attrib_list);
679*8975f5c5SAndroid Build Coastguard Worker }
680*8975f5c5SAndroid Build Coastguard Worker 
CreateEGLSync(EGLDisplay dpy,EGLenum type,const EGLAttrib * attrib_list,GLuint syncID)681*8975f5c5SAndroid Build Coastguard Worker void CreateEGLSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list, GLuint syncID)
682*8975f5c5SAndroid Build Coastguard Worker {
683*8975f5c5SAndroid Build Coastguard Worker     gEGLSyncMap[syncID] = eglCreateSync(dpy, type, attrib_list);
684*8975f5c5SAndroid Build Coastguard Worker }
685*8975f5c5SAndroid Build Coastguard Worker 
CreatePbufferSurface(EGLDisplay dpy,EGLConfig config,const EGLint * attrib_list,GLuint surfaceID)686*8975f5c5SAndroid Build Coastguard Worker void CreatePbufferSurface(EGLDisplay dpy,
687*8975f5c5SAndroid Build Coastguard Worker                           EGLConfig config,
688*8975f5c5SAndroid Build Coastguard Worker                           const EGLint *attrib_list,
689*8975f5c5SAndroid Build Coastguard Worker                           GLuint surfaceID)
690*8975f5c5SAndroid Build Coastguard Worker {
691*8975f5c5SAndroid Build Coastguard Worker     gSurfaceMap2[surfaceID] = eglCreatePbufferSurface(dpy, config, attrib_list);
692*8975f5c5SAndroid Build Coastguard Worker }
693*8975f5c5SAndroid Build Coastguard Worker 
CreateNativeClientBufferANDROID(const EGLint * attrib_list,uintptr_t clientBuffer)694*8975f5c5SAndroid Build Coastguard Worker void CreateNativeClientBufferANDROID(const EGLint *attrib_list, uintptr_t clientBuffer)
695*8975f5c5SAndroid Build Coastguard Worker {
696*8975f5c5SAndroid Build Coastguard Worker     gClientBufferMap[clientBuffer] = eglCreateNativeClientBufferANDROID(attrib_list);
697*8975f5c5SAndroid Build Coastguard Worker }
698*8975f5c5SAndroid Build Coastguard Worker 
CreateContext(GLuint contextID)699*8975f5c5SAndroid Build Coastguard Worker void CreateContext(GLuint contextID)
700*8975f5c5SAndroid Build Coastguard Worker {
701*8975f5c5SAndroid Build Coastguard Worker     EGLContext shareContext = gContextMap2[gShareContextId];
702*8975f5c5SAndroid Build Coastguard Worker     EGLContext context      = eglCreateContext(nullptr, nullptr, shareContext, nullptr);
703*8975f5c5SAndroid Build Coastguard Worker     gContextMap2[contextID] = context;
704*8975f5c5SAndroid Build Coastguard Worker }
705*8975f5c5SAndroid Build Coastguard Worker 
SetCurrentContextID(GLuint id)706*8975f5c5SAndroid Build Coastguard Worker void SetCurrentContextID(GLuint id)
707*8975f5c5SAndroid Build Coastguard Worker {
708*8975f5c5SAndroid Build Coastguard Worker     gContextMap2[id] = eglGetCurrentContext();
709*8975f5c5SAndroid Build Coastguard Worker }
710*8975f5c5SAndroid Build Coastguard Worker 
711*8975f5c5SAndroid Build Coastguard Worker ANGLE_REPLAY_EXPORT PFNEGLCREATEIMAGEPROC r_eglCreateImage;
712*8975f5c5SAndroid Build Coastguard Worker ANGLE_REPLAY_EXPORT PFNEGLCREATEIMAGEKHRPROC r_eglCreateImageKHR;
713*8975f5c5SAndroid Build Coastguard Worker ANGLE_REPLAY_EXPORT PFNEGLDESTROYIMAGEPROC r_eglDestroyImage;
714*8975f5c5SAndroid Build Coastguard Worker ANGLE_REPLAY_EXPORT PFNEGLDESTROYIMAGEKHRPROC r_eglDestroyImageKHR;
715