• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // trace_fixture.cpp:
7 //   Common code for the ANGLE trace replays.
8 //
9 
10 #include "trace_fixture.h"
11 
12 #include "angle_trace_gl.h"
13 
14 #include <string>
15 
16 namespace
17 {
UpdateResourceMap(GLuint * resourceMap,GLuint id,GLsizei readBufferOffset)18 void UpdateResourceMap(GLuint *resourceMap, GLuint id, GLsizei readBufferOffset)
19 {
20     GLuint returnedID;
21     memcpy(&returnedID, &gReadBuffer[readBufferOffset], sizeof(GLuint));
22     resourceMap[id] = returnedID;
23 }
24 
25 angle::TraceCallbacks *gTraceCallbacks = nullptr;
26 
GetClientBuffer(EGLenum target,uintptr_t key)27 EGLClientBuffer GetClientBuffer(EGLenum target, uintptr_t key)
28 {
29     switch (target)
30     {
31         case EGL_GL_TEXTURE_2D:
32         case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X:
33         case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
34         case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
35         case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
36         case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
37         case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
38         case EGL_GL_TEXTURE_3D:
39         {
40             uintptr_t id = static_cast<uintptr_t>(gTextureMap[key]);
41             return reinterpret_cast<EGLClientBuffer>(id);
42         }
43         case EGL_GL_RENDERBUFFER:
44         {
45             uintptr_t id = static_cast<uintptr_t>(gRenderbufferMap[key]);
46             return reinterpret_cast<EGLClientBuffer>(id);
47         }
48         default:
49         {
50             const auto &iData = gClientBufferMap.find(key);
51             return iData != gClientBufferMap.end() ? iData->second : nullptr;
52         }
53     }
54 }
55 
56 ValidateSerializedStateCallback gValidateSerializedStateCallback;
57 std::unordered_map<GLuint, std::vector<GLint>> gInternalUniformLocationsMap;
58 
59 constexpr size_t kMaxClientArrays = 16;
60 }  // namespace
61 
62 GLint **gUniformLocations;
63 GLuint gCurrentProgram = 0;
64 
65 // TODO(jmadill): Hide from the traces. http://anglebug.com/7753
66 BlockIndexesMap gUniformBlockIndexes;
67 
UpdateUniformLocation(GLuint program,const char * name,GLint location,GLint count)68 void UpdateUniformLocation(GLuint program, const char *name, GLint location, GLint count)
69 {
70     std::vector<GLint> &programLocations = gInternalUniformLocationsMap[program];
71     if (static_cast<GLint>(programLocations.size()) < location + count)
72     {
73         programLocations.resize(location + count, 0);
74     }
75     GLuint mappedProgramID = gShaderProgramMap[program];
76     for (GLint arrayIndex = 0; arrayIndex < count; ++arrayIndex)
77     {
78         programLocations[location + arrayIndex] =
79             glGetUniformLocation(mappedProgramID, name) + arrayIndex;
80     }
81     gUniformLocations[program] = programLocations.data();
82 }
83 
DeleteUniformLocations(GLuint program)84 void DeleteUniformLocations(GLuint program)
85 {
86     // No-op. We leave uniform locations around so deleted current programs can still use them.
87 }
88 
UpdateUniformBlockIndex(GLuint program,const char * name,GLuint index)89 void UpdateUniformBlockIndex(GLuint program, const char *name, GLuint index)
90 {
91     gUniformBlockIndexes[program][index] = glGetUniformBlockIndex(program, name);
92 }
93 
UniformBlockBinding(GLuint program,GLuint uniformblockIndex,GLuint binding)94 void UniformBlockBinding(GLuint program, GLuint uniformblockIndex, GLuint binding)
95 {
96     glUniformBlockBinding(gShaderProgramMap[program],
97                           gUniformBlockIndexes[gShaderProgramMap[program]][uniformblockIndex],
98                           binding);
99 }
100 
UpdateCurrentProgram(GLuint program)101 void UpdateCurrentProgram(GLuint program)
102 {
103     gCurrentProgram = program;
104 }
105 
106 uint8_t *gBinaryData;
107 uint8_t *gReadBuffer;
108 uint8_t *gClientArrays[kMaxClientArrays];
109 GLuint *gResourceIDBuffer;
110 SyncResourceMap gSyncMap;
111 ContextMap gContextMap;
112 GLuint gShareContextId;
113 
114 GLuint *gBufferMap;
115 GLuint *gFenceNVMap;
116 GLuint *gFramebufferMap;
117 GLuint *gMemoryObjectMap;
118 GLuint *gProgramPipelineMap;
119 GLuint *gQueryMap;
120 GLuint *gRenderbufferMap;
121 GLuint *gSamplerMap;
122 GLuint *gSemaphoreMap;
123 GLuint *gShaderProgramMap;
124 GLuint *gTextureMap;
125 GLuint *gTransformFeedbackMap;
126 GLuint *gVertexArrayMap;
127 
128 // TODO(jmadill): Consolidate. http://anglebug.com/7753
129 ClientBufferMap gClientBufferMap;
130 EGLImageMap gEGLImageMap;
131 SurfaceMap gSurfaceMap;
132 
133 GLeglImageOES *gEGLImageMap2;
134 EGLSurface *gSurfaceMap2;
135 EGLContext *gContextMap2;
136 GLsync *gSyncMap2;
137 EGLSync *gEGLSyncMap;
138 EGLDisplay gEGLDisplay;
139 
140 std::string gBinaryDataDir = ".";
141 
142 template <typename T>
AllocateZeroedValues(size_t count)143 T *AllocateZeroedValues(size_t count)
144 {
145     T *mem = new T[count + 1];
146     memset(mem, 0, sizeof(T) * (count + 1));
147     return mem;
148 }
149 
AllocateZeroedUints(size_t count)150 GLuint *AllocateZeroedUints(size_t count)
151 {
152     return AllocateZeroedValues<GLuint>(count);
153 }
154 
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)155 void InitializeReplay4(const char *binaryDataFileName,
156                        size_t maxClientArraySize,
157                        size_t readBufferSize,
158                        size_t resourceIDBufferSize,
159                        GLuint contextId,
160                        uint32_t maxBuffer,
161                        uint32_t maxContext,
162                        uint32_t maxFenceNV,
163                        uint32_t maxFramebuffer,
164                        uint32_t maxImage,
165                        uint32_t maxMemoryObject,
166                        uint32_t maxProgramPipeline,
167                        uint32_t maxQuery,
168                        uint32_t maxRenderbuffer,
169                        uint32_t maxSampler,
170                        uint32_t maxSemaphore,
171                        uint32_t maxShaderProgram,
172                        uint32_t maxSurface,
173                        uint32_t maxSync,
174                        uint32_t maxTexture,
175                        uint32_t maxTransformFeedback,
176                        uint32_t maxVertexArray,
177                        GLuint maxEGLSyncID)
178 {
179     InitializeReplay3(binaryDataFileName, maxClientArraySize, readBufferSize, resourceIDBufferSize,
180                       contextId, maxBuffer, maxContext, maxFenceNV, maxFramebuffer, maxImage,
181                       maxMemoryObject, maxProgramPipeline, maxQuery, maxRenderbuffer, maxSampler,
182                       maxSemaphore, maxShaderProgram, maxSurface, maxSync, maxTexture,
183                       maxTransformFeedback, maxVertexArray);
184     gEGLSyncMap = AllocateZeroedValues<EGLSync>(maxEGLSyncID);
185     gEGLDisplay = eglGetCurrentDisplay();
186 }
187 
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)188 void InitializeReplay3(const char *binaryDataFileName,
189                        size_t maxClientArraySize,
190                        size_t readBufferSize,
191                        size_t resourceIDBufferSize,
192                        GLuint contextId,
193                        uint32_t maxBuffer,
194                        uint32_t maxContext,
195                        uint32_t maxFenceNV,
196                        uint32_t maxFramebuffer,
197                        uint32_t maxImage,
198                        uint32_t maxMemoryObject,
199                        uint32_t maxProgramPipeline,
200                        uint32_t maxQuery,
201                        uint32_t maxRenderbuffer,
202                        uint32_t maxSampler,
203                        uint32_t maxSemaphore,
204                        uint32_t maxShaderProgram,
205                        uint32_t maxSurface,
206                        uint32_t maxSync,
207                        uint32_t maxTexture,
208                        uint32_t maxTransformFeedback,
209                        uint32_t maxVertexArray)
210 {
211     InitializeReplay2(binaryDataFileName, maxClientArraySize, readBufferSize, contextId, maxBuffer,
212                       maxContext, maxFenceNV, maxFramebuffer, maxImage, maxMemoryObject,
213                       maxProgramPipeline, maxQuery, maxRenderbuffer, maxSampler, maxSemaphore,
214                       maxShaderProgram, maxSurface, maxTexture, maxTransformFeedback,
215                       maxVertexArray);
216 
217     gSyncMap2         = AllocateZeroedValues<GLsync>(maxSync);
218     gResourceIDBuffer = AllocateZeroedUints(resourceIDBufferSize);
219 }
220 
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)221 void InitializeReplay2(const char *binaryDataFileName,
222                        size_t maxClientArraySize,
223                        size_t readBufferSize,
224                        GLuint contextId,
225                        uint32_t maxBuffer,
226                        uint32_t maxContext,
227                        uint32_t maxFenceNV,
228                        uint32_t maxFramebuffer,
229                        uint32_t maxImage,
230                        uint32_t maxMemoryObject,
231                        uint32_t maxProgramPipeline,
232                        uint32_t maxQuery,
233                        uint32_t maxRenderbuffer,
234                        uint32_t maxSampler,
235                        uint32_t maxSemaphore,
236                        uint32_t maxShaderProgram,
237                        uint32_t maxSurface,
238                        uint32_t maxTexture,
239                        uint32_t maxTransformFeedback,
240                        uint32_t maxVertexArray)
241 {
242     InitializeReplay(binaryDataFileName, maxClientArraySize, readBufferSize, maxBuffer, maxFenceNV,
243                      maxFramebuffer, maxMemoryObject, maxProgramPipeline, maxQuery, maxRenderbuffer,
244                      maxSampler, maxSemaphore, maxShaderProgram, maxTexture, maxTransformFeedback,
245                      maxVertexArray);
246 
247     gContextMap2  = AllocateZeroedValues<EGLContext>(maxContext);
248     gEGLImageMap2 = AllocateZeroedValues<EGLImage>(maxImage);
249     gSurfaceMap2  = AllocateZeroedValues<EGLSurface>(maxSurface);
250 
251     gContextMap2[0]         = EGL_NO_CONTEXT;
252     gShareContextId         = contextId;
253     gContextMap2[contextId] = eglGetCurrentContext();
254 }
255 
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)256 void InitializeReplay(const char *binaryDataFileName,
257                       size_t maxClientArraySize,
258                       size_t readBufferSize,
259                       uint32_t maxBuffer,
260                       uint32_t maxFenceNV,
261                       uint32_t maxFramebuffer,
262                       uint32_t maxMemoryObject,
263                       uint32_t maxProgramPipeline,
264                       uint32_t maxQuery,
265                       uint32_t maxRenderbuffer,
266                       uint32_t maxSampler,
267                       uint32_t maxSemaphore,
268                       uint32_t maxShaderProgram,
269                       uint32_t maxTexture,
270                       uint32_t maxTransformFeedback,
271                       uint32_t maxVertexArray)
272 {
273     gBinaryData = gTraceCallbacks->LoadBinaryData(binaryDataFileName);
274 
275     for (uint8_t *&clientArray : gClientArrays)
276     {
277         clientArray = new uint8_t[maxClientArraySize];
278     }
279 
280     gReadBuffer = new uint8_t[readBufferSize];
281 
282     gBufferMap            = AllocateZeroedUints(maxBuffer);
283     gFenceNVMap           = AllocateZeroedUints(maxFenceNV);
284     gFramebufferMap       = AllocateZeroedUints(maxFramebuffer);
285     gMemoryObjectMap      = AllocateZeroedUints(maxMemoryObject);
286     gProgramPipelineMap   = AllocateZeroedUints(maxProgramPipeline);
287     gQueryMap             = AllocateZeroedUints(maxQuery);
288     gRenderbufferMap      = AllocateZeroedUints(maxRenderbuffer);
289     gSamplerMap           = AllocateZeroedUints(maxSampler);
290     gSemaphoreMap         = AllocateZeroedUints(maxSemaphore);
291     gShaderProgramMap     = AllocateZeroedUints(maxShaderProgram);
292     gTextureMap           = AllocateZeroedUints(maxTexture);
293     gTransformFeedbackMap = AllocateZeroedUints(maxTransformFeedback);
294     gVertexArrayMap       = AllocateZeroedUints(maxVertexArray);
295 
296     gUniformLocations = new GLint *[maxShaderProgram + 1];
297     memset(gUniformLocations, 0, sizeof(GLint *) * (maxShaderProgram + 1));
298 
299     gContextMap[0] = EGL_NO_CONTEXT;
300 }
301 
FinishReplay()302 void FinishReplay()
303 {
304     for (uint8_t *&clientArray : gClientArrays)
305     {
306         delete[] clientArray;
307     }
308     delete[] gReadBuffer;
309     delete[] gResourceIDBuffer;
310 
311     delete[] gBufferMap;
312     delete[] gContextMap2;
313     delete[] gEGLImageMap2;
314     delete[] gEGLSyncMap;
315     delete[] gRenderbufferMap;
316     delete[] gTextureMap;
317     delete[] gFramebufferMap;
318     delete[] gShaderProgramMap;
319     delete[] gFenceNVMap;
320     delete[] gMemoryObjectMap;
321     delete[] gProgramPipelineMap;
322     delete[] gQueryMap;
323     delete[] gSamplerMap;
324     delete[] gSemaphoreMap;
325     delete[] gSurfaceMap2;
326     delete[] gSyncMap2;
327     delete[] gTransformFeedbackMap;
328     delete[] gVertexArrayMap;
329 }
330 
SetValidateSerializedStateCallback(ValidateSerializedStateCallback callback)331 void SetValidateSerializedStateCallback(ValidateSerializedStateCallback callback)
332 {
333     gValidateSerializedStateCallback = callback;
334 }
335 
336 angle::TraceInfo gTraceInfo;
337 std::string gTraceGzPath;
338 
339 struct TraceFunctionsImpl : angle::TraceFunctions
340 {
SetupReplayTraceFunctionsImpl341     void SetupReplay() override { ::SetupReplay(); }
342 
ReplayFrameTraceFunctionsImpl343     void ReplayFrame(uint32_t frameIndex) override { ::ReplayFrame(frameIndex); }
344 
ResetReplayTraceFunctionsImpl345     void ResetReplay() override { ::ResetReplay(); }
346 
FinishReplayTraceFunctionsImpl347     void FinishReplay() override { ::FinishReplay(); }
348 
SetBinaryDataDirTraceFunctionsImpl349     void SetBinaryDataDir(const char *dataDir) override { gBinaryDataDir = dataDir; }
350 
SetTraceInfoTraceFunctionsImpl351     void SetTraceInfo(const angle::TraceInfo &traceInfo) override { gTraceInfo = traceInfo; }
352 
SetTraceGzPathTraceFunctionsImpl353     void SetTraceGzPath(const std::string &traceGzPath) override { gTraceGzPath = traceGzPath; }
354 };
355 
356 TraceFunctionsImpl gTraceFunctionsImpl;
357 
SetupEntryPoints(angle::TraceCallbacks * traceCallbacks,angle::TraceFunctions ** traceFunctions)358 void SetupEntryPoints(angle::TraceCallbacks *traceCallbacks, angle::TraceFunctions **traceFunctions)
359 {
360     gTraceCallbacks = traceCallbacks;
361     *traceFunctions = &gTraceFunctionsImpl;
362 }
363 
UpdateClientArrayPointer(int arrayIndex,const void * data,uint64_t size)364 void UpdateClientArrayPointer(int arrayIndex, const void *data, uint64_t size)
365 {
366     memcpy(gClientArrays[arrayIndex], data, static_cast<size_t>(size));
367 }
368 BufferHandleMap gMappedBufferData;
369 
UpdateClientBufferData(GLuint bufferID,const void * source,GLsizei size)370 void UpdateClientBufferData(GLuint bufferID, const void *source, GLsizei size)
371 {
372     memcpy(gMappedBufferData[gBufferMap[bufferID]], source, size);
373 }
374 
UpdateClientBufferDataWithOffset(GLuint bufferID,const void * source,GLsizei size,GLsizei offset)375 void UpdateClientBufferDataWithOffset(GLuint bufferID,
376                                       const void *source,
377                                       GLsizei size,
378                                       GLsizei offset)
379 {
380     uintptr_t dest = reinterpret_cast<uintptr_t>(gMappedBufferData[gBufferMap[bufferID]]) + offset;
381     memcpy(reinterpret_cast<void *>(dest), source, size);
382 }
383 
UpdateResourceIDBuffer(int resourceIndex,GLuint id)384 void UpdateResourceIDBuffer(int resourceIndex, GLuint id)
385 {
386     gResourceIDBuffer[resourceIndex] = id;
387 }
388 
UpdateBufferID(GLuint id,GLsizei readBufferOffset)389 void UpdateBufferID(GLuint id, GLsizei readBufferOffset)
390 {
391     UpdateResourceMap(gBufferMap, id, readBufferOffset);
392 }
393 
UpdateFenceNVID(GLuint id,GLsizei readBufferOffset)394 void UpdateFenceNVID(GLuint id, GLsizei readBufferOffset)
395 {
396     UpdateResourceMap(gFenceNVMap, id, readBufferOffset);
397 }
398 
UpdateFramebufferID(GLuint id,GLsizei readBufferOffset)399 void UpdateFramebufferID(GLuint id, GLsizei readBufferOffset)
400 {
401     UpdateResourceMap(gFramebufferMap, id, readBufferOffset);
402 }
403 
UpdateMemoryObjectID(GLuint id,GLsizei readBufferOffset)404 void UpdateMemoryObjectID(GLuint id, GLsizei readBufferOffset)
405 {
406     UpdateResourceMap(gMemoryObjectMap, id, readBufferOffset);
407 }
408 
UpdateProgramPipelineID(GLuint id,GLsizei readBufferOffset)409 void UpdateProgramPipelineID(GLuint id, GLsizei readBufferOffset)
410 {
411     UpdateResourceMap(gProgramPipelineMap, id, readBufferOffset);
412 }
413 
UpdateQueryID(GLuint id,GLsizei readBufferOffset)414 void UpdateQueryID(GLuint id, GLsizei readBufferOffset)
415 {
416     UpdateResourceMap(gQueryMap, id, readBufferOffset);
417 }
418 
UpdateRenderbufferID(GLuint id,GLsizei readBufferOffset)419 void UpdateRenderbufferID(GLuint id, GLsizei readBufferOffset)
420 {
421     UpdateResourceMap(gRenderbufferMap, id, readBufferOffset);
422 }
423 
UpdateSamplerID(GLuint id,GLsizei readBufferOffset)424 void UpdateSamplerID(GLuint id, GLsizei readBufferOffset)
425 {
426     UpdateResourceMap(gSamplerMap, id, readBufferOffset);
427 }
428 
UpdateSemaphoreID(GLuint id,GLsizei readBufferOffset)429 void UpdateSemaphoreID(GLuint id, GLsizei readBufferOffset)
430 {
431     UpdateResourceMap(gSemaphoreMap, id, readBufferOffset);
432 }
433 
UpdateShaderProgramID(GLuint id,GLsizei readBufferOffset)434 void UpdateShaderProgramID(GLuint id, GLsizei readBufferOffset)
435 {
436     UpdateResourceMap(gShaderProgramMap, id, readBufferOffset);
437 }
438 
UpdateTextureID(GLuint id,GLsizei readBufferOffset)439 void UpdateTextureID(GLuint id, GLsizei readBufferOffset)
440 {
441     UpdateResourceMap(gTextureMap, id, readBufferOffset);
442 }
443 
UpdateTransformFeedbackID(GLuint id,GLsizei readBufferOffset)444 void UpdateTransformFeedbackID(GLuint id, GLsizei readBufferOffset)
445 {
446     UpdateResourceMap(gTransformFeedbackMap, id, readBufferOffset);
447 }
448 
UpdateVertexArrayID(GLuint id,GLsizei readBufferOffset)449 void UpdateVertexArrayID(GLuint id, GLsizei readBufferOffset)
450 {
451     UpdateResourceMap(gVertexArrayMap, id, readBufferOffset);
452 }
453 
SetResourceID(GLuint * map,GLuint id)454 void SetResourceID(GLuint *map, GLuint id)
455 {
456     map[id] = id;
457 }
458 
SetFramebufferID(GLuint id)459 void SetFramebufferID(GLuint id)
460 {
461     SetResourceID(gFramebufferMap, id);
462 }
463 
SetBufferID(GLuint id)464 void SetBufferID(GLuint id)
465 {
466     SetResourceID(gBufferMap, id);
467 }
468 
SetRenderbufferID(GLuint id)469 void SetRenderbufferID(GLuint id)
470 {
471     SetResourceID(gRenderbufferMap, id);
472 }
473 
SetTextureID(GLuint id)474 void SetTextureID(GLuint id)
475 {
476     SetResourceID(gTextureMap, id);
477 }
478 
ValidateSerializedState(const char * serializedState,const char * fileName,uint32_t line)479 void ValidateSerializedState(const char *serializedState, const char *fileName, uint32_t line)
480 {
481     if (gValidateSerializedStateCallback)
482     {
483         gValidateSerializedStateCallback(serializedState, fileName, line);
484     }
485 }
486 
MapBufferRange(GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access,GLuint buffer)487 void MapBufferRange(GLenum target,
488                     GLintptr offset,
489                     GLsizeiptr length,
490                     GLbitfield access,
491                     GLuint buffer)
492 {
493     gMappedBufferData[gBufferMap[buffer]] = glMapBufferRange(target, offset, length, access);
494 }
495 
MapBufferRangeEXT(GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access,GLuint buffer)496 void MapBufferRangeEXT(GLenum target,
497                        GLintptr offset,
498                        GLsizeiptr length,
499                        GLbitfield access,
500                        GLuint buffer)
501 {
502     gMappedBufferData[gBufferMap[buffer]] = glMapBufferRangeEXT(target, offset, length, access);
503 }
504 
MapBufferOES(GLenum target,GLbitfield access,GLuint buffer)505 void MapBufferOES(GLenum target, GLbitfield access, GLuint buffer)
506 {
507     gMappedBufferData[gBufferMap[buffer]] = glMapBufferOES(target, access);
508 }
509 
CreateShader(GLenum shaderType,GLuint shaderProgram)510 void CreateShader(GLenum shaderType, GLuint shaderProgram)
511 {
512     gShaderProgramMap[shaderProgram] = glCreateShader(shaderType);
513 }
514 
CreateProgram(GLuint shaderProgram)515 void CreateProgram(GLuint shaderProgram)
516 {
517     gShaderProgramMap[shaderProgram] = glCreateProgram();
518 }
519 
CreateShaderProgramv(GLenum type,GLsizei count,const GLchar * const * strings,GLuint shaderProgram)520 void CreateShaderProgramv(GLenum type,
521                           GLsizei count,
522                           const GLchar *const *strings,
523                           GLuint shaderProgram)
524 {
525     gShaderProgramMap[shaderProgram] = glCreateShaderProgramv(type, count, strings);
526 }
527 
FenceSync(GLenum condition,GLbitfield flags,uintptr_t fenceSync)528 void FenceSync(GLenum condition, GLbitfield flags, uintptr_t fenceSync)
529 {
530     gSyncMap[fenceSync] = glFenceSync(condition, flags);
531 }
532 
FenceSync2(GLenum condition,GLbitfield flags,uintptr_t fenceSync)533 void FenceSync2(GLenum condition, GLbitfield flags, uintptr_t fenceSync)
534 {
535     gSyncMap2[fenceSync] = glFenceSync(condition, flags);
536 }
537 
CreateEGLImage(EGLDisplay dpy,EGLContext ctx,EGLenum target,uintptr_t buffer,const EGLAttrib * attrib_list,GLuint imageID)538 void CreateEGLImage(EGLDisplay dpy,
539                     EGLContext ctx,
540                     EGLenum target,
541                     uintptr_t buffer,
542                     const EGLAttrib *attrib_list,
543                     GLuint imageID)
544 {
545     EGLClientBuffer clientBuffer = GetClientBuffer(target, buffer);
546     gEGLImageMap2[imageID]       = eglCreateImage(dpy, ctx, target, clientBuffer, attrib_list);
547 }
548 
CreateEGLImageKHR(EGLDisplay dpy,EGLContext ctx,EGLenum target,uintptr_t buffer,const EGLint * attrib_list,GLuint imageID)549 void CreateEGLImageKHR(EGLDisplay dpy,
550                        EGLContext ctx,
551                        EGLenum target,
552                        uintptr_t buffer,
553                        const EGLint *attrib_list,
554                        GLuint imageID)
555 {
556     EGLClientBuffer clientBuffer = GetClientBuffer(target, buffer);
557     gEGLImageMap2[imageID]       = eglCreateImageKHR(dpy, ctx, target, clientBuffer, attrib_list);
558 }
559 
CreateEGLSyncKHR(EGLDisplay dpy,EGLenum type,const EGLint * attrib_list,GLuint syncID)560 void CreateEGLSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list, GLuint syncID)
561 {
562     gEGLSyncMap[syncID] = eglCreateSyncKHR(dpy, type, attrib_list);
563 }
564 
CreateEGLSync(EGLDisplay dpy,EGLenum type,const EGLAttrib * attrib_list,GLuint syncID)565 void CreateEGLSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list, GLuint syncID)
566 {
567     gEGLSyncMap[syncID] = eglCreateSync(dpy, type, attrib_list);
568 }
569 
CreatePbufferSurface(EGLDisplay dpy,EGLConfig config,const EGLint * attrib_list,GLuint surfaceID)570 void CreatePbufferSurface(EGLDisplay dpy,
571                           EGLConfig config,
572                           const EGLint *attrib_list,
573                           GLuint surfaceID)
574 {
575     gSurfaceMap2[surfaceID] = eglCreatePbufferSurface(dpy, config, attrib_list);
576 }
577 
CreateNativeClientBufferANDROID(const EGLint * attrib_list,uintptr_t clientBuffer)578 void CreateNativeClientBufferANDROID(const EGLint *attrib_list, uintptr_t clientBuffer)
579 {
580     gClientBufferMap[clientBuffer] = eglCreateNativeClientBufferANDROID(attrib_list);
581 }
582 
CreateContext(GLuint contextID)583 void CreateContext(GLuint contextID)
584 {
585     EGLContext shareContext = gContextMap2[gShareContextId];
586     EGLContext context      = eglCreateContext(nullptr, nullptr, shareContext, nullptr);
587     gContextMap2[contextID] = context;
588 }
589 
SetCurrentContextID(GLuint id)590 void SetCurrentContextID(GLuint id)
591 {
592     gContextMap2[id] = eglGetCurrentContext();
593 }
594 
595 ANGLE_REPLAY_EXPORT PFNEGLCREATEIMAGEPROC r_eglCreateImage;
596 ANGLE_REPLAY_EXPORT PFNEGLCREATEIMAGEKHRPROC r_eglCreateImageKHR;
597 ANGLE_REPLAY_EXPORT PFNEGLDESTROYIMAGEPROC r_eglDestroyImage;
598 ANGLE_REPLAY_EXPORT PFNEGLDESTROYIMAGEKHRPROC r_eglDestroyImageKHR;
599