• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 
17 #include "GLESv2Decoder.h"
18 #include "GLESv2Dispatch.h"
19 
20 #include "base/Lock.h"
21 
22 #include "host-common/vm_operations.h"
23 
24 #include <EGL/egl.h>
25 #include <GLES2/gl2.h>
26 #include <GLES2/gl2ext.h>
27 #include <GLES3/gl3.h>
28 #include <GLES3/gl31.h>
29 
30 #include <string>
31 #include <vector>
32 
33 #include <string.h>
34 
35 using android::base::AutoLock;
36 using android::base::StaticLock;
37 
SafePointerFromUInt(GLuint value)38 static inline void* SafePointerFromUInt(GLuint value) {
39   return (void*)(uintptr_t)value;
40 }
41 
initDispatch(GLESv2Decoder::get_proc_func_t getProc,void * userData)42 int gles2_decoder_extended_context::initDispatch(
43         GLESv2Decoder::get_proc_func_t getProc, void *userData) {
44     gles2_server_context_t::initDispatchByName(getProc, userData);
45     glVertexAttribPointerWithDataSize =
46             (glVertexAttribPointerWithDataSize_server_proc_t)
47             getProc("glVertexAttribPointerWithDataSize", userData);
48     glVertexAttribIPointerWithDataSize =
49             (glVertexAttribIPointerWithDataSize_server_proc_t)
50             getProc("glVertexAttribIPointerWithDataSize", userData);
51     return 0;
52 }
53 
54 static StaticLock sLock;
55 static GLESv2Decoder::get_proc_func_t sGetProcFunc;
56 static void* sGetProcFuncData;
57 
58 namespace {
59 
60 struct ContextTemplateLoader {
ContextTemplateLoader__anon03c8062d0111::ContextTemplateLoader61     ContextTemplateLoader() {
62         context.initDispatch(sGetProcFunc, sGetProcFuncData);
63     }
64     gles2_decoder_extended_context context;
65 };
66 
67 }  // namespace
68 
sContextTemplate()69 static ContextTemplateLoader* sContextTemplate() {
70     static ContextTemplateLoader* c = new ContextTemplateLoader;
71     return c;
72 }
73 
GLESv2Decoder()74 GLESv2Decoder::GLESv2Decoder()
75 {
76     m_contextData = NULL;
77     m_GL2library = NULL;
78     m_snapshot = NULL;
79 }
80 
~GLESv2Decoder()81 GLESv2Decoder::~GLESv2Decoder()
82 {
83 }
84 
s_getProc(const char * name,void * userData)85 void *GLESv2Decoder::s_getProc(const char *name, void *userData)
86 {
87     GLESv2Decoder *ctx = (GLESv2Decoder *) userData;
88 
89     if (ctx == NULL || ctx->m_GL2library == NULL) {
90         return NULL;
91     }
92 
93     void *func = NULL;
94 #ifdef USE_EGL_GETPROCADDRESS
95     func = (void *) eglGetProcAddress(name);
96 #endif
97     if (func == NULL) {
98         func = (void *) ctx->m_GL2library->findSymbol(name);
99     }
100     return func;
101 }
102 
103 #define OVERRIDE_DEC(func) func##_dec = s_##func;
104 
initGL(get_proc_func_t getProcFunc,void * getProcFuncData)105 int GLESv2Decoder::initGL(get_proc_func_t getProcFunc, void *getProcFuncData)
106 {
107     AutoLock lock(sLock);
108     sGetProcFunc = getProcFunc;
109     sGetProcFuncData = getProcFuncData;
110     static_cast<gles2_decoder_extended_context&>(*this) = sContextTemplate()->context;
111 
112     glGetCompressedTextureFormats = s_glGetCompressedTextureFormats;
113     glVertexAttribPointerData = s_glVertexAttribPointerData;
114     glVertexAttribPointerOffset = s_glVertexAttribPointerOffset;
115     glShaderString = s_glShaderString;
116 
117     glDrawElementsOffset = s_glDrawElementsOffset;
118     glDrawElementsData = s_glDrawElementsData;
119     glDrawElementsOffsetNullAEMU = s_glDrawElementsOffsetNullAEMU;
120     glDrawElementsDataNullAEMU = s_glDrawElementsDataNullAEMU;
121     glFinishRoundTrip = s_glFinishRoundTrip;
122     glMapBufferRangeAEMU = s_glMapBufferRangeAEMU;
123     glUnmapBufferAEMU = s_glUnmapBufferAEMU;
124     glMapBufferRangeDMA = s_glMapBufferRangeDMA;
125     glUnmapBufferDMA = s_glUnmapBufferDMA;
126     glFlushMappedBufferRangeAEMU = s_glFlushMappedBufferRangeAEMU;
127     glMapBufferRangeDirect = s_glMapBufferRangeDirect;
128     glUnmapBufferDirect = s_glUnmapBufferDirect;
129     glFlushMappedBufferRangeDirect = s_glFlushMappedBufferRangeDirect;
130     glCompressedTexImage2DOffsetAEMU = s_glCompressedTexImage2DOffsetAEMU;
131     glCompressedTexSubImage2DOffsetAEMU = s_glCompressedTexSubImage2DOffsetAEMU;
132     glTexImage2DOffsetAEMU = s_glTexImage2DOffsetAEMU;
133     glTexSubImage2DOffsetAEMU = s_glTexSubImage2DOffsetAEMU;
134     glGetUniformIndicesAEMU = s_glGetUniformIndicesAEMU;
135     glVertexAttribIPointerDataAEMU = s_glVertexAttribIPointerDataAEMU;
136     glVertexAttribIPointerOffsetAEMU = s_glVertexAttribIPointerOffsetAEMU;
137     glTransformFeedbackVaryingsAEMU = s_glTransformFeedbackVaryingsAEMU;
138     glTexImage3DOffsetAEMU = s_glTexImage3DOffsetAEMU;
139     glTexSubImage3DOffsetAEMU = s_glTexSubImage3DOffsetAEMU;
140     glCompressedTexImage3DOffsetAEMU = s_glCompressedTexImage3DOffsetAEMU;
141     glCompressedTexSubImage3DOffsetAEMU = s_glCompressedTexSubImage3DOffsetAEMU;
142     glDrawElementsInstancedOffsetAEMU = s_glDrawElementsInstancedOffsetAEMU;
143     glDrawElementsInstancedDataAEMU = s_glDrawElementsInstancedDataAEMU;
144     glReadPixelsOffsetAEMU = s_glReadPixelsOffsetAEMU;
145 
146     glCreateShaderProgramvAEMU = s_glCreateShaderProgramvAEMU;
147 
148     glDrawArraysIndirectDataAEMU = s_glDrawArraysIndirectDataAEMU;
149     glDrawArraysIndirectOffsetAEMU = s_glDrawArraysIndirectOffsetAEMU;
150 
151     glDrawElementsIndirectDataAEMU = s_glDrawElementsIndirectDataAEMU;
152     glDrawElementsIndirectOffsetAEMU = s_glDrawElementsIndirectOffsetAEMU;
153 
154     glFenceSyncAEMU = s_glFenceSyncAEMU;
155     glClientWaitSyncAEMU = s_glClientWaitSyncAEMU;
156     glWaitSyncAEMU = s_glWaitSyncAEMU;
157     glIsSyncAEMU = s_glIsSyncAEMU;
158     glGetSyncivAEMU = s_glGetSyncivAEMU;
159     glDeleteSyncAEMU = s_glDeleteSyncAEMU;
160 
161     glBufferDataSyncAEMU = s_glBufferDataSyncAEMU;
162 
163     OVERRIDE_DEC(glCreateShader)
164     OVERRIDE_DEC(glCreateProgram)
165 
166     OVERRIDE_DEC(glGenBuffers)
167 
168     OVERRIDE_DEC(glGenFramebuffers)
169     OVERRIDE_DEC(glGenRenderbuffers)
170     OVERRIDE_DEC(glGenTextures)
171 
172     OVERRIDE_DEC(glGenVertexArraysOES)
173     OVERRIDE_DEC(glGenVertexArrays)
174 
175     OVERRIDE_DEC(glGenTransformFeedbacks)
176     OVERRIDE_DEC(glGenSamplers)
177     OVERRIDE_DEC(glGenQueries)
178     OVERRIDE_DEC(glGenProgramPipelines)
179 
180     OVERRIDE_DEC(glDeleteShader)
181     OVERRIDE_DEC(glDeleteProgram)
182 
183     OVERRIDE_DEC(glDeleteBuffers)
184     OVERRIDE_DEC(glDeleteFramebuffers)
185     OVERRIDE_DEC(glDeleteRenderbuffers)
186     OVERRIDE_DEC(glDeleteTextures)
187 
188     OVERRIDE_DEC(glDeleteVertexArraysOES)
189     OVERRIDE_DEC(glDeleteVertexArrays)
190 
191     OVERRIDE_DEC(glDeleteTransformFeedbacks)
192     OVERRIDE_DEC(glDeleteSamplers)
193     OVERRIDE_DEC(glDeleteQueries)
194     OVERRIDE_DEC(glDeleteProgramPipelines)
195 
196     // Shaders and programs
197     OVERRIDE_DEC(glCompileShader)
198     OVERRIDE_DEC(glAttachShader)
199     OVERRIDE_DEC(glDetachShader)
200     OVERRIDE_DEC(glLinkProgram)
201     OVERRIDE_DEC(glUseProgram)
202     OVERRIDE_DEC(glValidateProgram)
203     OVERRIDE_DEC(glIsShader)
204     OVERRIDE_DEC(glIsProgram)
205     OVERRIDE_DEC(glGetShaderiv)
206     OVERRIDE_DEC(glGetProgramiv)
207     OVERRIDE_DEC(glGetShaderInfoLog)
208     OVERRIDE_DEC(glGetProgramInfoLog)
209     OVERRIDE_DEC(glGetShaderSource)
210     OVERRIDE_DEC(glBindAttribLocation)
211     OVERRIDE_DEC(glGetActiveAttrib)
212     OVERRIDE_DEC(glGetActiveUniform)
213     OVERRIDE_DEC(glGetAttachedShaders)
214     OVERRIDE_DEC(glGetAttribLocation)
215     OVERRIDE_DEC(glGetUniformfv)
216     OVERRIDE_DEC(glGetUniformiv)
217     OVERRIDE_DEC(glGetUniformLocation)
218     OVERRIDE_DEC(glGetProgramBinaryOES)
219     OVERRIDE_DEC(glProgramBinaryOES)
220     OVERRIDE_DEC(glUniformBlockBinding)
221     OVERRIDE_DEC(glGetUniformBlockIndex)
222     OVERRIDE_DEC(glGetActiveUniformBlockiv)
223     OVERRIDE_DEC(glGetActiveUniformBlockName)
224     OVERRIDE_DEC(glGetUniformuiv)
225     OVERRIDE_DEC(glGetActiveUniformsiv)
226     OVERRIDE_DEC(glTransformFeedbackVaryings)
227     OVERRIDE_DEC(glGetTransformFeedbackVarying)
228     OVERRIDE_DEC(glProgramParameteri)
229     OVERRIDE_DEC(glProgramBinary)
230     OVERRIDE_DEC(glGetProgramBinary)
231     OVERRIDE_DEC(glGetFragDataLocation)
232     OVERRIDE_DEC(glUseProgramStages)
233     OVERRIDE_DEC(glActiveShaderProgram)
234     OVERRIDE_DEC(glProgramUniform1f)
235     OVERRIDE_DEC(glProgramUniform2f)
236     OVERRIDE_DEC(glProgramUniform3f)
237     OVERRIDE_DEC(glProgramUniform4f)
238     OVERRIDE_DEC(glProgramUniform1i)
239     OVERRIDE_DEC(glProgramUniform2i)
240     OVERRIDE_DEC(glProgramUniform3i)
241     OVERRIDE_DEC(glProgramUniform4i)
242     OVERRIDE_DEC(glProgramUniform1ui)
243     OVERRIDE_DEC(glProgramUniform2ui)
244     OVERRIDE_DEC(glProgramUniform3ui)
245     OVERRIDE_DEC(glProgramUniform4ui)
246     OVERRIDE_DEC(glProgramUniform1fv)
247     OVERRIDE_DEC(glProgramUniform2fv)
248     OVERRIDE_DEC(glProgramUniform3fv)
249     OVERRIDE_DEC(glProgramUniform4fv)
250     OVERRIDE_DEC(glProgramUniform1iv)
251     OVERRIDE_DEC(glProgramUniform2iv)
252     OVERRIDE_DEC(glProgramUniform3iv)
253     OVERRIDE_DEC(glProgramUniform4iv)
254     OVERRIDE_DEC(glProgramUniform1uiv)
255     OVERRIDE_DEC(glProgramUniform2uiv)
256     OVERRIDE_DEC(glProgramUniform3uiv)
257     OVERRIDE_DEC(glProgramUniform4uiv)
258     OVERRIDE_DEC(glProgramUniformMatrix2fv)
259     OVERRIDE_DEC(glProgramUniformMatrix3fv)
260     OVERRIDE_DEC(glProgramUniformMatrix4fv)
261     OVERRIDE_DEC(glProgramUniformMatrix2x3fv)
262     OVERRIDE_DEC(glProgramUniformMatrix3x2fv)
263     OVERRIDE_DEC(glProgramUniformMatrix2x4fv)
264     OVERRIDE_DEC(glProgramUniformMatrix4x2fv)
265     OVERRIDE_DEC(glProgramUniformMatrix3x4fv)
266     OVERRIDE_DEC(glProgramUniformMatrix4x3fv)
267     OVERRIDE_DEC(glGetProgramInterfaceiv)
268     OVERRIDE_DEC(glGetProgramResourceiv)
269     OVERRIDE_DEC(glGetProgramResourceIndex)
270     OVERRIDE_DEC(glGetProgramResourceLocation)
271     OVERRIDE_DEC(glGetProgramResourceName)
272 
273     return 0;
274 
275 }
276 
s_glFinishRoundTrip(void * self)277 int GLESv2Decoder::s_glFinishRoundTrip(void *self)
278 {
279     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
280     ctx->glFinish();
281     return 0;
282 }
283 
s_glGetCompressedTextureFormats(void * self,int count,GLint * formats)284 void GLESv2Decoder::s_glGetCompressedTextureFormats(void *self, int count, GLint *formats)
285 {
286     GLESv2Decoder *ctx = (GLESv2Decoder *) self;
287 
288     int nFormats;
289     ctx->glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &nFormats);
290     if (nFormats > count) {
291         fprintf(stderr, "%s: GetCompressedTextureFormats: The requested number of formats does not match the number that is reported by OpenGL\n", __FUNCTION__);
292     } else {
293         ctx->glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, formats);
294     }
295 }
296 
s_glVertexAttribPointerData(void * self,GLuint indx,GLint size,GLenum type,GLboolean normalized,GLsizei stride,void * data,GLuint datalen)297 void GLESv2Decoder::s_glVertexAttribPointerData(void *self, GLuint indx, GLint size, GLenum type,
298                                              GLboolean normalized, GLsizei stride,  void * data, GLuint datalen)
299 {
300     GLESv2Decoder *ctx = (GLESv2Decoder *) self;
301     if (ctx->m_contextData != NULL) {
302         ctx->m_contextData->storePointerData(indx, data, datalen);
303         // note - the stride of the data is always zero when it comes out of the codec.
304         // See gl2.attrib for the packing function call.
305         if ((void*)ctx->glVertexAttribPointerWithDataSize != gles2_unimplemented) {
306             ctx->glVertexAttribPointerWithDataSize(indx, size, type, normalized,
307                     0, ctx->m_contextData->pointerData(indx), datalen);
308         } else {
309             ctx->glVertexAttribPointer(indx, size, type, normalized, 0,
310                     ctx->m_contextData->pointerData(indx));
311         }
312     }
313 }
314 
s_glVertexAttribPointerOffset(void * self,GLuint indx,GLint size,GLenum type,GLboolean normalized,GLsizei stride,GLuint data)315 void GLESv2Decoder::s_glVertexAttribPointerOffset(void *self, GLuint indx, GLint size, GLenum type,
316                                                GLboolean normalized, GLsizei stride,  GLuint data)
317 {
318     GLESv2Decoder *ctx = (GLESv2Decoder *) self;
319     ctx->glVertexAttribPointer(indx, size, type, normalized, stride, SafePointerFromUInt(data));
320 }
321 
322 
s_glDrawElementsData(void * self,GLenum mode,GLsizei count,GLenum type,void * data,GLuint datalen)323 void GLESv2Decoder::s_glDrawElementsData(void *self, GLenum mode, GLsizei count, GLenum type, void * data, GLuint datalen)
324 {
325     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
326     ctx->glDrawElements(mode, count, type, data);
327 }
328 
329 
s_glDrawElementsOffset(void * self,GLenum mode,GLsizei count,GLenum type,GLuint offset)330 void GLESv2Decoder::s_glDrawElementsOffset(void *self, GLenum mode, GLsizei count, GLenum type, GLuint offset)
331 {
332     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
333     ctx->glDrawElements(mode, count, type, SafePointerFromUInt(offset));
334 }
335 
s_glDrawElementsDataNullAEMU(void * self,GLenum mode,GLsizei count,GLenum type,void * data,GLuint datalen)336 void GLESv2Decoder::s_glDrawElementsDataNullAEMU(void *self, GLenum mode, GLsizei count, GLenum type, void * data, GLuint datalen)
337 {
338     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
339     ctx->glDrawElementsNullAEMU(mode, count, type, data);
340 }
341 
342 
s_glDrawElementsOffsetNullAEMU(void * self,GLenum mode,GLsizei count,GLenum type,GLuint offset)343 void GLESv2Decoder::s_glDrawElementsOffsetNullAEMU(void *self, GLenum mode, GLsizei count, GLenum type, GLuint offset)
344 {
345     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
346     ctx->glDrawElementsNullAEMU(mode, count, type, SafePointerFromUInt(offset));
347 }
348 
s_glMapBufferRangeAEMU(void * self,GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access,void * mapped)349 void GLESv2Decoder::s_glMapBufferRangeAEMU(void* self, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, void* mapped)
350 {
351     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
352     if ((access & GL_MAP_READ_BIT) ||
353         ((access & GL_MAP_WRITE_BIT) &&
354          (!(access & GL_MAP_INVALIDATE_RANGE_BIT) &&
355           !(access & GL_MAP_INVALIDATE_BUFFER_BIT)))) {
356         void* gpu_ptr = ctx->glMapBufferRange(target, offset, length, access);
357 
358         // map failed, no need to copy or unmap
359         if (!gpu_ptr) {
360             fprintf(stderr, "%s: error: could not map host gpu buffer\n", __func__);
361             return;
362         }
363 
364         memcpy(mapped, gpu_ptr, length);
365         ctx->glUnmapBuffer(target);
366     } else {
367         // if writing while not wanting to preserve previous contents,
368         // let |mapped| stay as garbage.
369     }
370 }
371 
s_glUnmapBufferAEMU(void * self,GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access,void * guest_buffer,GLboolean * out_res)372 void GLESv2Decoder::s_glUnmapBufferAEMU(void* self, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, void* guest_buffer, GLboolean* out_res)
373 {
374     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
375     *out_res = GL_TRUE;
376 
377     if (access & GL_MAP_WRITE_BIT) {
378         if (!guest_buffer) {
379             // guest can flush 0 in some cases
380             return;
381         }
382         void* gpu_ptr = ctx->glMapBufferRange(target, offset, length, access);
383         if (!gpu_ptr) {
384             fprintf(stderr, "%s: could not get host gpu pointer!\n", __FUNCTION__);
385             return;
386         }
387         memcpy(gpu_ptr, guest_buffer, length);
388         *out_res = ctx->glUnmapBuffer(target);
389     }
390 }
391 
s_glMapBufferRangeDMA(void * self,GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access,uint64_t paddr)392 void GLESv2Decoder::s_glMapBufferRangeDMA(void* self, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, uint64_t paddr)
393 {
394     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
395     // Check if this is a read or write request and not an invalidate one.
396     if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) &&
397         !(access & (GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT))) {
398         // Not used
399         // void* guest_buffer = emugl::g_emugl_dma_get_host_addr(paddr);
400         void* guest_buffer = nullptr;
401         void* gpu_ptr = ctx->glMapBufferRange(target, offset, length, access);
402 
403         // map failed, no need to copy or unmap
404         if (!gpu_ptr) {
405             fprintf(stderr, "%s: error: could not map host gpu buffer\n", __func__);
406             return;
407         }
408 
409         memcpy(guest_buffer, gpu_ptr, length);
410         ctx->glUnmapBuffer(target);
411     } else {
412         // if writing while not wanting to preserve previous contents,
413         // let |mapped| stay as garbage.
414     }
415 }
416 
s_glUnmapBufferDMA(void * self,GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access,uint64_t paddr,GLboolean * out_res)417 void GLESv2Decoder::s_glUnmapBufferDMA(void* self, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, uint64_t paddr, GLboolean* out_res)
418 {
419     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
420     *out_res = GL_TRUE;
421 
422     if (access & GL_MAP_WRITE_BIT) {
423         if (!paddr) {
424             // guest can flush 0 in some cases
425             return;
426         }
427         // Not used
428         // void* guest_buffer = emugl::g_emugl_dma_get_host_addr(paddr);
429         void* guest_buffer = nullptr;
430         void* gpu_ptr = ctx->glMapBufferRange(target, offset, length, access);
431         if (!gpu_ptr) {
432             fprintf(stderr, "%s: could not get host gpu pointer!\n", __FUNCTION__);
433             return;
434         }
435         memcpy(gpu_ptr, guest_buffer, length);
436         *out_res = ctx->glUnmapBuffer(target);
437     }
438 }
439 
align_pointer_size(void * ptr,GLsizeiptr length)440 static std::pair<void*, GLsizeiptr> align_pointer_size(void* ptr, GLsizeiptr length)
441 {
442     constexpr size_t kPageBits = 12;
443     constexpr size_t kPageSize = 1u << kPageBits;
444     constexpr size_t kPageOffsetMask = kPageSize - 1;
445 
446     uintptr_t addr = reinterpret_cast<uintptr_t>(ptr);
447     uintptr_t page_offset = addr & kPageOffsetMask;
448 
449     return { reinterpret_cast<void*>(addr - page_offset),
450              ((length + page_offset + kPageSize - 1) >> kPageBits) << kPageBits
451            };
452 }
453 
s_glMapBufferRangeDirect(void * self,GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access,uint64_t paddr)454 uint64_t GLESv2Decoder::s_glMapBufferRangeDirect(void* self, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, uint64_t paddr)
455 {
456     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
457     // Check if this is a read or write request and not an invalidate one.
458     if (access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) {
459         void* gpu_ptr = ctx->glMapBufferRange(target, offset, length, access);
460 
461         if (gpu_ptr) {
462             std::pair<void*, GLsizeiptr> aligned = align_pointer_size(gpu_ptr, length);
463             get_emugl_vm_operations().mapUserBackedRam(paddr, aligned.first, aligned.second);
464             return reinterpret_cast<uint64_t>(gpu_ptr);
465         } else {
466             fprintf(stderr, "%s: error: could not map host gpu buffer\n", __func__);
467             return 0;
468         }
469     } else {
470         // if writing while not wanting to preserve previous contents,
471         // let |mapped| stay as garbage.
472         return 0;
473     }
474 }
475 
s_glUnmapBufferDirect(void * self,GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access,uint64_t paddr,uint64_t gpu_ptr,GLboolean * out_res)476 void GLESv2Decoder::s_glUnmapBufferDirect(void* self, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, uint64_t paddr, uint64_t gpu_ptr, GLboolean* out_res)
477 {
478     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
479     GLboolean res = GL_TRUE;
480 
481     if (access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) {
482         get_emugl_vm_operations().unmapUserBackedRam(paddr, align_pointer_size(reinterpret_cast<void*>(gpu_ptr), length).second);
483         res = ctx->glUnmapBuffer(target);
484     }
485 
486     *out_res = res;
487 }
488 
s_glFlushMappedBufferRangeAEMU(void * self,GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access,void * guest_buffer)489 void GLESv2Decoder::s_glFlushMappedBufferRangeAEMU(void* self, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, void* guest_buffer) {
490     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
491     if (!guest_buffer) {
492         // guest can end up flushing 0 bytes in a lot of cases
493         return;
494     }
495     void* gpu_ptr = ctx->glMapBufferRange(target, offset, length, access);
496 
497     // map failed, no need to copy or unmap
498     if (!gpu_ptr) {
499         fprintf(stderr, "%s: error: could not map host gpu buffer\n", __func__);
500         return;
501     }
502 
503     memcpy(gpu_ptr, guest_buffer, length);
504     // |offset| was the absolute offset into the mapping, so just flush offset 0.
505     ctx->glFlushMappedBufferRange(target, 0, length);
506     ctx->glUnmapBuffer(target);
507 }
508 
s_glFlushMappedBufferRangeDirect(void * self,GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access)509 void GLESv2Decoder::s_glFlushMappedBufferRangeDirect(void* self, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) {
510     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
511     ctx->glFlushMappedBufferRange(target, offset, length);
512 }
513 
s_glCompressedTexImage2DOffsetAEMU(void * self,GLenum target,GLint level,GLenum internalformat,GLsizei width,GLsizei height,GLint border,GLsizei imageSize,GLuint offset)514 void GLESv2Decoder::s_glCompressedTexImage2DOffsetAEMU(void* self, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, GLuint offset) {
515     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
516 	ctx->glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, SafePointerFromUInt(offset));
517 }
s_glCompressedTexSubImage2DOffsetAEMU(void * self,GLenum target,GLint level,GLint xoffset,GLint yoffset,GLsizei width,GLsizei height,GLenum format,GLsizei imageSize,GLuint offset)518 void GLESv2Decoder::s_glCompressedTexSubImage2DOffsetAEMU(void* self, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLuint offset) {
519     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
520 	ctx->glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, SafePointerFromUInt(offset));
521 }
s_glTexImage2DOffsetAEMU(void * self,GLenum target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLint border,GLenum format,GLenum type,GLuint offset)522 void GLESv2Decoder::s_glTexImage2DOffsetAEMU(void* self, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLuint offset) {
523     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
524 	ctx->glTexImage2D(target, level, internalformat, width, height, border, format, type, SafePointerFromUInt(offset));
525 }
s_glTexSubImage2DOffsetAEMU(void * self,GLenum target,GLint level,GLint xoffset,GLint yoffset,GLsizei width,GLsizei height,GLenum format,GLenum type,GLuint offset)526 void GLESv2Decoder::s_glTexSubImage2DOffsetAEMU(void* self, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLuint offset) {
527     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
528 	ctx->glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, SafePointerFromUInt(offset));
529 }
530 
531 static const char* const kNameDelimiter = ";";
532 
sUnpackVarNames(GLsizei count,const char * packedNames)533 static std::vector<std::string> sUnpackVarNames(GLsizei count, const char* packedNames) {
534     std::vector<std::string> unpacked;
535     GLsizei current = 0;
536 
537     while (current < count) {
538         const char* delimPos = strstr(packedNames, kNameDelimiter);
539         size_t nameLen = delimPos - packedNames;
540         std::string next;
541         next.resize(nameLen);
542         memcpy(&next[0], packedNames, nameLen);
543         unpacked.push_back(next);
544         packedNames = delimPos + 1;
545         current++;
546     }
547 
548     return unpacked;
549 }
550 
s_glGetUniformIndicesAEMU(void * self,GLuint program,GLsizei uniformCount,const GLchar * packedNames,GLsizei packedLen,GLuint * uniformIndices)551 void GLESv2Decoder::s_glGetUniformIndicesAEMU(void* self, GLuint program, GLsizei uniformCount, const GLchar* packedNames, GLsizei packedLen, GLuint* uniformIndices) {
552     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
553 
554     std::vector<std::string> unpacked = sUnpackVarNames(uniformCount, packedNames);
555 
556     GLchar** unpackedArray = new GLchar*[unpacked.size()];
557     GLsizei i = 0;
558     for (auto& elt : unpacked) {
559         unpackedArray[i] = (GLchar*)&elt[0];
560         i++;
561     }
562 
563     ctx->glGetUniformIndices(program, uniformCount, (const GLchar**)unpackedArray, uniformIndices);
564 
565     delete [] unpackedArray;
566 }
567 
s_glVertexAttribIPointerDataAEMU(void * self,GLuint indx,GLint size,GLenum type,GLsizei stride,void * data,GLuint datalen)568 void GLESv2Decoder::s_glVertexAttribIPointerDataAEMU(void *self, GLuint indx, GLint size, GLenum type, GLsizei stride, void * data, GLuint datalen)
569 {
570     GLESv2Decoder *ctx = (GLESv2Decoder *) self;
571     if (ctx->m_contextData != NULL) {
572         ctx->m_contextData->storePointerData(indx, data, datalen);
573         // note - the stride of the data is always zero when it comes out of the codec.
574         // See gl2.attrib for the packing function call.
575         if ((void*)ctx->glVertexAttribIPointerWithDataSize != gles2_unimplemented) {
576             ctx->glVertexAttribIPointerWithDataSize(indx, size, type, 0,
577                 ctx->m_contextData->pointerData(indx), datalen);
578         } else {
579             ctx->glVertexAttribIPointer(indx, size, type, 0,
580                 ctx->m_contextData->pointerData(indx));
581         }
582     }
583 }
584 
s_glVertexAttribIPointerOffsetAEMU(void * self,GLuint indx,GLint size,GLenum type,GLsizei stride,GLuint data)585 void GLESv2Decoder::s_glVertexAttribIPointerOffsetAEMU(void *self, GLuint indx, GLint size, GLenum type, GLsizei stride, GLuint data)
586 {
587     GLESv2Decoder *ctx = (GLESv2Decoder *) self;
588     ctx->glVertexAttribIPointer(indx, size, type, stride, SafePointerFromUInt(data));
589 }
590 
s_glTransformFeedbackVaryingsAEMU(void * self,GLuint program,GLsizei count,const char * packedVaryings,GLuint packedVaryingsLen,GLenum bufferMode)591 void GLESv2Decoder::s_glTransformFeedbackVaryingsAEMU(void* self, GLuint program, GLsizei count, const char* packedVaryings, GLuint packedVaryingsLen, GLenum bufferMode) {
592 
593     GLESv2Decoder *ctx = (GLESv2Decoder *) self;
594 
595     std::vector<std::string> unpacked = sUnpackVarNames(count, packedVaryings);
596 
597     char** unpackedArray = new char*[unpacked.size()];
598     GLsizei i = 0;
599     for (auto& elt : unpacked) {
600         unpackedArray[i] = &elt[0];
601         i++;
602     }
603 
604     ctx->glTransformFeedbackVaryings(program, count, (const char**)unpackedArray, bufferMode);
605 
606     delete [] unpackedArray;
607 }
608 
s_glTexImage3DOffsetAEMU(void * self,GLenum target,GLint level,GLint internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLint border,GLenum format,GLenum type,GLuint offset)609 void GLESv2Decoder::s_glTexImage3DOffsetAEMU(void* self, GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLuint offset) {
610     GLESv2Decoder *ctx = (GLESv2Decoder *) self;
611 	ctx->glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, SafePointerFromUInt(offset));
612 }
s_glTexSubImage3DOffsetAEMU(void * self,GLenum target,GLint level,GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,GLenum format,GLenum type,GLuint offset)613 void GLESv2Decoder::s_glTexSubImage3DOffsetAEMU(void* self, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLuint offset) {
614     GLESv2Decoder *ctx = (GLESv2Decoder *) self;
615 	ctx->glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, SafePointerFromUInt(offset));
616 }
s_glCompressedTexImage3DOffsetAEMU(void * self,GLenum target,GLint level,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth,GLint border,GLsizei imageSize,GLuint offset)617 void GLESv2Decoder::s_glCompressedTexImage3DOffsetAEMU(void* self, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLuint offset) {
618     GLESv2Decoder *ctx = (GLESv2Decoder *) self;
619 	ctx->glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, SafePointerFromUInt(offset));
620 }
s_glCompressedTexSubImage3DOffsetAEMU(void * self,GLenum target,GLint level,GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,GLenum format,GLsizei imageSize,GLuint offset)621 void GLESv2Decoder::s_glCompressedTexSubImage3DOffsetAEMU(void* self, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, GLuint offset) {
622     GLESv2Decoder *ctx = (GLESv2Decoder *) self;
623 	ctx->glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, SafePointerFromUInt(offset));
624 }
625 
s_glDrawElementsInstancedOffsetAEMU(void * self,GLenum mode,GLsizei count,GLenum type,GLuint offset,GLsizei primcount)626 void GLESv2Decoder::s_glDrawElementsInstancedOffsetAEMU(void* self, GLenum mode, GLsizei count, GLenum type, GLuint offset, GLsizei primcount) {
627     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
628     ctx->glDrawElementsInstanced(mode, count, type, SafePointerFromUInt(offset), primcount);
629 }
630 
s_glDrawElementsInstancedDataAEMU(void * self,GLenum mode,GLsizei count,GLenum type,const void * indices,GLsizei primcount,GLsizei datalen)631 void GLESv2Decoder::s_glDrawElementsInstancedDataAEMU(void* self, GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLsizei datalen) {
632     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
633     ctx->glDrawElementsInstanced(mode, count, type, indices, primcount);
634 }
635 
s_glReadPixelsOffsetAEMU(void * self,GLint x,GLint y,GLsizei width,GLsizei height,GLenum format,GLenum type,GLuint offset)636 void GLESv2Decoder::s_glReadPixelsOffsetAEMU(void* self, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLuint offset) {
637     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
638     ctx->glReadPixels(x, y, width, height, format, type, SafePointerFromUInt(offset));
639 }
640 
s_glCreateShaderProgramvAEMU(void * self,GLenum type,GLsizei count,const char * packedStrings,GLuint packedLen)641 GLuint GLESv2Decoder::s_glCreateShaderProgramvAEMU(void* self, GLenum type, GLsizei count, const char* packedStrings, GLuint packedLen) {
642     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
643     return ctx->glCreateShaderProgramv(type, 1, &packedStrings);
644     // TODO: Snapshot names
645 }
646 
s_glDrawArraysIndirectDataAEMU(void * self,GLenum mode,const void * indirect,GLuint datalen)647 void GLESv2Decoder::s_glDrawArraysIndirectDataAEMU(void* self, GLenum mode, const void* indirect, GLuint datalen) {
648     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
649     ctx->glDrawArraysIndirect(mode, indirect);
650 }
651 
s_glDrawArraysIndirectOffsetAEMU(void * self,GLenum mode,GLuint offset)652 void GLESv2Decoder::s_glDrawArraysIndirectOffsetAEMU(void* self, GLenum mode, GLuint offset) {
653     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
654     ctx->glDrawArraysIndirect(mode, SafePointerFromUInt(offset));
655 }
656 
s_glDrawElementsIndirectDataAEMU(void * self,GLenum mode,GLenum type,const void * indirect,GLuint datalen)657 void GLESv2Decoder::s_glDrawElementsIndirectDataAEMU(void* self, GLenum mode, GLenum type, const void* indirect, GLuint datalen) {
658     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
659     ctx->glDrawElementsIndirect(mode, type, indirect);
660 }
661 
s_glDrawElementsIndirectOffsetAEMU(void * self,GLenum mode,GLenum type,GLuint offset)662 void GLESv2Decoder::s_glDrawElementsIndirectOffsetAEMU(void* self, GLenum mode, GLenum type, GLuint offset) {
663     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
664     ctx->glDrawElementsIndirect(mode, type, SafePointerFromUInt(offset));
665 }
666 
s_glFenceSyncAEMU(void * self,GLenum condition,GLbitfield flags)667 uint64_t GLESv2Decoder::s_glFenceSyncAEMU(void* self, GLenum condition, GLbitfield flags) {
668     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
669     return (uint64_t)(uintptr_t)ctx->glFenceSync(condition, flags);
670 }
671 
s_glClientWaitSyncAEMU(void * self,uint64_t wait_on,GLbitfield flags,GLuint64 timeout)672 GLenum GLESv2Decoder::s_glClientWaitSyncAEMU(void* self, uint64_t wait_on, GLbitfield flags, GLuint64 timeout) {
673     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
674     return ctx->glClientWaitSync((GLsync)(uintptr_t)wait_on, flags, timeout);
675 }
676 
s_glWaitSyncAEMU(void * self,uint64_t wait_on,GLbitfield flags,GLuint64 timeout)677 void GLESv2Decoder::s_glWaitSyncAEMU(void* self, uint64_t wait_on, GLbitfield flags, GLuint64 timeout) {
678     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
679     ctx->glWaitSync((GLsync)(uintptr_t)wait_on, flags, timeout);
680 }
681 
s_glDeleteSyncAEMU(void * self,uint64_t to_delete)682 void GLESv2Decoder::s_glDeleteSyncAEMU(void* self, uint64_t to_delete) {
683     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
684     ctx->glDeleteSync((GLsync)(uintptr_t)to_delete);
685 }
686 
s_glIsSyncAEMU(void * self,uint64_t sync)687 GLboolean GLESv2Decoder::s_glIsSyncAEMU(void* self, uint64_t sync) {
688     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
689     return ctx->glIsSync((GLsync)(uintptr_t)sync);
690 }
691 
s_glGetSyncivAEMU(void * self,uint64_t sync,GLenum pname,GLsizei bufSize,GLsizei * length,GLint * values)692 void GLESv2Decoder::s_glGetSyncivAEMU(void* self, uint64_t sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values) {
693     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
694     ctx->glGetSynciv((GLsync)(uintptr_t)sync, pname, bufSize, length, values);
695 }
696 
s_glBufferDataSyncAEMU(void * self,GLenum target,GLsizeiptr size,const GLvoid * data,GLenum usage)697 GLboolean GLESv2Decoder::s_glBufferDataSyncAEMU(void* self, GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage) {
698     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
699     ctx->glBufferData(target, size, data, usage);
700     return GL_TRUE;
701 }
702 
s_glCreateShader(void * self,GLenum shaderType)703 GLuint GLESv2Decoder::s_glCreateShader(void* self, GLenum shaderType) {
704     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
705     GLuint shader = ctx->glCreateShader(shaderType);
706 
707     if (ctx->m_snapshot) {
708         GLuint emuName = ctx->m_snapshot->createShader(shader, shaderType);
709         return emuName;
710     }
711 
712     return shader;
713 }
714 
s_glCreateProgram(void * self)715 GLuint GLESv2Decoder::s_glCreateProgram(void* self) {
716     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
717     return ctx->glCreateProgram();
718 }
719 
s_glGenBuffers(void * self,GLsizei n,GLuint * buffers)720 void GLESv2Decoder::s_glGenBuffers(void* self, GLsizei n, GLuint* buffers) {
721     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
722     ctx->glGenBuffers(n, buffers);
723 
724     if (ctx->m_snapshot) {
725         ctx->m_snapshot->genBuffers(n, buffers);
726     }
727 }
728 
s_glGenFramebuffers(void * self,GLsizei n,GLuint * framebuffers)729 void GLESv2Decoder::s_glGenFramebuffers(void* self, GLsizei n, GLuint* framebuffers) {
730     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
731     ctx->glGenFramebuffers(n, framebuffers);
732     // TODO: Snapshot names
733 }
734 
s_glGenRenderbuffers(void * self,GLsizei n,GLuint * renderbuffers)735 void GLESv2Decoder::s_glGenRenderbuffers(void* self, GLsizei n, GLuint* renderbuffers) {
736     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
737     ctx->glGenRenderbuffers(n, renderbuffers);
738     // TODO: Snapshot names
739 }
740 
s_glGenTextures(void * self,GLsizei n,GLuint * textures)741 void GLESv2Decoder::s_glGenTextures(void* self, GLsizei n, GLuint* textures) {
742     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
743     ctx->glGenTextures(n, textures);
744     // TODO: Snapshot names
745 }
746 
s_glGenVertexArraysOES(void * self,GLsizei n,GLuint * arrays)747 void GLESv2Decoder::s_glGenVertexArraysOES(void* self, GLsizei n, GLuint* arrays) {
748     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
749     ctx->glGenVertexArraysOES(n, arrays);
750     // TODO: Snapshot names
751 }
752 
s_glGenVertexArrays(void * self,GLsizei n,GLuint * arrays)753 void GLESv2Decoder::s_glGenVertexArrays(void* self, GLsizei n, GLuint* arrays) {
754     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
755     ctx->glGenVertexArrays(n, arrays);
756     // TODO: Snapshot names
757 }
758 
s_glGenTransformFeedbacks(void * self,GLsizei n,GLuint * transformFeedbacks)759 void GLESv2Decoder::s_glGenTransformFeedbacks(void* self, GLsizei n, GLuint* transformFeedbacks) {
760     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
761     ctx->glGenTransformFeedbacks(n, transformFeedbacks);
762     // TODO: Snapshot names
763 }
764 
s_glGenSamplers(void * self,GLsizei n,GLuint * samplers)765 void GLESv2Decoder::s_glGenSamplers(void* self, GLsizei n, GLuint* samplers) {
766     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
767     ctx->glGenSamplers(n, samplers);
768     // TODO: Snapshot names
769 
770 }
771 
s_glGenQueries(void * self,GLsizei n,GLuint * queries)772 void GLESv2Decoder::s_glGenQueries(void* self, GLsizei n, GLuint* queries) {
773     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
774     ctx->glGenQueries(n, queries);
775     // TODO: Snapshot names
776 
777 }
778 
s_glGenProgramPipelines(void * self,GLsizei n,GLuint * pipelines)779 void GLESv2Decoder::s_glGenProgramPipelines(void* self, GLsizei n, GLuint* pipelines) {
780     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
781     ctx->glGenProgramPipelines(n, pipelines);
782     // TODO: Snapshot names
783 }
784 
s_glDeleteShader(void * self,GLuint shader)785 void GLESv2Decoder::s_glDeleteShader(void* self, GLuint shader) {
786     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
787     ctx->glDeleteShader(shader);
788     // TODO: Snapshot names
789 }
790 
s_glDeleteProgram(void * self,GLuint program)791 void GLESv2Decoder::s_glDeleteProgram(void* self, GLuint program) {
792     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
793     ctx->glDeleteProgram(program);
794     // TODO: Snapshot names
795 }
796 
s_glDeleteBuffers(void * self,GLsizei n,const GLuint * buffers)797 void GLESv2Decoder::s_glDeleteBuffers(void* self, GLsizei n, const GLuint *buffers) {
798     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
799     ctx->glDeleteBuffers(n, buffers);
800     // TODO: Snapshot names
801 }
802 
s_glDeleteFramebuffers(void * self,GLsizei n,const GLuint * framebuffers)803 void GLESv2Decoder::s_glDeleteFramebuffers(void* self, GLsizei n, const GLuint *framebuffers) {
804     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
805     ctx->glDeleteFramebuffers(n, framebuffers);
806     // TODO: Snapshot names
807 }
808 
s_glDeleteRenderbuffers(void * self,GLsizei n,const GLuint * renderbuffers)809 void GLESv2Decoder::s_glDeleteRenderbuffers(void* self, GLsizei n, const GLuint *renderbuffers) {
810     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
811     ctx->glDeleteRenderbuffers(n, renderbuffers);
812     // TODO: Snapshot names
813 }
814 
s_glDeleteTextures(void * self,GLsizei n,const GLuint * textures)815 void GLESv2Decoder::s_glDeleteTextures(void* self, GLsizei n, const GLuint *textures) {
816     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
817     ctx->glDeleteTextures(n, textures);
818     // TODO: Snapshot names
819 }
820 
821 
s_glDeleteVertexArraysOES(void * self,GLsizei n,const GLuint * arrays)822 void GLESv2Decoder::s_glDeleteVertexArraysOES(void* self, GLsizei n, const GLuint *arrays) {
823     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
824     ctx->glDeleteVertexArraysOES(n, arrays);
825     // TODO: Snapshot names
826 }
827 
s_glDeleteVertexArrays(void * self,GLsizei n,const GLuint * arrays)828 void GLESv2Decoder::s_glDeleteVertexArrays(void* self, GLsizei n, const GLuint *arrays) {
829     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
830     ctx->glDeleteVertexArrays(n, arrays);
831     // TODO: Snapshot names
832 }
833 
834 
s_glDeleteTransformFeedbacks(void * self,GLsizei n,const GLuint * transformFeedbacks)835 void GLESv2Decoder::s_glDeleteTransformFeedbacks(void* self, GLsizei n, const GLuint *transformFeedbacks) {
836     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
837     ctx->glDeleteTransformFeedbacks(n, transformFeedbacks);
838     // TODO: Snapshot names
839 }
840 
s_glDeleteSamplers(void * self,GLsizei n,const GLuint * samplers)841 void GLESv2Decoder::s_glDeleteSamplers(void* self, GLsizei n, const GLuint *samplers) {
842     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
843     ctx->glDeleteSamplers(n, samplers);
844     // TODO: Snapshot names
845 }
846 
s_glDeleteQueries(void * self,GLsizei n,const GLuint * queries)847 void GLESv2Decoder::s_glDeleteQueries(void* self, GLsizei n, const GLuint *queries) {
848     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
849     ctx->glDeleteQueries(n, queries);
850     // TODO: Snapshot names
851 }
852 
s_glDeleteProgramPipelines(void * self,GLsizei n,const GLuint * pipelines)853 void GLESv2Decoder::s_glDeleteProgramPipelines(void* self, GLsizei n, const GLuint *pipelines) {
854     GLESv2Decoder *ctx = (GLESv2Decoder *)self;
855     ctx->glDeleteProgramPipelines(n, pipelines);
856     // TODO: Snapshot names
857 }
858 
859 #define SNAPSHOT_PROGRAM_NAME(x) \
860     GLESv2Decoder *ctx = (GLESv2Decoder *)self; \
861     if (ctx->m_snapshot) { x = ctx->m_snapshot->getProgramName(x); } \
862 
863 #define SNAPSHOT_PROGRAM_NAME2(x,y) \
864     GLESv2Decoder *ctx = (GLESv2Decoder *)self; \
865     if (ctx->m_snapshot) { \
866         x = ctx->m_snapshot->getProgramName(x); \
867         y = ctx->m_snapshot->getProgramName(y); \
868     } \
869 
870 #define SNAPSHOT_SHADER_CALL(funcname,argtypes,args) \
871 void GLESv2Decoder::s_##funcname argtypes { \
872     SNAPSHOT_PROGRAM_NAME(shader) \
873     ctx-> funcname args ; \
874 } \
875 
876 #define SNAPSHOT_PROGRAM_CALL(funcname,argtypes,args) \
877 void GLESv2Decoder::s_##funcname argtypes  { \
878     SNAPSHOT_PROGRAM_NAME(program) \
879     ctx-> funcname args ; \
880 } \
881 
882 #define SNAPSHOT_PROGRAM_CALL_RET(rettype, funcname, argtypes, args) \
883 rettype GLESv2Decoder::s_##funcname argtypes  { \
884     SNAPSHOT_PROGRAM_NAME(program) \
885     return ctx-> funcname args; \
886 } \
887 
888 
s_glShaderString(void * self,GLuint shader,const GLchar * string,GLsizei len)889 void GLESv2Decoder::s_glShaderString(void *self, GLuint shader, const GLchar* string, GLsizei len)
890 {
891     SNAPSHOT_PROGRAM_NAME(shader);
892 
893     ctx->glShaderSource(shader, 1, &string, NULL);
894 
895     if (ctx->m_snapshot) {
896         ctx->m_snapshot->shaderString(shader, string);
897     }
898 }
899 
s_glAttachShader(void * self,GLuint program,GLuint shader)900 void GLESv2Decoder::s_glAttachShader(void* self, GLuint program, GLuint shader) {
901     SNAPSHOT_PROGRAM_NAME2(program, shader)
902     ctx->glAttachShader(program, shader);
903 }
904 
s_glDetachShader(void * self,GLuint program,GLuint shader)905 void GLESv2Decoder::s_glDetachShader(void* self, GLuint program, GLuint shader) {
906     SNAPSHOT_PROGRAM_NAME2(program, shader)
907     ctx->glDetachShader(program, shader);
908 }
909 
s_glIsShader(void * self,GLuint shader)910 GLboolean GLESv2Decoder::s_glIsShader(void* self, GLuint shader) {
911     SNAPSHOT_PROGRAM_NAME(shader);
912     return ctx->glIsShader(shader);
913 }
914 
s_glIsProgram(void * self,GLuint program)915 GLboolean GLESv2Decoder::s_glIsProgram(void* self, GLuint program) {
916     SNAPSHOT_PROGRAM_NAME(program);
917     return ctx->glIsProgram(program);
918 }
919 
920 SNAPSHOT_SHADER_CALL(glCompileShader, (void* self,  GLuint shader), (shader))
921 SNAPSHOT_SHADER_CALL(glGetShaderiv, (void* self,  GLuint shader, GLenum pname, GLint* params), (shader, pname, params))
922 SNAPSHOT_SHADER_CALL(glGetShaderInfoLog, (void* self,  GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog), (shader, bufsize, length, infolog))
923 SNAPSHOT_SHADER_CALL(glGetShaderSource, (void* self,  GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source), (shader, bufsize, length, source))
924 SNAPSHOT_PROGRAM_CALL(glLinkProgram, (void* self,  GLuint program), (program))
925 SNAPSHOT_PROGRAM_CALL(glUseProgram, (void* self,  GLuint program), (program))
926 SNAPSHOT_PROGRAM_CALL(glValidateProgram, (void* self,  GLuint program), (program))
927 SNAPSHOT_PROGRAM_CALL(glGetProgramiv, (void* self,  GLuint program, GLenum pname, GLint* params), (program, pname, params))
928 SNAPSHOT_PROGRAM_CALL(glGetProgramInfoLog, (void* self,  GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog), (program, bufsize, length, infolog))
929 SNAPSHOT_PROGRAM_CALL(glBindAttribLocation, (void* self,  GLuint program, GLuint index, const GLchar* name), (program, index, name))
930 SNAPSHOT_PROGRAM_CALL(glGetActiveAttrib, (void* self,  GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name), (program, index, bufsize, length, size, type, name))
931 SNAPSHOT_PROGRAM_CALL(glGetActiveUniform, (void* self,  GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name), (program, index, bufsize, length, size, type, name))
932 SNAPSHOT_PROGRAM_CALL(glGetAttachedShaders, (void* self,  GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders), (program, maxcount, count, shaders))
933 SNAPSHOT_PROGRAM_CALL_RET(GLint, glGetAttribLocation, (void* self,  GLuint program, const GLchar* name), (program, name))
934 SNAPSHOT_PROGRAM_CALL(glGetUniformfv, (void* self,  GLuint program, GLint location, GLfloat* params), (program, location, params))
935 SNAPSHOT_PROGRAM_CALL(glGetUniformiv, (void* self,  GLuint program, GLint location, GLint* params), (program, location, params))
936 SNAPSHOT_PROGRAM_CALL_RET(GLint, glGetUniformLocation, (void* self,  GLuint program, const GLchar* name), (program, name))
937 SNAPSHOT_PROGRAM_CALL(glGetProgramBinaryOES, (void* self,  GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary), (program, bufSize, length, binaryFormat, binary))
938 SNAPSHOT_PROGRAM_CALL(glProgramBinaryOES, (void* self,  GLuint program, GLenum binaryFormat, const GLvoid* binary, GLint length), (program, binaryFormat, binary, length))
939 SNAPSHOT_PROGRAM_CALL(glUniformBlockBinding, (void* self,  GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding), (program, uniformBlockIndex, uniformBlockBinding))
940 SNAPSHOT_PROGRAM_CALL_RET(GLuint, glGetUniformBlockIndex, (void* self,  GLuint program, const GLchar* uniformBlockName), (program, uniformBlockName))
941 SNAPSHOT_PROGRAM_CALL(glGetActiveUniformBlockiv, (void* self,  GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params), (program, uniformBlockIndex, pname, params))
942 SNAPSHOT_PROGRAM_CALL(glGetActiveUniformBlockName, (void* self,  GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName), (program, uniformBlockIndex, bufSize, length, uniformBlockName))
943 SNAPSHOT_PROGRAM_CALL(glGetUniformuiv, (void* self,  GLuint program, GLint location, GLuint* params), (program, location, params))
944 SNAPSHOT_PROGRAM_CALL(glGetActiveUniformsiv, (void* self,  GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params), (program, uniformCount, uniformIndices, pname, params))
945 SNAPSHOT_PROGRAM_CALL(glTransformFeedbackVaryings, (void* self,  GLuint program, GLsizei count, const char** varyings, GLenum bufferMode), (program, count, varyings, bufferMode))
946 SNAPSHOT_PROGRAM_CALL(glGetTransformFeedbackVarying, (void* self,  GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, char* name), (program, index, bufSize, length, size, type, name))
947 SNAPSHOT_PROGRAM_CALL(glProgramParameteri, (void* self,  GLuint program, GLenum pname, GLint value), (program, pname, value))
948 SNAPSHOT_PROGRAM_CALL(glProgramBinary, (void* self,  GLuint program, GLenum binaryFormat, const void* binary, GLsizei length), (program, binaryFormat, binary, length))
949 SNAPSHOT_PROGRAM_CALL(glGetProgramBinary, (void* self,  GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, void* binary), (program, bufSize, length, binaryFormat, binary))
950 SNAPSHOT_PROGRAM_CALL_RET(GLint, glGetFragDataLocation, (void* self,  GLuint program, const char* name), (program, name))
951 SNAPSHOT_PROGRAM_CALL(glUseProgramStages, (void* self,  GLuint pipeline, GLbitfield stages, GLuint program), (pipeline, stages, program))
952 SNAPSHOT_PROGRAM_CALL(glActiveShaderProgram, (void* self,  GLuint pipeline, GLuint program), (pipeline, program))
953 SNAPSHOT_PROGRAM_CALL(glProgramUniform1f, (void* self,  GLuint program, GLint location, GLfloat v0), (program, location, v0))
954 SNAPSHOT_PROGRAM_CALL(glProgramUniform2f, (void* self,  GLuint program, GLint location, GLfloat v0, GLfloat v1), (program, location, v0, v1))
955 SNAPSHOT_PROGRAM_CALL(glProgramUniform3f, (void* self,  GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2), (program, location, v0, v1, v2))
956 SNAPSHOT_PROGRAM_CALL(glProgramUniform4f, (void* self,  GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3), (program, location, v0, v1, v2, v3))
957 SNAPSHOT_PROGRAM_CALL(glProgramUniform1i, (void* self,  GLuint program, GLint location, GLint v0), (program, location, v0))
958 SNAPSHOT_PROGRAM_CALL(glProgramUniform2i, (void* self,  GLuint program, GLint location, GLint v0, GLint v1), (program, location, v0, v1))
959 SNAPSHOT_PROGRAM_CALL(glProgramUniform3i, (void* self,  GLuint program, GLint location, GLint v0, GLint v1, GLint v2), (program, location, v0, v1, v2))
960 SNAPSHOT_PROGRAM_CALL(glProgramUniform4i, (void* self,  GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3), (program, location, v0, v1, v2, v3))
961 SNAPSHOT_PROGRAM_CALL(glProgramUniform1ui, (void* self,  GLuint program, GLint location, GLuint v0), (program, location, v0))
962 SNAPSHOT_PROGRAM_CALL(glProgramUniform2ui, (void* self,  GLuint program, GLint location, GLint v0, GLuint v1), (program, location, v0, v1))
963 SNAPSHOT_PROGRAM_CALL(glProgramUniform3ui, (void* self,  GLuint program, GLint location, GLint v0, GLint v1, GLuint v2), (program, location, v0, v1, v2))
964 SNAPSHOT_PROGRAM_CALL(glProgramUniform4ui, (void* self,  GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLuint v3), (program, location, v0, v1, v2, v3))
965 SNAPSHOT_PROGRAM_CALL(glProgramUniform1fv, (void* self,  GLuint program, GLint location, GLsizei count, const GLfloat* value), (program, location, count, value))
966 SNAPSHOT_PROGRAM_CALL(glProgramUniform2fv, (void* self,  GLuint program, GLint location, GLsizei count, const GLfloat* value), (program, location, count, value))
967 SNAPSHOT_PROGRAM_CALL(glProgramUniform3fv, (void* self,  GLuint program, GLint location, GLsizei count, const GLfloat* value), (program, location, count, value))
968 SNAPSHOT_PROGRAM_CALL(glProgramUniform4fv, (void* self,  GLuint program, GLint location, GLsizei count, const GLfloat* value), (program, location, count, value))
969 SNAPSHOT_PROGRAM_CALL(glProgramUniform1iv, (void* self,  GLuint program, GLint location, GLsizei count, const GLint* value), (program, location, count, value))
970 SNAPSHOT_PROGRAM_CALL(glProgramUniform2iv, (void* self,  GLuint program, GLint location, GLsizei count, const GLint* value), (program, location, count, value))
971 SNAPSHOT_PROGRAM_CALL(glProgramUniform3iv, (void* self,  GLuint program, GLint location, GLsizei count, const GLint* value), (program, location, count, value))
972 SNAPSHOT_PROGRAM_CALL(glProgramUniform4iv, (void* self,  GLuint program, GLint location, GLsizei count, const GLint* value), (program, location, count, value))
973 SNAPSHOT_PROGRAM_CALL(glProgramUniform1uiv, (void* self,  GLuint program, GLint location, GLsizei count, const GLuint* value), (program, location, count, value))
974 SNAPSHOT_PROGRAM_CALL(glProgramUniform2uiv, (void* self,  GLuint program, GLint location, GLsizei count, const GLuint* value), (program, location, count, value))
975 SNAPSHOT_PROGRAM_CALL(glProgramUniform3uiv, (void* self,  GLuint program, GLint location, GLsizei count, const GLuint* value), (program, location, count, value))
976 SNAPSHOT_PROGRAM_CALL(glProgramUniform4uiv, (void* self,  GLuint program, GLint location, GLsizei count, const GLuint* value), (program, location, count, value))
977 SNAPSHOT_PROGRAM_CALL(glProgramUniformMatrix2fv, (void* self,  GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value), (program, location, count, transpose, value))
978 SNAPSHOT_PROGRAM_CALL(glProgramUniformMatrix3fv, (void* self,  GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value), (program, location, count, transpose, value))
979 SNAPSHOT_PROGRAM_CALL(glProgramUniformMatrix4fv, (void* self,  GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value), (program, location, count, transpose, value))
980 SNAPSHOT_PROGRAM_CALL(glProgramUniformMatrix2x3fv, (void* self,  GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value), (program, location, count, transpose, value))
981 SNAPSHOT_PROGRAM_CALL(glProgramUniformMatrix3x2fv, (void* self,  GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value), (program, location, count, transpose, value))
982 SNAPSHOT_PROGRAM_CALL(glProgramUniformMatrix2x4fv, (void* self,  GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value), (program, location, count, transpose, value))
983 SNAPSHOT_PROGRAM_CALL(glProgramUniformMatrix4x2fv, (void* self,  GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value), (program, location, count, transpose, value))
984 SNAPSHOT_PROGRAM_CALL(glProgramUniformMatrix3x4fv, (void* self,  GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value), (program, location, count, transpose, value))
985 SNAPSHOT_PROGRAM_CALL(glProgramUniformMatrix4x3fv, (void* self,  GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value), (program, location, count, transpose, value))
986 SNAPSHOT_PROGRAM_CALL(glGetProgramInterfaceiv, (void* self,  GLuint program, GLenum programInterface, GLenum pname, GLint* params), (program, programInterface, pname, params))
987 SNAPSHOT_PROGRAM_CALL(glGetProgramResourceiv, (void* self,  GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei* length, GLint* params), (program, programInterface, index, propCount, props, bufSize, length, params))
988 SNAPSHOT_PROGRAM_CALL_RET(GLuint, glGetProgramResourceIndex, (void* self, GLuint program, GLenum programInterface, const char * name), (program, programInterface, name))
989 SNAPSHOT_PROGRAM_CALL_RET(GLint, glGetProgramResourceLocation, (void* self, GLuint program, GLenum programInterface, const char * name), (program, programInterface, name))
990 SNAPSHOT_PROGRAM_CALL(glGetProgramResourceName, (void* self,  GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, char* name), (program, programInterface, index, bufSize, length, name))
991