/*
 * Copyright 2015, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * THIS FILE WAS GENERATED BY apic. DO NOT EDIT.
 */

#ifndef GAPII_GLES_SPY_H
#define GAPII_GLES_SPY_H

#include "gles_imports.h"
#include "gles_types.h"

#include "spy_base.h"

#include <gapic/log.h>
#include <gapic/coder/memory.h>
#include <gapic/coder/atom.h>
#include <gapic/coder/gles.h>

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

#include <memory>
#include <string>

using gapic::coder::atom::Observations;

namespace gapii {

class GlesSpy : public SpyBase {
public:
    inline void init(std::shared_ptr<gapic::Encoder> encoder);

    inline void glBlendBarrierKHR();
    inline void glBlendEquationSeparateiEXT(uint32_t buf, uint32_t modeRGB, uint32_t modeAlpha);
    inline void glBlendEquationiEXT(uint32_t buf, uint32_t mode);
    inline void glBlendFuncSeparateiEXT(uint32_t buf, uint32_t srcRGB, uint32_t dstRGB,
                                        uint32_t srcAlpha, uint32_t dstAlpha);
    inline void glBlendFunciEXT(uint32_t buf, uint32_t src, uint32_t dst);
    inline void glColorMaskiEXT(uint32_t index, uint8_t r, uint8_t g, uint8_t b, uint8_t a);
    inline void glCopyImageSubDataEXT(uint32_t srcName, uint32_t srcTarget, int32_t srcLevel,
                                      int32_t srcX, int32_t srcY, int32_t srcZ, uint32_t dstName,
                                      uint32_t dstTarget, int32_t dstLevel, int32_t dstX,
                                      int32_t dstY, int32_t dstZ, int32_t srcWidth,
                                      int32_t srcHeight, int32_t srcDepth);
    inline void glDebugMessageCallbackKHR(void* callback, void* userParam);
    inline void glDebugMessageControlKHR(uint32_t source, uint32_t type, uint32_t severity,
                                         int32_t count, uint32_t* ids, uint8_t enabled);
    inline void glDebugMessageInsertKHR(uint32_t source, uint32_t type, uint32_t id,
                                        uint32_t severity, int32_t length, char* buf);
    inline void glDisableiEXT(uint32_t target, uint32_t index);
    inline void glEnableiEXT(uint32_t target, uint32_t index);
    inline void glFramebufferTextureEXT(uint32_t target, uint32_t attachment, uint32_t texture,
                                        int32_t level);
    inline uint32_t glGetDebugMessageLogKHR(uint32_t count, int32_t bufSize, uint32_t* sources,
                                            uint32_t* types, uint32_t* ids, uint32_t* severities,
                                            int32_t* lengths, char* messageLog);
    inline void glGetObjectLabelKHR(uint32_t identifier, uint32_t name, int32_t bufSize,
                                    int32_t* length, char* label);
    inline void glGetObjectPtrLabelKHR(void* ptr, int32_t bufSize, int32_t* length, char* label);
    inline void glGetPointervKHR(uint32_t pname, void** params);
    inline void glGetSamplerParameterIivEXT(uint32_t sampler, uint32_t pname, int32_t* params);
    inline void glGetSamplerParameterIuivEXT(uint32_t sampler, uint32_t pname, uint32_t* params);
    inline void glGetTexParameterIivEXT(uint32_t target, uint32_t pname, int32_t* params);
    inline void glGetTexParameterIuivEXT(uint32_t target, uint32_t pname, uint32_t* params);
    inline uint8_t glIsEnablediEXT(uint32_t target, uint32_t index);
    inline void glMinSampleShadingOES(float value);
    inline void glObjectLabelKHR(uint32_t identifier, uint32_t name, int32_t length, char* label);
    inline void glObjectPtrLabelKHR(void* ptr, int32_t length, char* label);
    inline void glPatchParameteriEXT(uint32_t pname, int32_t value);
    inline void glPopDebugGroupKHR();
    inline void glPrimitiveBoundingBoxEXT(float minX, float minY, float minZ, float minW,
                                          float maxX, float maxY, float maxZ, float maxW);
    inline void glPushDebugGroupKHR(uint32_t source, uint32_t id, int32_t length, char* message);
    inline void glSamplerParameterIivEXT(uint32_t sampler, uint32_t pname, int32_t* param);
    inline void glSamplerParameterIuivEXT(uint32_t sampler, uint32_t pname, uint32_t* param);
    inline void glTexBufferEXT(uint32_t target, uint32_t internalformat, uint32_t buffer);
    inline void glTexBufferRangeEXT(uint32_t target, uint32_t internalformat, uint32_t buffer,
                                    int32_t offset, int32_t size);
    inline void glTexParameterIivEXT(uint32_t target, uint32_t pname, int32_t* params);
    inline void glTexParameterIuivEXT(uint32_t target, uint32_t pname, uint32_t* params);
    inline void glTexStorage3DMultisampleOES(uint32_t target, int32_t samples,
                                             uint32_t internalformat, int32_t width, int32_t height,
                                             int32_t depth, uint8_t fixedsamplelocations);
    inline void glBeginQuery(uint32_t target, uint32_t query);
    inline void glDeleteQueries(int32_t count, uint32_t* queries);
    inline void glEndQuery(uint32_t target);
    inline void glGenQueries(int32_t count, uint32_t* queries);
    inline void glGetQueryObjectuiv(uint32_t query, uint32_t parameter, uint32_t* value);
    inline void glGetQueryiv(uint32_t target, uint32_t parameter, int32_t* value);
    inline uint8_t glIsQuery(uint32_t query);
    inline void glBindBuffer(uint32_t target, uint32_t buffer);
    inline void glBindBufferBase(uint32_t target, uint32_t index, uint32_t buffer);
    inline void glBindBufferRange(uint32_t target, uint32_t index, uint32_t buffer, int32_t offset,
                                  int32_t size);
    inline void glBufferData(uint32_t target, int32_t size, void* data, uint32_t usage);
    inline void glBufferSubData(uint32_t target, int32_t offset, int32_t size, void* data);
    inline void glCopyBufferSubData(uint32_t readTarget, uint32_t writeTarget, int32_t readOffset,
                                    int32_t writeOffset, int32_t size);
    inline void glDeleteBuffers(int32_t count, uint32_t* buffers);
    inline void glGenBuffers(int32_t count, uint32_t* buffers);
    inline void glGetBufferParameteri64v(uint32_t target, uint32_t pname, int64_t* params);
    inline void glGetBufferParameteriv(uint32_t target, uint32_t parameter, int32_t* value);
    inline void glGetBufferPointerv(uint32_t target, uint32_t pname, void** params);
    inline uint8_t glIsBuffer(uint32_t buffer);
    inline void* glMapBufferRange(uint32_t target, int32_t offset, int32_t length, uint32_t access);
    inline uint8_t glUnmapBuffer(uint32_t target);
    inline void glDrawArrays(uint32_t draw_mode, int32_t first_index, int32_t index_count);
    inline void glDrawArraysIndirect(uint32_t mode, void* indirect);
    inline void glDrawArraysInstanced(uint32_t mode, int32_t first, int32_t count,
                                      int32_t instancecount);
    inline void glDrawBuffers(int32_t n, uint32_t* bufs);
    inline void glDrawElements(uint32_t draw_mode, int32_t element_count, uint32_t indices_type,
                               void* indices);
    inline void glDrawElementsIndirect(uint32_t mode, uint32_t type, void* indirect);
    inline void glDrawElementsInstanced(uint32_t mode, int32_t count, uint32_t type, void* indices,
                                        int32_t instancecount);
    inline void glDrawRangeElements(uint32_t mode, uint32_t start, uint32_t end, int32_t count,
                                    uint32_t type, void* indices);
    inline void glActiveShaderProgramEXT(uint32_t pipeline, uint32_t program);
    inline void glAlphaFuncQCOM(uint32_t func, float ref);
    inline void glBeginConditionalRenderNV(uint32_t id, uint32_t mode);
    inline void glBeginPerfMonitorAMD(uint32_t monitor);
    inline void glBeginPerfQueryINTEL(uint32_t queryHandle);
    inline void glBeginQueryEXT(uint32_t target, uint32_t query);
    inline void glBindProgramPipelineEXT(uint32_t pipeline);
    inline void glBindVertexArrayOES(uint32_t array);
    inline void glBlendBarrierNV();
    inline void glBlendEquationSeparateiOES(uint32_t buf, uint32_t modeRGB, uint32_t modeAlpha);
    inline void glBlendEquationiOES(uint32_t buf, uint32_t mode);
    inline void glBlendFuncSeparateiOES(uint32_t buf, uint32_t srcRGB, uint32_t dstRGB,
                                        uint32_t srcAlpha, uint32_t dstAlpha);
    inline void glBlendFunciOES(uint32_t buf, uint32_t src, uint32_t dst);
    inline void glBlendParameteriNV(uint32_t pname, int32_t value);
    inline void glBlitFramebufferANGLE(int32_t srcX0, int32_t srcY0, int32_t srcX1, int32_t srcY1,
                                       int32_t dstX0, int32_t dstY0, int32_t dstX1, int32_t dstY1,
                                       uint32_t mask, uint32_t filter);
    inline void glBlitFramebufferNV(int32_t srcX0, int32_t srcY0, int32_t srcX1, int32_t srcY1,
                                    int32_t dstX0, int32_t dstY0, int32_t dstX1, int32_t dstY1,
                                    uint32_t mask, uint32_t filter);
    inline void glBufferStorageEXT(uint32_t target, int32_t size, void* data, uint32_t flag);
    inline uint32_t glClientWaitSyncAPPLE(uint64_t sync, uint32_t flag, uint64_t timeout);
    inline void glColorMaskiOES(uint32_t index, uint8_t r, uint8_t g, uint8_t b, uint8_t a);
    inline void glCompressedTexImage3DOES(uint32_t target, int32_t level, uint32_t internalformat,
                                          int32_t width, int32_t height, int32_t depth,
                                          int32_t border, int32_t imageSize, void* data);
    inline void glCompressedTexSubImage3DOES(uint32_t target, int32_t level, int32_t xoffset,
                                             int32_t yoffset, int32_t zoffset, int32_t width,
                                             int32_t height, int32_t depth, uint32_t format,
                                             int32_t imageSize, void* data);
    inline void glCopyBufferSubDataNV(uint32_t readTarget, uint32_t writeTarget, int32_t readOffset,
                                      int32_t writeOffset, int32_t size);
    inline void glCopyImageSubDataOES(uint32_t srcName, uint32_t srcTarget, int32_t srcLevel,
                                      int32_t srcX, int32_t srcY, int32_t srcZ, uint32_t dstName,
                                      uint32_t dstTarget, int32_t dstLevel, int32_t dstX,
                                      int32_t dstY, int32_t dstZ, int32_t srcWidth,
                                      int32_t srcHeight, int32_t srcDepth);
    inline void glCopyPathNV(uint32_t resultPath, uint32_t srcPath);
    inline void glCopyTexSubImage3DOES(uint32_t target, int32_t level, int32_t xoffset,
                                       int32_t yoffset, int32_t zoffset, int32_t x, int32_t y,
                                       int32_t width, int32_t height);
    inline void glCopyTextureLevelsAPPLE(uint32_t destinationTexture, uint32_t sourceTexture,
                                         int32_t sourceBaseLevel, int32_t sourceLevelCount);
    inline void glCoverFillPathInstancedNV(int32_t numPaths, uint32_t pathNameType, void* paths,
                                           uint32_t pathBase, uint32_t coverMode,
                                           uint32_t transformType, float* transformValues);
    inline void glCoverFillPathNV(uint32_t path, uint32_t coverMode);
    inline void glCoverStrokePathInstancedNV(int32_t numPaths, uint32_t pathNameType, void* paths,
                                             uint32_t pathBase, uint32_t coverMode,
                                             uint32_t transformType, float* transformValues);
    inline void glCoverStrokePathNV(uint32_t path, uint32_t coverMode);
    inline void glCoverageMaskNV(uint8_t mask);
    inline void glCoverageOperationNV(uint32_t operation);
    inline void glCreatePerfQueryINTEL(uint32_t queryId, uint32_t* queryHandle);
    inline uint32_t glCreateShaderProgramvEXT(uint32_t type, int32_t count, char** strings);
    inline void glDeleteFencesNV(int32_t n, uint32_t* fences);
    inline void glDeletePathsNV(uint32_t path, int32_t range);
    inline void glDeletePerfMonitorsAMD(int32_t n, uint32_t* monitors);
    inline void glDeletePerfQueryINTEL(uint32_t queryHandle);
    inline void glDeleteProgramPipelinesEXT(int32_t n, uint32_t* pipelines);
    inline void glDeleteQueriesEXT(int32_t count, uint32_t* queries);
    inline void glDeleteSyncAPPLE(uint64_t sync);
    inline void glDeleteVertexArraysOES(int32_t count, uint32_t* arrays);
    inline void glDepthRangeArrayfvNV(uint32_t first, int32_t count, float* v);
    inline void glDepthRangeIndexedfNV(uint32_t index, float n, float f);
    inline void glDisableDriverControlQCOM(uint32_t driverControl);
    inline void glDisableiNV(uint32_t target, uint32_t index);
    inline void glDisableiOES(uint32_t target, uint32_t index);
    inline void glDiscardFramebufferEXT(uint32_t target, int32_t numAttachments,
                                        uint32_t* attachments);
    inline void glDrawArraysInstancedANGLE(uint32_t mode, int32_t first, int32_t count,
                                           int32_t primcount);
    inline void glDrawArraysInstancedBaseInstanceEXT(uint32_t mode, int32_t first, int32_t count,
                                                     int32_t instancecount, uint32_t baseinstance);
    inline void glDrawArraysInstancedEXT(uint32_t mode, int32_t start, int32_t count,
                                         int32_t primcount);
    inline void glDrawArraysInstancedNV(uint32_t mode, int32_t first, int32_t count,
                                        int32_t primcount);
    inline void glDrawBuffersEXT(int32_t n, uint32_t* bufs);
    inline void glDrawBuffersIndexedEXT(int32_t n, uint32_t* location, int32_t* indices);
    inline void glDrawBuffersNV(int32_t n, uint32_t* bufs);
    inline void glDrawElementsBaseVertexEXT(uint32_t mode, int32_t count, uint32_t type,
                                            void* indices, int32_t basevertex);
    inline void glDrawElementsBaseVertexOES(uint32_t mode, int32_t count, uint32_t type,
                                            void* indices, int32_t basevertex);
    inline void glDrawElementsInstancedANGLE(uint32_t mode, int32_t count, uint32_t type,
                                             void* indices, int32_t primcount);
    inline void glDrawElementsInstancedBaseInstanceEXT(uint32_t mode, int32_t count, uint32_t type,
                                                       void* indices, int32_t instancecount,
                                                       uint32_t baseinstance);
    inline void glDrawElementsInstancedBaseVertexEXT(uint32_t mode, int32_t count, uint32_t type,
                                                     void* indices, int32_t instancecount,
                                                     int32_t basevertex);
    inline void glDrawElementsInstancedBaseVertexOES(uint32_t mode, int32_t count, uint32_t type,
                                                     void* indices, int32_t instancecount,
                                                     int32_t basevertex);
    inline void glDrawElementsInstancedBaseVertexBaseInstanceEXT(uint32_t mode, int32_t count,
                                                                 uint32_t type, void* indices,
                                                                 int32_t instancecount,
                                                                 int32_t basevertex,
                                                                 uint32_t baseinstance);
    inline void glDrawElementsInstancedEXT(uint32_t mode, int32_t count, uint32_t type,
                                           void* indices, int32_t primcount);
    inline void glDrawElementsInstancedNV(uint32_t mode, int32_t count, uint32_t type,
                                          void* indices, int32_t primcount);
    inline void glDrawRangeElementsBaseVertexEXT(uint32_t mode, uint32_t start, uint32_t end,
                                                 int32_t count, uint32_t type, void* indices,
                                                 int32_t basevertex);
    inline void glDrawRangeElementsBaseVertexOES(uint32_t mode, uint32_t start, uint32_t end,
                                                 int32_t count, uint32_t type, void* indices,
                                                 int32_t basevertex);
    inline void glEGLImageTargetRenderbufferStorageOES(uint32_t target, void* image);
    inline void glEGLImageTargetTexture2DOES(uint32_t target, void* image);
    inline void glEnableDriverControlQCOM(uint32_t driverControl);
    inline void glEnableiNV(uint32_t target, uint32_t index);
    inline void glEnableiOES(uint32_t target, uint32_t index);
    inline void glEndConditionalRenderNV();
    inline void glEndPerfMonitorAMD(uint32_t monitor);
    inline void glEndPerfQueryINTEL(uint32_t queryHandle);
    inline void glEndQueryEXT(uint32_t target);
    inline void glEndTilingQCOM(uint32_t preserve_mask);
    inline void glExtGetBufferPointervQCOM(uint32_t target, void** params);
    inline void glExtGetBuffersQCOM(uint32_t* buffers, int32_t maxBuffers, int32_t* numBuffers);
    inline void glExtGetFramebuffersQCOM(uint32_t* framebuffers, int32_t maxFramebuffers,
                                         int32_t* numFramebuffers);
    inline void glExtGetProgramBinarySourceQCOM(uint32_t program, uint32_t shadertype, char* source,
                                                int32_t* length);
    inline void glExtGetProgramsQCOM(uint32_t* programs, int32_t maxPrograms, int32_t* numPrograms);
    inline void glExtGetRenderbuffersQCOM(uint32_t* renderbuffers, int32_t maxRenderbuffers,
                                          int32_t* numRenderbuffers);
    inline void glExtGetShadersQCOM(uint32_t* shaders, int32_t maxShaders, int32_t* numShaders);
    inline void glExtGetTexLevelParameterivQCOM(uint32_t texture, uint32_t face, int32_t level,
                                                uint32_t pname, int32_t* params);
    inline void glExtGetTexSubImageQCOM(uint32_t target, int32_t level, int32_t xoffset,
                                        int32_t yoffset, int32_t zoffset, int32_t width,
                                        int32_t height, int32_t depth, uint32_t format,
                                        uint32_t type, void* texels);
    inline void glExtGetTexturesQCOM(uint32_t* textures, int32_t maxTextures, int32_t* numTextures);
    inline uint8_t glExtIsProgramBinaryQCOM(uint32_t program);
    inline void glExtTexObjectStateOverrideiQCOM(uint32_t target, uint32_t pname, int32_t param);
    inline uint64_t glFenceSyncAPPLE(uint32_t condition, uint32_t flag);
    inline void glFinishFenceNV(uint32_t fence);
    inline void glFlushMappedBufferRangeEXT(uint32_t target, int32_t offset, int32_t length);
    inline void glFramebufferTexture2DMultisampleEXT(uint32_t target, uint32_t attachment,
                                                     uint32_t textarget, uint32_t texture,
                                                     int32_t level, int32_t samples);
    inline void glFramebufferTexture2DMultisampleIMG(uint32_t target, uint32_t attachment,
                                                     uint32_t textarget, uint32_t texture,
                                                     int32_t level, int32_t samples);
    inline void glFramebufferTexture3DOES(uint32_t target, uint32_t attachment, uint32_t textarget,
                                          uint32_t texture, int32_t level, int32_t zoffset);
    inline void glFramebufferTextureOES(uint32_t target, uint32_t attachment, uint32_t texture,
                                        int32_t level);
    inline void glFramebufferTextureMultiviewOVR(uint32_t target, uint32_t attachment,
                                                 uint32_t texture, int32_t level,
                                                 int32_t baseViewIndex, int32_t numViews);
    inline void glGenFencesNV(int32_t n, uint32_t* fences);
    inline uint32_t glGenPathsNV(int32_t range);
    inline void glGenPerfMonitorsAMD(int32_t n, uint32_t* monitors);
    inline void glGenProgramPipelinesEXT(int32_t n, uint32_t* pipelines);
    inline void glGenQueriesEXT(int32_t count, uint32_t* queries);
    inline void glGenVertexArraysOES(int32_t count, uint32_t* arrays);
    inline void glGetBufferPointervOES(uint32_t target, uint32_t pname, void** params);
    inline void glGetDriverControlStringQCOM(uint32_t driverControl, int32_t bufSize,
                                             int32_t* length, char* driverControlString);
    inline void glGetDriverControlsQCOM(int32_t* num, int32_t size, uint32_t* driverControls);
    inline void glGetFenceivNV(uint32_t fence, uint32_t pname, int32_t* params);
    inline void glGetFirstPerfQueryIdINTEL(uint32_t* queryId);
    inline void glGetFloati_vNV(uint32_t target, uint32_t index, float* data);
    inline uint32_t glGetGraphicsResetStatusEXT();
    inline uint32_t glGetGraphicsResetStatusKHR();
    inline uint64_t glGetImageHandleNV(uint32_t texture, int32_t level, uint8_t layered,
                                       int32_t layer, uint32_t format);
    inline void glGetInteger64vAPPLE(uint32_t pname, int64_t* params);
    inline void glGetIntegeri_vEXT(uint32_t target, uint32_t index, int32_t* data);
    inline void glGetInternalformatSampleivNV(uint32_t target, uint32_t internalformat,
                                              int32_t samples, uint32_t pname, int32_t bufSize,
                                              int32_t* params);
    inline void glGetNextPerfQueryIdINTEL(uint32_t queryId, uint32_t* nextQueryId);
    inline void glGetObjectLabelEXT(uint32_t type, uint32_t object, int32_t bufSize,
                                    int32_t* length, char* label);
    inline void glGetPathCommandsNV(uint32_t path, uint8_t* commands);
    inline void glGetPathCoordsNV(uint32_t path, float* coords);
    inline void glGetPathDashArrayNV(uint32_t path, float* dashArray);
    inline float glGetPathLengthNV(uint32_t path, int32_t startSegment, int32_t numSegments);
    inline void glGetPathMetricRangeNV(uint32_t metricQueryMask, uint32_t firstPathName,
                                       int32_t numPaths, int32_t stride, float* metrics);
    inline void glGetPathMetricsNV(uint32_t metricQueryMask, int32_t numPaths,
                                   uint32_t pathNameType, void* paths, uint32_t pathBase,
                                   int32_t stride, float* metrics);
    inline void glGetPathParameterfvNV(uint32_t path, uint32_t pname, float* value);
    inline void glGetPathParameterivNV(uint32_t path, uint32_t pname, int32_t* value);
    inline void glGetPathSpacingNV(uint32_t pathListMode, int32_t numPaths, uint32_t pathNameType,
                                   void* paths, uint32_t pathBase, float advanceScale,
                                   float kerningScale, uint32_t transformType,
                                   float* returnedSpacing);
    inline void glGetPerfCounterInfoINTEL(uint32_t queryId, uint32_t counterId,
                                          uint32_t counterNameLength, char* counterName,
                                          uint32_t counterDescLength, char* counterDesc,
                                          uint32_t* counterOffset, uint32_t* counterDataSize,
                                          uint32_t* counterTypeEnum, uint32_t* counterDataTypeEnum,
                                          uint64_t* rawCounterMaxValue);
    inline void glGetPerfMonitorCounterDataAMD(uint32_t monitor, uint32_t pname, int32_t dataSize,
                                               uint32_t* data, int32_t* bytesWritten);
    inline void glGetPerfMonitorCounterInfoAMD(uint32_t group, uint32_t counter, uint32_t pname,
                                               void* data);
    inline void glGetPerfMonitorCounterStringAMD(uint32_t group, uint32_t counter, int32_t bufSize,
                                                 int32_t* length, char* counterString);
    inline void glGetPerfMonitorCountersAMD(uint32_t group, int32_t* numCounters,
                                            int32_t* maxActiveCounters, int32_t counterSize,
                                            uint32_t* counters);
    inline void glGetPerfMonitorGroupStringAMD(uint32_t group, int32_t bufSize, int32_t* length,
                                               char* groupString);
    inline void glGetPerfMonitorGroupsAMD(int32_t* numGroups, int32_t groupsSize, uint32_t* groups);
    inline void glGetPerfQueryDataINTEL(uint32_t queryHandle, uint32_t flag, int32_t dataSize,
                                        void* data, uint32_t* bytesWritten);
    inline void glGetPerfQueryIdByNameINTEL(char* queryName, uint32_t* queryId);
    inline void glGetPerfQueryInfoINTEL(uint32_t queryId, uint32_t queryNameLength, char* queryName,
                                        uint32_t* dataSize, uint32_t* noCounters,
                                        uint32_t* noInstances, uint32_t* capsMask);
    inline void glGetProgramBinaryOES(uint32_t program, int32_t buffer_size, int32_t* bytes_written,
                                      uint32_t* binary_format, void* binary);
    inline void glGetProgramPipelineInfoLogEXT(uint32_t pipeline, int32_t bufSize, int32_t* length,
                                               char* infoLog);
    inline void glGetProgramPipelineivEXT(uint32_t pipeline, uint32_t pname, int32_t* params);
    inline void glGetProgramResourcefvNV(uint32_t program, uint32_t programInterface,
                                         uint32_t index, int32_t propCount, uint32_t* props,
                                         int32_t bufSize, int32_t* length, float* params);
    inline void glGetQueryObjecti64vEXT(uint32_t query, uint32_t parameter, int64_t* value);
    inline void glGetQueryObjectivEXT(uint32_t query, uint32_t parameter, int32_t* value);
    inline void glGetQueryObjectui64vEXT(uint32_t query, uint32_t parameter, uint64_t* value);
    inline void glGetQueryObjectuivEXT(uint32_t query, uint32_t parameter, uint32_t* value);
    inline void glGetQueryivEXT(uint32_t target, uint32_t parameter, int32_t* value);
    inline void glGetSamplerParameterIivOES(uint32_t sampler, uint32_t pname, int32_t* params);
    inline void glGetSamplerParameterIuivOES(uint32_t sampler, uint32_t pname, uint32_t* params);
    inline void glGetSyncivAPPLE(uint64_t sync, uint32_t pname, int32_t bufSize, int32_t* length,
                                 int32_t* values);
    inline void glGetTexParameterIivOES(uint32_t target, uint32_t pname, int32_t* params);
    inline void glGetTexParameterIuivOES(uint32_t target, uint32_t pname, uint32_t* params);
    inline uint64_t glGetTextureHandleNV(uint32_t texture);
    inline uint64_t glGetTextureSamplerHandleNV(uint32_t texture, uint32_t sampler);
    inline void glGetTranslatedShaderSourceANGLE(uint32_t shader, int32_t bufsize, int32_t* length,
                                                 char* source);
    inline void glGetnUniformfvEXT(uint32_t program, int32_t location, int32_t bufSize,
                                   float* params);
    inline void glGetnUniformfvKHR(uint32_t program, int32_t location, int32_t bufSize,
                                   float* params);
    inline void glGetnUniformivEXT(uint32_t program, int32_t location, int32_t bufSize,
                                   int32_t* params);
    inline void glGetnUniformivKHR(uint32_t program, int32_t location, int32_t bufSize,
                                   int32_t* params);
    inline void glGetnUniformuivKHR(uint32_t program, int32_t location, int32_t bufSize,
                                    uint32_t* params);
    inline void glInsertEventMarkerEXT(int32_t length, char* marker);
    inline void glInterpolatePathsNV(uint32_t resultPath, uint32_t pathA, uint32_t pathB,
                                     float weight);
    inline uint8_t glIsEnablediOES(uint32_t target, uint32_t index);
    inline uint8_t glIsEnablediNV(uint32_t target, uint32_t index);
    inline uint8_t glIsFenceNV(uint32_t fence);
    inline uint8_t glIsImageHandleResidentNV(uint64_t handle);
    inline uint8_t glIsPathNV(uint32_t path);
    inline uint8_t glIsPointInFillPathNV(uint32_t path, uint32_t mask, float x, float y);
    inline uint8_t glIsPointInStrokePathNV(uint32_t path, float x, float y);
    inline uint8_t glIsProgramPipelineEXT(uint32_t pipeline);
    inline uint8_t glIsQueryEXT(uint32_t query);
    inline uint8_t glIsSyncAPPLE(uint64_t sync);
    inline uint8_t glIsTextureHandleResidentNV(uint64_t handle);
    inline uint8_t glIsVertexArrayOES(uint32_t array);
    inline void glLabelObjectEXT(uint32_t type, uint32_t object, int32_t length, char* label);
    inline void glMakeImageHandleNonResidentNV(uint64_t handle);
    inline void glMakeImageHandleResidentNV(uint64_t handle, uint32_t access);
    inline void glMakeTextureHandleNonResidentNV(uint64_t handle);
    inline void glMakeTextureHandleResidentNV(uint64_t handle);
    inline void* glMapBufferOES(uint32_t target, uint32_t access);
    inline void* glMapBufferRangeEXT(uint32_t target, int32_t offset, int32_t length,
                                     uint32_t access);
    inline void glMatrixLoad3x2fNV(uint32_t matrixMode, float* m);
    inline void glMatrixLoad3x3fNV(uint32_t matrixMode, float* m);
    inline void glMatrixLoadTranspose3x3fNV(uint32_t matrixMode, float* m);
    inline void glMatrixMult3x2fNV(uint32_t matrixMode, float* m);
    inline void glMatrixMult3x3fNV(uint32_t matrixMode, float* m);
    inline void glMatrixMultTranspose3x3fNV(uint32_t matrixMode, float* m);
    inline void glMultiDrawArraysEXT(uint32_t mode, int32_t* first, int32_t* count,
                                     int32_t primcount);
    inline void glMultiDrawArraysIndirectEXT(uint32_t mode, void* indirect, int32_t drawcount,
                                             int32_t stride);
    inline void glMultiDrawElementsBaseVertexEXT(uint32_t mode, int32_t* count, uint32_t type,
                                                 void** indices, int32_t primcount,
                                                 int32_t* basevertex);
    inline void glMultiDrawElementsBaseVertexOES(uint32_t mode, int32_t* count, uint32_t type,
                                                 void** indices, int32_t primcount,
                                                 int32_t* basevertex);
    inline void glMultiDrawElementsEXT(uint32_t mode, int32_t* count, uint32_t type, void** indices,
                                       int32_t primcount);
    inline void glMultiDrawElementsIndirectEXT(uint32_t mode, uint32_t type, void* indirect,
                                               int32_t drawcount, int32_t stride);
    inline void glPatchParameteriOES(uint32_t pname, int32_t value);
    inline void glPathCommandsNV(uint32_t path, int32_t numCommands, uint8_t* commands,
                                 int32_t numCoords, uint32_t coordType, void* coords);
    inline void glPathCoordsNV(uint32_t path, int32_t numCoords, uint32_t coordType, void* coords);
    inline void glPathCoverDepthFuncNV(uint32_t func);
    inline void glPathDashArrayNV(uint32_t path, int32_t dashCount, float* dashArray);
    inline uint32_t glPathGlyphIndexArrayNV(uint32_t firstPathName, uint32_t fontTarget,
                                            void* fontName, uint32_t fontStyle,
                                            uint32_t firstGlyphIndex, int32_t numGlyphs,
                                            uint32_t pathParameterTemplate, float emScale);
    inline uint32_t glPathGlyphIndexRangeNV(uint32_t fontTarget, void* fontName, uint32_t fontStyle,
                                            uint32_t pathParameterTemplate, float emScale,
                                            uint32_t baseAndCount);
    inline void glPathGlyphRangeNV(uint32_t firstPathName, uint32_t fontTarget, void* fontName,
                                   uint32_t fontStyle, uint32_t firstGlyph, int32_t numGlyphs,
                                   uint32_t handleMissingGlyphs, uint32_t pathParameterTemplate,
                                   float emScale);
    inline void glPathGlyphsNV(uint32_t firstPathName, uint32_t fontTarget, void* fontName,
                               uint32_t fontStyle, int32_t numGlyphs, uint32_t type,
                               void* charcodes, uint32_t handleMissingGlyphs,
                               uint32_t pathParameterTemplate, float emScale);
    inline uint32_t glPathMemoryGlyphIndexArrayNV(uint32_t firstPathName, uint32_t fontTarget,
                                                  int32_t fontSize, void* fontData,
                                                  int32_t faceIndex, uint32_t firstGlyphIndex,
                                                  int32_t numGlyphs, uint32_t pathParameterTemplate,
                                                  float emScale);
    inline void glPathParameterfNV(uint32_t path, uint32_t pname, float value);
    inline void glPathParameterfvNV(uint32_t path, uint32_t pname, float* value);
    inline void glPathParameteriNV(uint32_t path, uint32_t pname, int32_t value);
    inline void glPathParameterivNV(uint32_t path, uint32_t pname, int32_t* value);
    inline void glPathStencilDepthOffsetNV(float factor, float units);
    inline void glPathStencilFuncNV(uint32_t func, int32_t ref, uint32_t mask);
    inline void glPathStringNV(uint32_t path, uint32_t format, int32_t length, void* pathString);
    inline void glPathSubCommandsNV(uint32_t path, int32_t commandStart, int32_t commandsToDelete,
                                    int32_t numCommands, uint8_t* commands, int32_t numCoords,
                                    uint32_t coordType, void* coords);
    inline void glPathSubCoordsNV(uint32_t path, int32_t coordStart, int32_t numCoords,
                                  uint32_t coordType, void* coords);
    inline uint8_t glPointAlongPathNV(uint32_t path, int32_t startSegment, int32_t numSegments,
                                      float distance, float* x, float* y, float* tangentX,
                                      float* tangentY);
    inline void glPolygonModeNV(uint32_t face, uint32_t mode);
    inline void glPopGroupMarkerEXT();
    inline void glPrimitiveBoundingBoxOES(float minX, float minY, float minZ, float minW,
                                          float maxX, float maxY, float maxZ, float maxW);
    inline void glProgramBinaryOES(uint32_t program, uint32_t binary_format, void* binary,
                                   int32_t binary_size);
    inline void glProgramParameteriEXT(uint32_t program, uint32_t pname, int32_t value);
    inline void glProgramPathFragmentInputGenNV(uint32_t program, int32_t location,
                                                uint32_t genMode, int32_t components,
                                                float* coeffs);
    inline void glProgramUniform1fEXT(uint32_t program, int32_t location, float v0);
    inline void glProgramUniform1fvEXT(uint32_t program, int32_t location, int32_t count,
                                       float* value);
    inline void glProgramUniform1iEXT(uint32_t program, int32_t location, int32_t v0);
    inline void glProgramUniform1ivEXT(uint32_t program, int32_t location, int32_t count,
                                       int32_t* value);
    inline void glProgramUniform1uiEXT(uint32_t program, int32_t location, uint32_t v0);
    inline void glProgramUniform1uivEXT(uint32_t program, int32_t location, int32_t count,
                                        uint32_t* value);
    inline void glProgramUniform2fEXT(uint32_t program, int32_t location, float v0, float v1);
    inline void glProgramUniform2fvEXT(uint32_t program, int32_t location, int32_t count,
                                       float* value);
    inline void glProgramUniform2iEXT(uint32_t program, int32_t location, int32_t v0, int32_t v1);
    inline void glProgramUniform2ivEXT(uint32_t program, int32_t location, int32_t count,
                                       int32_t* value);
    inline void glProgramUniform2uiEXT(uint32_t program, int32_t location, uint32_t v0,
                                       uint32_t v1);
    inline void glProgramUniform2uivEXT(uint32_t program, int32_t location, int32_t count,
                                        uint32_t* value);
    inline void glProgramUniform3fEXT(uint32_t program, int32_t location, float v0, float v1,
                                      float v2);
    inline void glProgramUniform3fvEXT(uint32_t program, int32_t location, int32_t count,
                                       float* value);
    inline void glProgramUniform3iEXT(uint32_t program, int32_t location, int32_t v0, int32_t v1,
                                      int32_t v2);
    inline void glProgramUniform3ivEXT(uint32_t program, int32_t location, int32_t count,
                                       int32_t* value);
    inline void glProgramUniform3uiEXT(uint32_t program, int32_t location, uint32_t v0, uint32_t v1,
                                       uint32_t v2);
    inline void glProgramUniform3uivEXT(uint32_t program, int32_t location, int32_t count,
                                        uint32_t* value);
    inline void glProgramUniform4fEXT(uint32_t program, int32_t location, float v0, float v1,
                                      float v2, float v3);
    inline void glProgramUniform4fvEXT(uint32_t program, int32_t location, int32_t count,
                                       float* value);
    inline void glProgramUniform4iEXT(uint32_t program, int32_t location, int32_t v0, int32_t v1,
                                      int32_t v2, int32_t v3);
    inline void glProgramUniform4ivEXT(uint32_t program, int32_t location, int32_t count,
                                       int32_t* value);
    inline void glProgramUniform4uiEXT(uint32_t program, int32_t location, uint32_t v0, uint32_t v1,
                                       uint32_t v2, uint32_t v3);
    inline void glProgramUniform4uivEXT(uint32_t program, int32_t location, int32_t count,
                                        uint32_t* value);
    inline void glProgramUniformHandleui64NV(uint32_t program, int32_t location, uint64_t value);
    inline void glProgramUniformHandleui64vNV(uint32_t program, int32_t location, int32_t count,
                                              uint64_t* values);
    inline void glProgramUniformMatrix2fvEXT(uint32_t program, int32_t location, int32_t count,
                                             uint8_t transpose, float* value);
    inline void glProgramUniformMatrix2x3fvEXT(uint32_t program, int32_t location, int32_t count,
                                               uint8_t transpose, float* value);
    inline void glProgramUniformMatrix2x4fvEXT(uint32_t program, int32_t location, int32_t count,
                                               uint8_t transpose, float* value);
    inline void glProgramUniformMatrix3fvEXT(uint32_t program, int32_t location, int32_t count,
                                             uint8_t transpose, float* value);
    inline void glProgramUniformMatrix3x2fvEXT(uint32_t program, int32_t location, int32_t count,
                                               uint8_t transpose, float* value);
    inline void glProgramUniformMatrix3x4fvEXT(uint32_t program, int32_t location, int32_t count,
                                               uint8_t transpose, float* value);
    inline void glProgramUniformMatrix4fvEXT(uint32_t program, int32_t location, int32_t count,
                                             uint8_t transpose, float* value);
    inline void glProgramUniformMatrix4x2fvEXT(uint32_t program, int32_t location, int32_t count,
                                               uint8_t transpose, float* value);
    inline void glProgramUniformMatrix4x3fvEXT(uint32_t program, int32_t location, int32_t count,
                                               uint8_t transpose, float* value);
    inline void glPushGroupMarkerEXT(int32_t length, char* marker);
    inline void glQueryCounterEXT(uint32_t query, uint32_t target);
    inline void glReadBufferIndexedEXT(uint32_t src, int32_t index);
    inline void glReadBufferNV(uint32_t mode);
    inline void glReadnPixelsEXT(int32_t x, int32_t y, int32_t width, int32_t height,
                                 uint32_t format, uint32_t type, int32_t bufSize, void* data);
    inline void glReadnPixelsKHR(int32_t x, int32_t y, int32_t width, int32_t height,
                                 uint32_t format, uint32_t type, int32_t bufSize, void* data);
    inline void glRenderbufferStorageMultisampleANGLE(uint32_t target, int32_t samples,
                                                      uint32_t internalformat, int32_t width,
                                                      int32_t height);
    inline void glRenderbufferStorageMultisampleAPPLE(uint32_t target, int32_t samples,
                                                      uint32_t internalformat, int32_t width,
                                                      int32_t height);
    inline void glRenderbufferStorageMultisampleEXT(uint32_t target, int32_t samples,
                                                    uint32_t internalformat, int32_t width,
                                                    int32_t height);
    inline void glRenderbufferStorageMultisampleIMG(uint32_t target, int32_t samples,
                                                    uint32_t internalformat, int32_t width,
                                                    int32_t height);
    inline void glRenderbufferStorageMultisampleNV(uint32_t target, int32_t samples,
                                                   uint32_t internalformat, int32_t width,
                                                   int32_t height);
    inline void glResolveMultisampleFramebufferAPPLE();
    inline void glSamplerParameterIivOES(uint32_t sampler, uint32_t pname, int32_t* param);
    inline void glSamplerParameterIuivOES(uint32_t sampler, uint32_t pname, uint32_t* param);
    inline void glScissorArrayvNV(uint32_t first, int32_t count, int32_t* v);
    inline void glScissorIndexedNV(uint32_t index, int32_t left, int32_t bottom, int32_t width,
                                   int32_t height);
    inline void glScissorIndexedvNV(uint32_t index, int32_t* v);
    inline void glSelectPerfMonitorCountersAMD(uint32_t monitor, uint8_t enable, uint32_t group,
                                               int32_t numCounters, uint32_t* counterList);
    inline void glSetFenceNV(uint32_t fence, uint32_t condition);
    inline void glStartTilingQCOM(uint32_t x, uint32_t y, uint32_t width, uint32_t height,
                                  uint32_t preserveMask);
    inline void glStencilFillPathInstancedNV(int32_t numPaths, uint32_t pathNameType, void* paths,
                                             uint32_t pathBase, uint32_t fillMode, uint32_t mask,
                                             uint32_t transformType, float* transformValues);
    inline void glStencilFillPathNV(uint32_t path, uint32_t fillMode, uint32_t mask);
    inline void glStencilStrokePathInstancedNV(int32_t numPaths, uint32_t pathNameType, void* paths,
                                               uint32_t pathBase, int32_t reference, uint32_t mask,
                                               uint32_t transformType, float* transformValues);
    inline void glStencilStrokePathNV(uint32_t path, int32_t reference, uint32_t mask);
    inline void glStencilThenCoverFillPathInstancedNV(int32_t numPaths, uint32_t pathNameType,
                                                      void* paths, uint32_t pathBase,
                                                      uint32_t fillMode, uint32_t mask,
                                                      uint32_t coverMode, uint32_t transformType,
                                                      float* transformValues);
    inline void glStencilThenCoverFillPathNV(uint32_t path, uint32_t fillMode, uint32_t mask,
                                             uint32_t coverMode);
    inline void glStencilThenCoverStrokePathInstancedNV(int32_t numPaths, uint32_t pathNameType,
                                                        void* paths, uint32_t pathBase,
                                                        int32_t reference, uint32_t mask,
                                                        uint32_t coverMode, uint32_t transformType,
                                                        float* transformValues);
    inline void glStencilThenCoverStrokePathNV(uint32_t path, int32_t reference, uint32_t mask,
                                               uint32_t coverMode);
    inline uint8_t glTestFenceNV(uint32_t fence);
    inline void glTexBufferOES(uint32_t target, uint32_t internalformat, uint32_t buffer);
    inline void glTexBufferRangeOES(uint32_t target, uint32_t internalformat, uint32_t buffer,
                                    int32_t offset, int32_t size);
    inline void glTexImage3DOES(uint32_t target, int32_t level, uint32_t internalformat,
                                int32_t width, int32_t height, int32_t depth, int32_t border,
                                uint32_t format, uint32_t type, void* pixels);
    inline void glTexPageCommitmentARB(uint32_t target, int32_t level, int32_t xoffset,
                                       int32_t yoffset, int32_t zoffset, int32_t width,
                                       int32_t height, int32_t depth, uint8_t commit);
    inline void glTexParameterIivOES(uint32_t target, uint32_t pname, int32_t* params);
    inline void glTexParameterIuivOES(uint32_t target, uint32_t pname, uint32_t* params);
    inline void glTexStorage1DEXT(uint32_t target, int32_t levels, uint32_t format, int32_t width);
    inline void glTexStorage2DEXT(uint32_t target, int32_t levels, uint32_t format, int32_t width,
                                  int32_t height);
    inline void glTexStorage3DEXT(uint32_t target, int32_t levels, uint32_t format, int32_t width,
                                  int32_t height, int32_t depth);
    inline void glTexSubImage3DOES(uint32_t target, int32_t level, int32_t xoffset, int32_t yoffset,
                                   int32_t zoffset, int32_t width, int32_t height, int32_t depth,
                                   uint32_t format, uint32_t type, void* pixels);
    inline void glTextureStorage1DEXT(uint32_t texture, uint32_t target, int32_t levels,
                                      uint32_t format, int32_t width);
    inline void glTextureStorage2DEXT(uint32_t texture, uint32_t target, int32_t levels,
                                      uint32_t format, int32_t width, int32_t height);
    inline void glTextureStorage3DEXT(uint32_t texture, uint32_t target, int32_t levels,
                                      uint32_t format, int32_t width, int32_t height,
                                      int32_t depth);
    inline void glTextureViewEXT(uint32_t texture, uint32_t target, uint32_t origtexture,
                                 uint32_t internalformat, uint32_t minlevel, uint32_t numlevels,
                                 uint32_t minlayer, uint32_t numlayers);
    inline void glTextureViewOES(uint32_t texture, uint32_t target, uint32_t origtexture,
                                 uint32_t internalformat, uint32_t minlevel, uint32_t numlevels,
                                 uint32_t minlayer, uint32_t numlayers);
    inline void glTransformPathNV(uint32_t resultPath, uint32_t srcPath, uint32_t transformType,
                                  float* transformValues);
    inline void glUniformHandleui64NV(int32_t location, uint64_t value);
    inline void glUniformHandleui64vNV(int32_t location, int32_t count, uint64_t* value);
    inline void glUniformMatrix2x3fvNV(int32_t location, int32_t count, uint8_t transpose,
                                       float* value);
    inline void glUniformMatrix2x4fvNV(int32_t location, int32_t count, uint8_t transpose,
                                       float* value);
    inline void glUniformMatrix3x2fvNV(int32_t location, int32_t count, uint8_t transpose,
                                       float* value);
    inline void glUniformMatrix3x4fvNV(int32_t location, int32_t count, uint8_t transpose,
                                       float* value);
    inline void glUniformMatrix4x2fvNV(int32_t location, int32_t count, uint8_t transpose,
                                       float* value);
    inline void glUniformMatrix4x3fvNV(int32_t location, int32_t count, uint8_t transpose,
                                       float* value);
    inline uint8_t glUnmapBufferOES(uint32_t target);
    inline void glUseProgramStagesEXT(uint32_t pipeline, uint32_t stages, uint32_t program);
    inline void glValidateProgramPipelineEXT(uint32_t pipeline);
    inline void glVertexAttribDivisorANGLE(uint32_t index, uint32_t divisor);
    inline void glVertexAttribDivisorEXT(uint32_t index, uint32_t divisor);
    inline void glVertexAttribDivisorNV(uint32_t index, uint32_t divisor);
    inline void glViewportArrayvNV(uint32_t first, int32_t count, float* v);
    inline void glViewportIndexedfNV(uint32_t index, float x, float y, float w, float h);
    inline void glViewportIndexedfvNV(uint32_t index, float* v);
    inline void glWaitSyncAPPLE(uint64_t sync, uint32_t flag, uint64_t timeout);
    inline void glWeightPathsNV(uint32_t resultPath, int32_t numPaths, uint32_t* paths,
                                float* weights);
    inline void glCoverageModulationNV(uint32_t components);
    inline void glCoverageModulationTableNV(int32_t n, float* v);
    inline void glFragmentCoverageColorNV(uint32_t color);
    inline void glFramebufferSampleLocationsfvNV(uint32_t target, uint32_t start, int32_t count,
                                                 float* v);
    inline void glGetCoverageModulationTableNV(int32_t bufsize, float* v);
    inline void glNamedFramebufferSampleLocationsfvNV(uint32_t framebuffer, uint32_t start,
                                                      int32_t count, float* v);
    inline void glRasterSamplesEXT(uint32_t samples, uint8_t fixedsamplelocations);
    inline void glResolveDepthValuesNV();
    inline void glSubpixelPrecisionBiasNV(uint32_t xbits, uint32_t ybits);
    inline void glBlendColor(float red, float green, float blue, float alpha);
    inline void glBlendEquation(uint32_t equation);
    inline void glBlendEquationSeparate(uint32_t rgb, uint32_t alpha);
    inline void glBlendFunc(uint32_t src_factor, uint32_t dst_factor);
    inline void glBlendFuncSeparate(uint32_t src_factor_rgb, uint32_t dst_factor_rgb,
                                    uint32_t src_factor_alpha, uint32_t dst_factor_alpha);
    inline void glDepthFunc(uint32_t function);
    inline void glSampleCoverage(float value, uint8_t invert);
    inline void glSampleMaski(uint32_t maskNumber, uint32_t mask);
    inline void glScissor(int32_t x, int32_t y, int32_t width, int32_t height);
    inline void glStencilFunc(uint32_t func, int32_t ref, uint32_t mask);
    inline void glStencilFuncSeparate(uint32_t face, uint32_t function, int32_t reference_value,
                                      uint32_t mask);
    inline void glStencilOp(uint32_t fail, uint32_t zfail, uint32_t zpass);
    inline void glStencilOpSeparate(uint32_t face, uint32_t stencil_fail,
                                    uint32_t stencil_pass_depth_fail,
                                    uint32_t stencil_pass_depth_pass);
    inline void glBindFramebuffer(uint32_t target, uint32_t framebuffer);
    inline void glBindRenderbuffer(uint32_t target, uint32_t renderbuffer);
    inline void glBlitFramebuffer(int32_t srcX0, int32_t srcY0, int32_t srcX1, int32_t srcY1,
                                  int32_t dstX0, int32_t dstY0, int32_t dstX1, int32_t dstY1,
                                  uint32_t mask, uint32_t filter);
    inline uint32_t glCheckFramebufferStatus(uint32_t target);
    inline void glClear(uint32_t mask);
    inline void glClearBufferfi(uint32_t buffer, int32_t drawbuffer, float depth, int32_t stencil);
    inline void glClearBufferfv(uint32_t buffer, int32_t drawbuffer, float* value);
    inline void glClearBufferiv(uint32_t buffer, int32_t drawbuffer, int32_t* value);
    inline void glClearBufferuiv(uint32_t buffer, int32_t drawbuffer, uint32_t* value);
    inline void glClearColor(float r, float g, float b, float a);
    inline void glClearDepthf(float depth);
    inline void glClearStencil(int32_t stencil);
    inline void glColorMask(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha);
    inline void glDeleteFramebuffers(int32_t count, uint32_t* framebuffers);
    inline void glDeleteRenderbuffers(int32_t count, uint32_t* renderbuffers);
    inline void glDepthMask(uint8_t enabled);
    inline void glFramebufferParameteri(uint32_t target, uint32_t pname, int32_t param);
    inline void glFramebufferRenderbuffer(uint32_t framebuffer_target,
                                          uint32_t framebuffer_attachment,
                                          uint32_t renderbuffer_target, uint32_t renderbuffer);
    inline void glFramebufferTexture2D(uint32_t framebuffer_target, uint32_t framebuffer_attachment,
                                       uint32_t texture_target, uint32_t texture, int32_t level);
    inline void glFramebufferTextureLayer(uint32_t target, uint32_t attachment, uint32_t texture,
                                          int32_t level, int32_t layer);
    inline void glGenFramebuffers(int32_t count, uint32_t* framebuffers);
    inline void glGenRenderbuffers(int32_t count, uint32_t* renderbuffers);
    inline void glGetFramebufferAttachmentParameteriv(uint32_t framebuffer_target,
                                                      uint32_t attachment, uint32_t parameter,
                                                      int32_t* value);
    inline void glGetFramebufferParameteriv(uint32_t target, uint32_t pname, int32_t* params);
    inline void glGetRenderbufferParameteriv(uint32_t target, uint32_t parameter, int32_t* values);
    inline void glInvalidateFramebuffer(uint32_t target, int32_t count, uint32_t* attachments);
    inline void glInvalidateSubFramebuffer(uint32_t target, int32_t numAttachments,
                                           uint32_t* attachments, int32_t x, int32_t y,
                                           int32_t width, int32_t height);
    inline uint8_t glIsFramebuffer(uint32_t framebuffer);
    inline uint8_t glIsRenderbuffer(uint32_t renderbuffer);
    inline void glReadBuffer(uint32_t src);
    inline void glReadPixels(int32_t x, int32_t y, int32_t width, int32_t height, uint32_t format,
                             uint32_t type, void* data);
    inline void glRenderbufferStorage(uint32_t target, uint32_t format, int32_t width,
                                      int32_t height);
    inline void glRenderbufferStorageMultisample(uint32_t target, int32_t samples, uint32_t format,
                                                 int32_t width, int32_t height);
    inline void glStencilMask(uint32_t mask);
    inline void glStencilMaskSeparate(uint32_t face, uint32_t mask);
    inline void glDisable(uint32_t capability);
    inline void glEnable(uint32_t capability);
    inline void glFinish();
    inline void glFlush();
    inline void glFlushMappedBufferRange(uint32_t target, int32_t offset, int32_t length);
    inline uint32_t glGetError();
    inline void glHint(uint32_t target, uint32_t mode);
    inline void glActiveShaderProgram(uint32_t pipeline, uint32_t program);
    inline void glAttachShader(uint32_t program, uint32_t shader);
    inline void glBindAttribLocation(uint32_t program, uint32_t location, char* name);
    inline void glBindProgramPipeline(uint32_t pipeline);
    inline void glCompileShader(uint32_t shader);
    inline uint32_t glCreateProgram();
    inline uint32_t glCreateShader(uint32_t type);
    inline uint32_t glCreateShaderProgramv(uint32_t type, int32_t count, char** strings);
    inline void glDeleteProgram(uint32_t program);
    inline void glDeleteProgramPipelines(int32_t n, uint32_t* pipelines);
    inline void glDeleteShader(uint32_t shader);
    inline void glDetachShader(uint32_t program, uint32_t shader);
    inline void glDispatchCompute(uint32_t num_groups_x, uint32_t num_groups_y,
                                  uint32_t num_groups_z);
    inline void glDispatchComputeIndirect(int32_t indirect);
    inline void glGenProgramPipelines(int32_t n, uint32_t* pipelines);
    inline void glGetActiveAttrib(uint32_t program, uint32_t location, int32_t buffer_size,
                                  int32_t* buffer_bytes_written, int32_t* vector_count,
                                  uint32_t* type, char* name);
    inline void glGetActiveUniform(uint32_t program, uint32_t location, int32_t buffer_size,
                                   int32_t* buffer_bytes_written, int32_t* vector_count,
                                   uint32_t* type, char* name);
    inline void glGetActiveUniformBlockName(uint32_t program, uint32_t uniform_block_index,
                                            int32_t buffer_size, int32_t* buffer_bytes_written,
                                            char* name);
    inline void glGetActiveUniformBlockiv(uint32_t program, uint32_t uniform_block_index,
                                          uint32_t parameter_name, int32_t* parameters);
    inline void glGetActiveUniformsiv(uint32_t program, int32_t uniform_count,
                                      uint32_t* uniform_indices, uint32_t parameter_name,
                                      int32_t* parameters);
    inline void glGetAttachedShaders(uint32_t program, int32_t buffer_length,
                                     int32_t* shaders_length_written, uint32_t* shaders);
    inline int32_t glGetAttribLocation(uint32_t program, char* name);
    inline int32_t glGetFragDataLocation(uint32_t program, char* name);
    inline void glGetProgramBinary(uint32_t program, int32_t bufSize, int32_t* length,
                                   uint32_t* binaryFormat, void* binary);
    inline void glGetProgramInfoLog(uint32_t program, int32_t buffer_length,
                                    int32_t* string_length_written, char* info);
    inline void glGetProgramInterfaceiv(uint32_t program, uint32_t programInterface, uint32_t pname,
                                        int32_t* params);
    inline void glGetProgramPipelineInfoLog(uint32_t pipeline, int32_t bufSize, int32_t* length,
                                            char* infoLog);
    inline void glGetProgramPipelineiv(uint32_t pipeline, uint32_t pname, int32_t* params);
    inline uint32_t glGetProgramResourceIndex(uint32_t program, uint32_t programInterface,
                                              char* name);
    inline int32_t glGetProgramResourceLocation(uint32_t program, uint32_t programInterface,
                                                char* name);
    inline void glGetProgramResourceName(uint32_t program, uint32_t programInterface,
                                         uint32_t index, int32_t bufSize, int32_t* length,
                                         char* name);
    inline void glGetProgramResourceiv(uint32_t program, uint32_t programInterface, uint32_t index,
                                       int32_t propCount, uint32_t* props, int32_t bufSize,
                                       int32_t* length, int32_t* params);
    inline void glGetProgramiv(uint32_t program, uint32_t parameter, int32_t* value);
    inline void glGetShaderInfoLog(uint32_t shader, int32_t buffer_length,
                                   int32_t* string_length_written, char* info);
    inline void glGetShaderPrecisionFormat(uint32_t shader_type, uint32_t precision_type,
                                           int32_t* range, int32_t* precision);
    inline void glGetShaderSource(uint32_t shader, int32_t buffer_length,
                                  int32_t* string_length_written, char* source);
    inline void glGetShaderiv(uint32_t shader, uint32_t parameter, int32_t* value);
    inline uint32_t glGetUniformBlockIndex(uint32_t program, char* uniformBlockName);
    inline void glGetUniformIndices(uint32_t program, int32_t uniformCount, char** uniformNames,
                                    uint32_t* uniformIndices);
    inline int32_t glGetUniformLocation(uint32_t program, char* name);
    inline void glGetUniformfv(uint32_t program, int32_t location, float* values);
    inline void glGetUniformiv(uint32_t program, int32_t location, int32_t* values);
    inline void glGetUniformuiv(uint32_t program, int32_t location, uint32_t* params);
    inline uint8_t glIsProgram(uint32_t program);
    inline uint8_t glIsProgramPipeline(uint32_t pipeline);
    inline uint8_t glIsShader(uint32_t shader);
    inline void glLinkProgram(uint32_t program);
    inline void glMemoryBarrier(uint32_t barriers);
    inline void glMemoryBarrierByRegion(uint32_t barriers);
    inline void glProgramBinary(uint32_t program, uint32_t binaryFormat, void* binary,
                                int32_t length);
    inline void glProgramParameteri(uint32_t program, uint32_t pname, int32_t value);
    inline void glProgramUniform1f(uint32_t program, int32_t location, float v0);
    inline void glProgramUniform1fv(uint32_t program, int32_t location, int32_t count,
                                    float* value);
    inline void glProgramUniform1i(uint32_t program, int32_t location, int32_t v0);
    inline void glProgramUniform1iv(uint32_t program, int32_t location, int32_t count,
                                    int32_t* value);
    inline void glProgramUniform1ui(uint32_t program, int32_t location, uint32_t v0);
    inline void glProgramUniform1uiv(uint32_t program, int32_t location, int32_t count,
                                     uint32_t* value);
    inline void glProgramUniform2f(uint32_t program, int32_t location, float v0, float v1);
    inline void glProgramUniform2fv(uint32_t program, int32_t location, int32_t count,
                                    float* value);
    inline void glProgramUniform2i(uint32_t program, int32_t location, int32_t v0, int32_t v1);
    inline void glProgramUniform2iv(uint32_t program, int32_t location, int32_t count,
                                    int32_t* value);
    inline void glProgramUniform2ui(uint32_t program, int32_t location, uint32_t v0, uint32_t v1);
    inline void glProgramUniform2uiv(uint32_t program, int32_t location, int32_t count,
                                     uint32_t* value);
    inline void glProgramUniform3f(uint32_t program, int32_t location, float v0, float v1,
                                   float v2);
    inline void glProgramUniform3fv(uint32_t program, int32_t location, int32_t count,
                                    float* value);
    inline void glProgramUniform3i(uint32_t program, int32_t location, int32_t v0, int32_t v1,
                                   int32_t v2);
    inline void glProgramUniform3iv(uint32_t program, int32_t location, int32_t count,
                                    int32_t* value);
    inline void glProgramUniform3ui(uint32_t program, int32_t location, uint32_t v0, uint32_t v1,
                                    uint32_t v2);
    inline void glProgramUniform3uiv(uint32_t program, int32_t location, int32_t count,
                                     uint32_t* value);
    inline void glProgramUniform4f(uint32_t program, int32_t location, float v0, float v1, float v2,
                                   float v3);
    inline void glProgramUniform4fv(uint32_t program, int32_t location, int32_t count,
                                    float* value);
    inline void glProgramUniform4i(uint32_t program, int32_t location, int32_t v0, int32_t v1,
                                   int32_t v2, int32_t v3);
    inline void glProgramUniform4iv(uint32_t program, int32_t location, int32_t count,
                                    int32_t* value);
    inline void glProgramUniform4ui(uint32_t program, int32_t location, uint32_t v0, uint32_t v1,
                                    uint32_t v2, uint32_t v3);
    inline void glProgramUniform4uiv(uint32_t program, int32_t location, int32_t count,
                                     uint32_t* value);
    inline void glProgramUniformMatrix2fv(uint32_t program, int32_t location, int32_t count,
                                          uint8_t transpose, float* value);
    inline void glProgramUniformMatrix2x3fv(uint32_t program, int32_t location, int32_t count,
                                            uint8_t transpose, float* value);
    inline void glProgramUniformMatrix2x4fv(uint32_t program, int32_t location, int32_t count,
                                            uint8_t transpose, float* value);
    inline void glProgramUniformMatrix3fv(uint32_t program, int32_t location, int32_t count,
                                          uint8_t transpose, float* value);
    inline void glProgramUniformMatrix3x2fv(uint32_t program, int32_t location, int32_t count,
                                            uint8_t transpose, float* value);
    inline void glProgramUniformMatrix3x4fv(uint32_t program, int32_t location, int32_t count,
                                            uint8_t transpose, float* value);
    inline void glProgramUniformMatrix4fv(uint32_t program, int32_t location, int32_t count,
                                          uint8_t transpose, float* value);
    inline void glProgramUniformMatrix4x2fv(uint32_t program, int32_t location, int32_t count,
                                            uint8_t transpose, float* value);
    inline void glProgramUniformMatrix4x3fv(uint32_t program, int32_t location, int32_t count,
                                            uint8_t transpose, float* value);
    inline void glReleaseShaderCompiler();
    inline void glShaderBinary(int32_t count, uint32_t* shaders, uint32_t binary_format,
                               void* binary, int32_t binary_size);
    inline void glShaderSource(uint32_t shader, int32_t count, char** source, int32_t* length);
    inline void glUniform1f(int32_t location, float value);
    inline void glUniform1fv(int32_t location, int32_t count, float* values);
    inline void glUniform1i(int32_t location, int32_t value);
    inline void glUniform1iv(int32_t location, int32_t count, int32_t* values);
    inline void glUniform1ui(int32_t location, uint32_t v0);
    inline void glUniform1uiv(int32_t location, int32_t count, uint32_t* value);
    inline void glUniform2f(int32_t location, float value0, float value1);
    inline void glUniform2fv(int32_t location, int32_t count, float* values);
    inline void glUniform2i(int32_t location, int32_t value0, int32_t value1);
    inline void glUniform2iv(int32_t location, int32_t count, int32_t* values);
    inline void glUniform2ui(int32_t location, uint32_t v0, uint32_t v1);
    inline void glUniform2uiv(int32_t location, int32_t count, uint32_t* value);
    inline void glUniform3f(int32_t location, float value0, float value1, float value2);
    inline void glUniform3fv(int32_t location, int32_t count, float* values);
    inline void glUniform3i(int32_t location, int32_t value0, int32_t value1, int32_t value2);
    inline void glUniform3iv(int32_t location, int32_t count, int32_t* values);
    inline void glUniform3ui(int32_t location, uint32_t v0, uint32_t v1, uint32_t v2);
    inline void glUniform3uiv(int32_t location, int32_t count, uint32_t* value);
    inline void glUniform4f(int32_t location, float value0, float value1, float value2,
                            float value3);
    inline void glUniform4fv(int32_t location, int32_t count, float* values);
    inline void glUniform4i(int32_t location, int32_t value0, int32_t value1, int32_t value2,
                            int32_t value3);
    inline void glUniform4iv(int32_t location, int32_t count, int32_t* values);
    inline void glUniform4ui(int32_t location, uint32_t v0, uint32_t v1, uint32_t v2, uint32_t v3);
    inline void glUniform4uiv(int32_t location, int32_t count, uint32_t* value);
    inline void glUniformBlockBinding(uint32_t program, uint32_t uniform_block_index,
                                      uint32_t uniform_block_binding);
    inline void glUniformMatrix2fv(int32_t location, int32_t count, uint8_t transpose,
                                   float* values);
    inline void glUniformMatrix2x3fv(int32_t location, int32_t count, uint8_t transpose,
                                     float* value);
    inline void glUniformMatrix2x4fv(int32_t location, int32_t count, uint8_t transpose,
                                     float* value);
    inline void glUniformMatrix3fv(int32_t location, int32_t count, uint8_t transpose,
                                   float* values);
    inline void glUniformMatrix3x2fv(int32_t location, int32_t count, uint8_t transpose,
                                     float* value);
    inline void glUniformMatrix3x4fv(int32_t location, int32_t count, uint8_t transpose,
                                     float* value);
    inline void glUniformMatrix4fv(int32_t location, int32_t count, uint8_t transpose,
                                   float* values);
    inline void glUniformMatrix4x2fv(int32_t location, int32_t count, uint8_t transpose,
                                     float* value);
    inline void glUniformMatrix4x3fv(int32_t location, int32_t count, uint8_t transpose,
                                     float* value);
    inline void glUseProgram(uint32_t program);
    inline void glUseProgramStages(uint32_t pipeline, uint32_t stages, uint32_t program);
    inline void glValidateProgram(uint32_t program);
    inline void glValidateProgramPipeline(uint32_t pipeline);
    inline void glCullFace(uint32_t mode);
    inline void glDepthRangef(float near, float far);
    inline void glFrontFace(uint32_t orientation);
    inline void glGetMultisamplefv(uint32_t pname, uint32_t index, float* val);
    inline void glLineWidth(float width);
    inline void glPolygonOffset(float scale_factor, float units);
    inline void glViewport(int32_t x, int32_t y, int32_t width, int32_t height);
    inline void glGetBooleani_v(uint32_t target, uint32_t index, uint8_t* data);
    inline void glGetBooleanv(uint32_t param, uint8_t* values);
    inline void glGetFloatv(uint32_t param, float* values);
    inline void glGetInteger64i_v(uint32_t target, uint32_t index, int64_t* data);
    inline void glGetInteger64v(uint32_t pname, int64_t* data);
    inline void glGetIntegeri_v(uint32_t target, uint32_t index, int32_t* data);
    inline void glGetIntegerv(uint32_t param, int32_t* values);
    inline void glGetInternalformativ(uint32_t target, uint32_t internalformat, uint32_t pname,
                                      int32_t bufSize, int32_t* params);
    inline uint8_t* glGetString(uint32_t param);
    inline uint8_t* glGetStringi(uint32_t name, uint32_t index);
    inline uint8_t glIsEnabled(uint32_t capability);
    inline uint32_t glClientWaitSync(uint64_t sync, uint32_t syncFlags, uint64_t timeout);
    inline void glDeleteSync(uint64_t sync);
    inline uint64_t glFenceSync(uint32_t condition, uint32_t syncFlags);
    inline void glGetSynciv(uint64_t sync, uint32_t pname, int32_t bufSize, int32_t* length,
                            int32_t* values);
    inline uint8_t glIsSync(uint64_t sync);
    inline void glWaitSync(uint64_t sync, uint32_t syncFlags, uint64_t timeout);
    inline void glActiveTexture(uint32_t unit);
    inline void glBindImageTexture(uint32_t unit, uint32_t texture, int32_t level, uint8_t layered,
                                   int32_t layer, uint32_t access, uint32_t format);
    inline void glBindSampler(uint32_t unit, uint32_t sampler);
    inline void glBindTexture(uint32_t target, uint32_t texture);
    inline void glCompressedTexImage2D(uint32_t target, int32_t level, uint32_t format,
                                       int32_t width, int32_t height, int32_t border,
                                       int32_t image_size, void* data);
    inline void glCompressedTexImage3D(uint32_t target, int32_t level, uint32_t internalformat,
                                       int32_t width, int32_t height, int32_t depth, int32_t border,
                                       int32_t imageSize, void* data);
    inline void glCompressedTexSubImage2D(uint32_t target, int32_t level, int32_t xoffset,
                                          int32_t yoffset, int32_t width, int32_t height,
                                          uint32_t format, int32_t image_size, void* data);
    inline void glCompressedTexSubImage3D(uint32_t target, int32_t level, int32_t xoffset,
                                          int32_t yoffset, int32_t zoffset, int32_t width,
                                          int32_t height, int32_t depth, uint32_t format,
                                          int32_t imageSize, void* data);
    inline void glCopyTexImage2D(uint32_t target, int32_t level, uint32_t format, int32_t x,
                                 int32_t y, int32_t width, int32_t height, int32_t border);
    inline void glCopyTexSubImage2D(uint32_t target, int32_t level, int32_t xoffset,
                                    int32_t yoffset, int32_t x, int32_t y, int32_t width,
                                    int32_t height);
    inline void glCopyTexSubImage3D(uint32_t target, int32_t level, int32_t xoffset,
                                    int32_t yoffset, int32_t zoffset, int32_t x, int32_t y,
                                    int32_t width, int32_t height);
    inline void glDeleteSamplers(int32_t count, uint32_t* samplers);
    inline void glDeleteTextures(int32_t count, uint32_t* textures);
    inline void glGenSamplers(int32_t count, uint32_t* samplers);
    inline void glGenTextures(int32_t count, uint32_t* textures);
    inline void glGenerateMipmap(uint32_t target);
    inline void glGetSamplerParameterfv(uint32_t sampler, uint32_t pname, float* params);
    inline void glGetSamplerParameteriv(uint32_t sampler, uint32_t pname, int32_t* params);
    inline void glGetTexLevelParameterfv(uint32_t target, int32_t level, uint32_t pname,
                                         float* params);
    inline void glGetTexLevelParameteriv(uint32_t target, int32_t level, uint32_t pname,
                                         int32_t* params);
    inline void glGetTexParameterfv(uint32_t target, uint32_t parameter, float* values);
    inline void glGetTexParameteriv(uint32_t target, uint32_t parameter, int32_t* values);
    inline uint8_t glIsSampler(uint32_t sampler);
    inline uint8_t glIsTexture(uint32_t texture);
    inline void glPixelStorei(uint32_t parameter, int32_t value);
    inline void glSamplerParameterf(uint32_t sampler, uint32_t pname, float param);
    inline void glSamplerParameterfv(uint32_t sampler, uint32_t pname, float* param);
    inline void glSamplerParameteri(uint32_t sampler, uint32_t pname, int32_t param);
    inline void glSamplerParameteriv(uint32_t sampler, uint32_t pname, int32_t* param);
    inline void glTexImage2D(uint32_t target, int32_t level, int32_t internal_format, int32_t width,
                             int32_t height, int32_t border, uint32_t format, uint32_t type,
                             void* data);
    inline void glTexImage3D(uint32_t target, int32_t level, int32_t internalformat, int32_t width,
                             int32_t height, int32_t depth, int32_t border, uint32_t format,
                             uint32_t type, void* pixels);
    inline void glTexParameterf(uint32_t target, uint32_t parameter, float value);
    inline void glTexParameterfv(uint32_t target, uint32_t pname, float* params);
    inline void glTexParameteri(uint32_t target, uint32_t parameter, int32_t value);
    inline void glTexParameteriv(uint32_t target, uint32_t pname, int32_t* params);
    inline void glTexStorage2D(uint32_t target, int32_t levels, uint32_t internalformat,
                               int32_t width, int32_t height);
    inline void glTexStorage2DMultisample(uint32_t target, int32_t samples, uint32_t internalformat,
                                          int32_t width, int32_t height,
                                          uint8_t fixedsamplelocations);
    inline void glTexStorage3D(uint32_t target, int32_t levels, uint32_t internalformat,
                               int32_t width, int32_t height, int32_t depth);
    inline void glTexSubImage2D(uint32_t target, int32_t level, int32_t xoffset, int32_t yoffset,
                                int32_t width, int32_t height, uint32_t format, uint32_t type,
                                void* data);
    inline void glTexSubImage3D(uint32_t target, int32_t level, int32_t xoffset, int32_t yoffset,
                                int32_t zoffset, int32_t width, int32_t height, int32_t depth,
                                uint32_t format, uint32_t type, void* pixels);
    inline void glBeginTransformFeedback(uint32_t primitiveMode);
    inline void glBindTransformFeedback(uint32_t target, uint32_t id);
    inline void glDeleteTransformFeedbacks(int32_t n, uint32_t* ids);
    inline void glEndTransformFeedback();
    inline void glGenTransformFeedbacks(int32_t n, uint32_t* ids);
    inline void glGetTransformFeedbackVarying(uint32_t program, uint32_t index, int32_t bufSize,
                                              int32_t* length, int32_t* size, uint32_t* type,
                                              char* name);
    inline uint8_t glIsTransformFeedback(uint32_t id);
    inline void glPauseTransformFeedback();
    inline void glResumeTransformFeedback();
    inline void glTransformFeedbackVaryings(uint32_t program, int32_t count, char** varyings,
                                            uint32_t bufferMode);
    inline void glBindVertexArray(uint32_t array);
    inline void glBindVertexBuffer(uint32_t bindingindex, uint32_t buffer, int32_t offset,
                                   int32_t stride);
    inline void glDeleteVertexArrays(int32_t count, uint32_t* arrays);
    inline void glDisableVertexAttribArray(uint32_t location);
    inline void glEnableVertexAttribArray(uint32_t location);
    inline void glGenVertexArrays(int32_t count, uint32_t* arrays);
    inline void glGetVertexAttribIiv(uint32_t index, uint32_t pname, int32_t* params);
    inline void glGetVertexAttribIuiv(uint32_t index, uint32_t pname, uint32_t* params);
    inline void glGetVertexAttribPointerv(uint32_t index, uint32_t pname, void** pointer);
    inline void glGetVertexAttribfv(uint32_t index, uint32_t pname, float* params);
    inline void glGetVertexAttribiv(uint32_t index, uint32_t pname, int32_t* params);
    inline uint8_t glIsVertexArray(uint32_t array);
    inline void glVertexAttrib1f(uint32_t location, float value0);
    inline void glVertexAttrib1fv(uint32_t location, float* value);
    inline void glVertexAttrib2f(uint32_t location, float value0, float value1);
    inline void glVertexAttrib2fv(uint32_t location, float* value);
    inline void glVertexAttrib3f(uint32_t location, float value0, float value1, float value2);
    inline void glVertexAttrib3fv(uint32_t location, float* value);
    inline void glVertexAttrib4f(uint32_t location, float value0, float value1, float value2,
                                 float value3);
    inline void glVertexAttrib4fv(uint32_t location, float* value);
    inline void glVertexAttribBinding(uint32_t attribindex, uint32_t bindingindex);
    inline void glVertexAttribDivisor(uint32_t index, uint32_t divisor);
    inline void glVertexAttribFormat(uint32_t attribindex, int32_t size, uint32_t type,
                                     uint8_t normalized, uint32_t relativeoffset);
    inline void glVertexAttribI4i(uint32_t index, int32_t x, int32_t y, int32_t z, int32_t w);
    inline void glVertexAttribI4iv(uint32_t index, int32_t* v);
    inline void glVertexAttribI4ui(uint32_t index, uint32_t x, uint32_t y, uint32_t z, uint32_t w);
    inline void glVertexAttribI4uiv(uint32_t index, uint32_t* v);
    inline void glVertexAttribIFormat(uint32_t attribindex, int32_t size, uint32_t type,
                                      uint32_t relativeoffset);
    inline void glVertexAttribIPointer(uint32_t index, int32_t size, uint32_t type, int32_t stride,
                                       void* pointer);
    inline void glVertexAttribPointer(uint32_t location, int32_t size, uint32_t type,
                                      uint8_t normalized, int32_t stride, void* data);
    inline void glVertexBindingDivisor(uint32_t bindingindex, uint32_t divisor);
    inline int eglInitialize(void* dpy, int* major, int* minor);
    inline void* eglCreateContext(void* display, void* config, void* share_context,
                                  int* attrib_list);
    inline int eglMakeCurrent(void* display, void* draw, void* read, void* context);
    inline int eglSwapBuffers(void* display, void* surface);
    inline int eglQuerySurface(void* display, void* surface, int attribute, int* value);
    inline void* glXCreateContext(void* dpy, void* vis, void* shareList, bool direct);
    inline void* glXCreateNewContext(void* display, void* fbconfig, uint32_t type, void* shared,
                                     bool direct);
    inline int glXMakeContextCurrent(void* display, void* draw, void* read, void* ctx);
    inline int glXMakeCurrent(void* display, void* drawable, void* ctx);
    inline void glXSwapBuffers(void* display, void* drawable);
    inline int glXQueryDrawable(void* display, void* draw, int attribute, int* value);
    inline void* wglCreateContext(void* hdc);
    inline void* wglCreateContextAttribsARB(void* hdc, void* hShareContext, int* attribList);
    inline int wglMakeCurrent(void* hdc, void* hglrc);
    inline void wglSwapBuffers(void* hdc);
    inline int CGLCreateContext(void* pix, void* share, void** ctx);
    inline int CGLSetCurrentContext(void* ctx);
    inline int CGLGetSurface(void* ctx, void** cid, int32_t* wid, int32_t* sid);
    inline int CGSGetSurfaceBounds(void* cid, int32_t wid, int32_t sid, double* bounds);
    inline int CGLFlushDrawable(void* ctx);
    inline void glGetQueryObjecti64v(uint32_t query, uint32_t parameter, int64_t* value);
    inline void glGetQueryObjectui64v(uint32_t query, uint32_t parameter, uint64_t* value);
    inline void architecture(uint32_t pointer_alignment, uint32_t pointer_size,
                             uint32_t integer_size, bool little_endian);
    inline void replayCreateRenderer(uint32_t id);
    inline void replayBindRenderer(uint32_t id);
    inline void switchThread(uint64_t threadID);
    inline void backbufferInfo(int32_t width, int32_t height, uint32_t color_fmt,
                               uint32_t depth_fmt, uint32_t stencil_fmt, bool resetViewportScissor,
                               bool preserveBuffersOnSwap);
    inline void startTimer(uint8_t index);
    inline uint64_t stopTimer(uint8_t index);
    inline void flushPostBuffer();

protected:
    GlesImports mImports;

    // Globals
    ContextID NextContextID;
    ThreadID CurrentThread;
    ThreadIDToContext__R Contexts;
    EGLContextToContext__R EGLContexts;
    GLXContextToContext__R GLXContexts;
    HGLRCToContext__R WGLContexts;
    CGLContextObjToContext__R CGLContexts;

#include "gles_state_externs.inl"
};

// Inline methods
inline void GlesSpy::init(std::shared_ptr<gapic::Encoder> encoder) {
    SpyBase::init(encoder);
    mImports.Resolve();
    NextContextID = 0;
    CurrentThread = 0;
    Contexts = ThreadIDToContext__R();
    EGLContexts = EGLContextToContext__R();
    GLXContexts = GLXContextToContext__R();
    WGLContexts = HGLRCToContext__R();
    CGLContexts = CGLContextObjToContext__R();
}

inline void GlesSpy::glBlendBarrierKHR() {
    GAPID_INFO("glBlendBarrierKHR()\n");

    Observations observations;
    do {
        uint32_t l_requiresExtension_0_ext = ExtensionId::GL_KHR_blend_equation_advanced;
        observe(observations.mReads);
        mImports.glBlendBarrierKHR();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendBarrierKHR coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendEquationSeparateiEXT(uint32_t buf, uint32_t modeRGB,
                                                 uint32_t modeAlpha) {
    GAPID_INFO("glBlendEquationSeparateiEXT(%" PRIu32 ", %u, %u)\n", buf, modeRGB, modeAlpha);

    Observations observations;
    do {
        uint32_t l_requiresExtension_1_ext = ExtensionId::GL_EXT_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glBlendEquationSeparateiEXT(buf, modeRGB, modeAlpha);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendEquationSeparateiEXT coder(observations, buf, modeRGB, modeAlpha);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendEquationiEXT(uint32_t buf, uint32_t mode) {
    GAPID_INFO("glBlendEquationiEXT(%" PRIu32 ", %u)\n", buf, mode);

    Observations observations;
    do {
        uint32_t l_requiresExtension_2_ext = ExtensionId::GL_EXT_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glBlendEquationiEXT(buf, mode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendEquationiEXT coder(observations, buf, mode);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendFuncSeparateiEXT(uint32_t buf, uint32_t srcRGB, uint32_t dstRGB,
                                             uint32_t srcAlpha, uint32_t dstAlpha) {
    GAPID_INFO("glBlendFuncSeparateiEXT(%" PRIu32 ", %u, %u, %u, %u)\n", buf, srcRGB, dstRGB,
               srcAlpha, dstAlpha);

    Observations observations;
    do {
        uint32_t l_requiresExtension_3_ext = ExtensionId::GL_EXT_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glBlendFuncSeparateiEXT(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendFuncSeparateiEXT coder(observations, buf, srcRGB, dstRGB, srcAlpha,
                                                      dstAlpha);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendFunciEXT(uint32_t buf, uint32_t src, uint32_t dst) {
    GAPID_INFO("glBlendFunciEXT(%" PRIu32 ", %u, %u)\n", buf, src, dst);

    Observations observations;
    do {
        uint32_t l_requiresExtension_4_ext = ExtensionId::GL_EXT_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glBlendFunciEXT(buf, src, dst);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendFunciEXT coder(observations, buf, src, dst);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glColorMaskiEXT(uint32_t index, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
    GAPID_INFO("glColorMaskiEXT(%" PRIu32 ", %" PRIu8 ", %" PRIu8 ", %" PRIu8 ", %" PRIu8 ")\n",
               index, r, g, b, a);

    Observations observations;
    do {
        uint32_t l_requiresExtension_5_ext = ExtensionId::GL_EXT_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glColorMaskiEXT(index, r, g, b, a);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlColorMaskiEXT coder(observations, index, r, g, b, a);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCopyImageSubDataEXT(uint32_t srcName, uint32_t srcTarget, int32_t srcLevel,
                                           int32_t srcX, int32_t srcY, int32_t srcZ,
                                           uint32_t dstName, uint32_t dstTarget, int32_t dstLevel,
                                           int32_t dstX, int32_t dstY, int32_t dstZ,
                                           int32_t srcWidth, int32_t srcHeight, int32_t srcDepth) {
    GAPID_INFO("glCopyImageSubDataEXT(%" PRIu32 ", %u, %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRIu32 ", %u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %" PRId32 ")\n",
               srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX,
               dstY, dstZ, srcWidth, srcHeight, srcDepth);

    Observations observations;
    do {
        uint32_t l_requiresExtension_6_ext = ExtensionId::GL_EXT_copy_image;
        observe(observations.mReads);
        mImports.glCopyImageSubDataEXT(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName,
                                       dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight,
                                       srcDepth);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCopyImageSubDataEXT coder(
            observations, srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget,
            dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDebugMessageCallbackKHR(void* callback, void* userParam) {
    GAPID_INFO("glDebugMessageCallbackKHR(%p, %p)\n", callback, userParam);

    Observations observations;
    do {
        uint32_t l_requiresExtension_7_ext = ExtensionId::GL_KHR_debug;
        observe(observations.mReads);
        mImports.glDebugMessageCallbackKHR(callback, userParam);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDebugMessageCallbackKHR coder(
            observations, gapic::coder::gles::GLDEBUGPROCKHR(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(callback), 0)),
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(userParam), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDebugMessageControlKHR(uint32_t source, uint32_t type, uint32_t severity,
                                              int32_t count, uint32_t* ids, uint8_t enabled) {
    GAPID_INFO("glDebugMessageControlKHR(%u, %u, %u, %" PRId32 ", %p, %" PRIu8 ")\n", source, type,
               severity, count, ids, enabled);

    Observations observations;
    do {
        uint32_t l_requiresExtension_8_ext = ExtensionId::GL_KHR_debug;
        observe(observations.mReads);
        mImports.glDebugMessageControlKHR(source, type, severity, count, ids, enabled);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDebugMessageControlKHR coder(
            observations, source, type, severity, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(ids), 0)),
            enabled);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDebugMessageInsertKHR(uint32_t source, uint32_t type, uint32_t id,
                                             uint32_t severity, int32_t length, char* buf) {
    GAPID_INFO("glDebugMessageInsertKHR(%u, %u, %" PRIu32 ", %u, %" PRId32 ", %p)\n", source, type,
               id, severity, length, buf);

    Observations observations;
    do {
        uint32_t l_requiresExtension_9_ext = ExtensionId::GL_KHR_debug;
        observe(observations.mReads);
        mImports.glDebugMessageInsertKHR(source, type, id, severity, length, buf);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDebugMessageInsertKHR coder(
            observations, source, type, id, severity, length,
            gapic::coder::gles::GLchar__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(buf), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDisableiEXT(uint32_t target, uint32_t index) {
    GAPID_INFO("glDisableiEXT(%u, %" PRIu32 ")\n", target, index);

    Observations observations;
    do {
        uint32_t l_requiresExtension_10_ext = ExtensionId::GL_EXT_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glDisableiEXT(target, index);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDisableiEXT coder(observations, target, index);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEnableiEXT(uint32_t target, uint32_t index) {
    GAPID_INFO("glEnableiEXT(%u, %" PRIu32 ")\n", target, index);

    Observations observations;
    do {
        uint32_t l_requiresExtension_11_ext = ExtensionId::GL_EXT_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glEnableiEXT(target, index);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEnableiEXT coder(observations, target, index);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFramebufferTextureEXT(uint32_t target, uint32_t attachment, uint32_t texture,
                                             int32_t level) {
    GAPID_INFO("glFramebufferTextureEXT(%u, %u, %" PRIu32 ", %" PRId32 ")\n", target, attachment,
               texture, level);

    Observations observations;
    do {
        uint32_t l_requiresExtension_12_ext = ExtensionId::GL_EXT_geometry_shader;
        observe(observations.mReads);
        mImports.glFramebufferTextureEXT(target, attachment, texture, level);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFramebufferTextureEXT coder(observations, target, attachment, texture,
                                                      level);
    mEncoder->Object(&coder);
}

inline uint32_t GlesSpy::glGetDebugMessageLogKHR(uint32_t count, int32_t bufSize, uint32_t* sources,
                                                 uint32_t* types, uint32_t* ids,
                                                 uint32_t* severities, int32_t* lengths,
                                                 char* messageLog) {
    GAPID_INFO("glGetDebugMessageLogKHR(%" PRIu32 ", %" PRId32 ", %p, %p, %p, %p, %p, %p)\n", count,
               bufSize, sources, types, ids, severities, lengths, messageLog);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_13_ext = ExtensionId::GL_KHR_debug;
        observe(observations.mReads);
        result = mImports.glGetDebugMessageLogKHR(count, bufSize, sources, types, ids, severities,
                                                  lengths, messageLog);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetDebugMessageLogKHR coder(
            observations, count, bufSize,
            gapic::coder::gles::GLenum__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(sources), 0)),
            gapic::coder::gles::GLenum__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(types), 0)),
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(ids), 0)),
            gapic::coder::gles::GLenum__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(severities), 0)),
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(lengths), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(messageLog), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glGetObjectLabelKHR(uint32_t identifier, uint32_t name, int32_t bufSize,
                                         int32_t* length, char* label) {
    GAPID_INFO("glGetObjectLabelKHR(%u, %" PRIu32 ", %" PRId32 ", %p, %p)\n", identifier, name,
               bufSize, length, label);

    Observations observations;
    do {
        uint32_t l_requiresExtension_14_ext = ExtensionId::GL_KHR_debug;
        observe(observations.mReads);
        mImports.glGetObjectLabelKHR(identifier, name, bufSize, length, label);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetObjectLabelKHR coder(
            observations, identifier, name, bufSize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(label), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetObjectPtrLabelKHR(void* ptr, int32_t bufSize, int32_t* length,
                                            char* label) {
    GAPID_INFO("glGetObjectPtrLabelKHR(%p, %" PRId32 ", %p, %p)\n", ptr, bufSize, length, label);

    Observations observations;
    do {
        uint32_t l_requiresExtension_15_ext = ExtensionId::GL_KHR_debug;
        observe(observations.mReads);
        mImports.glGetObjectPtrLabelKHR(ptr, bufSize, length, label);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetObjectPtrLabelKHR coder(
            observations, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(ptr), 0)),
            bufSize, gapic::coder::gles::GLsizei__P(
                             gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(label), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPointervKHR(uint32_t pname, void** params) {
    GAPID_INFO("glGetPointervKHR(%u, %p)\n", pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_16_ext = ExtensionId::GL_KHR_debug;
        observe(observations.mReads);
        mImports.glGetPointervKHR(pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPointervKHR coder(
            observations, pname, gapic::coder::gles::Void__P__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetSamplerParameterIivEXT(uint32_t sampler, uint32_t pname,
                                                 int32_t* params) {
    GAPID_INFO("glGetSamplerParameterIivEXT(%" PRIu32 ", %u, %p)\n", sampler, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_17_ext = ExtensionId::GL_EXT_texture_border_clamp;
        observe(observations.mReads);
        mImports.glGetSamplerParameterIivEXT(sampler, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetSamplerParameterIivEXT coder(
            observations, sampler, pname,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetSamplerParameterIuivEXT(uint32_t sampler, uint32_t pname,
                                                  uint32_t* params) {
    GAPID_INFO("glGetSamplerParameterIuivEXT(%" PRIu32 ", %u, %p)\n", sampler, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_18_ext = ExtensionId::GL_EXT_texture_border_clamp;
        observe(observations.mReads);
        mImports.glGetSamplerParameterIuivEXT(sampler, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetSamplerParameterIuivEXT coder(
            observations, sampler, pname,
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetTexParameterIivEXT(uint32_t target, uint32_t pname, int32_t* params) {
    GAPID_INFO("glGetTexParameterIivEXT(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_19_ext = ExtensionId::GL_EXT_texture_border_clamp;
        observe(observations.mReads);
        mImports.glGetTexParameterIivEXT(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetTexParameterIivEXT coder(
            observations, target, pname, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                                 reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetTexParameterIuivEXT(uint32_t target, uint32_t pname, uint32_t* params) {
    GAPID_INFO("glGetTexParameterIuivEXT(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_20_ext = ExtensionId::GL_EXT_texture_border_clamp;
        observe(observations.mReads);
        mImports.glGetTexParameterIuivEXT(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetTexParameterIuivEXT coder(
            observations, target, pname,
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glIsEnablediEXT(uint32_t target, uint32_t index) {
    GAPID_INFO("glIsEnablediEXT(%u, %" PRIu32 ")\n", target, index);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_21_ext = ExtensionId::GL_EXT_draw_buffers_indexed;
        observe(observations.mReads);
        result = mImports.glIsEnablediEXT(target, index);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsEnablediEXT coder(observations, target, index, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glMinSampleShadingOES(float value) {
    GAPID_INFO("glMinSampleShadingOES(%f)\n", value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_22_ext = ExtensionId::GL_OES_sample_shading;
        observe(observations.mReads);
        mImports.glMinSampleShadingOES(value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMinSampleShadingOES coder(observations, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glObjectLabelKHR(uint32_t identifier, uint32_t name, int32_t length,
                                      char* label) {
    GAPID_INFO("glObjectLabelKHR(%u, %" PRIu32 ", %" PRId32 ", %p)\n", identifier, name, length,
               label);

    Observations observations;
    do {
        uint32_t l_requiresExtension_23_ext = ExtensionId::GL_KHR_debug;
        observe(observations.mReads);
        mImports.glObjectLabelKHR(identifier, name, length, label);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlObjectLabelKHR coder(
            observations, identifier, name, length,
            gapic::coder::gles::GLchar__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(label), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glObjectPtrLabelKHR(void* ptr, int32_t length, char* label) {
    GAPID_INFO("glObjectPtrLabelKHR(%p, %" PRId32 ", %p)\n", ptr, length, label);

    Observations observations;
    do {
        uint32_t l_requiresExtension_24_ext = ExtensionId::GL_KHR_debug;
        observe(observations.mReads);
        mImports.glObjectPtrLabelKHR(ptr, length, label);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlObjectPtrLabelKHR coder(
            observations, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(ptr), 0)),
            length, gapic::coder::gles::GLchar__CP(
                            gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(label), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPatchParameteriEXT(uint32_t pname, int32_t value) {
    GAPID_INFO("glPatchParameteriEXT(%u, %" PRId32 ")\n", pname, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_25_ext = ExtensionId::GL_EXT_tessellation_shader;
        observe(observations.mReads);
        mImports.glPatchParameteriEXT(pname, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPatchParameteriEXT coder(observations, pname, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPopDebugGroupKHR() {
    GAPID_INFO("glPopDebugGroupKHR()\n");

    Observations observations;
    do {
        uint32_t l_requiresExtension_26_ext = ExtensionId::GL_KHR_debug;
        observe(observations.mReads);
        mImports.glPopDebugGroupKHR();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPopDebugGroupKHR coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPrimitiveBoundingBoxEXT(float minX, float minY, float minZ, float minW,
                                               float maxX, float maxY, float maxZ, float maxW) {
    GAPID_INFO("glPrimitiveBoundingBoxEXT(%f, %f, %f, %f, %f, %f, %f, %f)\n", minX, minY, minZ,
               minW, maxX, maxY, maxZ, maxW);

    Observations observations;
    do {
        uint32_t l_requiresExtension_27_ext = ExtensionId::GL_EXT_primitive_bounding_box;
        observe(observations.mReads);
        mImports.glPrimitiveBoundingBoxEXT(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPrimitiveBoundingBoxEXT coder(observations, minX, minY, minZ, minW, maxX,
                                                        maxY, maxZ, maxW);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPushDebugGroupKHR(uint32_t source, uint32_t id, int32_t length,
                                         char* message) {
    GAPID_INFO("glPushDebugGroupKHR(%u, %" PRIu32 ", %" PRId32 ", %p)\n", source, id, length,
               message);

    Observations observations;
    do {
        uint32_t l_requiresExtension_28_ext = ExtensionId::GL_KHR_debug;
        observe(observations.mReads);
        mImports.glPushDebugGroupKHR(source, id, length, message);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPushDebugGroupKHR coder(
            observations, source, id, length,
            gapic::coder::gles::GLchar__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(message), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSamplerParameterIivEXT(uint32_t sampler, uint32_t pname, int32_t* param) {
    GAPID_INFO("glSamplerParameterIivEXT(%" PRIu32 ", %u, %p)\n", sampler, pname, param);

    Observations observations;
    do {
        uint32_t l_requiresExtension_29_ext = ExtensionId::GL_EXT_texture_border_clamp;
        observe(observations.mReads);
        mImports.glSamplerParameterIivEXT(sampler, pname, param);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSamplerParameterIivEXT coder(
            observations, sampler, pname,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(param), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSamplerParameterIuivEXT(uint32_t sampler, uint32_t pname, uint32_t* param) {
    GAPID_INFO("glSamplerParameterIuivEXT(%" PRIu32 ", %u, %p)\n", sampler, pname, param);

    Observations observations;
    do {
        uint32_t l_requiresExtension_30_ext = ExtensionId::GL_EXT_texture_border_clamp;
        observe(observations.mReads);
        mImports.glSamplerParameterIuivEXT(sampler, pname, param);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSamplerParameterIuivEXT coder(
            observations, sampler, pname,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(param), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexBufferEXT(uint32_t target, uint32_t internalformat, uint32_t buffer) {
    GAPID_INFO("glTexBufferEXT(%u, %u, %" PRIu32 ")\n", target, internalformat, buffer);

    Observations observations;
    do {
        uint32_t l_requiresExtension_31_ext = ExtensionId::GL_EXT_texture_buffer;
        observe(observations.mReads);
        mImports.glTexBufferEXT(target, internalformat, buffer);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexBufferEXT coder(observations, target, internalformat, buffer);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexBufferRangeEXT(uint32_t target, uint32_t internalformat, uint32_t buffer,
                                         int32_t offset, int32_t size) {
    GAPID_INFO("glTexBufferRangeEXT(%u, %u, %" PRIu32 ", %" PRId32 ", %" PRId32 ")\n", target,
               internalformat, buffer, offset, size);

    Observations observations;
    do {
        uint32_t l_requiresExtension_32_ext = ExtensionId::GL_EXT_texture_buffer;
        observe(observations.mReads);
        mImports.glTexBufferRangeEXT(target, internalformat, buffer, offset, size);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexBufferRangeEXT coder(observations, target, internalformat, buffer,
                                                  offset, size);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexParameterIivEXT(uint32_t target, uint32_t pname, int32_t* params) {
    GAPID_INFO("glTexParameterIivEXT(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_33_ext = ExtensionId::GL_EXT_texture_border_clamp;
        observe(observations.mReads);
        mImports.glTexParameterIivEXT(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexParameterIivEXT coder(
            observations, target, pname,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexParameterIuivEXT(uint32_t target, uint32_t pname, uint32_t* params) {
    GAPID_INFO("glTexParameterIuivEXT(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_34_ext = ExtensionId::GL_EXT_texture_border_clamp;
        observe(observations.mReads);
        mImports.glTexParameterIuivEXT(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexParameterIuivEXT coder(
            observations, target, pname,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexStorage3DMultisampleOES(uint32_t target, int32_t samples,
                                                  uint32_t internalformat, int32_t width,
                                                  int32_t height, int32_t depth,
                                                  uint8_t fixedsamplelocations) {
    GAPID_INFO("glTexStorage3DMultisampleOES(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRIu8 ")\n",
               target, samples, internalformat, width, height, depth, fixedsamplelocations);

    Observations observations;
    do {
        uint32_t l_requiresExtension_35_ext =
                ExtensionId::GL_OES_texture_storage_multisample_2d_array;
        observe(observations.mReads);
        mImports.glTexStorage3DMultisampleOES(target, samples, internalformat, width, height, depth,
                                              fixedsamplelocations);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexStorage3DMultisampleOES coder(observations, target, samples,
                                                           internalformat, width, height, depth,
                                                           fixedsamplelocations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBeginQuery(uint32_t target, uint32_t query) {
    GAPID_INFO("glBeginQuery(%u, %" PRIu32 ")\n", target, query);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_36_major = 3;
        uint32_t l_minRequiredVersion_36_minor = 0;
        switch (target) {
            case GLenum::GL_ANY_SAMPLES_PASSED:               // fall-through...
            case GLenum::GL_ANY_SAMPLES_PASSED_CONSERVATIVE:  // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glBeginQuery(target, query);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBeginQuery coder(observations, target, query);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteQueries(int32_t count, uint32_t* queries) {
    GAPID_INFO("glDeleteQueries(%" PRId32 ", %p)\n", count, queries);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_38_major = 3;
        uint32_t l_minRequiredVersion_38_minor = 0;
        Slice<QueryId> l_q = slice(queries, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_39_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_39_result;
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            l_ctx->mInstances.mQueries[read(l_q, (uint64_t)(l_i))] = std::shared_ptr<Query>();
        }
        observe(observations.mReads);
        mImports.glDeleteQueries(count, queries);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteQueries coder(
            observations, count, gapic::coder::gles::QueryId__CP(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(queries), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEndQuery(uint32_t target) {
    GAPID_INFO("glEndQuery(%u)\n", target);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_40_major = 3;
        uint32_t l_minRequiredVersion_40_minor = 0;
        switch (target) {
            case GLenum::GL_ANY_SAMPLES_PASSED:               // fall-through...
            case GLenum::GL_ANY_SAMPLES_PASSED_CONSERVATIVE:  // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glEndQuery(target);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEndQuery coder(observations, target);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenQueries(int32_t count, uint32_t* queries) {
    GAPID_INFO("glGenQueries(%" PRId32 ", %p)\n", count, queries);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_42_major = 3;
        uint32_t l_minRequiredVersion_42_minor = 0;
        Slice<QueryId> l_q = slice(queries, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_43_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_43_result;
        observe(observations.mReads);
        mImports.glGenQueries(count, queries);
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            QueryId l_id = (QueryId)(
                    slice(queries, (uint64_t)((GLsizei)(0)), (uint64_t)(count))[(uint64_t)(l_i)]);
            l_ctx->mInstances.mQueries[l_id] = std::shared_ptr<Query>((new Query()));
            write(l_q, (uint64_t)(l_i), l_id);
        }
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenQueries coder(
            observations, count, gapic::coder::gles::QueryId__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(queries), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetQueryObjectuiv(uint32_t query, uint32_t parameter, uint32_t* value) {
    GAPID_INFO("glGetQueryObjectuiv(%" PRIu32 ", %u, %p)\n", query, parameter, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_44_major = 3;
        uint32_t l_minRequiredVersion_44_minor = 0;
        switch (parameter) {
            case GLenum::GL_QUERY_RESULT:  // fall-through...
            case GLenum::GL_QUERY_RESULT_AVAILABLE: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetQueryObjectuiv(query, parameter, value);
        write(slice(value, 0, 1), 0, slice(value, 0, 1)[0]);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetQueryObjectuiv coder(
            observations, query, parameter,
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetQueryiv(uint32_t target, uint32_t parameter, int32_t* value) {
    GAPID_INFO("glGetQueryiv(%u, %u, %p)\n", target, parameter, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_46_major = 3;
        uint32_t l_minRequiredVersion_46_minor = 0;
        switch (target) {
            case GLenum::GL_ANY_SAMPLES_PASSED:               // fall-through...
            case GLenum::GL_ANY_SAMPLES_PASSED_CONSERVATIVE:  // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: {
                break;
            }
        }
        switch (parameter) {
            case GLenum::GL_CURRENT_QUERY: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetQueryiv(target, parameter, value);
        write(slice(value, 0, 1), 0, slice(value, 0, 1)[0]);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetQueryiv coder(
            observations, target, parameter,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glIsQuery(uint32_t query) {
    GAPID_INFO("glIsQuery(%" PRIu32 ")\n", query);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_49_major = 3;
        uint32_t l_minRequiredVersion_49_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_50_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_50_result;
        observe(observations.mReads);
        result = mImports.glIsQuery(query);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsQuery coder(observations, query, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glBindBuffer(uint32_t target, uint32_t buffer) {
    GAPID_INFO("glBindBuffer(%u, %" PRIu32 ")\n", target, buffer);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_51_major = 2;
        uint32_t l_minRequiredVersion_51_minor = 0;
        switch (target) {
            case GLenum::GL_ARRAY_BUFFER:  // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER: {
                break;
            }
            case GLenum::GL_COPY_READ_BUFFER:           // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                uint32_t l_minRequiredVersion_52_major = 3;
                uint32_t l_minRequiredVersion_52_minor = 0;
                break;
            }
            case GLenum::GL_ATOMIC_COUNTER_BUFFER:     // fall-through...
            case GLenum::GL_DISPATCH_INDIRECT_BUFFER:  // fall-through...
            case GLenum::GL_DRAW_INDIRECT_BUFFER:      // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER: {
                uint32_t l_minRequiredVersion_53_major = 3;
                uint32_t l_minRequiredVersion_53_minor = 1;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_55_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_55_result;
        if (!(l_ctx->mInstances.mBuffers.count(buffer) > 0)) {
            l_ctx->mInstances.mBuffers[buffer] = std::shared_ptr<Buffer>((new Buffer()));
        }
        l_ctx->mBoundBuffers[target] = buffer;
        observe(observations.mReads);
        mImports.glBindBuffer(target, buffer);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindBuffer coder(observations, target, buffer);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindBufferBase(uint32_t target, uint32_t index, uint32_t buffer) {
    GAPID_INFO("glBindBufferBase(%u, %" PRIu32 ", %" PRIu32 ")\n", target, index, buffer);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_56_major = 3;
        uint32_t l_minRequiredVersion_56_minor = 0;
        switch (target) {
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                break;
            }
            case GLenum::GL_ATOMIC_COUNTER_BUFFER:  // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER: {
                uint32_t l_minRequiredVersion_57_major = 3;
                uint32_t l_minRequiredVersion_57_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glBindBufferBase(target, index, buffer);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindBufferBase coder(observations, target, index, buffer);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindBufferRange(uint32_t target, uint32_t index, uint32_t buffer,
                                       int32_t offset, int32_t size) {
    GAPID_INFO("glBindBufferRange(%u, %" PRIu32 ", %" PRIu32 ", %" PRId32 ", %" PRId32 ")\n",
               target, index, buffer, offset, size);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_59_major = 3;
        uint32_t l_minRequiredVersion_59_minor = 0;
        switch (target) {
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                break;
            }
            case GLenum::GL_ATOMIC_COUNTER_BUFFER:  // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER: {
                uint32_t l_minRequiredVersion_60_major = 3;
                uint32_t l_minRequiredVersion_60_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glBindBufferRange(target, index, buffer, offset, size);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindBufferRange coder(observations, target, index, buffer, offset, size);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBufferData(uint32_t target, int32_t size, void* data, uint32_t usage) {
    GAPID_INFO("glBufferData(%u, %" PRId32 ", %p, %u)\n", target, size, data, usage);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_62_major = 2;
        uint32_t l_minRequiredVersion_62_minor = 0;
        switch (target) {
            case GLenum::GL_ARRAY_BUFFER:  // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER: {
                break;
            }
            case GLenum::GL_COPY_READ_BUFFER:           // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                uint32_t l_minRequiredVersion_63_major = 3;
                uint32_t l_minRequiredVersion_63_minor = 0;
                break;
            }
            case GLenum::GL_ATOMIC_COUNTER_BUFFER:     // fall-through...
            case GLenum::GL_DISPATCH_INDIRECT_BUFFER:  // fall-through...
            case GLenum::GL_DRAW_INDIRECT_BUFFER:      // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER: {
                uint32_t l_minRequiredVersion_64_major = 3;
                uint32_t l_minRequiredVersion_64_minor = 1;
                break;
            }
        }
        switch (usage) {
            case GLenum::GL_DYNAMIC_DRAW:  // fall-through...
            case GLenum::GL_STATIC_DRAW:   // fall-through...
            case GLenum::GL_STREAM_DRAW: {
                break;
            }
            case GLenum::GL_DYNAMIC_COPY:  // fall-through...
            case GLenum::GL_DYNAMIC_READ:  // fall-through...
            case GLenum::GL_STATIC_COPY:   // fall-through...
            case GLenum::GL_STATIC_READ:   // fall-through...
            case GLenum::GL_STREAM_COPY:   // fall-through...
            case GLenum::GL_STREAM_READ: {
                uint32_t l_minRequiredVersion_66_major = 3;
                uint32_t l_minRequiredVersion_66_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_68_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_68_result;
        BufferId l_id = l_ctx->mBoundBuffers[target];
        std::shared_ptr<Buffer> l_b = l_ctx->mInstances.mBuffers[l_id];
        l_b->mData = /* clang-format off */
        /* switch(data != nullptr) */
            /* case true: */(((data != nullptr) == (true))) ? (clone(slice((uint8_t*)(data), (uint64_t)((GLsizeiptr)(0)), (uint64_t)(size)))) :
            /* case false: */(((data != nullptr) == (false))) ? (make<uint8_t>((uint64_t)(size))) :
            /* default: */ Slice<uint8_t>() /* clang-format on */;
        l_b->mSize = size;
        l_b->mUsage = usage;
        observe(observations.mReads);
        mImports.glBufferData(target, size, data, usage);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBufferData coder(
            observations, target, size,
            gapic::coder::gles::BufferDataPointer(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)),
            usage);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBufferSubData(uint32_t target, int32_t offset, int32_t size, void* data) {
    GAPID_INFO("glBufferSubData(%u, %" PRId32 ", %" PRId32 ", %p)\n", target, offset, size, data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_69_major = 2;
        uint32_t l_minRequiredVersion_69_minor = 0;
        switch (target) {
            case GLenum::GL_ARRAY_BUFFER:  // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER: {
                break;
            }
            case GLenum::GL_COPY_READ_BUFFER:           // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                uint32_t l_minRequiredVersion_70_major = 3;
                uint32_t l_minRequiredVersion_70_minor = 0;
                break;
            }
            case GLenum::GL_ATOMIC_COUNTER_BUFFER:     // fall-through...
            case GLenum::GL_DISPATCH_INDIRECT_BUFFER:  // fall-through...
            case GLenum::GL_DRAW_INDIRECT_BUFFER:      // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER: {
                uint32_t l_minRequiredVersion_71_major = 3;
                uint32_t l_minRequiredVersion_71_minor = 1;
                break;
            }
        }
        read(slice(data, (uint64_t)((GLsizeiptr)(0)), (uint64_t)(size)));
        observe(observations.mReads);
        mImports.glBufferSubData(target, offset, size, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBufferSubData coder(
            observations, target, offset, size,
            gapic::coder::gles::BufferDataPointer(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCopyBufferSubData(uint32_t readTarget, uint32_t writeTarget,
                                         int32_t readOffset, int32_t writeOffset, int32_t size) {
    GAPID_INFO("glCopyBufferSubData(%u, %u, %" PRId32 ", %" PRId32 ", %" PRId32 ")\n", readTarget,
               writeTarget, readOffset, writeOffset, size);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_73_major = 3;
        uint32_t l_minRequiredVersion_73_minor = 0;
        switch (readTarget) {
            case GLenum::GL_ARRAY_BUFFER:               // fall-through...
            case GLenum::GL_COPY_READ_BUFFER:           // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER:          // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER:       // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                break;
            }
        }
        switch (writeTarget) {
            case GLenum::GL_ARRAY_BUFFER:               // fall-through...
            case GLenum::GL_COPY_READ_BUFFER:           // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER:          // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER:       // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCopyBufferSubData coder(observations, readTarget, writeTarget, readOffset,
                                                  writeOffset, size);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteBuffers(int32_t count, uint32_t* buffers) {
    GAPID_INFO("glDeleteBuffers(%" PRId32 ", %p)\n", count, buffers);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_76_major = 2;
        uint32_t l_minRequiredVersion_76_minor = 0;
        Slice<BufferId> l_b = slice(buffers, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_77_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_77_result;
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            l_ctx->mInstances.mBuffers[read(l_b, (uint64_t)(l_i))] = std::shared_ptr<Buffer>();
        }
        observe(observations.mReads);
        mImports.glDeleteBuffers(count, buffers);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteBuffers coder(
            observations, count, gapic::coder::gles::BufferId__CP(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(buffers), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenBuffers(int32_t count, uint32_t* buffers) {
    GAPID_INFO("glGenBuffers(%" PRId32 ", %p)\n", count, buffers);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_78_major = 2;
        uint32_t l_minRequiredVersion_78_minor = 0;
        Slice<BufferId> l_b = slice(buffers, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_79_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_79_result;
        observe(observations.mReads);
        mImports.glGenBuffers(count, buffers);
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            BufferId l_id = (BufferId)(
                    slice(buffers, (uint64_t)((GLsizei)(0)), (uint64_t)(count))[(uint64_t)(l_i)]);
            l_ctx->mInstances.mBuffers[l_id] = std::shared_ptr<Buffer>((new Buffer()));
            write(l_b, (uint64_t)(l_i), l_id);
        }
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenBuffers coder(
            observations, count, gapic::coder::gles::BufferId__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(buffers), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetBufferParameteri64v(uint32_t target, uint32_t pname, int64_t* params) {
    GAPID_INFO("glGetBufferParameteri64v(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_80_major = 3;
        uint32_t l_minRequiredVersion_80_minor = 0;
        switch (target) {
            case GLenum::GL_ARRAY_BUFFER:               // fall-through...
            case GLenum::GL_COPY_READ_BUFFER:           // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER:          // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER:       // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                break;
            }
        }
        switch (pname) {
            case GLenum::GL_BUFFER_ACCESS_FLAGS:  // fall-through...
            case GLenum::GL_BUFFER_MAPPED:        // fall-through...
            case GLenum::GL_BUFFER_MAP_LENGTH:    // fall-through...
            case GLenum::GL_BUFFER_MAP_OFFSET:    // fall-through...
            case GLenum::GL_BUFFER_SIZE:          // fall-through...
            case GLenum::GL_BUFFER_USAGE: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetBufferParameteri64v(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetBufferParameteri64v coder(
            observations, target, pname,
            gapic::coder::gles::GLint64__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetBufferParameteriv(uint32_t target, uint32_t parameter, int32_t* value) {
    GAPID_INFO("glGetBufferParameteriv(%u, %u, %p)\n", target, parameter, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_83_major = 2;
        uint32_t l_minRequiredVersion_83_minor = 0;
        switch (target) {
            case GLenum::GL_ARRAY_BUFFER:  // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER: {
                break;
            }
            case GLenum::GL_COPY_READ_BUFFER:           // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                uint32_t l_minRequiredVersion_84_major = 3;
                uint32_t l_minRequiredVersion_84_minor = 0;
                break;
            }
        }
        switch (parameter) {
            case GLenum::GL_BUFFER_SIZE:  // fall-through...
            case GLenum::GL_BUFFER_USAGE: {
                break;
            }
            case GLenum::GL_BUFFER_ACCESS_FLAGS:  // fall-through...
            case GLenum::GL_BUFFER_MAPPED:        // fall-through...
            case GLenum::GL_BUFFER_MAP_LENGTH:    // fall-through...
            case GLenum::GL_BUFFER_MAP_OFFSET: {
                uint32_t l_minRequiredVersion_86_major = 3;
                uint32_t l_minRequiredVersion_86_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_88_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_88_result;
        BufferId l_id = l_ctx->mBoundBuffers[target];
        std::shared_ptr<Buffer> l_b = l_ctx->mInstances.mBuffers[l_id];
        observe(observations.mReads);
        mImports.glGetBufferParameteriv(target, parameter, value);
        write(slice(value, 0, 1), 0, /* clang-format off */
        /* switch(parameter) */
            /* case GLenum::GL_BUFFER_SIZE: */(((parameter) == (GLenum::GL_BUFFER_SIZE))) ? ((GLint)(l_b->mSize)) :
            /* case GLenum::GL_BUFFER_USAGE: */(((parameter) == (GLenum::GL_BUFFER_USAGE))) ? ((GLint)(l_b->mUsage)) :
            /* default: */ 0 /* clang-format on */);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetBufferParameteriv coder(
            observations, target, parameter,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetBufferPointerv(uint32_t target, uint32_t pname, void** params) {
    GAPID_INFO("glGetBufferPointerv(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_89_major = 3;
        uint32_t l_minRequiredVersion_89_minor = 0;
        switch (target) {
            case GLenum::GL_ARRAY_BUFFER:               // fall-through...
            case GLenum::GL_COPY_READ_BUFFER:           // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER:          // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER:       // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                break;
            }
        }
        switch (pname) {
            case GLenum::GL_BUFFER_MAP_POINTER: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetBufferPointerv(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetBufferPointerv coder(
            observations, target, pname,
            gapic::coder::gles::Void__P__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glIsBuffer(uint32_t buffer) {
    GAPID_INFO("glIsBuffer(%" PRIu32 ")\n", buffer);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_92_major = 2;
        uint32_t l_minRequiredVersion_92_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_93_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_93_result;
        observe(observations.mReads);
        result = mImports.glIsBuffer(buffer);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsBuffer coder(observations, buffer, result);
    mEncoder->Object(&coder);

    return result;
}

inline void* GlesSpy::glMapBufferRange(uint32_t target, int32_t offset, int32_t length,
                                       uint32_t access) {
    GAPID_INFO("glMapBufferRange(%u, %" PRId32 ", %" PRId32 ", %u)\n", target, offset, length,
               access);

    void* result = nullptr;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_94_major = 3;
        uint32_t l_minRequiredVersion_94_minor = 0;
        switch (target) {
            case GLenum::GL_ARRAY_BUFFER:               // fall-through...
            case GLenum::GL_COPY_READ_BUFFER:           // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER:          // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER:       // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                break;
            }
            case GLenum::GL_ATOMIC_COUNTER_BUFFER:     // fall-through...
            case GLenum::GL_DISPATCH_INDIRECT_BUFFER:  // fall-through...
            case GLenum::GL_DRAW_INDIRECT_BUFFER:      // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER: {
                uint32_t l_minRequiredVersion_95_major = 3;
                uint32_t l_minRequiredVersion_95_minor = 1;
                break;
            }
        }
        uint32_t l_supportsBits_97_seenBits = access;
        uint32_t l_supportsBits_97_validBits =
                GLbitfield::GL_MAP_FLUSH_EXPLICIT_BIT | GLbitfield::GL_MAP_INVALIDATE_BUFFER_BIT |
                GLbitfield::GL_MAP_INVALIDATE_RANGE_BIT | GLbitfield::GL_MAP_READ_BIT |
                GLbitfield::GL_MAP_UNSYNCHRONIZED_BIT | GLbitfield::GL_MAP_WRITE_BIT;
        if ((access & GLbitfield::GL_MAP_FLUSH_EXPLICIT_BIT) != 0) {
        }
        if ((access & GLbitfield::GL_MAP_INVALIDATE_BUFFER_BIT) != 0) {
        }
        if ((access & GLbitfield::GL_MAP_INVALIDATE_RANGE_BIT) != 0) {
        }
        if ((access & GLbitfield::GL_MAP_READ_BIT) != 0) {
        }
        if ((access & GLbitfield::GL_MAP_UNSYNCHRONIZED_BIT) != 0) {
        }
        if ((access & GLbitfield::GL_MAP_WRITE_BIT) != 0) {
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_98_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_98_result;
        std::shared_ptr<Buffer> l_b = l_ctx->mInstances.mBuffers[l_ctx->mBoundBuffers[target]];
        observe(observations.mReads);
        result = mImports.glMapBufferRange(target, offset, length, access);
        uint8_t* l_ptr = (uint8_t*)(result);
        l_b->mMappingAccess = access;
        l_b->mMappingData = slice(l_ptr, (uint64_t)((GLsizeiptr)(0)), (uint64_t)(length));
        if ((access & GLbitfield::GL_MAP_READ_BIT) != 0) {
            Slice<uint8_t> l_src =
                    slice(l_b->mData, (uint64_t)(offset), (uint64_t)(offset + (GLintptr)(length)));
            Slice<uint8_t> l_dst = l_b->mMappingData;
            write(l_dst);
        }
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMapBufferRange coder(
            observations, target, offset, length, access,
            gapic::coder::gles::Void__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(result), 0)));
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glUnmapBuffer(uint32_t target) {
    GAPID_INFO("glUnmapBuffer(%u)\n", target);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_99_major = 3;
        uint32_t l_minRequiredVersion_99_minor = 0;
        switch (target) {
            case GLenum::GL_ARRAY_BUFFER:               // fall-through...
            case GLenum::GL_COPY_READ_BUFFER:           // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER:          // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER:       // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                break;
            }
            case GLenum::GL_ATOMIC_COUNTER_BUFFER:     // fall-through...
            case GLenum::GL_DISPATCH_INDIRECT_BUFFER:  // fall-through...
            case GLenum::GL_DRAW_INDIRECT_BUFFER:      // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER: {
                uint32_t l_minRequiredVersion_100_major = 3;
                uint32_t l_minRequiredVersion_100_minor = 1;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_102_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_102_result;
        std::shared_ptr<Buffer> l_b = l_ctx->mInstances.mBuffers[l_ctx->mBoundBuffers[target]];
        Slice<uint8_t> copy__dst__ =
                copy(slice(l_b->mData, (uint64_t)(l_b->mMappingOffset),
                           (uint64_t)(l_b->mMappingOffset + int32_t((l_b->mMappingData.count())))),
                     l_b->mMappingData);
        observe(observations.mReads);
        result = mImports.glUnmapBuffer(target);
        write(copy__dst__);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUnmapBuffer coder(observations, target, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glDrawArrays(uint32_t draw_mode, int32_t first_index, int32_t index_count) {
    GAPID_INFO("glDrawArrays(%u, %" PRId32 ", %" PRId32 ")\n", draw_mode, first_index, index_count);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_103_major = 2;
        uint32_t l_minRequiredVersion_103_minor = 0;
        switch (draw_mode) {
            case GLenum::GL_LINES:         // fall-through...
            case GLenum::GL_LINE_LOOP:     // fall-through...
            case GLenum::GL_LINE_STRIP:    // fall-through...
            case GLenum::GL_POINTS:        // fall-through...
            case GLenum::GL_TRIANGLES:     // fall-through...
            case GLenum::GL_TRIANGLE_FAN:  // fall-through...
            case GLenum::GL_TRIANGLE_STRIP: {
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_105_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_105_result;
        uint32_t l_last_index = (uint32_t)(first_index) + (uint32_t)(index_count)-1;
        std::shared_ptr<Context> l_ReadVertexArrays_106_ctx = l_ctx;
        uint32_t l_ReadVertexArrays_106_first_index = (uint32_t)(first_index);
        uint32_t l_ReadVertexArrays_106_last_index = l_last_index;
        for (int32_t l_i = 0;
             l_i < int32_t((l_ReadVertexArrays_106_ctx->mVertexAttributeArrays.size())); ++l_i) {
            std::shared_ptr<VertexAttributeArray> l_arr =
                    l_ReadVertexArrays_106_ctx->mVertexAttributeArrays[(AttributeLocation)(l_i)];
            if (l_arr->mEnabled && l_arr->mBuffer == (BufferId)(0)) {
                uint32_t l_vertexAttribTypeSize_107_t = l_arr->mType;
                uint32_t l_vertexAttribTypeSize_107_result = /* clang-format off */
                /* switch(l_vertexAttribTypeSize_107_t) */
                    /* case GLenum::GL_BYTE: */(((l_vertexAttribTypeSize_107_t) == (GLenum::GL_BYTE))) ? (1) :
                    /* case GLenum::GL_UNSIGNED_BYTE: */(((l_vertexAttribTypeSize_107_t) == (GLenum::GL_UNSIGNED_BYTE))) ? (1) :
                    /* case GLenum::GL_SHORT: */(((l_vertexAttribTypeSize_107_t) == (GLenum::GL_SHORT))) ? (2) :
                    /* case GLenum::GL_UNSIGNED_SHORT: */(((l_vertexAttribTypeSize_107_t) == (GLenum::GL_UNSIGNED_SHORT))) ? (2) :
                    /* case GLenum::GL_FIXED: */(((l_vertexAttribTypeSize_107_t) == (GLenum::GL_FIXED))) ? (4) :
                    /* case GLenum::GL_FLOAT: */(((l_vertexAttribTypeSize_107_t) == (GLenum::GL_FLOAT))) ? (4) :
                    /* case GLenum::GL_HALF_FLOAT_ARB: */(((l_vertexAttribTypeSize_107_t) == (GLenum::GL_HALF_FLOAT_ARB))) ? (2) :
                    /* case GLenum::GL_HALF_FLOAT_OES: */(((l_vertexAttribTypeSize_107_t) == (GLenum::GL_HALF_FLOAT_OES))) ? (2) :
                    /* default: */ 0 /* clang-format on */;
                uint32_t l_elsize = l_vertexAttribTypeSize_107_result * l_arr->mSize;
                uint32_t l_elstride = /* clang-format off */
                /* switch(l_arr->mStride == (GLsizei)(0)) */
                    /* case true: */(((l_arr->mStride == (GLsizei)(0)) == (true))) ? (l_elsize) :
                    /* case false: */(((l_arr->mStride == (GLsizei)(0)) == (false))) ? ((uint32_t)(l_arr->mStride)) :
                    /* default: */ 0 /* clang-format on */;
                for (uint32_t l_v = l_ReadVertexArrays_106_first_index;
                     l_v < l_ReadVertexArrays_106_last_index + 1; ++l_v) {
                    uint32_t l_offset = l_elstride * l_v;
                    read(slice(l_arr->mPointer, (uint64_t)(l_offset),
                               (uint64_t)(l_offset + l_elsize)));
                }
            }
        }
        observe(observations.mReads);
        mImports.glDrawArrays(draw_mode, first_index, index_count);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawArrays coder(observations, draw_mode, first_index, index_count);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawArraysIndirect(uint32_t mode, void* indirect) {
    GAPID_INFO("glDrawArraysIndirect(%u, %p)\n", mode, indirect);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_108_major = 3;
        uint32_t l_minRequiredVersion_108_minor = 1;
        switch (mode) {
            case GLenum::GL_LINES:         // fall-through...
            case GLenum::GL_LINE_LOOP:     // fall-through...
            case GLenum::GL_LINE_STRIP:    // fall-through...
            case GLenum::GL_POINTS:        // fall-through...
            case GLenum::GL_TRIANGLES:     // fall-through...
            case GLenum::GL_TRIANGLE_FAN:  // fall-through...
            case GLenum::GL_TRIANGLE_STRIP: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glDrawArraysIndirect(mode, indirect);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawArraysIndirect coder(
            observations, mode, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                                        reinterpret_cast<uintptr_t>(indirect), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawArraysInstanced(uint32_t mode, int32_t first, int32_t count,
                                           int32_t instancecount) {
    GAPID_INFO("glDrawArraysInstanced(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ")\n", mode, first,
               count, instancecount);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_110_major = 3;
        uint32_t l_minRequiredVersion_110_minor = 0;
        switch (mode) {
            case GLenum::GL_LINES:         // fall-through...
            case GLenum::GL_LINE_LOOP:     // fall-through...
            case GLenum::GL_LINE_STRIP:    // fall-through...
            case GLenum::GL_POINTS:        // fall-through...
            case GLenum::GL_TRIANGLES:     // fall-through...
            case GLenum::GL_TRIANGLE_FAN:  // fall-through...
            case GLenum::GL_TRIANGLE_STRIP: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glDrawArraysInstanced(mode, first, count, instancecount);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawArraysInstanced coder(observations, mode, first, count,
                                                    instancecount);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawBuffers(int32_t n, uint32_t* bufs) {
    GAPID_INFO("glDrawBuffers(%" PRId32 ", %p)\n", n, bufs);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_112_major = 3;
        uint32_t l_minRequiredVersion_112_minor = 0;
        observe(observations.mReads);
        mImports.glDrawBuffers(n, bufs);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawBuffers coder(
            observations, n, gapic::coder::gles::GLenum__CP(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(bufs), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawElements(uint32_t draw_mode, int32_t element_count,
                                    uint32_t indices_type, void* indices) {
    GAPID_INFO("glDrawElements(%u, %" PRId32 ", %u, %p)\n", draw_mode, element_count, indices_type,
               indices);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_113_major = 2;
        uint32_t l_minRequiredVersion_113_minor = 0;
        switch (draw_mode) {
            case GLenum::GL_LINES:         // fall-through...
            case GLenum::GL_LINE_LOOP:     // fall-through...
            case GLenum::GL_LINE_STRIP:    // fall-through...
            case GLenum::GL_POINTS:        // fall-through...
            case GLenum::GL_TRIANGLES:     // fall-through...
            case GLenum::GL_TRIANGLE_FAN:  // fall-through...
            case GLenum::GL_TRIANGLE_STRIP: {
                break;
            }
        }
        switch (indices_type) {
            case GLenum::GL_UNSIGNED_BYTE:  // fall-through...
            case GLenum::GL_UNSIGNED_SHORT: {
                break;
            }
            case GLenum::GL_UNSIGNED_INT: {
                uint32_t l_minRequiredVersion_115_major = 3;
                uint32_t l_minRequiredVersion_115_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_117_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_117_result;
        uint32_t l_count = (uint32_t)(element_count);
        BufferId l_id = l_ctx->mBoundBuffers[GLenum::GL_ELEMENT_ARRAY_BUFFER];
        if (l_id != (BufferId)(0)) {
            Slice<uint8_t> l_index_data = l_ctx->mInstances.mBuffers[l_id]->mData;
            uint32_t l_offset = (uint32_t)((uint64_t)(indices));
            uint32_t l_first = minIndex(l_index_data.begin(), indices_type, l_offset, l_count);
            uint32_t l_last = maxIndex(l_index_data.begin(), indices_type, l_offset, l_count);
            std::shared_ptr<Context> l_ReadVertexArrays_118_ctx = l_ctx;
            uint32_t l_ReadVertexArrays_118_first_index = l_first;
            uint32_t l_ReadVertexArrays_118_last_index = l_last;
            for (int32_t l_i = 0;
                 l_i < int32_t((l_ReadVertexArrays_118_ctx->mVertexAttributeArrays.size()));
                 ++l_i) {
                std::shared_ptr<VertexAttributeArray> l_arr =
                        l_ReadVertexArrays_118_ctx
                                ->mVertexAttributeArrays[(AttributeLocation)(l_i)];
                if (l_arr->mEnabled && l_arr->mBuffer == (BufferId)(0)) {
                    uint32_t l_vertexAttribTypeSize_119_t = l_arr->mType;
                    uint32_t l_vertexAttribTypeSize_119_result = /* clang-format off */
                    /* switch(l_vertexAttribTypeSize_119_t) */
                        /* case GLenum::GL_BYTE: */(((l_vertexAttribTypeSize_119_t) == (GLenum::GL_BYTE))) ? (1) :
                        /* case GLenum::GL_UNSIGNED_BYTE: */(((l_vertexAttribTypeSize_119_t) == (GLenum::GL_UNSIGNED_BYTE))) ? (1) :
                        /* case GLenum::GL_SHORT: */(((l_vertexAttribTypeSize_119_t) == (GLenum::GL_SHORT))) ? (2) :
                        /* case GLenum::GL_UNSIGNED_SHORT: */(((l_vertexAttribTypeSize_119_t) == (GLenum::GL_UNSIGNED_SHORT))) ? (2) :
                        /* case GLenum::GL_FIXED: */(((l_vertexAttribTypeSize_119_t) == (GLenum::GL_FIXED))) ? (4) :
                        /* case GLenum::GL_FLOAT: */(((l_vertexAttribTypeSize_119_t) == (GLenum::GL_FLOAT))) ? (4) :
                        /* case GLenum::GL_HALF_FLOAT_ARB: */(((l_vertexAttribTypeSize_119_t) == (GLenum::GL_HALF_FLOAT_ARB))) ? (2) :
                        /* case GLenum::GL_HALF_FLOAT_OES: */(((l_vertexAttribTypeSize_119_t) == (GLenum::GL_HALF_FLOAT_OES))) ? (2) :
                        /* default: */ 0 /* clang-format on */;
                    uint32_t l_elsize = l_vertexAttribTypeSize_119_result * l_arr->mSize;
                    uint32_t l_elstride = /* clang-format off */
                    /* switch(l_arr->mStride == (GLsizei)(0)) */
                        /* case true: */(((l_arr->mStride == (GLsizei)(0)) == (true))) ? (l_elsize) :
                        /* case false: */(((l_arr->mStride == (GLsizei)(0)) == (false))) ? ((uint32_t)(l_arr->mStride)) :
                        /* default: */ 0 /* clang-format on */;
                    for (uint32_t l_v = l_ReadVertexArrays_118_first_index;
                         l_v < l_ReadVertexArrays_118_last_index + 1; ++l_v) {
                        uint32_t l_offset = l_elstride * l_v;
                        read(slice(l_arr->mPointer, (uint64_t)(l_offset),
                                   (uint64_t)(l_offset + l_elsize)));
                    }
                }
            }
        } else {
            uint8_t* l_index_data = (uint8_t*)(indices);
            uint32_t l_first = minIndex(l_index_data, indices_type, 0, l_count);
            uint32_t l_last = maxIndex(l_index_data, indices_type, 0, l_count);
            std::shared_ptr<Context> l_ReadVertexArrays_120_ctx = l_ctx;
            uint32_t l_ReadVertexArrays_120_first_index = l_first;
            uint32_t l_ReadVertexArrays_120_last_index = l_last;
            for (int32_t l_i = 0;
                 l_i < int32_t((l_ReadVertexArrays_120_ctx->mVertexAttributeArrays.size()));
                 ++l_i) {
                std::shared_ptr<VertexAttributeArray> l_arr =
                        l_ReadVertexArrays_120_ctx
                                ->mVertexAttributeArrays[(AttributeLocation)(l_i)];
                if (l_arr->mEnabled && l_arr->mBuffer == (BufferId)(0)) {
                    uint32_t l_vertexAttribTypeSize_121_t = l_arr->mType;
                    uint32_t l_vertexAttribTypeSize_121_result = /* clang-format off */
                    /* switch(l_vertexAttribTypeSize_121_t) */
                        /* case GLenum::GL_BYTE: */(((l_vertexAttribTypeSize_121_t) == (GLenum::GL_BYTE))) ? (1) :
                        /* case GLenum::GL_UNSIGNED_BYTE: */(((l_vertexAttribTypeSize_121_t) == (GLenum::GL_UNSIGNED_BYTE))) ? (1) :
                        /* case GLenum::GL_SHORT: */(((l_vertexAttribTypeSize_121_t) == (GLenum::GL_SHORT))) ? (2) :
                        /* case GLenum::GL_UNSIGNED_SHORT: */(((l_vertexAttribTypeSize_121_t) == (GLenum::GL_UNSIGNED_SHORT))) ? (2) :
                        /* case GLenum::GL_FIXED: */(((l_vertexAttribTypeSize_121_t) == (GLenum::GL_FIXED))) ? (4) :
                        /* case GLenum::GL_FLOAT: */(((l_vertexAttribTypeSize_121_t) == (GLenum::GL_FLOAT))) ? (4) :
                        /* case GLenum::GL_HALF_FLOAT_ARB: */(((l_vertexAttribTypeSize_121_t) == (GLenum::GL_HALF_FLOAT_ARB))) ? (2) :
                        /* case GLenum::GL_HALF_FLOAT_OES: */(((l_vertexAttribTypeSize_121_t) == (GLenum::GL_HALF_FLOAT_OES))) ? (2) :
                        /* default: */ 0 /* clang-format on */;
                    uint32_t l_elsize = l_vertexAttribTypeSize_121_result * l_arr->mSize;
                    uint32_t l_elstride = /* clang-format off */
                    /* switch(l_arr->mStride == (GLsizei)(0)) */
                        /* case true: */(((l_arr->mStride == (GLsizei)(0)) == (true))) ? (l_elsize) :
                        /* case false: */(((l_arr->mStride == (GLsizei)(0)) == (false))) ? ((uint32_t)(l_arr->mStride)) :
                        /* default: */ 0 /* clang-format on */;
                    for (uint32_t l_v = l_ReadVertexArrays_120_first_index;
                         l_v < l_ReadVertexArrays_120_last_index + 1; ++l_v) {
                        uint32_t l_offset = l_elstride * l_v;
                        read(slice(l_arr->mPointer, (uint64_t)(l_offset),
                                   (uint64_t)(l_offset + l_elsize)));
                    }
                }
            }
            uint32_t l_IndexSize_122_indices_type = indices_type;
            uint32_t l_IndexSize_122_result = /* clang-format off */
            /* switch(l_IndexSize_122_indices_type) */
                /* case GLenum::GL_UNSIGNED_BYTE: */(((l_IndexSize_122_indices_type) == (GLenum::GL_UNSIGNED_BYTE))) ? (1) :
                /* case GLenum::GL_UNSIGNED_SHORT: */(((l_IndexSize_122_indices_type) == (GLenum::GL_UNSIGNED_SHORT))) ? (2) :
                /* case GLenum::GL_UNSIGNED_INT: */(((l_IndexSize_122_indices_type) == (GLenum::GL_UNSIGNED_INT))) ? (4) :
                /* default: */ 0 /* clang-format on */;
            read(slice(l_index_data, (uint64_t)(0),
                       (uint64_t)((uint32_t)(element_count)*l_IndexSize_122_result)));
        }
        observe(observations.mReads);
        mImports.glDrawElements(draw_mode, element_count, indices_type, indices);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawElements coder(
            observations, draw_mode, element_count, indices_type,
            gapic::coder::gles::IndicesPointer(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawElementsIndirect(uint32_t mode, uint32_t type, void* indirect) {
    GAPID_INFO("glDrawElementsIndirect(%u, %u, %p)\n", mode, type, indirect);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_123_major = 3;
        uint32_t l_minRequiredVersion_123_minor = 1;
        switch (mode) {
            case GLenum::GL_LINES:         // fall-through...
            case GLenum::GL_LINE_LOOP:     // fall-through...
            case GLenum::GL_LINE_STRIP:    // fall-through...
            case GLenum::GL_POINTS:        // fall-through...
            case GLenum::GL_TRIANGLES:     // fall-through...
            case GLenum::GL_TRIANGLE_FAN:  // fall-through...
            case GLenum::GL_TRIANGLE_STRIP: {
                break;
            }
        }
        switch (type) {
            case GLenum::GL_UNSIGNED_BYTE:  // fall-through...
            case GLenum::GL_UNSIGNED_INT:   // fall-through...
            case GLenum::GL_UNSIGNED_SHORT: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glDrawElementsIndirect(mode, type, indirect);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawElementsIndirect coder(
            observations, mode, type, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                                              reinterpret_cast<uintptr_t>(indirect), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawElementsInstanced(uint32_t mode, int32_t count, uint32_t type,
                                             void* indices, int32_t instancecount) {
    GAPID_INFO("glDrawElementsInstanced(%u, %" PRId32 ", %u, %p, %" PRId32 ")\n", mode, count, type,
               indices, instancecount);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_126_major = 3;
        uint32_t l_minRequiredVersion_126_minor = 0;
        switch (mode) {
            case GLenum::GL_LINES:         // fall-through...
            case GLenum::GL_LINE_LOOP:     // fall-through...
            case GLenum::GL_LINE_STRIP:    // fall-through...
            case GLenum::GL_POINTS:        // fall-through...
            case GLenum::GL_TRIANGLES:     // fall-through...
            case GLenum::GL_TRIANGLE_FAN:  // fall-through...
            case GLenum::GL_TRIANGLE_STRIP: {
                break;
            }
        }
        switch (type) {
            case GLenum::GL_UNSIGNED_BYTE:  // fall-through...
            case GLenum::GL_UNSIGNED_INT:   // fall-through...
            case GLenum::GL_UNSIGNED_SHORT: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glDrawElementsInstanced(mode, count, type, indices, instancecount);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawElementsInstanced coder(
            observations, mode, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            instancecount);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawRangeElements(uint32_t mode, uint32_t start, uint32_t end, int32_t count,
                                         uint32_t type, void* indices) {
    GAPID_INFO("glDrawRangeElements(%u, %" PRIu32 ", %" PRIu32 ", %" PRId32 ", %u, %p)\n", mode,
               start, end, count, type, indices);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_129_major = 3;
        uint32_t l_minRequiredVersion_129_minor = 0;
        switch (mode) {
            case GLenum::GL_LINES:         // fall-through...
            case GLenum::GL_LINE_LOOP:     // fall-through...
            case GLenum::GL_LINE_STRIP:    // fall-through...
            case GLenum::GL_POINTS:        // fall-through...
            case GLenum::GL_TRIANGLES:     // fall-through...
            case GLenum::GL_TRIANGLE_FAN:  // fall-through...
            case GLenum::GL_TRIANGLE_STRIP: {
                break;
            }
        }
        switch (type) {
            case GLenum::GL_UNSIGNED_BYTE:  // fall-through...
            case GLenum::GL_UNSIGNED_INT:   // fall-through...
            case GLenum::GL_UNSIGNED_SHORT: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glDrawRangeElements(mode, start, end, count, type, indices);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawRangeElements coder(
            observations, mode, start, end, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glActiveShaderProgramEXT(uint32_t pipeline, uint32_t program) {
    GAPID_INFO("glActiveShaderProgramEXT(%" PRIu32 ", %" PRIu32 ")\n", pipeline, program);

    Observations observations;
    do {
        uint32_t l_requiresExtension_132_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glActiveShaderProgramEXT(pipeline, program);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlActiveShaderProgramEXT coder(observations, pipeline, program);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glAlphaFuncQCOM(uint32_t func, float ref) {
    GAPID_INFO("glAlphaFuncQCOM(%u, %f)\n", func, ref);

    Observations observations;
    do {
        uint32_t l_requiresExtension_133_ext = ExtensionId::GL_QCOM_alpha_test;
        observe(observations.mReads);
        mImports.glAlphaFuncQCOM(func, ref);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlAlphaFuncQCOM coder(observations, func, ref);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBeginConditionalRenderNV(uint32_t id, uint32_t mode) {
    GAPID_INFO("glBeginConditionalRenderNV(%" PRIu32 ", %u)\n", id, mode);

    Observations observations;
    do {
        uint32_t l_requiresExtension_134_ext = ExtensionId::GL_NV_conditional_render;
        observe(observations.mReads);
        mImports.glBeginConditionalRenderNV(id, mode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBeginConditionalRenderNV coder(observations, id, mode);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBeginPerfMonitorAMD(uint32_t monitor) {
    GAPID_INFO("glBeginPerfMonitorAMD(%" PRIu32 ")\n", monitor);

    Observations observations;
    do {
        uint32_t l_requiresExtension_135_ext = ExtensionId::GL_AMD_performance_monitor;
        observe(observations.mReads);
        mImports.glBeginPerfMonitorAMD(monitor);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBeginPerfMonitorAMD coder(observations, monitor);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBeginPerfQueryINTEL(uint32_t queryHandle) {
    GAPID_INFO("glBeginPerfQueryINTEL(%" PRIu32 ")\n", queryHandle);

    Observations observations;
    do {
        uint32_t l_requiresExtension_136_ext = ExtensionId::GL_INTEL_performance_query;
        observe(observations.mReads);
        mImports.glBeginPerfQueryINTEL(queryHandle);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBeginPerfQueryINTEL coder(observations, queryHandle);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBeginQueryEXT(uint32_t target, uint32_t query) {
    GAPID_INFO("glBeginQueryEXT(%u, %" PRIu32 ")\n", target, query);

    Observations observations;
    do {
        uint32_t l_requiresExtension_137_ext = ExtensionId::GL_EXT_disjoint_timer_query;
        uint32_t l_requiresExtension_138_ext = ExtensionId::GL_EXT_occlusion_query_boolean;
        observe(observations.mReads);
        mImports.glBeginQueryEXT(target, query);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBeginQueryEXT coder(observations, target, query);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindProgramPipelineEXT(uint32_t pipeline) {
    GAPID_INFO("glBindProgramPipelineEXT(%" PRIu32 ")\n", pipeline);

    Observations observations;
    do {
        uint32_t l_requiresExtension_139_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glBindProgramPipelineEXT(pipeline);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindProgramPipelineEXT coder(observations, pipeline);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindVertexArrayOES(uint32_t array) {
    GAPID_INFO("glBindVertexArrayOES(%" PRIu32 ")\n", array);

    Observations observations;
    do {
        uint32_t l_requiresExtension_140_ext = ExtensionId::GL_OES_vertex_array_object;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_141_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_141_result;
        if (!(l_ctx->mInstances.mVertexArrays.count(array) > 0)) {
            l_ctx->mInstances.mVertexArrays[array] =
                    std::shared_ptr<VertexArray>((new VertexArray()));
        }
        l_ctx->mBoundVertexArray = array;
        observe(observations.mReads);
        mImports.glBindVertexArrayOES(array);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindVertexArrayOES coder(observations, array);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendBarrierNV() {
    GAPID_INFO("glBlendBarrierNV()\n");

    Observations observations;
    do {
        uint32_t l_requiresExtension_142_ext = ExtensionId::GL_NV_blend_equation_advanced;
        observe(observations.mReads);
        mImports.glBlendBarrierNV();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendBarrierNV coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendEquationSeparateiOES(uint32_t buf, uint32_t modeRGB,
                                                 uint32_t modeAlpha) {
    GAPID_INFO("glBlendEquationSeparateiOES(%" PRIu32 ", %u, %u)\n", buf, modeRGB, modeAlpha);

    Observations observations;
    do {
        uint32_t l_requiresExtension_143_ext = ExtensionId::GL_OES_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glBlendEquationSeparateiOES(buf, modeRGB, modeAlpha);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendEquationSeparateiOES coder(observations, buf, modeRGB, modeAlpha);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendEquationiOES(uint32_t buf, uint32_t mode) {
    GAPID_INFO("glBlendEquationiOES(%" PRIu32 ", %u)\n", buf, mode);

    Observations observations;
    do {
        uint32_t l_requiresExtension_144_ext = ExtensionId::GL_OES_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glBlendEquationiOES(buf, mode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendEquationiOES coder(observations, buf, mode);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendFuncSeparateiOES(uint32_t buf, uint32_t srcRGB, uint32_t dstRGB,
                                             uint32_t srcAlpha, uint32_t dstAlpha) {
    GAPID_INFO("glBlendFuncSeparateiOES(%" PRIu32 ", %u, %u, %u, %u)\n", buf, srcRGB, dstRGB,
               srcAlpha, dstAlpha);

    Observations observations;
    do {
        uint32_t l_requiresExtension_145_ext = ExtensionId::GL_OES_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glBlendFuncSeparateiOES(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendFuncSeparateiOES coder(observations, buf, srcRGB, dstRGB, srcAlpha,
                                                      dstAlpha);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendFunciOES(uint32_t buf, uint32_t src, uint32_t dst) {
    GAPID_INFO("glBlendFunciOES(%" PRIu32 ", %u, %u)\n", buf, src, dst);

    Observations observations;
    do {
        uint32_t l_requiresExtension_146_ext = ExtensionId::GL_OES_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glBlendFunciOES(buf, src, dst);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendFunciOES coder(observations, buf, src, dst);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendParameteriNV(uint32_t pname, int32_t value) {
    GAPID_INFO("glBlendParameteriNV(%u, %" PRId32 ")\n", pname, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_147_ext = ExtensionId::GL_NV_blend_equation_advanced;
        observe(observations.mReads);
        mImports.glBlendParameteriNV(pname, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendParameteriNV coder(observations, pname, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlitFramebufferANGLE(int32_t srcX0, int32_t srcY0, int32_t srcX1,
                                            int32_t srcY1, int32_t dstX0, int32_t dstY0,
                                            int32_t dstX1, int32_t dstY1, uint32_t mask,
                                            uint32_t filter) {
    GAPID_INFO("glBlitFramebufferANGLE(%" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %u, %u)\n",
               srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);

    Observations observations;
    do {
        uint32_t l_requiresExtension_148_ext = ExtensionId::GL_ANGLE_framebuffer_blit;
        observe(observations.mReads);
        mImports.glBlitFramebufferANGLE(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
                                        mask, filter);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlitFramebufferANGLE coder(observations, srcX0, srcY0, srcX1, srcY1,
                                                     dstX0, dstY0, dstX1, dstY1, mask, filter);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlitFramebufferNV(int32_t srcX0, int32_t srcY0, int32_t srcX1, int32_t srcY1,
                                         int32_t dstX0, int32_t dstY0, int32_t dstX1, int32_t dstY1,
                                         uint32_t mask, uint32_t filter) {
    GAPID_INFO("glBlitFramebufferNV(%" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %u, %u)\n",
               srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);

    Observations observations;
    do {
        uint32_t l_requiresExtension_149_ext = ExtensionId::GL_NV_framebuffer_blit;
        observe(observations.mReads);
        mImports.glBlitFramebufferNV(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask,
                                     filter);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlitFramebufferNV coder(observations, srcX0, srcY0, srcX1, srcY1, dstX0,
                                                  dstY0, dstX1, dstY1, mask, filter);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBufferStorageEXT(uint32_t target, int32_t size, void* data, uint32_t flag) {
    GAPID_INFO("glBufferStorageEXT(%u, %" PRId32 ", %p, %u)\n", target, size, data, flag);

    Observations observations;
    do {
        uint32_t l_requiresExtension_150_ext = ExtensionId::GL_EXT_buffer_storage;
        observe(observations.mReads);
        mImports.glBufferStorageEXT(target, size, data, flag);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBufferStorageEXT coder(
            observations, target, size, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                                                reinterpret_cast<uintptr_t>(data), 0)),
            flag);
    mEncoder->Object(&coder);
}

inline uint32_t GlesSpy::glClientWaitSyncAPPLE(uint64_t sync, uint32_t flag, uint64_t timeout) {
    GAPID_INFO("glClientWaitSyncAPPLE(%" PRIu64 ", %u, %" PRIu64 ")\n", sync, flag, timeout);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_151_ext = ExtensionId::GL_APPLE_sync;
        observe(observations.mReads);
        result = mImports.glClientWaitSyncAPPLE(sync, flag, timeout);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlClientWaitSyncAPPLE coder(observations, sync, flag, timeout, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glColorMaskiOES(uint32_t index, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
    GAPID_INFO("glColorMaskiOES(%" PRIu32 ", %" PRIu8 ", %" PRIu8 ", %" PRIu8 ", %" PRIu8 ")\n",
               index, r, g, b, a);

    Observations observations;
    do {
        uint32_t l_requiresExtension_152_ext = ExtensionId::GL_OES_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glColorMaskiOES(index, r, g, b, a);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlColorMaskiOES coder(observations, index, r, g, b, a);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCompressedTexImage3DOES(uint32_t target, int32_t level,
                                               uint32_t internalformat, int32_t width,
                                               int32_t height, int32_t depth, int32_t border,
                                               int32_t imageSize, void* data) {
    GAPID_INFO("glCompressedTexImage3DOES(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %p)\n",
               target, level, internalformat, width, height, depth, border, imageSize, data);

    Observations observations;
    do {
        uint32_t l_requiresExtension_153_ext = ExtensionId::GL_OES_texture_3D;
        observe(observations.mReads);
        mImports.glCompressedTexImage3DOES(target, level, internalformat, width, height, depth,
                                           border, imageSize, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCompressedTexImage3DOES coder(
            observations, target, level, internalformat, width, height, depth, border, imageSize,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCompressedTexSubImage3DOES(uint32_t target, int32_t level, int32_t xoffset,
                                                  int32_t yoffset, int32_t zoffset, int32_t width,
                                                  int32_t height, int32_t depth, uint32_t format,
                                                  int32_t imageSize, void* data) {
    GAPID_INFO("glCompressedTexSubImage3DOES(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %u, %" PRId32 ", %p)\n",
               target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize,
               data);

    Observations observations;
    do {
        uint32_t l_requiresExtension_154_ext = ExtensionId::GL_OES_texture_3D;
        observe(observations.mReads);
        mImports.glCompressedTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width,
                                              height, depth, format, imageSize, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCompressedTexSubImage3DOES coder(
            observations, target, level, xoffset, yoffset, zoffset, width, height, depth, format,
            imageSize, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                               reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCopyBufferSubDataNV(uint32_t readTarget, uint32_t writeTarget,
                                           int32_t readOffset, int32_t writeOffset, int32_t size) {
    GAPID_INFO("glCopyBufferSubDataNV(%u, %u, %" PRId32 ", %" PRId32 ", %" PRId32 ")\n", readTarget,
               writeTarget, readOffset, writeOffset, size);

    Observations observations;
    do {
        uint32_t l_requiresExtension_155_ext = ExtensionId::GL_NV_copy_buffer;
        observe(observations.mReads);
        mImports.glCopyBufferSubDataNV(readTarget, writeTarget, readOffset, writeOffset, size);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCopyBufferSubDataNV coder(observations, readTarget, writeTarget,
                                                    readOffset, writeOffset, size);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCopyImageSubDataOES(uint32_t srcName, uint32_t srcTarget, int32_t srcLevel,
                                           int32_t srcX, int32_t srcY, int32_t srcZ,
                                           uint32_t dstName, uint32_t dstTarget, int32_t dstLevel,
                                           int32_t dstX, int32_t dstY, int32_t dstZ,
                                           int32_t srcWidth, int32_t srcHeight, int32_t srcDepth) {
    GAPID_INFO("glCopyImageSubDataOES(%" PRIu32 ", %u, %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRIu32 ", %u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %" PRId32 ")\n",
               srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX,
               dstY, dstZ, srcWidth, srcHeight, srcDepth);

    Observations observations;
    do {
        uint32_t l_requiresExtension_156_ext = ExtensionId::GL_OES_copy_image;
        observe(observations.mReads);
        mImports.glCopyImageSubDataOES(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName,
                                       dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight,
                                       srcDepth);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCopyImageSubDataOES coder(
            observations, srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget,
            dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCopyPathNV(uint32_t resultPath, uint32_t srcPath) {
    GAPID_INFO("glCopyPathNV(%" PRIu32 ", %" PRIu32 ")\n", resultPath, srcPath);

    Observations observations;
    do {
        uint32_t l_requiresExtension_157_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glCopyPathNV(resultPath, srcPath);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCopyPathNV coder(observations, resultPath, srcPath);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCopyTexSubImage3DOES(uint32_t target, int32_t level, int32_t xoffset,
                                            int32_t yoffset, int32_t zoffset, int32_t x, int32_t y,
                                            int32_t width, int32_t height) {
    GAPID_INFO("glCopyTexSubImage3DOES(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ")\n",
               target, level, xoffset, yoffset, zoffset, x, y, width, height);

    Observations observations;
    do {
        uint32_t l_requiresExtension_158_ext = ExtensionId::GL_OES_texture_3D;
        observe(observations.mReads);
        mImports.glCopyTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, x, y, width,
                                        height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCopyTexSubImage3DOES coder(observations, target, level, xoffset, yoffset,
                                                     zoffset, x, y, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCopyTextureLevelsAPPLE(uint32_t destinationTexture, uint32_t sourceTexture,
                                              int32_t sourceBaseLevel, int32_t sourceLevelCount) {
    GAPID_INFO("glCopyTextureLevelsAPPLE(%" PRIu32 ", %" PRIu32 ", %" PRId32 ", %" PRId32 ")\n",
               destinationTexture, sourceTexture, sourceBaseLevel, sourceLevelCount);

    Observations observations;
    do {
        uint32_t l_requiresExtension_159_ext = ExtensionId::GL_APPLE_copy_texture_levels;
        observe(observations.mReads);
        mImports.glCopyTextureLevelsAPPLE(destinationTexture, sourceTexture, sourceBaseLevel,
                                          sourceLevelCount);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCopyTextureLevelsAPPLE coder(
            observations, destinationTexture, sourceTexture, sourceBaseLevel, sourceLevelCount);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCoverFillPathInstancedNV(int32_t numPaths, uint32_t pathNameType,
                                                void* paths, uint32_t pathBase, uint32_t coverMode,
                                                uint32_t transformType, float* transformValues) {
    GAPID_INFO("glCoverFillPathInstancedNV(%" PRId32 ", %u, %p, %" PRIu32 ", %u, %u, %p)\n",
               numPaths, pathNameType, paths, pathBase, coverMode, transformType, transformValues);

    Observations observations;
    do {
        uint32_t l_requiresExtension_160_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glCoverFillPathInstancedNV(numPaths, pathNameType, paths, pathBase, coverMode,
                                            transformType, transformValues);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCoverFillPathInstancedNV coder(
            observations, numPaths, pathNameType,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(paths), 0)),
            pathBase, coverMode, transformType,
            gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(transformValues), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCoverFillPathNV(uint32_t path, uint32_t coverMode) {
    GAPID_INFO("glCoverFillPathNV(%" PRIu32 ", %u)\n", path, coverMode);

    Observations observations;
    do {
        uint32_t l_requiresExtension_161_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glCoverFillPathNV(path, coverMode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCoverFillPathNV coder(observations, path, coverMode);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCoverStrokePathInstancedNV(int32_t numPaths, uint32_t pathNameType,
                                                  void* paths, uint32_t pathBase,
                                                  uint32_t coverMode, uint32_t transformType,
                                                  float* transformValues) {
    GAPID_INFO("glCoverStrokePathInstancedNV(%" PRId32 ", %u, %p, %" PRIu32 ", %u, %u, %p)\n",
               numPaths, pathNameType, paths, pathBase, coverMode, transformType, transformValues);

    Observations observations;
    do {
        uint32_t l_requiresExtension_162_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glCoverStrokePathInstancedNV(numPaths, pathNameType, paths, pathBase, coverMode,
                                              transformType, transformValues);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCoverStrokePathInstancedNV coder(
            observations, numPaths, pathNameType,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(paths), 0)),
            pathBase, coverMode, transformType,
            gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(transformValues), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCoverStrokePathNV(uint32_t path, uint32_t coverMode) {
    GAPID_INFO("glCoverStrokePathNV(%" PRIu32 ", %u)\n", path, coverMode);

    Observations observations;
    do {
        uint32_t l_requiresExtension_163_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glCoverStrokePathNV(path, coverMode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCoverStrokePathNV coder(observations, path, coverMode);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCoverageMaskNV(uint8_t mask) {
    GAPID_INFO("glCoverageMaskNV(%" PRIu8 ")\n", mask);

    Observations observations;
    do {
        uint32_t l_requiresExtension_164_ext = ExtensionId::GL_NV_coverage_sample;
        observe(observations.mReads);
        mImports.glCoverageMaskNV(mask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCoverageMaskNV coder(observations, mask);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCoverageOperationNV(uint32_t operation) {
    GAPID_INFO("glCoverageOperationNV(%u)\n", operation);

    Observations observations;
    do {
        uint32_t l_requiresExtension_165_ext = ExtensionId::GL_NV_coverage_sample;
        observe(observations.mReads);
        mImports.glCoverageOperationNV(operation);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCoverageOperationNV coder(observations, operation);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCreatePerfQueryINTEL(uint32_t queryId, uint32_t* queryHandle) {
    GAPID_INFO("glCreatePerfQueryINTEL(%" PRIu32 ", %p)\n", queryId, queryHandle);

    Observations observations;
    do {
        uint32_t l_requiresExtension_166_ext = ExtensionId::GL_INTEL_performance_query;
        observe(observations.mReads);
        mImports.glCreatePerfQueryINTEL(queryId, queryHandle);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCreatePerfQueryINTEL coder(
            observations, queryId, gapic::coder::gles::GLuint__P(gapic::coder::memory::Pointer(
                                           reinterpret_cast<uintptr_t>(queryHandle), 0)));
    mEncoder->Object(&coder);
}

inline uint32_t GlesSpy::glCreateShaderProgramvEXT(uint32_t type, int32_t count, char** strings) {
    GAPID_INFO("glCreateShaderProgramvEXT(%u, %" PRId32 ", %p)\n", type, count, strings);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_167_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        result = mImports.glCreateShaderProgramvEXT(type, count, strings);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCreateShaderProgramvEXT coder(
            observations, type, count,
            gapic::coder::gles::GLchar__CP__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(strings), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glDeleteFencesNV(int32_t n, uint32_t* fences) {
    GAPID_INFO("glDeleteFencesNV(%" PRId32 ", %p)\n", n, fences);

    Observations observations;
    do {
        uint32_t l_requiresExtension_168_ext = ExtensionId::GL_NV_fence;
        observe(observations.mReads);
        mImports.glDeleteFencesNV(n, fences);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteFencesNV coder(
            observations, n, gapic::coder::gles::GLuint__CP(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(fences), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeletePathsNV(uint32_t path, int32_t range) {
    GAPID_INFO("glDeletePathsNV(%" PRIu32 ", %" PRId32 ")\n", path, range);

    Observations observations;
    do {
        uint32_t l_requiresExtension_169_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glDeletePathsNV(path, range);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeletePathsNV coder(observations, path, range);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeletePerfMonitorsAMD(int32_t n, uint32_t* monitors) {
    GAPID_INFO("glDeletePerfMonitorsAMD(%" PRId32 ", %p)\n", n, monitors);

    Observations observations;
    do {
        uint32_t l_requiresExtension_170_ext = ExtensionId::GL_AMD_performance_monitor;
        observe(observations.mReads);
        mImports.glDeletePerfMonitorsAMD(n, monitors);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeletePerfMonitorsAMD coder(
            observations, n, gapic::coder::gles::GLuint__P(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(monitors), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeletePerfQueryINTEL(uint32_t queryHandle) {
    GAPID_INFO("glDeletePerfQueryINTEL(%" PRIu32 ")\n", queryHandle);

    Observations observations;
    do {
        uint32_t l_requiresExtension_171_ext = ExtensionId::GL_INTEL_performance_query;
        observe(observations.mReads);
        mImports.glDeletePerfQueryINTEL(queryHandle);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeletePerfQueryINTEL coder(observations, queryHandle);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteProgramPipelinesEXT(int32_t n, uint32_t* pipelines) {
    GAPID_INFO("glDeleteProgramPipelinesEXT(%" PRId32 ", %p)\n", n, pipelines);

    Observations observations;
    do {
        uint32_t l_requiresExtension_172_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glDeleteProgramPipelinesEXT(n, pipelines);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteProgramPipelinesEXT coder(
            observations, n, gapic::coder::gles::PipelineId__CP(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(pipelines), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteQueriesEXT(int32_t count, uint32_t* queries) {
    GAPID_INFO("glDeleteQueriesEXT(%" PRId32 ", %p)\n", count, queries);

    Observations observations;
    do {
        uint32_t l_requiresExtension_173_ext = ExtensionId::GL_EXT_disjoint_timer_query;
        uint32_t l_requiresExtension_174_ext = ExtensionId::GL_EXT_occlusion_query_boolean;
        Slice<QueryId> l_q = slice(queries, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_175_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_175_result;
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            l_ctx->mInstances.mQueries[read(l_q, (uint64_t)(l_i))] = std::shared_ptr<Query>();
        }
        observe(observations.mReads);
        mImports.glDeleteQueriesEXT(count, queries);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteQueriesEXT coder(
            observations, count, gapic::coder::gles::QueryId__CP(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(queries), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteSyncAPPLE(uint64_t sync) {
    GAPID_INFO("glDeleteSyncAPPLE(%" PRIu64 ")\n", sync);

    Observations observations;
    do {
        uint32_t l_requiresExtension_176_ext = ExtensionId::GL_APPLE_sync;
        observe(observations.mReads);
        mImports.glDeleteSyncAPPLE(sync);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteSyncAPPLE coder(observations, sync);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteVertexArraysOES(int32_t count, uint32_t* arrays) {
    GAPID_INFO("glDeleteVertexArraysOES(%" PRId32 ", %p)\n", count, arrays);

    Observations observations;
    do {
        uint32_t l_requiresExtension_177_ext = ExtensionId::GL_OES_vertex_array_object;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_178_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_178_result;
        Slice<VertexArrayId> l_a = slice(arrays, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            l_ctx->mInstances.mVertexArrays[read(l_a, (uint64_t)(l_i))] =
                    std::shared_ptr<VertexArray>();
        }
        observe(observations.mReads);
        mImports.glDeleteVertexArraysOES(count, arrays);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteVertexArraysOES coder(
            observations, count,
            gapic::coder::gles::VertexArrayId__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(arrays), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDepthRangeArrayfvNV(uint32_t first, int32_t count, float* v) {
    GAPID_INFO("glDepthRangeArrayfvNV(%" PRIu32 ", %" PRId32 ", %p)\n", first, count, v);

    Observations observations;
    do {
        uint32_t l_requiresExtension_179_ext = ExtensionId::GL_NV_viewport_array;
        observe(observations.mReads);
        mImports.glDepthRangeArrayfvNV(first, count, v);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDepthRangeArrayfvNV coder(
            observations, first, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(v), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDepthRangeIndexedfNV(uint32_t index, float n, float f) {
    GAPID_INFO("glDepthRangeIndexedfNV(%" PRIu32 ", %f, %f)\n", index, n, f);

    Observations observations;
    do {
        uint32_t l_requiresExtension_180_ext = ExtensionId::GL_NV_viewport_array;
        observe(observations.mReads);
        mImports.glDepthRangeIndexedfNV(index, n, f);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDepthRangeIndexedfNV coder(observations, index, n, f);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDisableDriverControlQCOM(uint32_t driverControl) {
    GAPID_INFO("glDisableDriverControlQCOM(%" PRIu32 ")\n", driverControl);

    Observations observations;
    do {
        uint32_t l_requiresExtension_181_ext = ExtensionId::GL_QCOM_driver_control;
        observe(observations.mReads);
        mImports.glDisableDriverControlQCOM(driverControl);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDisableDriverControlQCOM coder(observations, driverControl);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDisableiNV(uint32_t target, uint32_t index) {
    GAPID_INFO("glDisableiNV(%u, %" PRIu32 ")\n", target, index);

    Observations observations;
    do {
        uint32_t l_requiresExtension_182_ext = ExtensionId::GL_NV_viewport_array;
        observe(observations.mReads);
        mImports.glDisableiNV(target, index);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDisableiNV coder(observations, target, index);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDisableiOES(uint32_t target, uint32_t index) {
    GAPID_INFO("glDisableiOES(%u, %" PRIu32 ")\n", target, index);

    Observations observations;
    do {
        uint32_t l_requiresExtension_183_ext = ExtensionId::GL_OES_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glDisableiOES(target, index);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDisableiOES coder(observations, target, index);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDiscardFramebufferEXT(uint32_t target, int32_t numAttachments,
                                             uint32_t* attachments) {
    GAPID_INFO("glDiscardFramebufferEXT(%u, %" PRId32 ", %p)\n", target, numAttachments,
               attachments);

    Observations observations;
    do {
        uint32_t l_requiresExtension_184_ext = ExtensionId::GL_EXT_discard_framebuffer;
        observe(observations.mReads);
        mImports.glDiscardFramebufferEXT(target, numAttachments, attachments);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDiscardFramebufferEXT coder(
            observations, target, numAttachments,
            gapic::coder::gles::GLenum__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(attachments), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawArraysInstancedANGLE(uint32_t mode, int32_t first, int32_t count,
                                                int32_t primcount) {
    GAPID_INFO("glDrawArraysInstancedANGLE(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ")\n", mode,
               first, count, primcount);

    Observations observations;
    do {
        uint32_t l_requiresExtension_185_ext = ExtensionId::GL_ANGLE_instanced_arrays;
        observe(observations.mReads);
        mImports.glDrawArraysInstancedANGLE(mode, first, count, primcount);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawArraysInstancedANGLE coder(observations, mode, first, count,
                                                         primcount);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawArraysInstancedBaseInstanceEXT(uint32_t mode, int32_t first,
                                                          int32_t count, int32_t instancecount,
                                                          uint32_t baseinstance) {
    GAPID_INFO("glDrawArraysInstancedBaseInstanceEXT(%u, %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRIu32 ")\n",
               mode, first, count, instancecount, baseinstance);

    Observations observations;
    do {
        uint32_t l_requiresExtension_186_ext = ExtensionId::GL_EXT_base_instance;
        observe(observations.mReads);
        mImports.glDrawArraysInstancedBaseInstanceEXT(mode, first, count, instancecount,
                                                      baseinstance);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawArraysInstancedBaseInstanceEXT coder(observations, mode, first, count,
                                                                   instancecount, baseinstance);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawArraysInstancedEXT(uint32_t mode, int32_t start, int32_t count,
                                              int32_t primcount) {
    GAPID_INFO("glDrawArraysInstancedEXT(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ")\n", mode, start,
               count, primcount);

    Observations observations;
    do {
        uint32_t l_requiresExtension_187_ext = ExtensionId::GL_EXT_draw_instanced;
        uint32_t l_requiresExtension_188_ext = ExtensionId::GL_EXT_instanced_arrays;
        observe(observations.mReads);
        mImports.glDrawArraysInstancedEXT(mode, start, count, primcount);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawArraysInstancedEXT coder(observations, mode, start, count, primcount);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawArraysInstancedNV(uint32_t mode, int32_t first, int32_t count,
                                             int32_t primcount) {
    GAPID_INFO("glDrawArraysInstancedNV(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ")\n", mode, first,
               count, primcount);

    Observations observations;
    do {
        uint32_t l_requiresExtension_189_ext = ExtensionId::GL_NV_draw_instanced;
        observe(observations.mReads);
        mImports.glDrawArraysInstancedNV(mode, first, count, primcount);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawArraysInstancedNV coder(observations, mode, first, count, primcount);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawBuffersEXT(int32_t n, uint32_t* bufs) {
    GAPID_INFO("glDrawBuffersEXT(%" PRId32 ", %p)\n", n, bufs);

    Observations observations;
    do {
        uint32_t l_requiresExtension_190_ext = ExtensionId::GL_EXT_draw_buffers;
        observe(observations.mReads);
        mImports.glDrawBuffersEXT(n, bufs);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawBuffersEXT coder(
            observations, n, gapic::coder::gles::GLenum__CP(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(bufs), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawBuffersIndexedEXT(int32_t n, uint32_t* location, int32_t* indices) {
    GAPID_INFO("glDrawBuffersIndexedEXT(%" PRId32 ", %p, %p)\n", n, location, indices);

    Observations observations;
    do {
        uint32_t l_requiresExtension_191_ext = ExtensionId::GL_EXT_multiview_draw_buffers;
        observe(observations.mReads);
        mImports.glDrawBuffersIndexedEXT(n, location, indices);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawBuffersIndexedEXT coder(
            observations, n, gapic::coder::gles::GLenum__CP(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(location), 0)),
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawBuffersNV(int32_t n, uint32_t* bufs) {
    GAPID_INFO("glDrawBuffersNV(%" PRId32 ", %p)\n", n, bufs);

    Observations observations;
    do {
        uint32_t l_requiresExtension_192_ext = ExtensionId::GL_NV_draw_buffers;
        observe(observations.mReads);
        mImports.glDrawBuffersNV(n, bufs);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawBuffersNV coder(
            observations, n, gapic::coder::gles::GLenum__CP(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(bufs), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawElementsBaseVertexEXT(uint32_t mode, int32_t count, uint32_t type,
                                                 void* indices, int32_t basevertex) {
    GAPID_INFO("glDrawElementsBaseVertexEXT(%u, %" PRId32 ", %u, %p, %" PRId32 ")\n", mode, count,
               type, indices, basevertex);

    Observations observations;
    do {
        uint32_t l_requiresExtension_193_ext = ExtensionId::GL_EXT_draw_elements_base_vertex;
        observe(observations.mReads);
        mImports.glDrawElementsBaseVertexEXT(mode, count, type, indices, basevertex);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawElementsBaseVertexEXT coder(
            observations, mode, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            basevertex);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawElementsBaseVertexOES(uint32_t mode, int32_t count, uint32_t type,
                                                 void* indices, int32_t basevertex) {
    GAPID_INFO("glDrawElementsBaseVertexOES(%u, %" PRId32 ", %u, %p, %" PRId32 ")\n", mode, count,
               type, indices, basevertex);

    Observations observations;
    do {
        uint32_t l_requiresExtension_194_ext = ExtensionId::GL_OES_draw_elements_base_vertex;
        observe(observations.mReads);
        mImports.glDrawElementsBaseVertexOES(mode, count, type, indices, basevertex);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawElementsBaseVertexOES coder(
            observations, mode, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            basevertex);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawElementsInstancedANGLE(uint32_t mode, int32_t count, uint32_t type,
                                                  void* indices, int32_t primcount) {
    GAPID_INFO("glDrawElementsInstancedANGLE(%u, %" PRId32 ", %u, %p, %" PRId32 ")\n", mode, count,
               type, indices, primcount);

    Observations observations;
    do {
        uint32_t l_requiresExtension_195_ext = ExtensionId::GL_ANGLE_instanced_arrays;
        observe(observations.mReads);
        mImports.glDrawElementsInstancedANGLE(mode, count, type, indices, primcount);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawElementsInstancedANGLE coder(
            observations, mode, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            primcount);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawElementsInstancedBaseInstanceEXT(uint32_t mode, int32_t count,
                                                            uint32_t type, void* indices,
                                                            int32_t instancecount,
                                                            uint32_t baseinstance) {
    GAPID_INFO("glDrawElementsInstancedBaseInstanceEXT(%u, %" PRId32 ", %u, %p, %" PRId32
               ", %" PRIu32 ")\n",
               mode, count, type, indices, instancecount, baseinstance);

    Observations observations;
    do {
        uint32_t l_requiresExtension_196_ext = ExtensionId::GL_EXT_base_instance;
        observe(observations.mReads);
        mImports.glDrawElementsInstancedBaseInstanceEXT(mode, count, type, indices, instancecount,
                                                        baseinstance);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawElementsInstancedBaseInstanceEXT coder(
            observations, mode, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            instancecount, baseinstance);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawElementsInstancedBaseVertexEXT(uint32_t mode, int32_t count,
                                                          uint32_t type, void* indices,
                                                          int32_t instancecount,
                                                          int32_t basevertex) {
    GAPID_INFO("glDrawElementsInstancedBaseVertexEXT(%u, %" PRId32 ", %u, %p, %" PRId32 ", %" PRId32
               ")\n",
               mode, count, type, indices, instancecount, basevertex);

    Observations observations;
    do {
        uint32_t l_requiresExtension_197_ext = ExtensionId::GL_EXT_draw_elements_base_vertex;
        observe(observations.mReads);
        mImports.glDrawElementsInstancedBaseVertexEXT(mode, count, type, indices, instancecount,
                                                      basevertex);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawElementsInstancedBaseVertexEXT coder(
            observations, mode, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            instancecount, basevertex);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawElementsInstancedBaseVertexOES(uint32_t mode, int32_t count,
                                                          uint32_t type, void* indices,
                                                          int32_t instancecount,
                                                          int32_t basevertex) {
    GAPID_INFO("glDrawElementsInstancedBaseVertexOES(%u, %" PRId32 ", %u, %p, %" PRId32 ", %" PRId32
               ")\n",
               mode, count, type, indices, instancecount, basevertex);

    Observations observations;
    do {
        uint32_t l_requiresExtension_198_ext = ExtensionId::GL_OES_draw_elements_base_vertex;
        observe(observations.mReads);
        mImports.glDrawElementsInstancedBaseVertexOES(mode, count, type, indices, instancecount,
                                                      basevertex);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawElementsInstancedBaseVertexOES coder(
            observations, mode, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            instancecount, basevertex);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawElementsInstancedBaseVertexBaseInstanceEXT(uint32_t mode, int32_t count,
                                                                      uint32_t type, void* indices,
                                                                      int32_t instancecount,
                                                                      int32_t basevertex,
                                                                      uint32_t baseinstance) {
    GAPID_INFO("glDrawElementsInstancedBaseVertexBaseInstanceEXT(%u, %" PRId32 ", %u, %p, %" PRId32
               ", %" PRId32 ", %" PRIu32 ")\n",
               mode, count, type, indices, instancecount, basevertex, baseinstance);

    Observations observations;
    do {
        uint32_t l_requiresExtension_199_ext = ExtensionId::GL_EXT_base_instance;
        observe(observations.mReads);
        mImports.glDrawElementsInstancedBaseVertexBaseInstanceEXT(
                mode, count, type, indices, instancecount, basevertex, baseinstance);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawElementsInstancedBaseVertexBaseInstanceEXT coder(
            observations, mode, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            instancecount, basevertex, baseinstance);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawElementsInstancedEXT(uint32_t mode, int32_t count, uint32_t type,
                                                void* indices, int32_t primcount) {
    GAPID_INFO("glDrawElementsInstancedEXT(%u, %" PRId32 ", %u, %p, %" PRId32 ")\n", mode, count,
               type, indices, primcount);

    Observations observations;
    do {
        uint32_t l_requiresExtension_200_ext = ExtensionId::GL_EXT_draw_instanced;
        uint32_t l_requiresExtension_201_ext = ExtensionId::GL_EXT_instanced_arrays;
        observe(observations.mReads);
        mImports.glDrawElementsInstancedEXT(mode, count, type, indices, primcount);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawElementsInstancedEXT coder(
            observations, mode, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            primcount);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawElementsInstancedNV(uint32_t mode, int32_t count, uint32_t type,
                                               void* indices, int32_t primcount) {
    GAPID_INFO("glDrawElementsInstancedNV(%u, %" PRId32 ", %u, %p, %" PRId32 ")\n", mode, count,
               type, indices, primcount);

    Observations observations;
    do {
        uint32_t l_requiresExtension_202_ext = ExtensionId::GL_NV_draw_instanced;
        observe(observations.mReads);
        mImports.glDrawElementsInstancedNV(mode, count, type, indices, primcount);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawElementsInstancedNV coder(
            observations, mode, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            primcount);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawRangeElementsBaseVertexEXT(uint32_t mode, uint32_t start, uint32_t end,
                                                      int32_t count, uint32_t type, void* indices,
                                                      int32_t basevertex) {
    GAPID_INFO("glDrawRangeElementsBaseVertexEXT(%u, %" PRIu32 ", %" PRIu32 ", %" PRId32
               ", %u, %p, %" PRId32 ")\n",
               mode, start, end, count, type, indices, basevertex);

    Observations observations;
    do {
        uint32_t l_requiresExtension_203_ext = ExtensionId::GL_EXT_draw_elements_base_vertex;
        observe(observations.mReads);
        mImports.glDrawRangeElementsBaseVertexEXT(mode, start, end, count, type, indices,
                                                  basevertex);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawRangeElementsBaseVertexEXT coder(
            observations, mode, start, end, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            basevertex);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDrawRangeElementsBaseVertexOES(uint32_t mode, uint32_t start, uint32_t end,
                                                      int32_t count, uint32_t type, void* indices,
                                                      int32_t basevertex) {
    GAPID_INFO("glDrawRangeElementsBaseVertexOES(%u, %" PRIu32 ", %" PRIu32 ", %" PRId32
               ", %u, %p, %" PRId32 ")\n",
               mode, start, end, count, type, indices, basevertex);

    Observations observations;
    do {
        uint32_t l_requiresExtension_204_ext = ExtensionId::GL_OES_draw_elements_base_vertex;
        observe(observations.mReads);
        mImports.glDrawRangeElementsBaseVertexOES(mode, start, end, count, type, indices,
                                                  basevertex);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDrawRangeElementsBaseVertexOES coder(
            observations, mode, start, end, count, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            basevertex);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEGLImageTargetRenderbufferStorageOES(uint32_t target, void* image) {
    GAPID_INFO("glEGLImageTargetRenderbufferStorageOES(%u, %p)\n", target, image);

    Observations observations;
    do {
        uint32_t l_requiresExtension_205_ext = ExtensionId::GL_OES_EGL_image;
        observe(observations.mReads);
        mImports.glEGLImageTargetRenderbufferStorageOES(target, image);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEGLImageTargetRenderbufferStorageOES coder(
            observations, target, gapic::coder::gles::GLeglImageOES(gapic::coder::memory::Pointer(
                                          reinterpret_cast<uintptr_t>(image), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEGLImageTargetTexture2DOES(uint32_t target, void* image) {
    GAPID_INFO("glEGLImageTargetTexture2DOES(%u, %p)\n", target, image);

    Observations observations;
    do {
        uint32_t l_requiresExtension_206_ext = ExtensionId::GL_OES_EGL_image;
        observe(observations.mReads);
        mImports.glEGLImageTargetTexture2DOES(target, image);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEGLImageTargetTexture2DOES coder(
            observations, target, gapic::coder::gles::GLeglImageOES(gapic::coder::memory::Pointer(
                                          reinterpret_cast<uintptr_t>(image), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEnableDriverControlQCOM(uint32_t driverControl) {
    GAPID_INFO("glEnableDriverControlQCOM(%" PRIu32 ")\n", driverControl);

    Observations observations;
    do {
        uint32_t l_requiresExtension_207_ext = ExtensionId::GL_QCOM_driver_control;
        observe(observations.mReads);
        mImports.glEnableDriverControlQCOM(driverControl);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEnableDriverControlQCOM coder(observations, driverControl);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEnableiNV(uint32_t target, uint32_t index) {
    GAPID_INFO("glEnableiNV(%u, %" PRIu32 ")\n", target, index);

    Observations observations;
    do {
        uint32_t l_requiresExtension_208_ext = ExtensionId::GL_NV_viewport_array;
        observe(observations.mReads);
        mImports.glEnableiNV(target, index);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEnableiNV coder(observations, target, index);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEnableiOES(uint32_t target, uint32_t index) {
    GAPID_INFO("glEnableiOES(%u, %" PRIu32 ")\n", target, index);

    Observations observations;
    do {
        uint32_t l_requiresExtension_209_ext = ExtensionId::GL_OES_draw_buffers_indexed;
        observe(observations.mReads);
        mImports.glEnableiOES(target, index);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEnableiOES coder(observations, target, index);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEndConditionalRenderNV() {
    GAPID_INFO("glEndConditionalRenderNV()\n");

    Observations observations;
    do {
        uint32_t l_requiresExtension_210_ext = ExtensionId::GL_NV_conditional_render;
        observe(observations.mReads);
        mImports.glEndConditionalRenderNV();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEndConditionalRenderNV coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEndPerfMonitorAMD(uint32_t monitor) {
    GAPID_INFO("glEndPerfMonitorAMD(%" PRIu32 ")\n", monitor);

    Observations observations;
    do {
        uint32_t l_requiresExtension_211_ext = ExtensionId::GL_AMD_performance_monitor;
        observe(observations.mReads);
        mImports.glEndPerfMonitorAMD(monitor);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEndPerfMonitorAMD coder(observations, monitor);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEndPerfQueryINTEL(uint32_t queryHandle) {
    GAPID_INFO("glEndPerfQueryINTEL(%" PRIu32 ")\n", queryHandle);

    Observations observations;
    do {
        uint32_t l_requiresExtension_212_ext = ExtensionId::GL_INTEL_performance_query;
        observe(observations.mReads);
        mImports.glEndPerfQueryINTEL(queryHandle);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEndPerfQueryINTEL coder(observations, queryHandle);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEndQueryEXT(uint32_t target) {
    GAPID_INFO("glEndQueryEXT(%u)\n", target);

    Observations observations;
    do {
        uint32_t l_requiresExtension_213_ext = ExtensionId::GL_EXT_disjoint_timer_query;
        uint32_t l_requiresExtension_214_ext = ExtensionId::GL_EXT_occlusion_query_boolean;
        observe(observations.mReads);
        mImports.glEndQueryEXT(target);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEndQueryEXT coder(observations, target);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEndTilingQCOM(uint32_t preserve_mask) {
    GAPID_INFO("glEndTilingQCOM(%u)\n", preserve_mask);

    Observations observations;
    do {
        uint32_t l_requiresExtension_215_ext = ExtensionId::GL_QCOM_tiled_rendering;
        observe(observations.mReads);
        mImports.glEndTilingQCOM(preserve_mask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEndTilingQCOM coder(observations, preserve_mask);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glExtGetBufferPointervQCOM(uint32_t target, void** params) {
    GAPID_INFO("glExtGetBufferPointervQCOM(%u, %p)\n", target, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_216_ext = ExtensionId::GL_QCOM_extended_get;
        observe(observations.mReads);
        mImports.glExtGetBufferPointervQCOM(target, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlExtGetBufferPointervQCOM coder(
            observations, target, gapic::coder::gles::Void__P__P(gapic::coder::memory::Pointer(
                                          reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glExtGetBuffersQCOM(uint32_t* buffers, int32_t maxBuffers,
                                         int32_t* numBuffers) {
    GAPID_INFO("glExtGetBuffersQCOM(%p, %" PRId32 ", %p)\n", buffers, maxBuffers, numBuffers);

    Observations observations;
    do {
        uint32_t l_requiresExtension_217_ext = ExtensionId::GL_QCOM_extended_get;
        observe(observations.mReads);
        mImports.glExtGetBuffersQCOM(buffers, maxBuffers, numBuffers);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlExtGetBuffersQCOM coder(
            observations, gapic::coder::gles::BufferId__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(buffers), 0)),
            maxBuffers, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                reinterpret_cast<uintptr_t>(numBuffers), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glExtGetFramebuffersQCOM(uint32_t* framebuffers, int32_t maxFramebuffers,
                                              int32_t* numFramebuffers) {
    GAPID_INFO("glExtGetFramebuffersQCOM(%p, %" PRId32 ", %p)\n", framebuffers, maxFramebuffers,
               numFramebuffers);

    Observations observations;
    do {
        uint32_t l_requiresExtension_218_ext = ExtensionId::GL_QCOM_extended_get;
        observe(observations.mReads);
        mImports.glExtGetFramebuffersQCOM(framebuffers, maxFramebuffers, numFramebuffers);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlExtGetFramebuffersQCOM coder(
            observations, gapic::coder::gles::FramebufferId__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(framebuffers), 0)),
            maxFramebuffers, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(numFramebuffers), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glExtGetProgramBinarySourceQCOM(uint32_t program, uint32_t shadertype,
                                                     char* source, int32_t* length) {
    GAPID_INFO("glExtGetProgramBinarySourceQCOM(%" PRIu32 ", %u, %p, %p)\n", program, shadertype,
               source, length);

    Observations observations;
    do {
        uint32_t l_requiresExtension_219_ext = ExtensionId::GL_QCOM_extended_get2;
        observe(observations.mReads);
        mImports.glExtGetProgramBinarySourceQCOM(program, shadertype, source, length);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlExtGetProgramBinarySourceQCOM coder(
            observations, program, shadertype,
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(source), 0)),
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glExtGetProgramsQCOM(uint32_t* programs, int32_t maxPrograms,
                                          int32_t* numPrograms) {
    GAPID_INFO("glExtGetProgramsQCOM(%p, %" PRId32 ", %p)\n", programs, maxPrograms, numPrograms);

    Observations observations;
    do {
        uint32_t l_requiresExtension_220_ext = ExtensionId::GL_QCOM_extended_get2;
        observe(observations.mReads);
        mImports.glExtGetProgramsQCOM(programs, maxPrograms, numPrograms);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlExtGetProgramsQCOM coder(
            observations, gapic::coder::gles::ProgramId__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(programs), 0)),
            maxPrograms, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                 reinterpret_cast<uintptr_t>(numPrograms), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glExtGetRenderbuffersQCOM(uint32_t* renderbuffers, int32_t maxRenderbuffers,
                                               int32_t* numRenderbuffers) {
    GAPID_INFO("glExtGetRenderbuffersQCOM(%p, %" PRId32 ", %p)\n", renderbuffers, maxRenderbuffers,
               numRenderbuffers);

    Observations observations;
    do {
        uint32_t l_requiresExtension_221_ext = ExtensionId::GL_QCOM_extended_get;
        observe(observations.mReads);
        mImports.glExtGetRenderbuffersQCOM(renderbuffers, maxRenderbuffers, numRenderbuffers);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlExtGetRenderbuffersQCOM coder(
            observations, gapic::coder::gles::RenderbufferId__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(renderbuffers), 0)),
            maxRenderbuffers, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                      reinterpret_cast<uintptr_t>(numRenderbuffers), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glExtGetShadersQCOM(uint32_t* shaders, int32_t maxShaders,
                                         int32_t* numShaders) {
    GAPID_INFO("glExtGetShadersQCOM(%p, %" PRId32 ", %p)\n", shaders, maxShaders, numShaders);

    Observations observations;
    do {
        uint32_t l_requiresExtension_222_ext = ExtensionId::GL_QCOM_extended_get2;
        observe(observations.mReads);
        mImports.glExtGetShadersQCOM(shaders, maxShaders, numShaders);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlExtGetShadersQCOM coder(
            observations, gapic::coder::gles::ShaderId__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(shaders), 0)),
            maxShaders, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                reinterpret_cast<uintptr_t>(numShaders), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glExtGetTexLevelParameterivQCOM(uint32_t texture, uint32_t face, int32_t level,
                                                     uint32_t pname, int32_t* params) {
    GAPID_INFO("glExtGetTexLevelParameterivQCOM(%" PRIu32 ", %u, %" PRId32 ", %u, %p)\n", texture,
               face, level, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_223_ext = ExtensionId::GL_QCOM_extended_get;
        observe(observations.mReads);
        mImports.glExtGetTexLevelParameterivQCOM(texture, face, level, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlExtGetTexLevelParameterivQCOM coder(
            observations, texture, face, level, pname,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glExtGetTexSubImageQCOM(uint32_t target, int32_t level, int32_t xoffset,
                                             int32_t yoffset, int32_t zoffset, int32_t width,
                                             int32_t height, int32_t depth, uint32_t format,
                                             uint32_t type, void* texels) {
    GAPID_INFO("glExtGetTexSubImageQCOM(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %u, %u, %p)\n",
               target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
               texels);

    Observations observations;
    do {
        uint32_t l_requiresExtension_224_ext = ExtensionId::GL_QCOM_extended_get;
        observe(observations.mReads);
        mImports.glExtGetTexSubImageQCOM(target, level, xoffset, yoffset, zoffset, width, height,
                                         depth, format, type, texels);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlExtGetTexSubImageQCOM coder(
            observations, target, level, xoffset, yoffset, zoffset, width, height, depth, format,
            type, gapic::coder::gles::Void__P(
                          gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(texels), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glExtGetTexturesQCOM(uint32_t* textures, int32_t maxTextures,
                                          int32_t* numTextures) {
    GAPID_INFO("glExtGetTexturesQCOM(%p, %" PRId32 ", %p)\n", textures, maxTextures, numTextures);

    Observations observations;
    do {
        uint32_t l_requiresExtension_225_ext = ExtensionId::GL_QCOM_extended_get;
        observe(observations.mReads);
        mImports.glExtGetTexturesQCOM(textures, maxTextures, numTextures);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlExtGetTexturesQCOM coder(
            observations, gapic::coder::gles::TextureId__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(textures), 0)),
            maxTextures, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                 reinterpret_cast<uintptr_t>(numTextures), 0)));
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glExtIsProgramBinaryQCOM(uint32_t program) {
    GAPID_INFO("glExtIsProgramBinaryQCOM(%" PRIu32 ")\n", program);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_226_ext = ExtensionId::GL_QCOM_extended_get2;
        observe(observations.mReads);
        result = mImports.glExtIsProgramBinaryQCOM(program);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlExtIsProgramBinaryQCOM coder(observations, program, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glExtTexObjectStateOverrideiQCOM(uint32_t target, uint32_t pname,
                                                      int32_t param) {
    GAPID_INFO("glExtTexObjectStateOverrideiQCOM(%u, %u, %" PRId32 ")\n", target, pname, param);

    Observations observations;
    do {
        uint32_t l_requiresExtension_227_ext = ExtensionId::GL_QCOM_extended_get;
        observe(observations.mReads);
        mImports.glExtTexObjectStateOverrideiQCOM(target, pname, param);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlExtTexObjectStateOverrideiQCOM coder(observations, target, pname, param);
    mEncoder->Object(&coder);
}

inline uint64_t GlesSpy::glFenceSyncAPPLE(uint32_t condition, uint32_t flag) {
    GAPID_INFO("glFenceSyncAPPLE(%u, %u)\n", condition, flag);

    uint64_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_228_ext = ExtensionId::GL_APPLE_sync;
        observe(observations.mReads);
        result = mImports.glFenceSyncAPPLE(condition, flag);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFenceSyncAPPLE coder(observations, condition, flag, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glFinishFenceNV(uint32_t fence) {
    GAPID_INFO("glFinishFenceNV(%" PRIu32 ")\n", fence);

    Observations observations;
    do {
        uint32_t l_requiresExtension_229_ext = ExtensionId::GL_NV_fence;
        observe(observations.mReads);
        mImports.glFinishFenceNV(fence);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFinishFenceNV coder(observations, fence);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFlushMappedBufferRangeEXT(uint32_t target, int32_t offset, int32_t length) {
    GAPID_INFO("glFlushMappedBufferRangeEXT(%u, %" PRId32 ", %" PRId32 ")\n", target, offset,
               length);

    Observations observations;
    do {
        uint32_t l_requiresExtension_230_ext = ExtensionId::GL_EXT_map_buffer_range;
        observe(observations.mReads);
        mImports.glFlushMappedBufferRangeEXT(target, offset, length);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFlushMappedBufferRangeEXT coder(observations, target, offset, length);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFramebufferTexture2DMultisampleEXT(uint32_t target, uint32_t attachment,
                                                          uint32_t textarget, uint32_t texture,
                                                          int32_t level, int32_t samples) {
    GAPID_INFO("glFramebufferTexture2DMultisampleEXT(%u, %u, %u, %" PRIu32 ", %" PRId32 ", %" PRId32
               ")\n",
               target, attachment, textarget, texture, level, samples);

    Observations observations;
    do {
        uint32_t l_requiresExtension_231_ext = ExtensionId::GL_EXT_multisampled_render_to_texture;
        observe(observations.mReads);
        mImports.glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, texture, level,
                                                      samples);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFramebufferTexture2DMultisampleEXT coder(
            observations, target, attachment, textarget, texture, level, samples);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFramebufferTexture2DMultisampleIMG(uint32_t target, uint32_t attachment,
                                                          uint32_t textarget, uint32_t texture,
                                                          int32_t level, int32_t samples) {
    GAPID_INFO("glFramebufferTexture2DMultisampleIMG(%u, %u, %u, %" PRIu32 ", %" PRId32 ", %" PRId32
               ")\n",
               target, attachment, textarget, texture, level, samples);

    Observations observations;
    do {
        uint32_t l_requiresExtension_232_ext = ExtensionId::GL_IMG_multisampled_render_to_texture;
        observe(observations.mReads);
        mImports.glFramebufferTexture2DMultisampleIMG(target, attachment, textarget, texture, level,
                                                      samples);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFramebufferTexture2DMultisampleIMG coder(
            observations, target, attachment, textarget, texture, level, samples);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFramebufferTexture3DOES(uint32_t target, uint32_t attachment,
                                               uint32_t textarget, uint32_t texture, int32_t level,
                                               int32_t zoffset) {
    GAPID_INFO("glFramebufferTexture3DOES(%u, %u, %u, %" PRIu32 ", %" PRId32 ", %" PRId32 ")\n",
               target, attachment, textarget, texture, level, zoffset);

    Observations observations;
    do {
        uint32_t l_requiresExtension_233_ext = ExtensionId::GL_OES_texture_3D;
        observe(observations.mReads);
        mImports.glFramebufferTexture3DOES(target, attachment, textarget, texture, level, zoffset);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFramebufferTexture3DOES coder(observations, target, attachment, textarget,
                                                        texture, level, zoffset);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFramebufferTextureOES(uint32_t target, uint32_t attachment, uint32_t texture,
                                             int32_t level) {
    GAPID_INFO("glFramebufferTextureOES(%u, %u, %" PRIu32 ", %" PRId32 ")\n", target, attachment,
               texture, level);

    Observations observations;
    do {
        uint32_t l_requiresExtension_234_ext = ExtensionId::GL_OES_geometry_shader;
        observe(observations.mReads);
        mImports.glFramebufferTextureOES(target, attachment, texture, level);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFramebufferTextureOES coder(observations, target, attachment, texture,
                                                      level);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFramebufferTextureMultiviewOVR(uint32_t target, uint32_t attachment,
                                                      uint32_t texture, int32_t level,
                                                      int32_t baseViewIndex, int32_t numViews) {
    GAPID_INFO("glFramebufferTextureMultiviewOVR(%u, %u, %" PRIu32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ")\n",
               target, attachment, texture, level, baseViewIndex, numViews);

    Observations observations;
    do {
        uint32_t l_requiresExtension_235_ext = ExtensionId::GL_OVR_multiview;
        observe(observations.mReads);
        mImports.glFramebufferTextureMultiviewOVR(target, attachment, texture, level, baseViewIndex,
                                                  numViews);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFramebufferTextureMultiviewOVR coder(
            observations, target, attachment, texture, level, baseViewIndex, numViews);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenFencesNV(int32_t n, uint32_t* fences) {
    GAPID_INFO("glGenFencesNV(%" PRId32 ", %p)\n", n, fences);

    Observations observations;
    do {
        uint32_t l_requiresExtension_236_ext = ExtensionId::GL_NV_fence;
        observe(observations.mReads);
        mImports.glGenFencesNV(n, fences);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenFencesNV coder(
            observations, n, gapic::coder::gles::GLuint__P(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(fences), 0)));
    mEncoder->Object(&coder);
}

inline uint32_t GlesSpy::glGenPathsNV(int32_t range) {
    GAPID_INFO("glGenPathsNV(%" PRId32 ")\n", range);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_237_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        result = mImports.glGenPathsNV(range);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenPathsNV coder(observations, range, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glGenPerfMonitorsAMD(int32_t n, uint32_t* monitors) {
    GAPID_INFO("glGenPerfMonitorsAMD(%" PRId32 ", %p)\n", n, monitors);

    Observations observations;
    do {
        uint32_t l_requiresExtension_238_ext = ExtensionId::GL_AMD_performance_monitor;
        observe(observations.mReads);
        mImports.glGenPerfMonitorsAMD(n, monitors);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenPerfMonitorsAMD coder(
            observations, n, gapic::coder::gles::GLuint__P(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(monitors), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenProgramPipelinesEXT(int32_t n, uint32_t* pipelines) {
    GAPID_INFO("glGenProgramPipelinesEXT(%" PRId32 ", %p)\n", n, pipelines);

    Observations observations;
    do {
        uint32_t l_requiresExtension_239_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glGenProgramPipelinesEXT(n, pipelines);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenProgramPipelinesEXT coder(
            observations, n, gapic::coder::gles::PipelineId__P(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(pipelines), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenQueriesEXT(int32_t count, uint32_t* queries) {
    GAPID_INFO("glGenQueriesEXT(%" PRId32 ", %p)\n", count, queries);

    Observations observations;
    do {
        uint32_t l_requiresExtension_240_ext = ExtensionId::GL_EXT_disjoint_timer_query;
        uint32_t l_requiresExtension_241_ext = ExtensionId::GL_EXT_occlusion_query_boolean;
        Slice<QueryId> l_q = slice(queries, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_242_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_242_result;
        observe(observations.mReads);
        mImports.glGenQueriesEXT(count, queries);
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            QueryId l_id = (QueryId)(
                    slice(queries, (uint64_t)((GLsizei)(0)), (uint64_t)(count))[(uint64_t)(l_i)]);
            l_ctx->mInstances.mQueries[l_id] = std::shared_ptr<Query>((new Query()));
            write(l_q, (uint64_t)(l_i), l_id);
        }
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenQueriesEXT coder(
            observations, count, gapic::coder::gles::QueryId__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(queries), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenVertexArraysOES(int32_t count, uint32_t* arrays) {
    GAPID_INFO("glGenVertexArraysOES(%" PRId32 ", %p)\n", count, arrays);

    Observations observations;
    do {
        uint32_t l_requiresExtension_243_ext = ExtensionId::GL_OES_vertex_array_object;
        Slice<VertexArrayId> l_a = slice(arrays, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_244_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_244_result;
        observe(observations.mReads);
        mImports.glGenVertexArraysOES(count, arrays);
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            VertexArrayId l_id = (VertexArrayId)(
                    slice(arrays, (uint64_t)((GLsizei)(0)), (uint64_t)(count))[(uint64_t)(l_i)]);
            l_ctx->mInstances.mVertexArrays[l_id] =
                    std::shared_ptr<VertexArray>((new VertexArray()));
            write(l_a, (uint64_t)(l_i), l_id);
        }
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenVertexArraysOES coder(
            observations, count, gapic::coder::gles::VertexArrayId__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(arrays), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetBufferPointervOES(uint32_t target, uint32_t pname, void** params) {
    GAPID_INFO("glGetBufferPointervOES(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_245_ext = ExtensionId::GL_OES_mapbuffer;
        observe(observations.mReads);
        mImports.glGetBufferPointervOES(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetBufferPointervOES coder(
            observations, target, pname,
            gapic::coder::gles::Void__P__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetDriverControlStringQCOM(uint32_t driverControl, int32_t bufSize,
                                                  int32_t* length, char* driverControlString) {
    GAPID_INFO("glGetDriverControlStringQCOM(%" PRIu32 ", %" PRId32 ", %p, %p)\n", driverControl,
               bufSize, length, driverControlString);

    Observations observations;
    do {
        uint32_t l_requiresExtension_246_ext = ExtensionId::GL_QCOM_driver_control;
        observe(observations.mReads);
        mImports.glGetDriverControlStringQCOM(driverControl, bufSize, length, driverControlString);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetDriverControlStringQCOM coder(
            observations, driverControl, bufSize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLchar__P(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(driverControlString), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetDriverControlsQCOM(int32_t* num, int32_t size, uint32_t* driverControls) {
    GAPID_INFO("glGetDriverControlsQCOM(%p, %" PRId32 ", %p)\n", num, size, driverControls);

    Observations observations;
    do {
        uint32_t l_requiresExtension_247_ext = ExtensionId::GL_QCOM_driver_control;
        observe(observations.mReads);
        mImports.glGetDriverControlsQCOM(num, size, driverControls);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetDriverControlsQCOM coder(
            observations, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(num), 0)),
            size, gapic::coder::gles::GLuint__P(gapic::coder::memory::Pointer(
                          reinterpret_cast<uintptr_t>(driverControls), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetFenceivNV(uint32_t fence, uint32_t pname, int32_t* params) {
    GAPID_INFO("glGetFenceivNV(%" PRIu32 ", %u, %p)\n", fence, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_248_ext = ExtensionId::GL_NV_fence;
        observe(observations.mReads);
        mImports.glGetFenceivNV(fence, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetFenceivNV coder(
            observations, fence, pname, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                                reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetFirstPerfQueryIdINTEL(uint32_t* queryId) {
    GAPID_INFO("glGetFirstPerfQueryIdINTEL(%p)\n", queryId);

    Observations observations;
    do {
        uint32_t l_requiresExtension_249_ext = ExtensionId::GL_INTEL_performance_query;
        observe(observations.mReads);
        mImports.glGetFirstPerfQueryIdINTEL(queryId);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetFirstPerfQueryIdINTEL coder(
            observations, gapic::coder::gles::GLuint__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(queryId), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetFloati_vNV(uint32_t target, uint32_t index, float* data) {
    GAPID_INFO("glGetFloati_vNV(%u, %" PRIu32 ", %p)\n", target, index, data);

    Observations observations;
    do {
        uint32_t l_requiresExtension_250_ext = ExtensionId::GL_NV_viewport_array;
        observe(observations.mReads);
        mImports.glGetFloati_vNV(target, index, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetFloati_vNV coder(
            observations, target, index,
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline uint32_t GlesSpy::glGetGraphicsResetStatusEXT() {
    GAPID_INFO("glGetGraphicsResetStatusEXT()\n");

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_251_ext = ExtensionId::GL_EXT_robustness;
        observe(observations.mReads);
        result = mImports.glGetGraphicsResetStatusEXT();
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetGraphicsResetStatusEXT coder(observations, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint32_t GlesSpy::glGetGraphicsResetStatusKHR() {
    GAPID_INFO("glGetGraphicsResetStatusKHR()\n");

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_252_ext = ExtensionId::GL_KHR_robustness;
        observe(observations.mReads);
        result = mImports.glGetGraphicsResetStatusKHR();
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetGraphicsResetStatusKHR coder(observations, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint64_t GlesSpy::glGetImageHandleNV(uint32_t texture, int32_t level, uint8_t layered,
                                            int32_t layer, uint32_t format) {
    GAPID_INFO("glGetImageHandleNV(%" PRIu32 ", %" PRId32 ", %" PRIu8 ", %" PRId32 ", %u)\n",
               texture, level, layered, layer, format);

    uint64_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_253_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        result = mImports.glGetImageHandleNV(texture, level, layered, layer, format);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetImageHandleNV coder(observations, texture, level, layered, layer,
                                                 format, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glGetInteger64vAPPLE(uint32_t pname, int64_t* params) {
    GAPID_INFO("glGetInteger64vAPPLE(%u, %p)\n", pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_254_ext = ExtensionId::GL_APPLE_sync;
        observe(observations.mReads);
        mImports.glGetInteger64vAPPLE(pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetInteger64vAPPLE coder(
            observations, pname, gapic::coder::gles::GLint64__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetIntegeri_vEXT(uint32_t target, uint32_t index, int32_t* data) {
    GAPID_INFO("glGetIntegeri_vEXT(%u, %" PRIu32 ", %p)\n", target, index, data);

    Observations observations;
    do {
        uint32_t l_requiresExtension_255_ext = ExtensionId::GL_EXT_multiview_draw_buffers;
        observe(observations.mReads);
        mImports.glGetIntegeri_vEXT(target, index, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetIntegeri_vEXT coder(
            observations, target, index, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                                 reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetInternalformatSampleivNV(uint32_t target, uint32_t internalformat,
                                                   int32_t samples, uint32_t pname, int32_t bufSize,
                                                   int32_t* params) {
    GAPID_INFO("glGetInternalformatSampleivNV(%u, %u, %" PRId32 ", %u, %" PRId32 ", %p)\n", target,
               internalformat, samples, pname, bufSize, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_256_ext = ExtensionId::GL_NV_internalformat_sample_query;
        observe(observations.mReads);
        mImports.glGetInternalformatSampleivNV(target, internalformat, samples, pname, bufSize,
                                               params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetInternalformatSampleivNV coder(
            observations, target, internalformat, samples, pname, bufSize,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetNextPerfQueryIdINTEL(uint32_t queryId, uint32_t* nextQueryId) {
    GAPID_INFO("glGetNextPerfQueryIdINTEL(%" PRIu32 ", %p)\n", queryId, nextQueryId);

    Observations observations;
    do {
        uint32_t l_requiresExtension_257_ext = ExtensionId::GL_INTEL_performance_query;
        observe(observations.mReads);
        mImports.glGetNextPerfQueryIdINTEL(queryId, nextQueryId);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetNextPerfQueryIdINTEL coder(
            observations, queryId, gapic::coder::gles::GLuint__P(gapic::coder::memory::Pointer(
                                           reinterpret_cast<uintptr_t>(nextQueryId), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetObjectLabelEXT(uint32_t type, uint32_t object, int32_t bufSize,
                                         int32_t* length, char* label) {
    GAPID_INFO("glGetObjectLabelEXT(%u, %" PRIu32 ", %" PRId32 ", %p, %p)\n", type, object, bufSize,
               length, label);

    Observations observations;
    do {
        uint32_t l_requiresExtension_258_ext = ExtensionId::GL_EXT_debug_label;
        observe(observations.mReads);
        mImports.glGetObjectLabelEXT(type, object, bufSize, length, label);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetObjectLabelEXT coder(
            observations, type, object, bufSize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(label), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPathCommandsNV(uint32_t path, uint8_t* commands) {
    GAPID_INFO("glGetPathCommandsNV(%" PRIu32 ", %p)\n", path, commands);

    Observations observations;
    do {
        uint32_t l_requiresExtension_259_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glGetPathCommandsNV(path, commands);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPathCommandsNV coder(
            observations, path, gapic::coder::gles::GLubyte__P(gapic::coder::memory::Pointer(
                                        reinterpret_cast<uintptr_t>(commands), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPathCoordsNV(uint32_t path, float* coords) {
    GAPID_INFO("glGetPathCoordsNV(%" PRIu32 ", %p)\n", path, coords);

    Observations observations;
    do {
        uint32_t l_requiresExtension_260_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glGetPathCoordsNV(path, coords);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPathCoordsNV coder(
            observations, path, gapic::coder::gles::GLfloat__P(gapic::coder::memory::Pointer(
                                        reinterpret_cast<uintptr_t>(coords), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPathDashArrayNV(uint32_t path, float* dashArray) {
    GAPID_INFO("glGetPathDashArrayNV(%" PRIu32 ", %p)\n", path, dashArray);

    Observations observations;
    do {
        uint32_t l_requiresExtension_261_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glGetPathDashArrayNV(path, dashArray);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPathDashArrayNV coder(
            observations, path, gapic::coder::gles::GLfloat__P(gapic::coder::memory::Pointer(
                                        reinterpret_cast<uintptr_t>(dashArray), 0)));
    mEncoder->Object(&coder);
}

inline float GlesSpy::glGetPathLengthNV(uint32_t path, int32_t startSegment, int32_t numSegments) {
    GAPID_INFO("glGetPathLengthNV(%" PRIu32 ", %" PRId32 ", %" PRId32 ")\n", path, startSegment,
               numSegments);

    float result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_262_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        result = mImports.glGetPathLengthNV(path, startSegment, numSegments);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPathLengthNV coder(observations, path, startSegment, numSegments,
                                                result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glGetPathMetricRangeNV(uint32_t metricQueryMask, uint32_t firstPathName,
                                            int32_t numPaths, int32_t stride, float* metrics) {
    GAPID_INFO("glGetPathMetricRangeNV(%u, %" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n",
               metricQueryMask, firstPathName, numPaths, stride, metrics);

    Observations observations;
    do {
        uint32_t l_requiresExtension_263_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glGetPathMetricRangeNV(metricQueryMask, firstPathName, numPaths, stride, metrics);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPathMetricRangeNV coder(
            observations, metricQueryMask, firstPathName, numPaths, stride,
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(metrics), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPathMetricsNV(uint32_t metricQueryMask, int32_t numPaths,
                                        uint32_t pathNameType, void* paths, uint32_t pathBase,
                                        int32_t stride, float* metrics) {
    GAPID_INFO("glGetPathMetricsNV(%u, %" PRId32 ", %u, %p, %" PRIu32 ", %" PRId32 ", %p)\n",
               metricQueryMask, numPaths, pathNameType, paths, pathBase, stride, metrics);

    Observations observations;
    do {
        uint32_t l_requiresExtension_264_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glGetPathMetricsNV(metricQueryMask, numPaths, pathNameType, paths, pathBase,
                                    stride, metrics);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPathMetricsNV coder(
            observations, metricQueryMask, numPaths, pathNameType,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(paths), 0)),
            pathBase, stride, gapic::coder::gles::GLfloat__P(gapic::coder::memory::Pointer(
                                      reinterpret_cast<uintptr_t>(metrics), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPathParameterfvNV(uint32_t path, uint32_t pname, float* value) {
    GAPID_INFO("glGetPathParameterfvNV(%" PRIu32 ", %u, %p)\n", path, pname, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_265_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glGetPathParameterfvNV(path, pname, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPathParameterfvNV coder(
            observations, path, pname, gapic::coder::gles::GLfloat__P(gapic::coder::memory::Pointer(
                                               reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPathParameterivNV(uint32_t path, uint32_t pname, int32_t* value) {
    GAPID_INFO("glGetPathParameterivNV(%" PRIu32 ", %u, %p)\n", path, pname, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_266_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glGetPathParameterivNV(path, pname, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPathParameterivNV coder(
            observations, path, pname, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                               reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPathSpacingNV(uint32_t pathListMode, int32_t numPaths,
                                        uint32_t pathNameType, void* paths, uint32_t pathBase,
                                        float advanceScale, float kerningScale,
                                        uint32_t transformType, float* returnedSpacing) {
    GAPID_INFO("glGetPathSpacingNV(%u, %" PRId32 ", %u, %p, %" PRIu32 ", %f, %f, %u, %p)\n",
               pathListMode, numPaths, pathNameType, paths, pathBase, advanceScale, kerningScale,
               transformType, returnedSpacing);

    Observations observations;
    do {
        uint32_t l_requiresExtension_267_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glGetPathSpacingNV(pathListMode, numPaths, pathNameType, paths, pathBase,
                                    advanceScale, kerningScale, transformType, returnedSpacing);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPathSpacingNV coder(
            observations, pathListMode, numPaths, pathNameType,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(paths), 0)),
            pathBase, advanceScale, kerningScale, transformType,
            gapic::coder::gles::GLfloat__P(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(returnedSpacing), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPerfCounterInfoINTEL(uint32_t queryId, uint32_t counterId,
                                               uint32_t counterNameLength, char* counterName,
                                               uint32_t counterDescLength, char* counterDesc,
                                               uint32_t* counterOffset, uint32_t* counterDataSize,
                                               uint32_t* counterTypeEnum,
                                               uint32_t* counterDataTypeEnum,
                                               uint64_t* rawCounterMaxValue) {
    GAPID_INFO("glGetPerfCounterInfoINTEL(%" PRIu32 ", %" PRIu32 ", %" PRIu32 ", %p, %" PRIu32
               ", %p, %p, %p, %p, %p, %p)\n",
               queryId, counterId, counterNameLength, counterName, counterDescLength, counterDesc,
               counterOffset, counterDataSize, counterTypeEnum, counterDataTypeEnum,
               rawCounterMaxValue);

    Observations observations;
    do {
        uint32_t l_requiresExtension_268_ext = ExtensionId::GL_INTEL_performance_query;
        observe(observations.mReads);
        mImports.glGetPerfCounterInfoINTEL(queryId, counterId, counterNameLength, counterName,
                                           counterDescLength, counterDesc, counterOffset,
                                           counterDataSize, counterTypeEnum, counterDataTypeEnum,
                                           rawCounterMaxValue);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPerfCounterInfoINTEL coder(
            observations, queryId, counterId, counterNameLength,
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(counterName), 0)),
            counterDescLength, gapic::coder::gles::GLchar__P(gapic::coder::memory::Pointer(
                                       reinterpret_cast<uintptr_t>(counterDesc), 0)),
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(counterOffset), 0)),
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(counterDataSize), 0)),
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(counterTypeEnum), 0)),
            gapic::coder::gles::GLuint__P(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(counterDataTypeEnum), 0)),
            gapic::coder::gles::GLuint64__P(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(rawCounterMaxValue), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPerfMonitorCounterDataAMD(uint32_t monitor, uint32_t pname,
                                                    int32_t dataSize, uint32_t* data,
                                                    int32_t* bytesWritten) {
    GAPID_INFO("glGetPerfMonitorCounterDataAMD(%" PRIu32 ", %u, %" PRId32 ", %p, %p)\n", monitor,
               pname, dataSize, data, bytesWritten);

    Observations observations;
    do {
        uint32_t l_requiresExtension_269_ext = ExtensionId::GL_AMD_performance_monitor;
        observe(observations.mReads);
        mImports.glGetPerfMonitorCounterDataAMD(monitor, pname, dataSize, data, bytesWritten);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPerfMonitorCounterDataAMD coder(
            observations, monitor, pname, dataSize,
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)),
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(bytesWritten), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPerfMonitorCounterInfoAMD(uint32_t group, uint32_t counter,
                                                    uint32_t pname, void* data) {
    GAPID_INFO("glGetPerfMonitorCounterInfoAMD(%" PRIu32 ", %" PRIu32 ", %u, %p)\n", group, counter,
               pname, data);

    Observations observations;
    do {
        uint32_t l_requiresExtension_270_ext = ExtensionId::GL_AMD_performance_monitor;
        observe(observations.mReads);
        mImports.glGetPerfMonitorCounterInfoAMD(group, counter, pname, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPerfMonitorCounterInfoAMD coder(
            observations, group, counter, pname,
            gapic::coder::gles::Void__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPerfMonitorCounterStringAMD(uint32_t group, uint32_t counter,
                                                      int32_t bufSize, int32_t* length,
                                                      char* counterString) {
    GAPID_INFO("glGetPerfMonitorCounterStringAMD(%" PRIu32 ", %" PRIu32 ", %" PRId32 ", %p, %p)\n",
               group, counter, bufSize, length, counterString);

    Observations observations;
    do {
        uint32_t l_requiresExtension_271_ext = ExtensionId::GL_AMD_performance_monitor;
        observe(observations.mReads);
        mImports.glGetPerfMonitorCounterStringAMD(group, counter, bufSize, length, counterString);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPerfMonitorCounterStringAMD coder(
            observations, group, counter, bufSize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(counterString), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPerfMonitorCountersAMD(uint32_t group, int32_t* numCounters,
                                                 int32_t* maxActiveCounters, int32_t counterSize,
                                                 uint32_t* counters) {
    GAPID_INFO("glGetPerfMonitorCountersAMD(%" PRIu32 ", %p, %p, %" PRId32 ", %p)\n", group,
               numCounters, maxActiveCounters, counterSize, counters);

    Observations observations;
    do {
        uint32_t l_requiresExtension_272_ext = ExtensionId::GL_AMD_performance_monitor;
        observe(observations.mReads);
        mImports.glGetPerfMonitorCountersAMD(group, numCounters, maxActiveCounters, counterSize,
                                             counters);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPerfMonitorCountersAMD coder(
            observations, group, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(numCounters), 0)),
            gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(maxActiveCounters), 0)),
            counterSize, gapic::coder::gles::GLuint__P(gapic::coder::memory::Pointer(
                                 reinterpret_cast<uintptr_t>(counters), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPerfMonitorGroupStringAMD(uint32_t group, int32_t bufSize,
                                                    int32_t* length, char* groupString) {
    GAPID_INFO("glGetPerfMonitorGroupStringAMD(%" PRIu32 ", %" PRId32 ", %p, %p)\n", group, bufSize,
               length, groupString);

    Observations observations;
    do {
        uint32_t l_requiresExtension_273_ext = ExtensionId::GL_AMD_performance_monitor;
        observe(observations.mReads);
        mImports.glGetPerfMonitorGroupStringAMD(group, bufSize, length, groupString);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPerfMonitorGroupStringAMD coder(
            observations, group, bufSize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(groupString), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPerfMonitorGroupsAMD(int32_t* numGroups, int32_t groupsSize,
                                               uint32_t* groups) {
    GAPID_INFO("glGetPerfMonitorGroupsAMD(%p, %" PRId32 ", %p)\n", numGroups, groupsSize, groups);

    Observations observations;
    do {
        uint32_t l_requiresExtension_274_ext = ExtensionId::GL_AMD_performance_monitor;
        observe(observations.mReads);
        mImports.glGetPerfMonitorGroupsAMD(numGroups, groupsSize, groups);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPerfMonitorGroupsAMD coder(
            observations, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(numGroups), 0)),
            groupsSize, gapic::coder::gles::GLuint__P(gapic::coder::memory::Pointer(
                                reinterpret_cast<uintptr_t>(groups), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPerfQueryDataINTEL(uint32_t queryHandle, uint32_t flag, int32_t dataSize,
                                             void* data, uint32_t* bytesWritten) {
    GAPID_INFO("glGetPerfQueryDataINTEL(%" PRIu32 ", %" PRIu32 ", %" PRId32 ", %p, %p)\n",
               queryHandle, flag, dataSize, data, bytesWritten);

    Observations observations;
    do {
        uint32_t l_requiresExtension_275_ext = ExtensionId::GL_INTEL_performance_query;
        observe(observations.mReads);
        mImports.glGetPerfQueryDataINTEL(queryHandle, flag, dataSize, data, bytesWritten);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPerfQueryDataINTEL coder(
            observations, queryHandle, flag, dataSize,
            gapic::coder::gles::GLvoid__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)),
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(bytesWritten), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPerfQueryIdByNameINTEL(char* queryName, uint32_t* queryId) {
    GAPID_INFO("glGetPerfQueryIdByNameINTEL(%p, %p)\n", queryName, queryId);

    Observations observations;
    do {
        uint32_t l_requiresExtension_276_ext = ExtensionId::GL_INTEL_performance_query;
        observe(observations.mReads);
        mImports.glGetPerfQueryIdByNameINTEL(queryName, queryId);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPerfQueryIdByNameINTEL coder(
            observations, gapic::coder::gles::GLchar__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(queryName), 0)),
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(queryId), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetPerfQueryInfoINTEL(uint32_t queryId, uint32_t queryNameLength,
                                             char* queryName, uint32_t* dataSize,
                                             uint32_t* noCounters, uint32_t* noInstances,
                                             uint32_t* capsMask) {
    GAPID_INFO("glGetPerfQueryInfoINTEL(%" PRIu32 ", %" PRIu32 ", %p, %p, %p, %p, %p)\n", queryId,
               queryNameLength, queryName, dataSize, noCounters, noInstances, capsMask);

    Observations observations;
    do {
        uint32_t l_requiresExtension_277_ext = ExtensionId::GL_INTEL_performance_query;
        observe(observations.mReads);
        mImports.glGetPerfQueryInfoINTEL(queryId, queryNameLength, queryName, dataSize, noCounters,
                                         noInstances, capsMask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetPerfQueryInfoINTEL coder(
            observations, queryId, queryNameLength,
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(queryName), 0)),
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(dataSize), 0)),
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(noCounters), 0)),
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(noInstances), 0)),
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(capsMask), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetProgramBinaryOES(uint32_t program, int32_t buffer_size,
                                           int32_t* bytes_written, uint32_t* binary_format,
                                           void* binary) {
    GAPID_INFO("glGetProgramBinaryOES(%" PRIu32 ", %" PRId32 ", %p, %p, %p)\n", program,
               buffer_size, bytes_written, binary_format, binary);

    Observations observations;
    do {
        uint32_t l_requiresExtension_278_ext = ExtensionId::GL_OES_get_program_binary;
        observe(observations.mReads);
        mImports.glGetProgramBinaryOES(program, buffer_size, bytes_written, binary_format, binary);
        GLsizei l_l = (GLsizei)(slice(bytes_written, 0, 1)[0]);
        write(slice(bytes_written, 0, 1), 0, l_l);
        write(slice(binary_format, 0, 1), 0, slice(binary_format, 0, 1)[0]);
        write(slice(binary, (uint64_t)((GLsizei)(0)), (uint64_t)(l_l)));
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramBinaryOES coder(
            observations, program, buffer_size,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(bytes_written), 0)),
            gapic::coder::gles::GLenum__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(binary_format), 0)),
            gapic::coder::gles::Void__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(binary), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetProgramPipelineInfoLogEXT(uint32_t pipeline, int32_t bufSize,
                                                    int32_t* length, char* infoLog) {
    GAPID_INFO("glGetProgramPipelineInfoLogEXT(%" PRIu32 ", %" PRId32 ", %p, %p)\n", pipeline,
               bufSize, length, infoLog);

    Observations observations;
    do {
        uint32_t l_requiresExtension_279_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glGetProgramPipelineInfoLogEXT(pipeline, bufSize, length, infoLog);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramPipelineInfoLogEXT coder(
            observations, pipeline, bufSize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(infoLog), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetProgramPipelineivEXT(uint32_t pipeline, uint32_t pname, int32_t* params) {
    GAPID_INFO("glGetProgramPipelineivEXT(%" PRIu32 ", %u, %p)\n", pipeline, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_280_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glGetProgramPipelineivEXT(pipeline, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramPipelineivEXT coder(
            observations, pipeline, pname,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetProgramResourcefvNV(uint32_t program, uint32_t programInterface,
                                              uint32_t index, int32_t propCount, uint32_t* props,
                                              int32_t bufSize, int32_t* length, float* params) {
    GAPID_INFO("glGetProgramResourcefvNV(%" PRIu32 ", %u, %" PRIu32 ", %" PRId32 ", %p, %" PRId32
               ", %p, %p)\n",
               program, programInterface, index, propCount, props, bufSize, length, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_281_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glGetProgramResourcefvNV(program, programInterface, index, propCount, props,
                                          bufSize, length, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramResourcefvNV coder(
            observations, program, programInterface, index, propCount,
            gapic::coder::gles::GLenum__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(props), 0)),
            bufSize, gapic::coder::gles::GLsizei__P(
                             gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetQueryObjecti64vEXT(uint32_t query, uint32_t parameter, int64_t* value) {
    GAPID_INFO("glGetQueryObjecti64vEXT(%" PRIu32 ", %u, %p)\n", query, parameter, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_282_ext = ExtensionId::GL_EXT_disjoint_timer_query;
        observe(observations.mReads);
        mImports.glGetQueryObjecti64vEXT(query, parameter, value);
        write(slice(value, 0, 1), 0, slice(value, 0, 1)[0]);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetQueryObjecti64vEXT coder(
            observations, query, parameter,
            gapic::coder::gles::GLint64__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetQueryObjectivEXT(uint32_t query, uint32_t parameter, int32_t* value) {
    GAPID_INFO("glGetQueryObjectivEXT(%" PRIu32 ", %u, %p)\n", query, parameter, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_283_ext = ExtensionId::GL_EXT_disjoint_timer_query;
        observe(observations.mReads);
        mImports.glGetQueryObjectivEXT(query, parameter, value);
        write(slice(value, 0, 1), 0, slice(value, 0, 1)[0]);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetQueryObjectivEXT coder(
            observations, query, parameter,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetQueryObjectui64vEXT(uint32_t query, uint32_t parameter, uint64_t* value) {
    GAPID_INFO("glGetQueryObjectui64vEXT(%" PRIu32 ", %u, %p)\n", query, parameter, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_284_ext = ExtensionId::GL_EXT_disjoint_timer_query;
        observe(observations.mReads);
        mImports.glGetQueryObjectui64vEXT(query, parameter, value);
        write(slice(value, 0, 1), 0, slice(value, 0, 1)[0]);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetQueryObjectui64vEXT coder(
            observations, query, parameter,
            gapic::coder::gles::GLuint64__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetQueryObjectuivEXT(uint32_t query, uint32_t parameter, uint32_t* value) {
    GAPID_INFO("glGetQueryObjectuivEXT(%" PRIu32 ", %u, %p)\n", query, parameter, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_285_ext = ExtensionId::GL_EXT_disjoint_timer_query;
        uint32_t l_requiresExtension_286_ext = ExtensionId::GL_EXT_occlusion_query_boolean;
        observe(observations.mReads);
        mImports.glGetQueryObjectuivEXT(query, parameter, value);
        write(slice(value, 0, 1), 0, slice(value, 0, 1)[0]);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetQueryObjectuivEXT coder(
            observations, query, parameter,
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetQueryivEXT(uint32_t target, uint32_t parameter, int32_t* value) {
    GAPID_INFO("glGetQueryivEXT(%u, %u, %p)\n", target, parameter, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_287_ext = ExtensionId::GL_EXT_disjoint_timer_query;
        uint32_t l_requiresExtension_288_ext = ExtensionId::GL_EXT_occlusion_query_boolean;
        observe(observations.mReads);
        mImports.glGetQueryivEXT(target, parameter, value);
        write(slice(value, 0, 1), 0, slice(value, 0, 1)[0]);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetQueryivEXT coder(
            observations, target, parameter,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetSamplerParameterIivOES(uint32_t sampler, uint32_t pname,
                                                 int32_t* params) {
    GAPID_INFO("glGetSamplerParameterIivOES(%" PRIu32 ", %u, %p)\n", sampler, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_289_ext = ExtensionId::GL_OES_texture_border_clamp;
        observe(observations.mReads);
        mImports.glGetSamplerParameterIivOES(sampler, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetSamplerParameterIivOES coder(
            observations, sampler, pname,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetSamplerParameterIuivOES(uint32_t sampler, uint32_t pname,
                                                  uint32_t* params) {
    GAPID_INFO("glGetSamplerParameterIuivOES(%" PRIu32 ", %u, %p)\n", sampler, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_290_ext = ExtensionId::GL_OES_texture_border_clamp;
        observe(observations.mReads);
        mImports.glGetSamplerParameterIuivOES(sampler, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetSamplerParameterIuivOES coder(
            observations, sampler, pname,
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetSyncivAPPLE(uint64_t sync, uint32_t pname, int32_t bufSize,
                                      int32_t* length, int32_t* values) {
    GAPID_INFO("glGetSyncivAPPLE(%" PRIu64 ", %u, %" PRId32 ", %p, %p)\n", sync, pname, bufSize,
               length, values);

    Observations observations;
    do {
        uint32_t l_requiresExtension_291_ext = ExtensionId::GL_APPLE_sync;
        observe(observations.mReads);
        mImports.glGetSyncivAPPLE(sync, pname, bufSize, length, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetSyncivAPPLE coder(
            observations, sync, pname, bufSize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetTexParameterIivOES(uint32_t target, uint32_t pname, int32_t* params) {
    GAPID_INFO("glGetTexParameterIivOES(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_292_ext = ExtensionId::GL_OES_texture_border_clamp;
        observe(observations.mReads);
        mImports.glGetTexParameterIivOES(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetTexParameterIivOES coder(
            observations, target, pname, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                                 reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetTexParameterIuivOES(uint32_t target, uint32_t pname, uint32_t* params) {
    GAPID_INFO("glGetTexParameterIuivOES(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_293_ext = ExtensionId::GL_OES_texture_border_clamp;
        observe(observations.mReads);
        mImports.glGetTexParameterIuivOES(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetTexParameterIuivOES coder(
            observations, target, pname,
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline uint64_t GlesSpy::glGetTextureHandleNV(uint32_t texture) {
    GAPID_INFO("glGetTextureHandleNV(%" PRIu32 ")\n", texture);

    uint64_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_294_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        result = mImports.glGetTextureHandleNV(texture);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetTextureHandleNV coder(observations, texture, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint64_t GlesSpy::glGetTextureSamplerHandleNV(uint32_t texture, uint32_t sampler) {
    GAPID_INFO("glGetTextureSamplerHandleNV(%" PRIu32 ", %" PRIu32 ")\n", texture, sampler);

    uint64_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_295_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        result = mImports.glGetTextureSamplerHandleNV(texture, sampler);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetTextureSamplerHandleNV coder(observations, texture, sampler, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glGetTranslatedShaderSourceANGLE(uint32_t shader, int32_t bufsize,
                                                      int32_t* length, char* source) {
    GAPID_INFO("glGetTranslatedShaderSourceANGLE(%" PRIu32 ", %" PRId32 ", %p, %p)\n", shader,
               bufsize, length, source);

    Observations observations;
    do {
        uint32_t l_requiresExtension_296_ext = ExtensionId::GL_ANGLE_translated_shader_source;
        observe(observations.mReads);
        mImports.glGetTranslatedShaderSourceANGLE(shader, bufsize, length, source);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetTranslatedShaderSourceANGLE coder(
            observations, shader, bufsize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(source), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetnUniformfvEXT(uint32_t program, int32_t location, int32_t bufSize,
                                        float* params) {
    GAPID_INFO("glGetnUniformfvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program, location,
               bufSize, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_297_ext = ExtensionId::GL_EXT_robustness;
        observe(observations.mReads);
        mImports.glGetnUniformfvEXT(program, location, bufSize, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetnUniformfvEXT coder(
            observations, program, location, bufSize,
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetnUniformfvKHR(uint32_t program, int32_t location, int32_t bufSize,
                                        float* params) {
    GAPID_INFO("glGetnUniformfvKHR(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program, location,
               bufSize, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_298_ext = ExtensionId::GL_KHR_robustness;
        observe(observations.mReads);
        mImports.glGetnUniformfvKHR(program, location, bufSize, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetnUniformfvKHR coder(
            observations, program, location, bufSize,
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetnUniformivEXT(uint32_t program, int32_t location, int32_t bufSize,
                                        int32_t* params) {
    GAPID_INFO("glGetnUniformivEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program, location,
               bufSize, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_299_ext = ExtensionId::GL_EXT_robustness;
        observe(observations.mReads);
        mImports.glGetnUniformivEXT(program, location, bufSize, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetnUniformivEXT coder(
            observations, program, location, bufSize,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetnUniformivKHR(uint32_t program, int32_t location, int32_t bufSize,
                                        int32_t* params) {
    GAPID_INFO("glGetnUniformivKHR(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program, location,
               bufSize, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_300_ext = ExtensionId::GL_KHR_robustness;
        observe(observations.mReads);
        mImports.glGetnUniformivKHR(program, location, bufSize, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetnUniformivKHR coder(
            observations, program, location, bufSize,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetnUniformuivKHR(uint32_t program, int32_t location, int32_t bufSize,
                                         uint32_t* params) {
    GAPID_INFO("glGetnUniformuivKHR(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, bufSize, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_301_ext = ExtensionId::GL_KHR_robustness;
        observe(observations.mReads);
        mImports.glGetnUniformuivKHR(program, location, bufSize, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetnUniformuivKHR coder(
            observations, program, location, bufSize,
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glInsertEventMarkerEXT(int32_t length, char* marker) {
    GAPID_INFO("glInsertEventMarkerEXT(%" PRId32 ", %p)\n", length, marker);

    Observations observations;
    do {
        uint32_t l_requiresExtension_302_ext = ExtensionId::GL_EXT_debug_marker;
        if (length > (GLsizei)(0)) {
            read(slice(marker, (uint64_t)((GLsizei)(0)), (uint64_t)(length)));
        } else {
            string((char*)(marker));
        }
        observe(observations.mReads);
        mImports.glInsertEventMarkerEXT(length, marker);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlInsertEventMarkerEXT coder(
            observations, length, gapic::coder::gles::GLchar__CP(gapic::coder::memory::Pointer(
                                          reinterpret_cast<uintptr_t>(marker), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glInterpolatePathsNV(uint32_t resultPath, uint32_t pathA, uint32_t pathB,
                                          float weight) {
    GAPID_INFO("glInterpolatePathsNV(%" PRIu32 ", %" PRIu32 ", %" PRIu32 ", %f)\n", resultPath,
               pathA, pathB, weight);

    Observations observations;
    do {
        uint32_t l_requiresExtension_303_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glInterpolatePathsNV(resultPath, pathA, pathB, weight);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlInterpolatePathsNV coder(observations, resultPath, pathA, pathB, weight);
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glIsEnablediOES(uint32_t target, uint32_t index) {
    GAPID_INFO("glIsEnablediOES(%u, %" PRIu32 ")\n", target, index);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_304_ext = ExtensionId::GL_OES_draw_buffers_indexed;
        observe(observations.mReads);
        result = mImports.glIsEnablediOES(target, index);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsEnablediOES coder(observations, target, index, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsEnablediNV(uint32_t target, uint32_t index) {
    GAPID_INFO("glIsEnablediNV(%u, %" PRIu32 ")\n", target, index);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_305_ext = ExtensionId::GL_NV_viewport_array;
        observe(observations.mReads);
        result = mImports.glIsEnablediNV(target, index);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsEnablediNV coder(observations, target, index, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsFenceNV(uint32_t fence) {
    GAPID_INFO("glIsFenceNV(%" PRIu32 ")\n", fence);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_306_ext = ExtensionId::GL_NV_fence;
        observe(observations.mReads);
        result = mImports.glIsFenceNV(fence);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsFenceNV coder(observations, fence, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsImageHandleResidentNV(uint64_t handle) {
    GAPID_INFO("glIsImageHandleResidentNV(%" PRIu64 ")\n", handle);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_307_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        result = mImports.glIsImageHandleResidentNV(handle);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsImageHandleResidentNV coder(observations, handle, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsPathNV(uint32_t path) {
    GAPID_INFO("glIsPathNV(%" PRIu32 ")\n", path);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_308_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        result = mImports.glIsPathNV(path);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsPathNV coder(observations, path, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsPointInFillPathNV(uint32_t path, uint32_t mask, float x, float y) {
    GAPID_INFO("glIsPointInFillPathNV(%" PRIu32 ", %" PRIu32 ", %f, %f)\n", path, mask, x, y);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_309_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        result = mImports.glIsPointInFillPathNV(path, mask, x, y);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsPointInFillPathNV coder(observations, path, mask, x, y, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsPointInStrokePathNV(uint32_t path, float x, float y) {
    GAPID_INFO("glIsPointInStrokePathNV(%" PRIu32 ", %f, %f)\n", path, x, y);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_310_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        result = mImports.glIsPointInStrokePathNV(path, x, y);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsPointInStrokePathNV coder(observations, path, x, y, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsProgramPipelineEXT(uint32_t pipeline) {
    GAPID_INFO("glIsProgramPipelineEXT(%" PRIu32 ")\n", pipeline);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_311_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        result = mImports.glIsProgramPipelineEXT(pipeline);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsProgramPipelineEXT coder(observations, pipeline, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsQueryEXT(uint32_t query) {
    GAPID_INFO("glIsQueryEXT(%" PRIu32 ")\n", query);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_312_ext = ExtensionId::GL_EXT_disjoint_timer_query;
        uint32_t l_requiresExtension_313_ext = ExtensionId::GL_EXT_occlusion_query_boolean;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_314_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_314_result;
        observe(observations.mReads);
        result = mImports.glIsQueryEXT(query);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsQueryEXT coder(observations, query, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsSyncAPPLE(uint64_t sync) {
    GAPID_INFO("glIsSyncAPPLE(%" PRIu64 ")\n", sync);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_315_ext = ExtensionId::GL_APPLE_sync;
        observe(observations.mReads);
        result = mImports.glIsSyncAPPLE(sync);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsSyncAPPLE coder(observations, sync, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsTextureHandleResidentNV(uint64_t handle) {
    GAPID_INFO("glIsTextureHandleResidentNV(%" PRIu64 ")\n", handle);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_316_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        result = mImports.glIsTextureHandleResidentNV(handle);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsTextureHandleResidentNV coder(observations, handle, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsVertexArrayOES(uint32_t array) {
    GAPID_INFO("glIsVertexArrayOES(%" PRIu32 ")\n", array);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_317_ext = ExtensionId::GL_OES_vertex_array_object;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_318_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_318_result;
        observe(observations.mReads);
        result = mImports.glIsVertexArrayOES(array);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsVertexArrayOES coder(observations, array, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glLabelObjectEXT(uint32_t type, uint32_t object, int32_t length, char* label) {
    GAPID_INFO("glLabelObjectEXT(%u, %" PRIu32 ", %" PRId32 ", %p)\n", type, object, length, label);

    Observations observations;
    do {
        uint32_t l_requiresExtension_319_ext = ExtensionId::GL_EXT_debug_label;
        observe(observations.mReads);
        mImports.glLabelObjectEXT(type, object, length, label);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlLabelObjectEXT coder(
            observations, type, object, length,
            gapic::coder::gles::GLchar__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(label), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMakeImageHandleNonResidentNV(uint64_t handle) {
    GAPID_INFO("glMakeImageHandleNonResidentNV(%" PRIu64 ")\n", handle);

    Observations observations;
    do {
        uint32_t l_requiresExtension_320_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        mImports.glMakeImageHandleNonResidentNV(handle);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMakeImageHandleNonResidentNV coder(observations, handle);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMakeImageHandleResidentNV(uint64_t handle, uint32_t access) {
    GAPID_INFO("glMakeImageHandleResidentNV(%" PRIu64 ", %u)\n", handle, access);

    Observations observations;
    do {
        uint32_t l_requiresExtension_321_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        mImports.glMakeImageHandleResidentNV(handle, access);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMakeImageHandleResidentNV coder(observations, handle, access);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMakeTextureHandleNonResidentNV(uint64_t handle) {
    GAPID_INFO("glMakeTextureHandleNonResidentNV(%" PRIu64 ")\n", handle);

    Observations observations;
    do {
        uint32_t l_requiresExtension_322_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        mImports.glMakeTextureHandleNonResidentNV(handle);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMakeTextureHandleNonResidentNV coder(observations, handle);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMakeTextureHandleResidentNV(uint64_t handle) {
    GAPID_INFO("glMakeTextureHandleResidentNV(%" PRIu64 ")\n", handle);

    Observations observations;
    do {
        uint32_t l_requiresExtension_323_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        mImports.glMakeTextureHandleResidentNV(handle);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMakeTextureHandleResidentNV coder(observations, handle);
    mEncoder->Object(&coder);
}

inline void* GlesSpy::glMapBufferOES(uint32_t target, uint32_t access) {
    GAPID_INFO("glMapBufferOES(%u, %u)\n", target, access);

    void* result = nullptr;

    Observations observations;
    do {
        uint32_t l_requiresExtension_324_ext = ExtensionId::GL_OES_mapbuffer;
        observe(observations.mReads);
        result = mImports.glMapBufferOES(target, access);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMapBufferOES coder(
            observations, target, access, gapic::coder::gles::Void__P(gapic::coder::memory::Pointer(
                                                  reinterpret_cast<uintptr_t>(result), 0)));
    mEncoder->Object(&coder);

    return result;
}

inline void* GlesSpy::glMapBufferRangeEXT(uint32_t target, int32_t offset, int32_t length,
                                          uint32_t access) {
    GAPID_INFO("glMapBufferRangeEXT(%u, %" PRId32 ", %" PRId32 ", %u)\n", target, offset, length,
               access);

    void* result = nullptr;

    Observations observations;
    do {
        uint32_t l_requiresExtension_325_ext = ExtensionId::GL_EXT_map_buffer_range;
        observe(observations.mReads);
        result = mImports.glMapBufferRangeEXT(target, offset, length, access);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMapBufferRangeEXT coder(
            observations, target, offset, length, access,
            gapic::coder::gles::Void__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(result), 0)));
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glMatrixLoad3x2fNV(uint32_t matrixMode, float* m) {
    GAPID_INFO("glMatrixLoad3x2fNV(%u, %p)\n", matrixMode, m);

    Observations observations;
    do {
        uint32_t l_requiresExtension_326_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glMatrixLoad3x2fNV(matrixMode, m);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMatrixLoad3x2fNV coder(
            observations, matrixMode, gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                                              reinterpret_cast<uintptr_t>(m), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMatrixLoad3x3fNV(uint32_t matrixMode, float* m) {
    GAPID_INFO("glMatrixLoad3x3fNV(%u, %p)\n", matrixMode, m);

    Observations observations;
    do {
        uint32_t l_requiresExtension_327_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glMatrixLoad3x3fNV(matrixMode, m);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMatrixLoad3x3fNV coder(
            observations, matrixMode, gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                                              reinterpret_cast<uintptr_t>(m), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMatrixLoadTranspose3x3fNV(uint32_t matrixMode, float* m) {
    GAPID_INFO("glMatrixLoadTranspose3x3fNV(%u, %p)\n", matrixMode, m);

    Observations observations;
    do {
        uint32_t l_requiresExtension_328_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glMatrixLoadTranspose3x3fNV(matrixMode, m);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMatrixLoadTranspose3x3fNV coder(
            observations, matrixMode, gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                                              reinterpret_cast<uintptr_t>(m), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMatrixMult3x2fNV(uint32_t matrixMode, float* m) {
    GAPID_INFO("glMatrixMult3x2fNV(%u, %p)\n", matrixMode, m);

    Observations observations;
    do {
        uint32_t l_requiresExtension_329_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glMatrixMult3x2fNV(matrixMode, m);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMatrixMult3x2fNV coder(
            observations, matrixMode, gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                                              reinterpret_cast<uintptr_t>(m), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMatrixMult3x3fNV(uint32_t matrixMode, float* m) {
    GAPID_INFO("glMatrixMult3x3fNV(%u, %p)\n", matrixMode, m);

    Observations observations;
    do {
        uint32_t l_requiresExtension_330_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glMatrixMult3x3fNV(matrixMode, m);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMatrixMult3x3fNV coder(
            observations, matrixMode, gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                                              reinterpret_cast<uintptr_t>(m), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMatrixMultTranspose3x3fNV(uint32_t matrixMode, float* m) {
    GAPID_INFO("glMatrixMultTranspose3x3fNV(%u, %p)\n", matrixMode, m);

    Observations observations;
    do {
        uint32_t l_requiresExtension_331_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glMatrixMultTranspose3x3fNV(matrixMode, m);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMatrixMultTranspose3x3fNV coder(
            observations, matrixMode, gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                                              reinterpret_cast<uintptr_t>(m), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMultiDrawArraysEXT(uint32_t mode, int32_t* first, int32_t* count,
                                          int32_t primcount) {
    GAPID_INFO("glMultiDrawArraysEXT(%u, %p, %p, %" PRId32 ")\n", mode, first, count, primcount);

    Observations observations;
    do {
        uint32_t l_requiresExtension_332_ext = ExtensionId::GL_EXT_multi_draw_arrays;
        observe(observations.mReads);
        mImports.glMultiDrawArraysEXT(mode, first, count, primcount);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMultiDrawArraysEXT coder(
            observations, mode, gapic::coder::gles::GLint__CP(gapic::coder::memory::Pointer(
                                        reinterpret_cast<uintptr_t>(first), 0)),
            gapic::coder::gles::GLsizei__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(count), 0)),
            primcount);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMultiDrawArraysIndirectEXT(uint32_t mode, void* indirect, int32_t drawcount,
                                                  int32_t stride) {
    GAPID_INFO("glMultiDrawArraysIndirectEXT(%u, %p, %" PRId32 ", %" PRId32 ")\n", mode, indirect,
               drawcount, stride);

    Observations observations;
    do {
        uint32_t l_requiresExtension_333_ext = ExtensionId::GL_EXT_multi_draw_indirect;
        observe(observations.mReads);
        mImports.glMultiDrawArraysIndirectEXT(mode, indirect, drawcount, stride);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMultiDrawArraysIndirectEXT coder(
            observations, mode, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                                        reinterpret_cast<uintptr_t>(indirect), 0)),
            drawcount, stride);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMultiDrawElementsBaseVertexEXT(uint32_t mode, int32_t* count, uint32_t type,
                                                      void** indices, int32_t primcount,
                                                      int32_t* basevertex) {
    GAPID_INFO("glMultiDrawElementsBaseVertexEXT(%u, %p, %u, %p, %" PRId32 ", %p)\n", mode, count,
               type, indices, primcount, basevertex);

    Observations observations;
    do {
        uint32_t l_requiresExtension_334_ext = ExtensionId::GL_EXT_draw_elements_base_vertex;
        observe(observations.mReads);
        mImports.glMultiDrawElementsBaseVertexEXT(mode, count, type, indices, primcount,
                                                  basevertex);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMultiDrawElementsBaseVertexEXT coder(
            observations, mode, gapic::coder::gles::GLsizei__CP(gapic::coder::memory::Pointer(
                                        reinterpret_cast<uintptr_t>(count), 0)),
            type, gapic::coder::gles::Void__CP__CP(
                          gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            primcount, gapic::coder::gles::GLint__CP(gapic::coder::memory::Pointer(
                               reinterpret_cast<uintptr_t>(basevertex), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMultiDrawElementsBaseVertexOES(uint32_t mode, int32_t* count, uint32_t type,
                                                      void** indices, int32_t primcount,
                                                      int32_t* basevertex) {
    GAPID_INFO("glMultiDrawElementsBaseVertexOES(%u, %p, %u, %p, %" PRId32 ", %p)\n", mode, count,
               type, indices, primcount, basevertex);

    Observations observations;
    do {
        uint32_t l_requiresExtension_335_ext = ExtensionId::GL_OES_draw_elements_base_vertex;
        observe(observations.mReads);
        mImports.glMultiDrawElementsBaseVertexOES(mode, count, type, indices, primcount,
                                                  basevertex);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMultiDrawElementsBaseVertexOES coder(
            observations, mode, gapic::coder::gles::GLsizei__CP(gapic::coder::memory::Pointer(
                                        reinterpret_cast<uintptr_t>(count), 0)),
            type, gapic::coder::gles::Void__CP__CP(
                          gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            primcount, gapic::coder::gles::GLint__CP(gapic::coder::memory::Pointer(
                               reinterpret_cast<uintptr_t>(basevertex), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMultiDrawElementsEXT(uint32_t mode, int32_t* count, uint32_t type,
                                            void** indices, int32_t primcount) {
    GAPID_INFO("glMultiDrawElementsEXT(%u, %p, %u, %p, %" PRId32 ")\n", mode, count, type, indices,
               primcount);

    Observations observations;
    do {
        uint32_t l_requiresExtension_336_ext = ExtensionId::GL_EXT_multi_draw_arrays;
        observe(observations.mReads);
        mImports.glMultiDrawElementsEXT(mode, count, type, indices, primcount);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMultiDrawElementsEXT coder(
            observations, mode, gapic::coder::gles::GLsizei__CP(gapic::coder::memory::Pointer(
                                        reinterpret_cast<uintptr_t>(count), 0)),
            type, gapic::coder::gles::Void__CP__CP(
                          gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(indices), 0)),
            primcount);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMultiDrawElementsIndirectEXT(uint32_t mode, uint32_t type, void* indirect,
                                                    int32_t drawcount, int32_t stride) {
    GAPID_INFO("glMultiDrawElementsIndirectEXT(%u, %u, %p, %" PRId32 ", %" PRId32 ")\n", mode, type,
               indirect, drawcount, stride);

    Observations observations;
    do {
        uint32_t l_requiresExtension_337_ext = ExtensionId::GL_EXT_multi_draw_indirect;
        observe(observations.mReads);
        mImports.glMultiDrawElementsIndirectEXT(mode, type, indirect, drawcount, stride);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMultiDrawElementsIndirectEXT coder(
            observations, mode, type, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                                              reinterpret_cast<uintptr_t>(indirect), 0)),
            drawcount, stride);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPatchParameteriOES(uint32_t pname, int32_t value) {
    GAPID_INFO("glPatchParameteriOES(%u, %" PRId32 ")\n", pname, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_338_ext = ExtensionId::GL_OES_tessellation_shader;
        observe(observations.mReads);
        mImports.glPatchParameteriOES(pname, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPatchParameteriOES coder(observations, pname, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathCommandsNV(uint32_t path, int32_t numCommands, uint8_t* commands,
                                      int32_t numCoords, uint32_t coordType, void* coords) {
    GAPID_INFO("glPathCommandsNV(%" PRIu32 ", %" PRId32 ", %p, %" PRId32 ", %u, %p)\n", path,
               numCommands, commands, numCoords, coordType, coords);

    Observations observations;
    do {
        uint32_t l_requiresExtension_339_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathCommandsNV(path, numCommands, commands, numCoords, coordType, coords);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathCommandsNV coder(
            observations, path, numCommands,
            gapic::coder::gles::GLubyte__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(commands), 0)),
            numCoords, coordType, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                                          reinterpret_cast<uintptr_t>(coords), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathCoordsNV(uint32_t path, int32_t numCoords, uint32_t coordType,
                                    void* coords) {
    GAPID_INFO("glPathCoordsNV(%" PRIu32 ", %" PRId32 ", %u, %p)\n", path, numCoords, coordType,
               coords);

    Observations observations;
    do {
        uint32_t l_requiresExtension_340_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathCoordsNV(path, numCoords, coordType, coords);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathCoordsNV coder(
            observations, path, numCoords, coordType,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(coords), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathCoverDepthFuncNV(uint32_t func) {
    GAPID_INFO("glPathCoverDepthFuncNV(%u)\n", func);

    Observations observations;
    do {
        uint32_t l_requiresExtension_341_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathCoverDepthFuncNV(func);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathCoverDepthFuncNV coder(observations, func);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathDashArrayNV(uint32_t path, int32_t dashCount, float* dashArray) {
    GAPID_INFO("glPathDashArrayNV(%" PRIu32 ", %" PRId32 ", %p)\n", path, dashCount, dashArray);

    Observations observations;
    do {
        uint32_t l_requiresExtension_342_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathDashArrayNV(path, dashCount, dashArray);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathDashArrayNV coder(
            observations, path, dashCount,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(dashArray), 0)));
    mEncoder->Object(&coder);
}

inline uint32_t GlesSpy::glPathGlyphIndexArrayNV(uint32_t firstPathName, uint32_t fontTarget,
                                                 void* fontName, uint32_t fontStyle,
                                                 uint32_t firstGlyphIndex, int32_t numGlyphs,
                                                 uint32_t pathParameterTemplate, float emScale) {
    GAPID_INFO("glPathGlyphIndexArrayNV(%" PRIu32 ", %u, %p, %u, %" PRIu32 ", %" PRId32 ", %" PRIu32
               ", %f)\n",
               firstPathName, fontTarget, fontName, fontStyle, firstGlyphIndex, numGlyphs,
               pathParameterTemplate, emScale);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_343_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        result = mImports.glPathGlyphIndexArrayNV(firstPathName, fontTarget, fontName, fontStyle,
                                                  firstGlyphIndex, numGlyphs, pathParameterTemplate,
                                                  emScale);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathGlyphIndexArrayNV coder(
            observations, firstPathName, fontTarget,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(fontName), 0)),
            fontStyle, firstGlyphIndex, numGlyphs, pathParameterTemplate, emScale, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint32_t GlesSpy::glPathGlyphIndexRangeNV(uint32_t fontTarget, void* fontName,
                                                 uint32_t fontStyle, uint32_t pathParameterTemplate,
                                                 float emScale, uint32_t baseAndCount) {
    GAPID_INFO("glPathGlyphIndexRangeNV(%u, %p, %u, %" PRIu32 ", %f, %" PRIu32 ")\n", fontTarget,
               fontName, fontStyle, pathParameterTemplate, emScale, baseAndCount);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_344_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        result = mImports.glPathGlyphIndexRangeNV(fontTarget, fontName, fontStyle,
                                                  pathParameterTemplate, emScale, baseAndCount);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathGlyphIndexRangeNV coder(
            observations, fontTarget, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                                              reinterpret_cast<uintptr_t>(fontName), 0)),
            fontStyle, pathParameterTemplate, emScale, baseAndCount, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glPathGlyphRangeNV(uint32_t firstPathName, uint32_t fontTarget, void* fontName,
                                        uint32_t fontStyle, uint32_t firstGlyph, int32_t numGlyphs,
                                        uint32_t handleMissingGlyphs,
                                        uint32_t pathParameterTemplate, float emScale) {
    GAPID_INFO("glPathGlyphRangeNV(%" PRIu32 ", %u, %p, %u, %" PRIu32 ", %" PRId32 ", %u, %" PRIu32
               ", %f)\n",
               firstPathName, fontTarget, fontName, fontStyle, firstGlyph, numGlyphs,
               handleMissingGlyphs, pathParameterTemplate, emScale);

    Observations observations;
    do {
        uint32_t l_requiresExtension_345_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathGlyphRangeNV(firstPathName, fontTarget, fontName, fontStyle, firstGlyph,
                                    numGlyphs, handleMissingGlyphs, pathParameterTemplate, emScale);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathGlyphRangeNV coder(
            observations, firstPathName, fontTarget,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(fontName), 0)),
            fontStyle, firstGlyph, numGlyphs, handleMissingGlyphs, pathParameterTemplate, emScale);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathGlyphsNV(uint32_t firstPathName, uint32_t fontTarget, void* fontName,
                                    uint32_t fontStyle, int32_t numGlyphs, uint32_t type,
                                    void* charcodes, uint32_t handleMissingGlyphs,
                                    uint32_t pathParameterTemplate, float emScale) {
    GAPID_INFO("glPathGlyphsNV(%" PRIu32 ", %u, %p, %u, %" PRId32 ", %u, %p, %u, %" PRIu32
               ", %f)\n",
               firstPathName, fontTarget, fontName, fontStyle, numGlyphs, type, charcodes,
               handleMissingGlyphs, pathParameterTemplate, emScale);

    Observations observations;
    do {
        uint32_t l_requiresExtension_346_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathGlyphsNV(firstPathName, fontTarget, fontName, fontStyle, numGlyphs, type,
                                charcodes, handleMissingGlyphs, pathParameterTemplate, emScale);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathGlyphsNV coder(
            observations, firstPathName, fontTarget,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(fontName), 0)),
            fontStyle, numGlyphs, type, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                                                reinterpret_cast<uintptr_t>(charcodes), 0)),
            handleMissingGlyphs, pathParameterTemplate, emScale);
    mEncoder->Object(&coder);
}

inline uint32_t GlesSpy::glPathMemoryGlyphIndexArrayNV(uint32_t firstPathName, uint32_t fontTarget,
                                                       int32_t fontSize, void* fontData,
                                                       int32_t faceIndex, uint32_t firstGlyphIndex,
                                                       int32_t numGlyphs,
                                                       uint32_t pathParameterTemplate,
                                                       float emScale) {
    GAPID_INFO("glPathMemoryGlyphIndexArrayNV(%" PRIu32 ", %u, %" PRId32 ", %p, %" PRId32
               ", %" PRIu32 ", %" PRId32 ", %" PRIu32 ", %f)\n",
               firstPathName, fontTarget, fontSize, fontData, faceIndex, firstGlyphIndex, numGlyphs,
               pathParameterTemplate, emScale);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_347_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        result = mImports.glPathMemoryGlyphIndexArrayNV(firstPathName, fontTarget, fontSize,
                                                        fontData, faceIndex, firstGlyphIndex,
                                                        numGlyphs, pathParameterTemplate, emScale);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathMemoryGlyphIndexArrayNV coder(
            observations, firstPathName, fontTarget, fontSize,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(fontData), 0)),
            faceIndex, firstGlyphIndex, numGlyphs, pathParameterTemplate, emScale, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glPathParameterfNV(uint32_t path, uint32_t pname, float value) {
    GAPID_INFO("glPathParameterfNV(%" PRIu32 ", %u, %f)\n", path, pname, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_348_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathParameterfNV(path, pname, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathParameterfNV coder(observations, path, pname, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathParameterfvNV(uint32_t path, uint32_t pname, float* value) {
    GAPID_INFO("glPathParameterfvNV(%" PRIu32 ", %u, %p)\n", path, pname, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_349_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathParameterfvNV(path, pname, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathParameterfvNV coder(
            observations, path, pname,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathParameteriNV(uint32_t path, uint32_t pname, int32_t value) {
    GAPID_INFO("glPathParameteriNV(%" PRIu32 ", %u, %" PRId32 ")\n", path, pname, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_350_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathParameteriNV(path, pname, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathParameteriNV coder(observations, path, pname, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathParameterivNV(uint32_t path, uint32_t pname, int32_t* value) {
    GAPID_INFO("glPathParameterivNV(%" PRIu32 ", %u, %p)\n", path, pname, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_351_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathParameterivNV(path, pname, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathParameterivNV coder(
            observations, path, pname, gapic::coder::gles::GLint__CP(gapic::coder::memory::Pointer(
                                               reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathStencilDepthOffsetNV(float factor, float units) {
    GAPID_INFO("glPathStencilDepthOffsetNV(%f, %f)\n", factor, units);

    Observations observations;
    do {
        uint32_t l_requiresExtension_352_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathStencilDepthOffsetNV(factor, units);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathStencilDepthOffsetNV coder(observations, factor, units);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathStencilFuncNV(uint32_t func, int32_t ref, uint32_t mask) {
    GAPID_INFO("glPathStencilFuncNV(%u, %" PRId32 ", %" PRIu32 ")\n", func, ref, mask);

    Observations observations;
    do {
        uint32_t l_requiresExtension_353_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathStencilFuncNV(func, ref, mask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathStencilFuncNV coder(observations, func, ref, mask);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathStringNV(uint32_t path, uint32_t format, int32_t length,
                                    void* pathString) {
    GAPID_INFO("glPathStringNV(%" PRIu32 ", %u, %" PRId32 ", %p)\n", path, format, length,
               pathString);

    Observations observations;
    do {
        uint32_t l_requiresExtension_354_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathStringNV(path, format, length, pathString);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathStringNV coder(
            observations, path, format, length,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(pathString), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathSubCommandsNV(uint32_t path, int32_t commandStart,
                                         int32_t commandsToDelete, int32_t numCommands,
                                         uint8_t* commands, int32_t numCoords, uint32_t coordType,
                                         void* coords) {
    GAPID_INFO("glPathSubCommandsNV(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %p, %" PRId32 ", %u, %p)\n",
               path, commandStart, commandsToDelete, numCommands, commands, numCoords, coordType,
               coords);

    Observations observations;
    do {
        uint32_t l_requiresExtension_355_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathSubCommandsNV(path, commandStart, commandsToDelete, numCommands, commands,
                                     numCoords, coordType, coords);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathSubCommandsNV coder(
            observations, path, commandStart, commandsToDelete, numCommands,
            gapic::coder::gles::GLubyte__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(commands), 0)),
            numCoords, coordType, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                                          reinterpret_cast<uintptr_t>(coords), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPathSubCoordsNV(uint32_t path, int32_t coordStart, int32_t numCoords,
                                       uint32_t coordType, void* coords) {
    GAPID_INFO("glPathSubCoordsNV(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %u, %p)\n", path,
               coordStart, numCoords, coordType, coords);

    Observations observations;
    do {
        uint32_t l_requiresExtension_356_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glPathSubCoordsNV(path, coordStart, numCoords, coordType, coords);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPathSubCoordsNV coder(
            observations, path, coordStart, numCoords, coordType,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(coords), 0)));
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glPointAlongPathNV(uint32_t path, int32_t startSegment, int32_t numSegments,
                                           float distance, float* x, float* y, float* tangentX,
                                           float* tangentY) {
    GAPID_INFO("glPointAlongPathNV(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %f, %p, %p, %p, %p)\n",
               path, startSegment, numSegments, distance, x, y, tangentX, tangentY);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_357_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        result = mImports.glPointAlongPathNV(path, startSegment, numSegments, distance, x, y,
                                             tangentX, tangentY);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPointAlongPathNV coder(
            observations, path, startSegment, numSegments, distance,
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(x), 0)),
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(y), 0)),
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(tangentX), 0)),
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(tangentY), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glPolygonModeNV(uint32_t face, uint32_t mode) {
    GAPID_INFO("glPolygonModeNV(%u, %u)\n", face, mode);

    Observations observations;
    do {
        uint32_t l_requiresExtension_358_ext = ExtensionId::GL_NV_polygon_mode;
        observe(observations.mReads);
        mImports.glPolygonModeNV(face, mode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPolygonModeNV coder(observations, face, mode);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPopGroupMarkerEXT() {
    GAPID_INFO("glPopGroupMarkerEXT()\n");

    Observations observations;
    do {
        uint32_t l_requiresExtension_359_ext = ExtensionId::GL_EXT_debug_marker;
        observe(observations.mReads);
        mImports.glPopGroupMarkerEXT();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPopGroupMarkerEXT coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPrimitiveBoundingBoxOES(float minX, float minY, float minZ, float minW,
                                               float maxX, float maxY, float maxZ, float maxW) {
    GAPID_INFO("glPrimitiveBoundingBoxOES(%f, %f, %f, %f, %f, %f, %f, %f)\n", minX, minY, minZ,
               minW, maxX, maxY, maxZ, maxW);

    Observations observations;
    do {
        uint32_t l_requiresExtension_360_ext = ExtensionId::GL_OES_primitive_bounding_box;
        observe(observations.mReads);
        mImports.glPrimitiveBoundingBoxOES(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPrimitiveBoundingBoxOES coder(observations, minX, minY, minZ, minW, maxX,
                                                        maxY, maxZ, maxW);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramBinaryOES(uint32_t program, uint32_t binary_format, void* binary,
                                        int32_t binary_size) {
    GAPID_INFO("glProgramBinaryOES(%" PRIu32 ", %u, %p, %" PRId32 ")\n", program, binary_format,
               binary, binary_size);

    Observations observations;
    do {
        uint32_t l_requiresExtension_361_ext = ExtensionId::GL_OES_get_program_binary;
        observe(observations.mReads);
        mImports.glProgramBinaryOES(program, binary_format, binary, binary_size);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramBinaryOES coder(
            observations, program, binary_format,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(binary), 0)),
            binary_size);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramParameteriEXT(uint32_t program, uint32_t pname, int32_t value) {
    GAPID_INFO("glProgramParameteriEXT(%" PRIu32 ", %u, %" PRId32 ")\n", program, pname, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_362_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramParameteriEXT(program, pname, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramParameteriEXT coder(observations, program, pname, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramPathFragmentInputGenNV(uint32_t program, int32_t location,
                                                     uint32_t genMode, int32_t components,
                                                     float* coeffs) {
    GAPID_INFO("glProgramPathFragmentInputGenNV(%" PRIu32 ", %" PRId32 ", %u, %" PRId32 ", %p)\n",
               program, location, genMode, components, coeffs);

    Observations observations;
    do {
        uint32_t l_requiresExtension_363_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glProgramPathFragmentInputGenNV(program, location, genMode, components, coeffs);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramPathFragmentInputGenNV coder(
            observations, program, location, genMode, components,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(coeffs), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform1fEXT(uint32_t program, int32_t location, float v0) {
    GAPID_INFO("glProgramUniform1fEXT(%" PRIu32 ", %" PRId32 ", %f)\n", program, location, v0);

    Observations observations;
    do {
        uint32_t l_requiresExtension_364_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform1fEXT(program, location, v0);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform1fEXT coder(observations, program, location, v0);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform1fvEXT(uint32_t program, int32_t location, int32_t count,
                                            float* value) {
    GAPID_INFO("glProgramUniform1fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_365_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform1fvEXT(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform1fvEXT coder(
            observations, program, location, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform1iEXT(uint32_t program, int32_t location, int32_t v0) {
    GAPID_INFO("glProgramUniform1iEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ")\n", program, location,
               v0);

    Observations observations;
    do {
        uint32_t l_requiresExtension_366_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform1iEXT(program, location, v0);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform1iEXT coder(observations, program, location, v0);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform1ivEXT(uint32_t program, int32_t location, int32_t count,
                                            int32_t* value) {
    GAPID_INFO("glProgramUniform1ivEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_367_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform1ivEXT(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform1ivEXT coder(
            observations, program, location, count,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform1uiEXT(uint32_t program, int32_t location, uint32_t v0) {
    GAPID_INFO("glProgramUniform1uiEXT(%" PRIu32 ", %" PRId32 ", %" PRIu32 ")\n", program, location,
               v0);

    Observations observations;
    do {
        uint32_t l_requiresExtension_368_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform1uiEXT(program, location, v0);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform1uiEXT coder(observations, program, location, v0);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform1uivEXT(uint32_t program, int32_t location, int32_t count,
                                             uint32_t* value) {
    GAPID_INFO("glProgramUniform1uivEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_369_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform1uivEXT(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform1uivEXT coder(
            observations, program, location, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform2fEXT(uint32_t program, int32_t location, float v0, float v1) {
    GAPID_INFO("glProgramUniform2fEXT(%" PRIu32 ", %" PRId32 ", %f, %f)\n", program, location, v0,
               v1);

    Observations observations;
    do {
        uint32_t l_requiresExtension_370_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform2fEXT(program, location, v0, v1);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform2fEXT coder(observations, program, location, v0, v1);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform2fvEXT(uint32_t program, int32_t location, int32_t count,
                                            float* value) {
    GAPID_INFO("glProgramUniform2fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_371_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform2fvEXT(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform2fvEXT coder(
            observations, program, location, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform2iEXT(uint32_t program, int32_t location, int32_t v0,
                                           int32_t v1) {
    GAPID_INFO("glProgramUniform2iEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ")\n",
               program, location, v0, v1);

    Observations observations;
    do {
        uint32_t l_requiresExtension_372_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform2iEXT(program, location, v0, v1);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform2iEXT coder(observations, program, location, v0, v1);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform2ivEXT(uint32_t program, int32_t location, int32_t count,
                                            int32_t* value) {
    GAPID_INFO("glProgramUniform2ivEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_373_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform2ivEXT(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform2ivEXT coder(
            observations, program, location, count,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform2uiEXT(uint32_t program, int32_t location, uint32_t v0,
                                            uint32_t v1) {
    GAPID_INFO("glProgramUniform2uiEXT(%" PRIu32 ", %" PRId32 ", %" PRIu32 ", %" PRIu32 ")\n",
               program, location, v0, v1);

    Observations observations;
    do {
        uint32_t l_requiresExtension_374_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform2uiEXT(program, location, v0, v1);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform2uiEXT coder(observations, program, location, v0, v1);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform2uivEXT(uint32_t program, int32_t location, int32_t count,
                                             uint32_t* value) {
    GAPID_INFO("glProgramUniform2uivEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_375_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform2uivEXT(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform2uivEXT coder(
            observations, program, location, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform3fEXT(uint32_t program, int32_t location, float v0, float v1,
                                           float v2) {
    GAPID_INFO("glProgramUniform3fEXT(%" PRIu32 ", %" PRId32 ", %f, %f, %f)\n", program, location,
               v0, v1, v2);

    Observations observations;
    do {
        uint32_t l_requiresExtension_376_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform3fEXT(program, location, v0, v1, v2);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform3fEXT coder(observations, program, location, v0, v1, v2);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform3fvEXT(uint32_t program, int32_t location, int32_t count,
                                            float* value) {
    GAPID_INFO("glProgramUniform3fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_377_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform3fvEXT(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform3fvEXT coder(
            observations, program, location, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform3iEXT(uint32_t program, int32_t location, int32_t v0,
                                           int32_t v1, int32_t v2) {
    GAPID_INFO("glProgramUniform3iEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ")\n",
               program, location, v0, v1, v2);

    Observations observations;
    do {
        uint32_t l_requiresExtension_378_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform3iEXT(program, location, v0, v1, v2);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform3iEXT coder(observations, program, location, v0, v1, v2);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform3ivEXT(uint32_t program, int32_t location, int32_t count,
                                            int32_t* value) {
    GAPID_INFO("glProgramUniform3ivEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_379_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform3ivEXT(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform3ivEXT coder(
            observations, program, location, count,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform3uiEXT(uint32_t program, int32_t location, uint32_t v0,
                                            uint32_t v1, uint32_t v2) {
    GAPID_INFO("glProgramUniform3uiEXT(%" PRIu32 ", %" PRId32 ", %" PRIu32 ", %" PRIu32 ", %" PRIu32
               ")\n",
               program, location, v0, v1, v2);

    Observations observations;
    do {
        uint32_t l_requiresExtension_380_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform3uiEXT(program, location, v0, v1, v2);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform3uiEXT coder(observations, program, location, v0, v1, v2);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform3uivEXT(uint32_t program, int32_t location, int32_t count,
                                             uint32_t* value) {
    GAPID_INFO("glProgramUniform3uivEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_381_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform3uivEXT(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform3uivEXT coder(
            observations, program, location, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform4fEXT(uint32_t program, int32_t location, float v0, float v1,
                                           float v2, float v3) {
    GAPID_INFO("glProgramUniform4fEXT(%" PRIu32 ", %" PRId32 ", %f, %f, %f, %f)\n", program,
               location, v0, v1, v2, v3);

    Observations observations;
    do {
        uint32_t l_requiresExtension_382_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform4fEXT(program, location, v0, v1, v2, v3);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform4fEXT coder(observations, program, location, v0, v1, v2,
                                                    v3);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform4fvEXT(uint32_t program, int32_t location, int32_t count,
                                            float* value) {
    GAPID_INFO("glProgramUniform4fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_383_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform4fvEXT(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform4fvEXT coder(
            observations, program, location, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform4iEXT(uint32_t program, int32_t location, int32_t v0,
                                           int32_t v1, int32_t v2, int32_t v3) {
    GAPID_INFO("glProgramUniform4iEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ")\n",
               program, location, v0, v1, v2, v3);

    Observations observations;
    do {
        uint32_t l_requiresExtension_384_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform4iEXT(program, location, v0, v1, v2, v3);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform4iEXT coder(observations, program, location, v0, v1, v2,
                                                    v3);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform4ivEXT(uint32_t program, int32_t location, int32_t count,
                                            int32_t* value) {
    GAPID_INFO("glProgramUniform4ivEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_385_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform4ivEXT(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform4ivEXT coder(
            observations, program, location, count,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform4uiEXT(uint32_t program, int32_t location, uint32_t v0,
                                            uint32_t v1, uint32_t v2, uint32_t v3) {
    GAPID_INFO("glProgramUniform4uiEXT(%" PRIu32 ", %" PRId32 ", %" PRIu32 ", %" PRIu32 ", %" PRIu32
               ", %" PRIu32 ")\n",
               program, location, v0, v1, v2, v3);

    Observations observations;
    do {
        uint32_t l_requiresExtension_386_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform4uiEXT(program, location, v0, v1, v2, v3);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform4uiEXT coder(observations, program, location, v0, v1, v2,
                                                     v3);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform4uivEXT(uint32_t program, int32_t location, int32_t count,
                                             uint32_t* value) {
    GAPID_INFO("glProgramUniform4uivEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_387_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniform4uivEXT(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform4uivEXT coder(
            observations, program, location, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformHandleui64NV(uint32_t program, int32_t location,
                                                  uint64_t value) {
    GAPID_INFO("glProgramUniformHandleui64NV(%" PRIu32 ", %" PRId32 ", %" PRIu64 ")\n", program,
               location, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_388_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        mImports.glProgramUniformHandleui64NV(program, location, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformHandleui64NV coder(observations, program, location, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformHandleui64vNV(uint32_t program, int32_t location,
                                                   int32_t count, uint64_t* values) {
    GAPID_INFO("glProgramUniformHandleui64vNV(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n",
               program, location, count, values);

    Observations observations;
    do {
        uint32_t l_requiresExtension_389_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        mImports.glProgramUniformHandleui64vNV(program, location, count, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformHandleui64vNV coder(
            observations, program, location, count,
            gapic::coder::gles::GLuint64__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix2fvEXT(uint32_t program, int32_t location, int32_t count,
                                                  uint8_t transpose, float* value) {
    GAPID_INFO("glProgramUniformMatrix2fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_390_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix2fvEXT(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix2fvEXT coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix2x3fvEXT(uint32_t program, int32_t location,
                                                    int32_t count, uint8_t transpose,
                                                    float* value) {
    GAPID_INFO("glProgramUniformMatrix2x3fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_391_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix2x3fvEXT(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix2x3fvEXT coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix2x4fvEXT(uint32_t program, int32_t location,
                                                    int32_t count, uint8_t transpose,
                                                    float* value) {
    GAPID_INFO("glProgramUniformMatrix2x4fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_392_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix2x4fvEXT(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix2x4fvEXT coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix3fvEXT(uint32_t program, int32_t location, int32_t count,
                                                  uint8_t transpose, float* value) {
    GAPID_INFO("glProgramUniformMatrix3fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_393_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix3fvEXT(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix3fvEXT coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix3x2fvEXT(uint32_t program, int32_t location,
                                                    int32_t count, uint8_t transpose,
                                                    float* value) {
    GAPID_INFO("glProgramUniformMatrix3x2fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_394_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix3x2fvEXT(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix3x2fvEXT coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix3x4fvEXT(uint32_t program, int32_t location,
                                                    int32_t count, uint8_t transpose,
                                                    float* value) {
    GAPID_INFO("glProgramUniformMatrix3x4fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_395_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix3x4fvEXT(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix3x4fvEXT coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix4fvEXT(uint32_t program, int32_t location, int32_t count,
                                                  uint8_t transpose, float* value) {
    GAPID_INFO("glProgramUniformMatrix4fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_396_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix4fvEXT(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix4fvEXT coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix4x2fvEXT(uint32_t program, int32_t location,
                                                    int32_t count, uint8_t transpose,
                                                    float* value) {
    GAPID_INFO("glProgramUniformMatrix4x2fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_397_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix4x2fvEXT(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix4x2fvEXT coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix4x3fvEXT(uint32_t program, int32_t location,
                                                    int32_t count, uint8_t transpose,
                                                    float* value) {
    GAPID_INFO("glProgramUniformMatrix4x3fvEXT(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_398_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix4x3fvEXT(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix4x3fvEXT coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPushGroupMarkerEXT(int32_t length, char* marker) {
    GAPID_INFO("glPushGroupMarkerEXT(%" PRId32 ", %p)\n", length, marker);

    Observations observations;
    do {
        uint32_t l_requiresExtension_399_ext = ExtensionId::GL_EXT_debug_marker;
        if (length > (GLsizei)(0)) {
            read(slice(marker, (uint64_t)((GLsizei)(0)), (uint64_t)(length)));
        } else {
            string((char*)(marker));
        }
        observe(observations.mReads);
        mImports.glPushGroupMarkerEXT(length, marker);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPushGroupMarkerEXT coder(
            observations, length, gapic::coder::gles::GLchar__CP(gapic::coder::memory::Pointer(
                                          reinterpret_cast<uintptr_t>(marker), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glQueryCounterEXT(uint32_t query, uint32_t target) {
    GAPID_INFO("glQueryCounterEXT(%" PRIu32 ", %u)\n", query, target);

    Observations observations;
    do {
        uint32_t l_requiresExtension_400_ext = ExtensionId::GL_EXT_disjoint_timer_query;
        observe(observations.mReads);
        mImports.glQueryCounterEXT(query, target);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlQueryCounterEXT coder(observations, query, target);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glReadBufferIndexedEXT(uint32_t src, int32_t index) {
    GAPID_INFO("glReadBufferIndexedEXT(%u, %" PRId32 ")\n", src, index);

    Observations observations;
    do {
        uint32_t l_requiresExtension_401_ext = ExtensionId::GL_EXT_multiview_draw_buffers;
        observe(observations.mReads);
        mImports.glReadBufferIndexedEXT(src, index);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlReadBufferIndexedEXT coder(observations, src, index);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glReadBufferNV(uint32_t mode) {
    GAPID_INFO("glReadBufferNV(%u)\n", mode);

    Observations observations;
    do {
        uint32_t l_requiresExtension_402_ext = ExtensionId::GL_NV_read_buffer;
        observe(observations.mReads);
        mImports.glReadBufferNV(mode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlReadBufferNV coder(observations, mode);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glReadnPixelsEXT(int32_t x, int32_t y, int32_t width, int32_t height,
                                      uint32_t format, uint32_t type, int32_t bufSize, void* data) {
    GAPID_INFO("glReadnPixelsEXT(%" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %u, %u, %" PRId32 ", %p)\n",
               x, y, width, height, format, type, bufSize, data);

    Observations observations;
    do {
        uint32_t l_requiresExtension_403_ext = ExtensionId::GL_EXT_robustness;
        observe(observations.mReads);
        mImports.glReadnPixelsEXT(x, y, width, height, format, type, bufSize, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlReadnPixelsEXT coder(
            observations, x, y, width, height, format, type, bufSize,
            gapic::coder::gles::Void__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glReadnPixelsKHR(int32_t x, int32_t y, int32_t width, int32_t height,
                                      uint32_t format, uint32_t type, int32_t bufSize, void* data) {
    GAPID_INFO("glReadnPixelsKHR(%" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %u, %u, %" PRId32 ", %p)\n",
               x, y, width, height, format, type, bufSize, data);

    Observations observations;
    do {
        uint32_t l_requiresExtension_404_ext = ExtensionId::GL_KHR_robustness;
        observe(observations.mReads);
        mImports.glReadnPixelsKHR(x, y, width, height, format, type, bufSize, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlReadnPixelsKHR coder(
            observations, x, y, width, height, format, type, bufSize,
            gapic::coder::gles::Void__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glRenderbufferStorageMultisampleANGLE(uint32_t target, int32_t samples,
                                                           uint32_t internalformat, int32_t width,
                                                           int32_t height) {
    GAPID_INFO("glRenderbufferStorageMultisampleANGLE(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32
               ")\n",
               target, samples, internalformat, width, height);

    Observations observations;
    do {
        uint32_t l_requiresExtension_405_ext = ExtensionId::GL_ANGLE_framebuffer_multisample;
        observe(observations.mReads);
        mImports.glRenderbufferStorageMultisampleANGLE(target, samples, internalformat, width,
                                                       height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlRenderbufferStorageMultisampleANGLE coder(observations, target, samples,
                                                                    internalformat, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glRenderbufferStorageMultisampleAPPLE(uint32_t target, int32_t samples,
                                                           uint32_t internalformat, int32_t width,
                                                           int32_t height) {
    GAPID_INFO("glRenderbufferStorageMultisampleAPPLE(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32
               ")\n",
               target, samples, internalformat, width, height);

    Observations observations;
    do {
        uint32_t l_requiresExtension_406_ext = ExtensionId::GL_APPLE_framebuffer_multisample;
        observe(observations.mReads);
        mImports.glRenderbufferStorageMultisampleAPPLE(target, samples, internalformat, width,
                                                       height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlRenderbufferStorageMultisampleAPPLE coder(observations, target, samples,
                                                                    internalformat, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glRenderbufferStorageMultisampleEXT(uint32_t target, int32_t samples,
                                                         uint32_t internalformat, int32_t width,
                                                         int32_t height) {
    GAPID_INFO("glRenderbufferStorageMultisampleEXT(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32
               ")\n",
               target, samples, internalformat, width, height);

    Observations observations;
    do {
        uint32_t l_requiresExtension_407_ext = ExtensionId::GL_EXT_multisampled_render_to_texture;
        observe(observations.mReads);
        mImports.glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width,
                                                     height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlRenderbufferStorageMultisampleEXT coder(observations, target, samples,
                                                                  internalformat, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glRenderbufferStorageMultisampleIMG(uint32_t target, int32_t samples,
                                                         uint32_t internalformat, int32_t width,
                                                         int32_t height) {
    GAPID_INFO("glRenderbufferStorageMultisampleIMG(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32
               ")\n",
               target, samples, internalformat, width, height);

    Observations observations;
    do {
        uint32_t l_requiresExtension_408_ext = ExtensionId::GL_IMG_multisampled_render_to_texture;
        observe(observations.mReads);
        mImports.glRenderbufferStorageMultisampleIMG(target, samples, internalformat, width,
                                                     height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlRenderbufferStorageMultisampleIMG coder(observations, target, samples,
                                                                  internalformat, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glRenderbufferStorageMultisampleNV(uint32_t target, int32_t samples,
                                                        uint32_t internalformat, int32_t width,
                                                        int32_t height) {
    GAPID_INFO("glRenderbufferStorageMultisampleNV(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32
               ")\n",
               target, samples, internalformat, width, height);

    Observations observations;
    do {
        uint32_t l_requiresExtension_409_ext = ExtensionId::GL_NV_framebuffer_multisample;
        observe(observations.mReads);
        mImports.glRenderbufferStorageMultisampleNV(target, samples, internalformat, width, height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlRenderbufferStorageMultisampleNV coder(observations, target, samples,
                                                                 internalformat, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glResolveMultisampleFramebufferAPPLE() {
    GAPID_INFO("glResolveMultisampleFramebufferAPPLE()\n");

    Observations observations;
    do {
        uint32_t l_requiresExtension_410_ext = ExtensionId::GL_APPLE_framebuffer_multisample;
        observe(observations.mReads);
        mImports.glResolveMultisampleFramebufferAPPLE();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlResolveMultisampleFramebufferAPPLE coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSamplerParameterIivOES(uint32_t sampler, uint32_t pname, int32_t* param) {
    GAPID_INFO("glSamplerParameterIivOES(%" PRIu32 ", %u, %p)\n", sampler, pname, param);

    Observations observations;
    do {
        uint32_t l_requiresExtension_411_ext = ExtensionId::GL_OES_texture_border_clamp;
        observe(observations.mReads);
        mImports.glSamplerParameterIivOES(sampler, pname, param);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSamplerParameterIivOES coder(
            observations, sampler, pname,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(param), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSamplerParameterIuivOES(uint32_t sampler, uint32_t pname, uint32_t* param) {
    GAPID_INFO("glSamplerParameterIuivOES(%" PRIu32 ", %u, %p)\n", sampler, pname, param);

    Observations observations;
    do {
        uint32_t l_requiresExtension_412_ext = ExtensionId::GL_OES_texture_border_clamp;
        observe(observations.mReads);
        mImports.glSamplerParameterIuivOES(sampler, pname, param);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSamplerParameterIuivOES coder(
            observations, sampler, pname,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(param), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glScissorArrayvNV(uint32_t first, int32_t count, int32_t* v) {
    GAPID_INFO("glScissorArrayvNV(%" PRIu32 ", %" PRId32 ", %p)\n", first, count, v);

    Observations observations;
    do {
        uint32_t l_requiresExtension_413_ext = ExtensionId::GL_NV_viewport_array;
        observe(observations.mReads);
        mImports.glScissorArrayvNV(first, count, v);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlScissorArrayvNV coder(
            observations, first, count, gapic::coder::gles::GLint__CP(gapic::coder::memory::Pointer(
                                                reinterpret_cast<uintptr_t>(v), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glScissorIndexedNV(uint32_t index, int32_t left, int32_t bottom, int32_t width,
                                        int32_t height) {
    GAPID_INFO("glScissorIndexedNV(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ")\n",
               index, left, bottom, width, height);

    Observations observations;
    do {
        uint32_t l_requiresExtension_414_ext = ExtensionId::GL_NV_viewport_array;
        observe(observations.mReads);
        mImports.glScissorIndexedNV(index, left, bottom, width, height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlScissorIndexedNV coder(observations, index, left, bottom, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glScissorIndexedvNV(uint32_t index, int32_t* v) {
    GAPID_INFO("glScissorIndexedvNV(%" PRIu32 ", %p)\n", index, v);

    Observations observations;
    do {
        uint32_t l_requiresExtension_415_ext = ExtensionId::GL_NV_viewport_array;
        observe(observations.mReads);
        mImports.glScissorIndexedvNV(index, v);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlScissorIndexedvNV coder(
            observations, index, gapic::coder::gles::GLint__CP(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(v), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSelectPerfMonitorCountersAMD(uint32_t monitor, uint8_t enable,
                                                    uint32_t group, int32_t numCounters,
                                                    uint32_t* counterList) {
    GAPID_INFO("glSelectPerfMonitorCountersAMD(%" PRIu32 ", %" PRIu8 ", %" PRIu32 ", %" PRId32
               ", %p)\n",
               monitor, enable, group, numCounters, counterList);

    Observations observations;
    do {
        uint32_t l_requiresExtension_416_ext = ExtensionId::GL_AMD_performance_monitor;
        observe(observations.mReads);
        mImports.glSelectPerfMonitorCountersAMD(monitor, enable, group, numCounters, counterList);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSelectPerfMonitorCountersAMD coder(
            observations, monitor, enable, group, numCounters,
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(counterList), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSetFenceNV(uint32_t fence, uint32_t condition) {
    GAPID_INFO("glSetFenceNV(%" PRIu32 ", %u)\n", fence, condition);

    Observations observations;
    do {
        uint32_t l_requiresExtension_417_ext = ExtensionId::GL_NV_fence;
        observe(observations.mReads);
        mImports.glSetFenceNV(fence, condition);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSetFenceNV coder(observations, fence, condition);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStartTilingQCOM(uint32_t x, uint32_t y, uint32_t width, uint32_t height,
                                       uint32_t preserveMask) {
    GAPID_INFO("glStartTilingQCOM(%" PRIu32 ", %" PRIu32 ", %" PRIu32 ", %" PRIu32 ", %u)\n", x, y,
               width, height, preserveMask);

    Observations observations;
    do {
        uint32_t l_requiresExtension_418_ext = ExtensionId::GL_QCOM_tiled_rendering;
        observe(observations.mReads);
        mImports.glStartTilingQCOM(x, y, width, height, preserveMask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStartTilingQCOM coder(observations, x, y, width, height, preserveMask);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilFillPathInstancedNV(int32_t numPaths, uint32_t pathNameType,
                                                  void* paths, uint32_t pathBase, uint32_t fillMode,
                                                  uint32_t mask, uint32_t transformType,
                                                  float* transformValues) {
    GAPID_INFO("glStencilFillPathInstancedNV(%" PRId32 ", %u, %p, %" PRIu32 ", %u, %" PRIu32
               ", %u, %p)\n",
               numPaths, pathNameType, paths, pathBase, fillMode, mask, transformType,
               transformValues);

    Observations observations;
    do {
        uint32_t l_requiresExtension_419_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glStencilFillPathInstancedNV(numPaths, pathNameType, paths, pathBase, fillMode,
                                              mask, transformType, transformValues);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilFillPathInstancedNV coder(
            observations, numPaths, pathNameType,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(paths), 0)),
            pathBase, fillMode, mask, transformType,
            gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(transformValues), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilFillPathNV(uint32_t path, uint32_t fillMode, uint32_t mask) {
    GAPID_INFO("glStencilFillPathNV(%" PRIu32 ", %u, %" PRIu32 ")\n", path, fillMode, mask);

    Observations observations;
    do {
        uint32_t l_requiresExtension_420_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glStencilFillPathNV(path, fillMode, mask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilFillPathNV coder(observations, path, fillMode, mask);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilStrokePathInstancedNV(int32_t numPaths, uint32_t pathNameType,
                                                    void* paths, uint32_t pathBase,
                                                    int32_t reference, uint32_t mask,
                                                    uint32_t transformType,
                                                    float* transformValues) {
    GAPID_INFO("glStencilStrokePathInstancedNV(%" PRId32 ", %u, %p, %" PRIu32 ", %" PRId32
               ", %" PRIu32 ", %u, %p)\n",
               numPaths, pathNameType, paths, pathBase, reference, mask, transformType,
               transformValues);

    Observations observations;
    do {
        uint32_t l_requiresExtension_421_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glStencilStrokePathInstancedNV(numPaths, pathNameType, paths, pathBase, reference,
                                                mask, transformType, transformValues);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilStrokePathInstancedNV coder(
            observations, numPaths, pathNameType,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(paths), 0)),
            pathBase, reference, mask, transformType,
            gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(transformValues), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilStrokePathNV(uint32_t path, int32_t reference, uint32_t mask) {
    GAPID_INFO("glStencilStrokePathNV(%" PRIu32 ", %" PRId32 ", %" PRIu32 ")\n", path, reference,
               mask);

    Observations observations;
    do {
        uint32_t l_requiresExtension_422_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glStencilStrokePathNV(path, reference, mask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilStrokePathNV coder(observations, path, reference, mask);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilThenCoverFillPathInstancedNV(
        int32_t numPaths, uint32_t pathNameType, void* paths, uint32_t pathBase, uint32_t fillMode,
        uint32_t mask, uint32_t coverMode, uint32_t transformType, float* transformValues) {
    GAPID_INFO("glStencilThenCoverFillPathInstancedNV(%" PRId32 ", %u, %p, %" PRIu32
               ", %u, %" PRIu32 ", %u, %u, %p)\n",
               numPaths, pathNameType, paths, pathBase, fillMode, mask, coverMode, transformType,
               transformValues);

    Observations observations;
    do {
        uint32_t l_requiresExtension_423_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glStencilThenCoverFillPathInstancedNV(numPaths, pathNameType, paths, pathBase,
                                                       fillMode, mask, coverMode, transformType,
                                                       transformValues);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilThenCoverFillPathInstancedNV coder(
            observations, numPaths, pathNameType,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(paths), 0)),
            pathBase, fillMode, mask, coverMode, transformType,
            gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(transformValues), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilThenCoverFillPathNV(uint32_t path, uint32_t fillMode, uint32_t mask,
                                                  uint32_t coverMode) {
    GAPID_INFO("glStencilThenCoverFillPathNV(%" PRIu32 ", %u, %" PRIu32 ", %u)\n", path, fillMode,
               mask, coverMode);

    Observations observations;
    do {
        uint32_t l_requiresExtension_424_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glStencilThenCoverFillPathNV(path, fillMode, mask, coverMode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilThenCoverFillPathNV coder(observations, path, fillMode, mask,
                                                           coverMode);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilThenCoverStrokePathInstancedNV(
        int32_t numPaths, uint32_t pathNameType, void* paths, uint32_t pathBase, int32_t reference,
        uint32_t mask, uint32_t coverMode, uint32_t transformType, float* transformValues) {
    GAPID_INFO("glStencilThenCoverStrokePathInstancedNV(%" PRId32 ", %u, %p, %" PRIu32 ", %" PRId32
               ", %" PRIu32 ", %u, %u, %p)\n",
               numPaths, pathNameType, paths, pathBase, reference, mask, coverMode, transformType,
               transformValues);

    Observations observations;
    do {
        uint32_t l_requiresExtension_425_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glStencilThenCoverStrokePathInstancedNV(numPaths, pathNameType, paths, pathBase,
                                                         reference, mask, coverMode, transformType,
                                                         transformValues);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilThenCoverStrokePathInstancedNV coder(
            observations, numPaths, pathNameType,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(paths), 0)),
            pathBase, reference, mask, coverMode, transformType,
            gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(transformValues), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilThenCoverStrokePathNV(uint32_t path, int32_t reference, uint32_t mask,
                                                    uint32_t coverMode) {
    GAPID_INFO("glStencilThenCoverStrokePathNV(%" PRIu32 ", %" PRId32 ", %" PRIu32 ", %u)\n", path,
               reference, mask, coverMode);

    Observations observations;
    do {
        uint32_t l_requiresExtension_426_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glStencilThenCoverStrokePathNV(path, reference, mask, coverMode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilThenCoverStrokePathNV coder(observations, path, reference, mask,
                                                             coverMode);
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glTestFenceNV(uint32_t fence) {
    GAPID_INFO("glTestFenceNV(%" PRIu32 ")\n", fence);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_427_ext = ExtensionId::GL_NV_fence;
        observe(observations.mReads);
        result = mImports.glTestFenceNV(fence);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTestFenceNV coder(observations, fence, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glTexBufferOES(uint32_t target, uint32_t internalformat, uint32_t buffer) {
    GAPID_INFO("glTexBufferOES(%u, %u, %" PRIu32 ")\n", target, internalformat, buffer);

    Observations observations;
    do {
        uint32_t l_requiresExtension_428_ext = ExtensionId::GL_OES_texture_buffer;
        observe(observations.mReads);
        mImports.glTexBufferOES(target, internalformat, buffer);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexBufferOES coder(observations, target, internalformat, buffer);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexBufferRangeOES(uint32_t target, uint32_t internalformat, uint32_t buffer,
                                         int32_t offset, int32_t size) {
    GAPID_INFO("glTexBufferRangeOES(%u, %u, %" PRIu32 ", %" PRId32 ", %" PRId32 ")\n", target,
               internalformat, buffer, offset, size);

    Observations observations;
    do {
        uint32_t l_requiresExtension_429_ext = ExtensionId::GL_OES_texture_buffer;
        observe(observations.mReads);
        mImports.glTexBufferRangeOES(target, internalformat, buffer, offset, size);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexBufferRangeOES coder(observations, target, internalformat, buffer,
                                                  offset, size);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexImage3DOES(uint32_t target, int32_t level, uint32_t internalformat,
                                     int32_t width, int32_t height, int32_t depth, int32_t border,
                                     uint32_t format, uint32_t type, void* pixels) {
    GAPID_INFO("glTexImage3DOES(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %u, %u, %p)\n",
               target, level, internalformat, width, height, depth, border, format, type, pixels);

    Observations observations;
    do {
        uint32_t l_requiresExtension_430_ext = ExtensionId::GL_OES_texture_3D;
        observe(observations.mReads);
        mImports.glTexImage3DOES(target, level, internalformat, width, height, depth, border,
                                 format, type, pixels);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexImage3DOES coder(
            observations, target, level, internalformat, width, height, depth, border, format, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(pixels), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexPageCommitmentARB(uint32_t target, int32_t level, int32_t xoffset,
                                            int32_t yoffset, int32_t zoffset, int32_t width,
                                            int32_t height, int32_t depth, uint8_t commit) {
    GAPID_INFO("glTexPageCommitmentARB(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRIu8 ")\n",
               target, level, xoffset, yoffset, zoffset, width, height, depth, commit);

    Observations observations;
    do {
        uint32_t l_requiresExtension_431_ext = ExtensionId::GL_EXT_sparse_texture;
        observe(observations.mReads);
        mImports.glTexPageCommitmentARB(target, level, xoffset, yoffset, zoffset, width, height,
                                        depth, commit);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexPageCommitmentARB coder(observations, target, level, xoffset, yoffset,
                                                     zoffset, width, height, depth, commit);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexParameterIivOES(uint32_t target, uint32_t pname, int32_t* params) {
    GAPID_INFO("glTexParameterIivOES(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_432_ext = ExtensionId::GL_OES_texture_border_clamp;
        observe(observations.mReads);
        mImports.glTexParameterIivOES(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexParameterIivOES coder(
            observations, target, pname,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexParameterIuivOES(uint32_t target, uint32_t pname, uint32_t* params) {
    GAPID_INFO("glTexParameterIuivOES(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_requiresExtension_433_ext = ExtensionId::GL_OES_texture_border_clamp;
        observe(observations.mReads);
        mImports.glTexParameterIuivOES(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexParameterIuivOES coder(
            observations, target, pname,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexStorage1DEXT(uint32_t target, int32_t levels, uint32_t format,
                                       int32_t width) {
    GAPID_INFO("glTexStorage1DEXT(%u, %" PRId32 ", %u, %" PRId32 ")\n", target, levels, format,
               width);

    Observations observations;
    do {
        uint32_t l_requiresExtension_434_ext = ExtensionId::GL_EXT_texture_storage;
        observe(observations.mReads);
        mImports.glTexStorage1DEXT(target, levels, format, width);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexStorage1DEXT coder(observations, target, levels, format, width);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexStorage2DEXT(uint32_t target, int32_t levels, uint32_t format,
                                       int32_t width, int32_t height) {
    GAPID_INFO("glTexStorage2DEXT(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32 ")\n", target, levels,
               format, width, height);

    Observations observations;
    do {
        uint32_t l_requiresExtension_435_ext = ExtensionId::GL_EXT_texture_storage;
        observe(observations.mReads);
        mImports.glTexStorage2DEXT(target, levels, format, width, height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexStorage2DEXT coder(observations, target, levels, format, width,
                                                height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexStorage3DEXT(uint32_t target, int32_t levels, uint32_t format,
                                       int32_t width, int32_t height, int32_t depth) {
    GAPID_INFO("glTexStorage3DEXT(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32 ", %" PRId32 ")\n",
               target, levels, format, width, height, depth);

    Observations observations;
    do {
        uint32_t l_requiresExtension_436_ext = ExtensionId::GL_EXT_texture_storage;
        observe(observations.mReads);
        mImports.glTexStorage3DEXT(target, levels, format, width, height, depth);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexStorage3DEXT coder(observations, target, levels, format, width, height,
                                                depth);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexSubImage3DOES(uint32_t target, int32_t level, int32_t xoffset,
                                        int32_t yoffset, int32_t zoffset, int32_t width,
                                        int32_t height, int32_t depth, uint32_t format,
                                        uint32_t type, void* pixels) {
    GAPID_INFO("glTexSubImage3DOES(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %u, %u, %p)\n",
               target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
               pixels);

    Observations observations;
    do {
        uint32_t l_requiresExtension_437_ext = ExtensionId::GL_OES_texture_3D;
        observe(observations.mReads);
        mImports.glTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth,
                                    format, type, pixels);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexSubImage3DOES coder(
            observations, target, level, xoffset, yoffset, zoffset, width, height, depth, format,
            type, gapic::coder::gles::Void__CP(
                          gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(pixels), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTextureStorage1DEXT(uint32_t texture, uint32_t target, int32_t levels,
                                           uint32_t format, int32_t width) {
    GAPID_INFO("glTextureStorage1DEXT(%" PRIu32 ", %u, %" PRId32 ", %u, %" PRId32 ")\n", texture,
               target, levels, format, width);

    Observations observations;
    do {
        uint32_t l_requiresExtension_438_ext = ExtensionId::GL_EXT_texture_storage;
        observe(observations.mReads);
        mImports.glTextureStorage1DEXT(texture, target, levels, format, width);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTextureStorage1DEXT coder(observations, texture, target, levels, format,
                                                    width);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTextureStorage2DEXT(uint32_t texture, uint32_t target, int32_t levels,
                                           uint32_t format, int32_t width, int32_t height) {
    GAPID_INFO("glTextureStorage2DEXT(%" PRIu32 ", %u, %" PRId32 ", %u, %" PRId32 ", %" PRId32
               ")\n",
               texture, target, levels, format, width, height);

    Observations observations;
    do {
        uint32_t l_requiresExtension_439_ext = ExtensionId::GL_EXT_texture_storage;
        observe(observations.mReads);
        mImports.glTextureStorage2DEXT(texture, target, levels, format, width, height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTextureStorage2DEXT coder(observations, texture, target, levels, format,
                                                    width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTextureStorage3DEXT(uint32_t texture, uint32_t target, int32_t levels,
                                           uint32_t format, int32_t width, int32_t height,
                                           int32_t depth) {
    GAPID_INFO("glTextureStorage3DEXT(%" PRIu32 ", %u, %" PRId32 ", %u, %" PRId32 ", %" PRId32
               ", %" PRId32 ")\n",
               texture, target, levels, format, width, height, depth);

    Observations observations;
    do {
        uint32_t l_requiresExtension_440_ext = ExtensionId::GL_EXT_texture_storage;
        observe(observations.mReads);
        mImports.glTextureStorage3DEXT(texture, target, levels, format, width, height, depth);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTextureStorage3DEXT coder(observations, texture, target, levels, format,
                                                    width, height, depth);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTextureViewEXT(uint32_t texture, uint32_t target, uint32_t origtexture,
                                      uint32_t internalformat, uint32_t minlevel,
                                      uint32_t numlevels, uint32_t minlayer, uint32_t numlayers) {
    GAPID_INFO("glTextureViewEXT(%" PRIu32 ", %u, %" PRIu32 ", %u, %" PRIu32 ", %" PRIu32
               ", %" PRIu32 ", %" PRIu32 ")\n",
               texture, target, origtexture, internalformat, minlevel, numlevels, minlayer,
               numlayers);

    Observations observations;
    do {
        uint32_t l_requiresExtension_441_ext = ExtensionId::GL_EXT_texture_view;
        observe(observations.mReads);
        mImports.glTextureViewEXT(texture, target, origtexture, internalformat, minlevel, numlevels,
                                  minlayer, numlayers);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTextureViewEXT coder(observations, texture, target, origtexture,
                                               internalformat, minlevel, numlevels, minlayer,
                                               numlayers);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTextureViewOES(uint32_t texture, uint32_t target, uint32_t origtexture,
                                      uint32_t internalformat, uint32_t minlevel,
                                      uint32_t numlevels, uint32_t minlayer, uint32_t numlayers) {
    GAPID_INFO("glTextureViewOES(%" PRIu32 ", %u, %" PRIu32 ", %u, %" PRIu32 ", %" PRIu32
               ", %" PRIu32 ", %" PRIu32 ")\n",
               texture, target, origtexture, internalformat, minlevel, numlevels, minlayer,
               numlayers);

    Observations observations;
    do {
        uint32_t l_requiresExtension_442_ext = ExtensionId::GL_OES_texture_view;
        observe(observations.mReads);
        mImports.glTextureViewOES(texture, target, origtexture, internalformat, minlevel, numlevels,
                                  minlayer, numlayers);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTextureViewOES coder(observations, texture, target, origtexture,
                                               internalformat, minlevel, numlevels, minlayer,
                                               numlayers);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTransformPathNV(uint32_t resultPath, uint32_t srcPath,
                                       uint32_t transformType, float* transformValues) {
    GAPID_INFO("glTransformPathNV(%" PRIu32 ", %" PRIu32 ", %u, %p)\n", resultPath, srcPath,
               transformType, transformValues);

    Observations observations;
    do {
        uint32_t l_requiresExtension_443_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glTransformPathNV(resultPath, srcPath, transformType, transformValues);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTransformPathNV coder(
            observations, resultPath, srcPath, transformType,
            gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(transformValues), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformHandleui64NV(int32_t location, uint64_t value) {
    GAPID_INFO("glUniformHandleui64NV(%" PRId32 ", %" PRIu64 ")\n", location, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_444_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        mImports.glUniformHandleui64NV(location, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformHandleui64NV coder(observations, location, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformHandleui64vNV(int32_t location, int32_t count, uint64_t* value) {
    GAPID_INFO("glUniformHandleui64vNV(%" PRId32 ", %" PRId32 ", %p)\n", location, count, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_445_ext = ExtensionId::GL_NV_bindless_texture;
        observe(observations.mReads);
        mImports.glUniformHandleui64vNV(location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformHandleui64vNV coder(
            observations, location, count,
            gapic::coder::gles::GLuint64__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix2x3fvNV(int32_t location, int32_t count, uint8_t transpose,
                                            float* value) {
    GAPID_INFO("glUniformMatrix2x3fvNV(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location,
               count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_446_ext = ExtensionId::GL_NV_non_square_matrices;
        observe(observations.mReads);
        mImports.glUniformMatrix2x3fvNV(location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix2x3fvNV coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix2x4fvNV(int32_t location, int32_t count, uint8_t transpose,
                                            float* value) {
    GAPID_INFO("glUniformMatrix2x4fvNV(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location,
               count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_447_ext = ExtensionId::GL_NV_non_square_matrices;
        observe(observations.mReads);
        mImports.glUniformMatrix2x4fvNV(location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix2x4fvNV coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix3x2fvNV(int32_t location, int32_t count, uint8_t transpose,
                                            float* value) {
    GAPID_INFO("glUniformMatrix3x2fvNV(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location,
               count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_448_ext = ExtensionId::GL_NV_non_square_matrices;
        observe(observations.mReads);
        mImports.glUniformMatrix3x2fvNV(location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix3x2fvNV coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix3x4fvNV(int32_t location, int32_t count, uint8_t transpose,
                                            float* value) {
    GAPID_INFO("glUniformMatrix3x4fvNV(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location,
               count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_449_ext = ExtensionId::GL_NV_non_square_matrices;
        observe(observations.mReads);
        mImports.glUniformMatrix3x4fvNV(location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix3x4fvNV coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix4x2fvNV(int32_t location, int32_t count, uint8_t transpose,
                                            float* value) {
    GAPID_INFO("glUniformMatrix4x2fvNV(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location,
               count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_450_ext = ExtensionId::GL_NV_non_square_matrices;
        observe(observations.mReads);
        mImports.glUniformMatrix4x2fvNV(location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix4x2fvNV coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix4x3fvNV(int32_t location, int32_t count, uint8_t transpose,
                                            float* value) {
    GAPID_INFO("glUniformMatrix4x3fvNV(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location,
               count, transpose, value);

    Observations observations;
    do {
        uint32_t l_requiresExtension_451_ext = ExtensionId::GL_NV_non_square_matrices;
        observe(observations.mReads);
        mImports.glUniformMatrix4x3fvNV(location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix4x3fvNV coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glUnmapBufferOES(uint32_t target) {
    GAPID_INFO("glUnmapBufferOES(%u)\n", target);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_requiresExtension_452_ext = ExtensionId::GL_OES_mapbuffer;
        observe(observations.mReads);
        result = mImports.glUnmapBufferOES(target);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUnmapBufferOES coder(observations, target, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glUseProgramStagesEXT(uint32_t pipeline, uint32_t stages, uint32_t program) {
    GAPID_INFO("glUseProgramStagesEXT(%" PRIu32 ", %u, %" PRIu32 ")\n", pipeline, stages, program);

    Observations observations;
    do {
        uint32_t l_requiresExtension_453_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glUseProgramStagesEXT(pipeline, stages, program);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUseProgramStagesEXT coder(observations, pipeline, stages, program);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glValidateProgramPipelineEXT(uint32_t pipeline) {
    GAPID_INFO("glValidateProgramPipelineEXT(%" PRIu32 ")\n", pipeline);

    Observations observations;
    do {
        uint32_t l_requiresExtension_454_ext = ExtensionId::GL_EXT_separate_shader_objects;
        observe(observations.mReads);
        mImports.glValidateProgramPipelineEXT(pipeline);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlValidateProgramPipelineEXT coder(observations, pipeline);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribDivisorANGLE(uint32_t index, uint32_t divisor) {
    GAPID_INFO("glVertexAttribDivisorANGLE(%" PRIu32 ", %" PRIu32 ")\n", index, divisor);

    Observations observations;
    do {
        uint32_t l_requiresExtension_455_ext = ExtensionId::GL_ANGLE_instanced_arrays;
        observe(observations.mReads);
        mImports.glVertexAttribDivisorANGLE(index, divisor);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribDivisorANGLE coder(observations, index, divisor);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribDivisorEXT(uint32_t index, uint32_t divisor) {
    GAPID_INFO("glVertexAttribDivisorEXT(%" PRIu32 ", %" PRIu32 ")\n", index, divisor);

    Observations observations;
    do {
        uint32_t l_requiresExtension_456_ext = ExtensionId::GL_EXT_instanced_arrays;
        observe(observations.mReads);
        mImports.glVertexAttribDivisorEXT(index, divisor);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribDivisorEXT coder(observations, index, divisor);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribDivisorNV(uint32_t index, uint32_t divisor) {
    GAPID_INFO("glVertexAttribDivisorNV(%" PRIu32 ", %" PRIu32 ")\n", index, divisor);

    Observations observations;
    do {
        uint32_t l_requiresExtension_457_ext = ExtensionId::GL_NV_instanced_arrays;
        observe(observations.mReads);
        mImports.glVertexAttribDivisorNV(index, divisor);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribDivisorNV coder(observations, index, divisor);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glViewportArrayvNV(uint32_t first, int32_t count, float* v) {
    GAPID_INFO("glViewportArrayvNV(%" PRIu32 ", %" PRId32 ", %p)\n", first, count, v);

    Observations observations;
    do {
        uint32_t l_requiresExtension_458_ext = ExtensionId::GL_NV_viewport_array;
        observe(observations.mReads);
        mImports.glViewportArrayvNV(first, count, v);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlViewportArrayvNV coder(
            observations, first, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(v), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glViewportIndexedfNV(uint32_t index, float x, float y, float w, float h) {
    GAPID_INFO("glViewportIndexedfNV(%" PRIu32 ", %f, %f, %f, %f)\n", index, x, y, w, h);

    Observations observations;
    do {
        uint32_t l_requiresExtension_459_ext = ExtensionId::GL_NV_viewport_array;
        observe(observations.mReads);
        mImports.glViewportIndexedfNV(index, x, y, w, h);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlViewportIndexedfNV coder(observations, index, x, y, w, h);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glViewportIndexedfvNV(uint32_t index, float* v) {
    GAPID_INFO("glViewportIndexedfvNV(%" PRIu32 ", %p)\n", index, v);

    Observations observations;
    do {
        uint32_t l_requiresExtension_460_ext = ExtensionId::GL_NV_viewport_array;
        observe(observations.mReads);
        mImports.glViewportIndexedfvNV(index, v);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlViewportIndexedfvNV coder(
            observations, index, gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(v), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glWaitSyncAPPLE(uint64_t sync, uint32_t flag, uint64_t timeout) {
    GAPID_INFO("glWaitSyncAPPLE(%" PRIu64 ", %u, %" PRIu64 ")\n", sync, flag, timeout);

    Observations observations;
    do {
        uint32_t l_requiresExtension_461_ext = ExtensionId::GL_APPLE_sync;
        observe(observations.mReads);
        mImports.glWaitSyncAPPLE(sync, flag, timeout);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlWaitSyncAPPLE coder(observations, sync, flag, timeout);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glWeightPathsNV(uint32_t resultPath, int32_t numPaths, uint32_t* paths,
                                     float* weights) {
    GAPID_INFO("glWeightPathsNV(%" PRIu32 ", %" PRId32 ", %p, %p)\n", resultPath, numPaths, paths,
               weights);

    Observations observations;
    do {
        uint32_t l_requiresExtension_462_ext = ExtensionId::GL_NV_path_rendering;
        observe(observations.mReads);
        mImports.glWeightPathsNV(resultPath, numPaths, paths, weights);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlWeightPathsNV coder(
            observations, resultPath, numPaths,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(paths), 0)),
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(weights), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCoverageModulationNV(uint32_t components) {
    GAPID_INFO("glCoverageModulationNV(%u)\n", components);

    Observations observations;
    do {
        uint32_t l_requiresExtension_463_ext = ExtensionId::GL_NV_framebuffer_mixed_samples;
        observe(observations.mReads);
        mImports.glCoverageModulationNV(components);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCoverageModulationNV coder(observations, components);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCoverageModulationTableNV(int32_t n, float* v) {
    GAPID_INFO("glCoverageModulationTableNV(%" PRId32 ", %p)\n", n, v);

    Observations observations;
    do {
        uint32_t l_requiresExtension_464_ext = ExtensionId::GL_NV_framebuffer_mixed_samples;
        observe(observations.mReads);
        mImports.glCoverageModulationTableNV(n, v);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCoverageModulationTableNV coder(
            observations, n, gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(v), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFragmentCoverageColorNV(uint32_t color) {
    GAPID_INFO("glFragmentCoverageColorNV(%" PRIu32 ")\n", color);

    Observations observations;
    do {
        uint32_t l_requiresExtension_465_ext = ExtensionId::GL_NV_fragment_coverage_to_color;
        observe(observations.mReads);
        mImports.glFragmentCoverageColorNV(color);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFragmentCoverageColorNV coder(observations, color);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFramebufferSampleLocationsfvNV(uint32_t target, uint32_t start,
                                                      int32_t count, float* v) {
    GAPID_INFO("glFramebufferSampleLocationsfvNV(%u, %" PRIu32 ", %" PRId32 ", %p)\n", target,
               start, count, v);

    Observations observations;
    do {
        uint32_t l_requiresExtension_466_ext = ExtensionId::GL_NV_sample_locations;
        observe(observations.mReads);
        mImports.glFramebufferSampleLocationsfvNV(target, start, count, v);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFramebufferSampleLocationsfvNV coder(
            observations, target, start, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(v), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetCoverageModulationTableNV(int32_t bufsize, float* v) {
    GAPID_INFO("glGetCoverageModulationTableNV(%" PRId32 ", %p)\n", bufsize, v);

    Observations observations;
    do {
        uint32_t l_requiresExtension_467_ext = ExtensionId::GL_NV_framebuffer_mixed_samples;
        observe(observations.mReads);
        mImports.glGetCoverageModulationTableNV(bufsize, v);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetCoverageModulationTableNV coder(
            observations, bufsize, gapic::coder::gles::GLfloat__P(gapic::coder::memory::Pointer(
                                           reinterpret_cast<uintptr_t>(v), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glNamedFramebufferSampleLocationsfvNV(uint32_t framebuffer, uint32_t start,
                                                           int32_t count, float* v) {
    GAPID_INFO("glNamedFramebufferSampleLocationsfvNV(%" PRIu32 ", %" PRIu32 ", %" PRId32 ", %p)\n",
               framebuffer, start, count, v);

    Observations observations;
    do {
        uint32_t l_requiresExtension_468_ext = ExtensionId::GL_NV_sample_locations;
        observe(observations.mReads);
        mImports.glNamedFramebufferSampleLocationsfvNV(framebuffer, start, count, v);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlNamedFramebufferSampleLocationsfvNV coder(
            observations, framebuffer, start, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(v), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glRasterSamplesEXT(uint32_t samples, uint8_t fixedsamplelocations) {
    GAPID_INFO("glRasterSamplesEXT(%" PRIu32 ", %" PRIu8 ")\n", samples, fixedsamplelocations);

    Observations observations;
    do {
        uint32_t l_requiresExtension_469_ext = ExtensionId::GL_EXT_raster_multisample;
        uint32_t l_requiresExtension_470_ext = ExtensionId::GL_EXT_texture_filter_minmax;
        uint32_t l_requiresExtension_471_ext = ExtensionId::GL_NV_framebuffer_mixed_samples;
        observe(observations.mReads);
        mImports.glRasterSamplesEXT(samples, fixedsamplelocations);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlRasterSamplesEXT coder(observations, samples, fixedsamplelocations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glResolveDepthValuesNV() {
    GAPID_INFO("glResolveDepthValuesNV()\n");

    Observations observations;
    do {
        uint32_t l_requiresExtension_472_ext = ExtensionId::GL_NV_sample_locations;
        observe(observations.mReads);
        mImports.glResolveDepthValuesNV();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlResolveDepthValuesNV coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSubpixelPrecisionBiasNV(uint32_t xbits, uint32_t ybits) {
    GAPID_INFO("glSubpixelPrecisionBiasNV(%" PRIu32 ", %" PRIu32 ")\n", xbits, ybits);

    Observations observations;
    do {
        uint32_t l_requiresExtension_473_ext = ExtensionId::GL_NV_conservative_raster;
        observe(observations.mReads);
        mImports.glSubpixelPrecisionBiasNV(xbits, ybits);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSubpixelPrecisionBiasNV coder(observations, xbits, ybits);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendColor(float red, float green, float blue, float alpha) {
    GAPID_INFO("glBlendColor(%f, %f, %f, %f)\n", red, green, blue, alpha);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_474_major = 2;
        uint32_t l_minRequiredVersion_474_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_475_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_475_result;
        l_ctx->mBlending.mBlendColor =
                Color().SetRed(red).SetGreen(green).SetBlue(blue).SetAlpha(alpha);
        observe(observations.mReads);
        mImports.glBlendColor(red, green, blue, alpha);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendColor coder(observations, red, green, blue, alpha);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendEquation(uint32_t equation) {
    GAPID_INFO("glBlendEquation(%u)\n", equation);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_476_major = 2;
        uint32_t l_minRequiredVersion_476_minor = 0;
        switch (equation) {
            case GLenum::GL_FUNC_ADD:               // fall-through...
            case GLenum::GL_FUNC_REVERSE_SUBTRACT:  // fall-through...
            case GLenum::GL_FUNC_SUBTRACT: {
                break;
            }
            case GLenum::GL_MAX:  // fall-through...
            case GLenum::GL_MIN: {
                uint32_t l_minRequiredVersion_477_major = 3;
                uint32_t l_minRequiredVersion_477_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_479_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_479_result;
        l_ctx->mBlending.mBlendEquationRgb = equation;
        l_ctx->mBlending.mBlendEquationAlpha = equation;
        observe(observations.mReads);
        mImports.glBlendEquation(equation);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendEquation coder(observations, equation);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendEquationSeparate(uint32_t rgb, uint32_t alpha) {
    GAPID_INFO("glBlendEquationSeparate(%u, %u)\n", rgb, alpha);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_480_major = 2;
        uint32_t l_minRequiredVersion_480_minor = 0;
        switch (rgb) {
            case GLenum::GL_FUNC_ADD:               // fall-through...
            case GLenum::GL_FUNC_REVERSE_SUBTRACT:  // fall-through...
            case GLenum::GL_FUNC_SUBTRACT: {
                break;
            }
            case GLenum::GL_MAX:  // fall-through...
            case GLenum::GL_MIN: {
                uint32_t l_minRequiredVersion_481_major = 3;
                uint32_t l_minRequiredVersion_481_minor = 0;
                break;
            }
        }
        switch (alpha) {
            case GLenum::GL_FUNC_ADD:               // fall-through...
            case GLenum::GL_FUNC_REVERSE_SUBTRACT:  // fall-through...
            case GLenum::GL_FUNC_SUBTRACT: {
                break;
            }
            case GLenum::GL_MAX:  // fall-through...
            case GLenum::GL_MIN: {
                uint32_t l_minRequiredVersion_483_major = 3;
                uint32_t l_minRequiredVersion_483_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_485_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_485_result;
        l_ctx->mBlending.mBlendEquationRgb = rgb;
        l_ctx->mBlending.mBlendEquationAlpha = alpha;
        observe(observations.mReads);
        mImports.glBlendEquationSeparate(rgb, alpha);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendEquationSeparate coder(observations, rgb, alpha);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendFunc(uint32_t src_factor, uint32_t dst_factor) {
    GAPID_INFO("glBlendFunc(%u, %u)\n", src_factor, dst_factor);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_486_major = 2;
        uint32_t l_minRequiredVersion_486_minor = 0;
        switch (src_factor) {
            case GLenum::GL_CONSTANT_ALPHA:            // fall-through...
            case GLenum::GL_CONSTANT_COLOR:            // fall-through...
            case GLenum::GL_DST_ALPHA:                 // fall-through...
            case GLenum::GL_DST_COLOR:                 // fall-through...
            case GLenum::GL_ONE:                       // fall-through...
            case GLenum::GL_ONE_MINUS_CONSTANT_ALPHA:  // fall-through...
            case GLenum::GL_ONE_MINUS_CONSTANT_COLOR:  // fall-through...
            case GLenum::GL_ONE_MINUS_DST_ALPHA:       // fall-through...
            case GLenum::GL_ONE_MINUS_DST_COLOR:       // fall-through...
            case GLenum::GL_ONE_MINUS_SRC_ALPHA:       // fall-through...
            case GLenum::GL_ONE_MINUS_SRC_COLOR:       // fall-through...
            case GLenum::GL_SRC_ALPHA:                 // fall-through...
            case GLenum::GL_SRC_ALPHA_SATURATE:        // fall-through...
            case GLenum::GL_SRC_COLOR:                 // fall-through...
            case GLenum::GL_ZERO: {
                break;
            }
        }
        switch (dst_factor) {
            case GLenum::GL_CONSTANT_ALPHA:            // fall-through...
            case GLenum::GL_CONSTANT_COLOR:            // fall-through...
            case GLenum::GL_DST_ALPHA:                 // fall-through...
            case GLenum::GL_DST_COLOR:                 // fall-through...
            case GLenum::GL_ONE:                       // fall-through...
            case GLenum::GL_ONE_MINUS_CONSTANT_ALPHA:  // fall-through...
            case GLenum::GL_ONE_MINUS_CONSTANT_COLOR:  // fall-through...
            case GLenum::GL_ONE_MINUS_DST_ALPHA:       // fall-through...
            case GLenum::GL_ONE_MINUS_DST_COLOR:       // fall-through...
            case GLenum::GL_ONE_MINUS_SRC_ALPHA:       // fall-through...
            case GLenum::GL_ONE_MINUS_SRC_COLOR:       // fall-through...
            case GLenum::GL_SRC_ALPHA:                 // fall-through...
            case GLenum::GL_SRC_COLOR:                 // fall-through...
            case GLenum::GL_ZERO: {
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_489_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_489_result;
        l_ctx->mBlending.mSrcRgbBlendFactor = src_factor;
        l_ctx->mBlending.mSrcAlphaBlendFactor = src_factor;
        l_ctx->mBlending.mDstRgbBlendFactor = dst_factor;
        l_ctx->mBlending.mDstAlphaBlendFactor = dst_factor;
        observe(observations.mReads);
        mImports.glBlendFunc(src_factor, dst_factor);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendFunc coder(observations, src_factor, dst_factor);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlendFuncSeparate(uint32_t src_factor_rgb, uint32_t dst_factor_rgb,
                                         uint32_t src_factor_alpha, uint32_t dst_factor_alpha) {
    GAPID_INFO("glBlendFuncSeparate(%u, %u, %u, %u)\n", src_factor_rgb, dst_factor_rgb,
               src_factor_alpha, dst_factor_alpha);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_490_major = 2;
        uint32_t l_minRequiredVersion_490_minor = 0;
        switch (src_factor_rgb) {
            case GLenum::GL_CONSTANT_ALPHA:            // fall-through...
            case GLenum::GL_CONSTANT_COLOR:            // fall-through...
            case GLenum::GL_DST_ALPHA:                 // fall-through...
            case GLenum::GL_DST_COLOR:                 // fall-through...
            case GLenum::GL_ONE:                       // fall-through...
            case GLenum::GL_ONE_MINUS_CONSTANT_ALPHA:  // fall-through...
            case GLenum::GL_ONE_MINUS_CONSTANT_COLOR:  // fall-through...
            case GLenum::GL_ONE_MINUS_DST_ALPHA:       // fall-through...
            case GLenum::GL_ONE_MINUS_DST_COLOR:       // fall-through...
            case GLenum::GL_ONE_MINUS_SRC_ALPHA:       // fall-through...
            case GLenum::GL_ONE_MINUS_SRC_COLOR:       // fall-through...
            case GLenum::GL_SRC_ALPHA:                 // fall-through...
            case GLenum::GL_SRC_ALPHA_SATURATE:        // fall-through...
            case GLenum::GL_SRC_COLOR:                 // fall-through...
            case GLenum::GL_ZERO: {
                break;
            }
        }
        switch (dst_factor_rgb) {
            case GLenum::GL_CONSTANT_ALPHA:            // fall-through...
            case GLenum::GL_CONSTANT_COLOR:            // fall-through...
            case GLenum::GL_DST_ALPHA:                 // fall-through...
            case GLenum::GL_DST_COLOR:                 // fall-through...
            case GLenum::GL_ONE:                       // fall-through...
            case GLenum::GL_ONE_MINUS_CONSTANT_ALPHA:  // fall-through...
            case GLenum::GL_ONE_MINUS_CONSTANT_COLOR:  // fall-through...
            case GLenum::GL_ONE_MINUS_DST_ALPHA:       // fall-through...
            case GLenum::GL_ONE_MINUS_DST_COLOR:       // fall-through...
            case GLenum::GL_ONE_MINUS_SRC_ALPHA:       // fall-through...
            case GLenum::GL_ONE_MINUS_SRC_COLOR:       // fall-through...
            case GLenum::GL_SRC_ALPHA:                 // fall-through...
            case GLenum::GL_SRC_COLOR:                 // fall-through...
            case GLenum::GL_ZERO: {
                break;
            }
        }
        switch (src_factor_alpha) {
            case GLenum::GL_CONSTANT_ALPHA:            // fall-through...
            case GLenum::GL_CONSTANT_COLOR:            // fall-through...
            case GLenum::GL_DST_ALPHA:                 // fall-through...
            case GLenum::GL_DST_COLOR:                 // fall-through...
            case GLenum::GL_ONE:                       // fall-through...
            case GLenum::GL_ONE_MINUS_CONSTANT_ALPHA:  // fall-through...
            case GLenum::GL_ONE_MINUS_CONSTANT_COLOR:  // fall-through...
            case GLenum::GL_ONE_MINUS_DST_ALPHA:       // fall-through...
            case GLenum::GL_ONE_MINUS_DST_COLOR:       // fall-through...
            case GLenum::GL_ONE_MINUS_SRC_ALPHA:       // fall-through...
            case GLenum::GL_ONE_MINUS_SRC_COLOR:       // fall-through...
            case GLenum::GL_SRC_ALPHA:                 // fall-through...
            case GLenum::GL_SRC_ALPHA_SATURATE:        // fall-through...
            case GLenum::GL_SRC_COLOR:                 // fall-through...
            case GLenum::GL_ZERO: {
                break;
            }
        }
        switch (dst_factor_alpha) {
            case GLenum::GL_CONSTANT_ALPHA:            // fall-through...
            case GLenum::GL_CONSTANT_COLOR:            // fall-through...
            case GLenum::GL_DST_ALPHA:                 // fall-through...
            case GLenum::GL_DST_COLOR:                 // fall-through...
            case GLenum::GL_ONE:                       // fall-through...
            case GLenum::GL_ONE_MINUS_CONSTANT_ALPHA:  // fall-through...
            case GLenum::GL_ONE_MINUS_CONSTANT_COLOR:  // fall-through...
            case GLenum::GL_ONE_MINUS_DST_ALPHA:       // fall-through...
            case GLenum::GL_ONE_MINUS_DST_COLOR:       // fall-through...
            case GLenum::GL_ONE_MINUS_SRC_ALPHA:       // fall-through...
            case GLenum::GL_ONE_MINUS_SRC_COLOR:       // fall-through...
            case GLenum::GL_SRC_ALPHA:                 // fall-through...
            case GLenum::GL_SRC_COLOR:                 // fall-through...
            case GLenum::GL_ZERO: {
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_495_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_495_result;
        l_ctx->mBlending.mSrcRgbBlendFactor = src_factor_rgb;
        l_ctx->mBlending.mDstRgbBlendFactor = dst_factor_rgb;
        l_ctx->mBlending.mSrcAlphaBlendFactor = src_factor_alpha;
        l_ctx->mBlending.mDstAlphaBlendFactor = dst_factor_alpha;
        observe(observations.mReads);
        mImports.glBlendFuncSeparate(src_factor_rgb, dst_factor_rgb, src_factor_alpha,
                                     dst_factor_alpha);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlendFuncSeparate coder(observations, src_factor_rgb, dst_factor_rgb,
                                                  src_factor_alpha, dst_factor_alpha);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDepthFunc(uint32_t function) {
    GAPID_INFO("glDepthFunc(%u)\n", function);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_496_major = 2;
        uint32_t l_minRequiredVersion_496_minor = 0;
        switch (function) {
            case GLenum::GL_ALWAYS:   // fall-through...
            case GLenum::GL_EQUAL:    // fall-through...
            case GLenum::GL_GEQUAL:   // fall-through...
            case GLenum::GL_GREATER:  // fall-through...
            case GLenum::GL_LEQUAL:   // fall-through...
            case GLenum::GL_LESS:     // fall-through...
            case GLenum::GL_NEVER:    // fall-through...
            case GLenum::GL_NOTEQUAL: {
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_498_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_498_result;
        l_ctx->mRasterizing.mDepthTestFunction = function;
        observe(observations.mReads);
        mImports.glDepthFunc(function);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDepthFunc coder(observations, function);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSampleCoverage(float value, uint8_t invert) {
    GAPID_INFO("glSampleCoverage(%f, %" PRIu8 ")\n", value, invert);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_499_major = 2;
        uint32_t l_minRequiredVersion_499_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_500_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_500_result;
        l_ctx->mRasterizing.mSampleCoverageValue = value;
        l_ctx->mRasterizing.mSampleCoverageInvert = invert;
        observe(observations.mReads);
        mImports.glSampleCoverage(value, invert);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSampleCoverage coder(observations, value, invert);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSampleMaski(uint32_t maskNumber, uint32_t mask) {
    GAPID_INFO("glSampleMaski(%" PRIu32 ", %u)\n", maskNumber, mask);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_501_major = 3;
        uint32_t l_minRequiredVersion_501_minor = 1;
        observe(observations.mReads);
        mImports.glSampleMaski(maskNumber, mask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSampleMaski coder(observations, maskNumber, mask);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glScissor(int32_t x, int32_t y, int32_t width, int32_t height) {
    GAPID_INFO("glScissor(%" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ")\n", x, y, width,
               height);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_502_major = 2;
        uint32_t l_minRequiredVersion_502_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_503_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_503_result;
        l_ctx->mRasterizing.mScissor = Rect().SetX(x).SetY(y).SetWidth(width).SetHeight(height);
        observe(observations.mReads);
        mImports.glScissor(x, y, width, height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlScissor coder(observations, x, y, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilFunc(uint32_t func, int32_t ref, uint32_t mask) {
    GAPID_INFO("glStencilFunc(%u, %" PRId32 ", %" PRIu32 ")\n", func, ref, mask);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_504_major = 2;
        uint32_t l_minRequiredVersion_504_minor = 0;
        switch (func) {
            case GLenum::GL_ALWAYS:   // fall-through...
            case GLenum::GL_EQUAL:    // fall-through...
            case GLenum::GL_GEQUAL:   // fall-through...
            case GLenum::GL_GREATER:  // fall-through...
            case GLenum::GL_LEQUAL:   // fall-through...
            case GLenum::GL_LESS:     // fall-through...
            case GLenum::GL_NEVER:    // fall-through...
            case GLenum::GL_NOTEQUAL: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glStencilFunc(func, ref, mask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilFunc coder(observations, func, ref, mask);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilFuncSeparate(uint32_t face, uint32_t function,
                                           int32_t reference_value, uint32_t mask) {
    GAPID_INFO("glStencilFuncSeparate(%u, %u, %" PRId32 ", %" PRIu32 ")\n", face, function,
               reference_value, mask);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_506_major = 2;
        uint32_t l_minRequiredVersion_506_minor = 0;
        switch (face) {
            case GLenum::GL_BACK:   // fall-through...
            case GLenum::GL_FRONT:  // fall-through...
            case GLenum::GL_FRONT_AND_BACK: {
                break;
            }
        }
        switch (function) {
            case GLenum::GL_ALWAYS:   // fall-through...
            case GLenum::GL_EQUAL:    // fall-through...
            case GLenum::GL_GEQUAL:   // fall-through...
            case GLenum::GL_GREATER:  // fall-through...
            case GLenum::GL_LEQUAL:   // fall-through...
            case GLenum::GL_LESS:     // fall-through...
            case GLenum::GL_NEVER:    // fall-through...
            case GLenum::GL_NOTEQUAL: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glStencilFuncSeparate(face, function, reference_value, mask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilFuncSeparate coder(observations, face, function, reference_value,
                                                    mask);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilOp(uint32_t fail, uint32_t zfail, uint32_t zpass) {
    GAPID_INFO("glStencilOp(%u, %u, %u)\n", fail, zfail, zpass);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_509_major = 2;
        uint32_t l_minRequiredVersion_509_minor = 0;
        switch (fail) {
            case GLenum::GL_DECR:       // fall-through...
            case GLenum::GL_DECR_WRAP:  // fall-through...
            case GLenum::GL_INCR:       // fall-through...
            case GLenum::GL_INCR_WRAP:  // fall-through...
            case GLenum::GL_INVERT:     // fall-through...
            case GLenum::GL_KEEP:       // fall-through...
            case GLenum::GL_REPLACE:    // fall-through...
            case GLenum::GL_ZERO: {
                break;
            }
        }
        switch (zfail) {
            case GLenum::GL_DECR:       // fall-through...
            case GLenum::GL_DECR_WRAP:  // fall-through...
            case GLenum::GL_INCR:       // fall-through...
            case GLenum::GL_INCR_WRAP:  // fall-through...
            case GLenum::GL_INVERT:     // fall-through...
            case GLenum::GL_KEEP:       // fall-through...
            case GLenum::GL_REPLACE:    // fall-through...
            case GLenum::GL_ZERO: {
                break;
            }
        }
        switch (zpass) {
            case GLenum::GL_DECR:       // fall-through...
            case GLenum::GL_DECR_WRAP:  // fall-through...
            case GLenum::GL_INCR:       // fall-through...
            case GLenum::GL_INCR_WRAP:  // fall-through...
            case GLenum::GL_INVERT:     // fall-through...
            case GLenum::GL_KEEP:       // fall-through...
            case GLenum::GL_REPLACE:    // fall-through...
            case GLenum::GL_ZERO: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glStencilOp(fail, zfail, zpass);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilOp coder(observations, fail, zfail, zpass);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilOpSeparate(uint32_t face, uint32_t stencil_fail,
                                         uint32_t stencil_pass_depth_fail,
                                         uint32_t stencil_pass_depth_pass) {
    GAPID_INFO("glStencilOpSeparate(%u, %u, %u, %u)\n", face, stencil_fail, stencil_pass_depth_fail,
               stencil_pass_depth_pass);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_513_major = 2;
        uint32_t l_minRequiredVersion_513_minor = 0;
        switch (face) {
            case GLenum::GL_BACK:   // fall-through...
            case GLenum::GL_FRONT:  // fall-through...
            case GLenum::GL_FRONT_AND_BACK: {
                break;
            }
        }
        switch (stencil_fail) {
            case GLenum::GL_DECR:       // fall-through...
            case GLenum::GL_DECR_WRAP:  // fall-through...
            case GLenum::GL_INCR:       // fall-through...
            case GLenum::GL_INCR_WRAP:  // fall-through...
            case GLenum::GL_INVERT:     // fall-through...
            case GLenum::GL_KEEP:       // fall-through...
            case GLenum::GL_REPLACE:    // fall-through...
            case GLenum::GL_ZERO: {
                break;
            }
        }
        switch (stencil_pass_depth_fail) {
            case GLenum::GL_DECR:       // fall-through...
            case GLenum::GL_DECR_WRAP:  // fall-through...
            case GLenum::GL_INCR:       // fall-through...
            case GLenum::GL_INCR_WRAP:  // fall-through...
            case GLenum::GL_INVERT:     // fall-through...
            case GLenum::GL_KEEP:       // fall-through...
            case GLenum::GL_REPLACE:    // fall-through...
            case GLenum::GL_ZERO: {
                break;
            }
        }
        switch (stencil_pass_depth_pass) {
            case GLenum::GL_DECR:       // fall-through...
            case GLenum::GL_DECR_WRAP:  // fall-through...
            case GLenum::GL_INCR:       // fall-through...
            case GLenum::GL_INCR_WRAP:  // fall-through...
            case GLenum::GL_INVERT:     // fall-through...
            case GLenum::GL_KEEP:       // fall-through...
            case GLenum::GL_REPLACE:    // fall-through...
            case GLenum::GL_ZERO: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glStencilOpSeparate(face, stencil_fail, stencil_pass_depth_fail,
                                     stencil_pass_depth_pass);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilOpSeparate coder(observations, face, stencil_fail,
                                                  stencil_pass_depth_fail, stencil_pass_depth_pass);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindFramebuffer(uint32_t target, uint32_t framebuffer) {
    GAPID_INFO("glBindFramebuffer(%u, %" PRIu32 ")\n", target, framebuffer);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_518_major = 2;
        uint32_t l_minRequiredVersion_518_minor = 0;
        switch (target) {
            case GLenum::GL_FRAMEBUFFER: {
                break;
            }
            case GLenum::GL_DRAW_FRAMEBUFFER:  // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER: {
                uint32_t l_minRequiredVersion_519_major = 3;
                uint32_t l_minRequiredVersion_519_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_521_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_521_result;
        if (!(l_ctx->mInstances.mFramebuffers.count(framebuffer) > 0)) {
            l_ctx->mInstances.mFramebuffers[framebuffer] =
                    std::shared_ptr<Framebuffer>((new Framebuffer()));
        }
        if (target == GLenum::GL_FRAMEBUFFER) {
            l_ctx->mBoundFramebuffers[GLenum::GL_READ_FRAMEBUFFER] = framebuffer;
            l_ctx->mBoundFramebuffers[GLenum::GL_DRAW_FRAMEBUFFER] = framebuffer;
        } else {
            l_ctx->mBoundFramebuffers[target] = framebuffer;
        }
        observe(observations.mReads);
        mImports.glBindFramebuffer(target, framebuffer);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindFramebuffer coder(observations, target, framebuffer);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindRenderbuffer(uint32_t target, uint32_t renderbuffer) {
    GAPID_INFO("glBindRenderbuffer(%u, %" PRIu32 ")\n", target, renderbuffer);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_522_major = 2;
        uint32_t l_minRequiredVersion_522_minor = 0;
        switch (target) {
            case GLenum::GL_RENDERBUFFER: {
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_524_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_524_result;
        if (!(l_ctx->mInstances.mRenderbuffers.count(renderbuffer) > 0)) {
            l_ctx->mInstances.mRenderbuffers[renderbuffer] =
                    std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        }
        l_ctx->mBoundRenderbuffers[target] = renderbuffer;
        observe(observations.mReads);
        mImports.glBindRenderbuffer(target, renderbuffer);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindRenderbuffer coder(observations, target, renderbuffer);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBlitFramebuffer(int32_t srcX0, int32_t srcY0, int32_t srcX1, int32_t srcY1,
                                       int32_t dstX0, int32_t dstY0, int32_t dstX1, int32_t dstY1,
                                       uint32_t mask, uint32_t filter) {
    GAPID_INFO("glBlitFramebuffer(%" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %u, %u)\n",
               srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_525_major = 3;
        uint32_t l_minRequiredVersion_525_minor = 0;
        uint32_t l_supportsBits_526_seenBits = mask;
        uint32_t l_supportsBits_526_validBits = GLbitfield::GL_COLOR_BUFFER_BIT |
                                                GLbitfield::GL_DEPTH_BUFFER_BIT |
                                                GLbitfield::GL_STENCIL_BUFFER_BIT;
        if ((mask & GLbitfield::GL_COLOR_BUFFER_BIT) != 0) {
        }
        if ((mask & GLbitfield::GL_DEPTH_BUFFER_BIT) != 0) {
        }
        if ((mask & GLbitfield::GL_STENCIL_BUFFER_BIT) != 0) {
        }
        switch (filter) {
            case GLenum::GL_LINEAR:  // fall-through...
            case GLenum::GL_NEAREST: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask,
                                   filter);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBlitFramebuffer coder(observations, srcX0, srcY0, srcX1, srcY1, dstX0,
                                                dstY0, dstX1, dstY1, mask, filter);
    mEncoder->Object(&coder);
}

inline uint32_t GlesSpy::glCheckFramebufferStatus(uint32_t target) {
    GAPID_INFO("glCheckFramebufferStatus(%u)\n", target);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_528_major = 2;
        uint32_t l_minRequiredVersion_528_minor = 0;
        switch (target) {
            case GLenum::GL_FRAMEBUFFER: {
                break;
            }
            case GLenum::GL_DRAW_FRAMEBUFFER:  // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER: {
                uint32_t l_minRequiredVersion_529_major = 3;
                uint32_t l_minRequiredVersion_529_minor = 0;
                break;
            }
        }
        observe(observations.mReads);
        result = mImports.glCheckFramebufferStatus(target);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCheckFramebufferStatus coder(observations, target, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glClear(uint32_t mask) {
    GAPID_INFO("glClear(%u)\n", mask);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_531_major = 2;
        uint32_t l_minRequiredVersion_531_minor = 0;
        uint32_t l_supportsBits_532_seenBits = mask;
        uint32_t l_supportsBits_532_validBits = GLbitfield::GL_COLOR_BUFFER_BIT |
                                                GLbitfield::GL_DEPTH_BUFFER_BIT |
                                                GLbitfield::GL_STENCIL_BUFFER_BIT;
        if ((mask & GLbitfield::GL_COLOR_BUFFER_BIT) != 0) {
        }
        if ((mask & GLbitfield::GL_DEPTH_BUFFER_BIT) != 0) {
        }
        if ((mask & GLbitfield::GL_STENCIL_BUFFER_BIT) != 0) {
        }
        if ((mask & GLbitfield::GL_COLOR_BUFFER_BIT) != 0) {
        }
        observe(observations.mReads);
        mImports.glClear(mask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlClear coder(observations, mask);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glClearBufferfi(uint32_t buffer, int32_t drawbuffer, float depth,
                                     int32_t stencil) {
    GAPID_INFO("glClearBufferfi(%u, %" PRId32 ", %f, %" PRId32 ")\n", buffer, drawbuffer, depth,
               stencil);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_533_major = 3;
        uint32_t l_minRequiredVersion_533_minor = 0;
        switch (buffer) {
            case GLenum::GL_DEPTH_STENCIL: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glClearBufferfi(buffer, drawbuffer, depth, stencil);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlClearBufferfi coder(observations, buffer, drawbuffer, depth, stencil);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glClearBufferfv(uint32_t buffer, int32_t drawbuffer, float* value) {
    GAPID_INFO("glClearBufferfv(%u, %" PRId32 ", %p)\n", buffer, drawbuffer, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_535_major = 3;
        uint32_t l_minRequiredVersion_535_minor = 0;
        switch (buffer) {
            case GLenum::GL_COLOR:  // fall-through...
            case GLenum::GL_DEPTH: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glClearBufferfv(buffer, drawbuffer, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlClearBufferfv coder(
            observations, buffer, drawbuffer,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glClearBufferiv(uint32_t buffer, int32_t drawbuffer, int32_t* value) {
    GAPID_INFO("glClearBufferiv(%u, %" PRId32 ", %p)\n", buffer, drawbuffer, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_537_major = 3;
        uint32_t l_minRequiredVersion_537_minor = 0;
        switch (buffer) {
            case GLenum::GL_COLOR:  // fall-through...
            case GLenum::GL_STENCIL: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glClearBufferiv(buffer, drawbuffer, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlClearBufferiv coder(
            observations, buffer, drawbuffer,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glClearBufferuiv(uint32_t buffer, int32_t drawbuffer, uint32_t* value) {
    GAPID_INFO("glClearBufferuiv(%u, %" PRId32 ", %p)\n", buffer, drawbuffer, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_539_major = 3;
        uint32_t l_minRequiredVersion_539_minor = 0;
        switch (buffer) {
            case GLenum::GL_COLOR: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glClearBufferuiv(buffer, drawbuffer, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlClearBufferuiv coder(
            observations, buffer, drawbuffer,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glClearColor(float r, float g, float b, float a) {
    GAPID_INFO("glClearColor(%f, %f, %f, %f)\n", r, g, b, a);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_541_major = 2;
        uint32_t l_minRequiredVersion_541_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_542_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_542_result;
        l_ctx->mClearing.mClearColor = Color().SetRed(r).SetGreen(g).SetBlue(b).SetAlpha(a);
        observe(observations.mReads);
        mImports.glClearColor(r, g, b, a);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlClearColor coder(observations, r, g, b, a);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glClearDepthf(float depth) {
    GAPID_INFO("glClearDepthf(%f)\n", depth);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_543_major = 2;
        uint32_t l_minRequiredVersion_543_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_544_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_544_result;
        l_ctx->mClearing.mClearDepth = depth;
        observe(observations.mReads);
        mImports.glClearDepthf(depth);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlClearDepthf coder(observations, depth);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glClearStencil(int32_t stencil) {
    GAPID_INFO("glClearStencil(%" PRId32 ")\n", stencil);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_545_major = 2;
        uint32_t l_minRequiredVersion_545_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_546_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_546_result;
        l_ctx->mClearing.mClearStencil = stencil;
        observe(observations.mReads);
        mImports.glClearStencil(stencil);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlClearStencil coder(observations, stencil);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glColorMask(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) {
    GAPID_INFO("glColorMask(%" PRIu8 ", %" PRIu8 ", %" PRIu8 ", %" PRIu8 ")\n", red, green, blue,
               alpha);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_547_major = 2;
        uint32_t l_minRequiredVersion_547_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_548_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_548_result;
        l_ctx->mRasterizing.mColorMaskRed = red;
        l_ctx->mRasterizing.mColorMaskGreen = green;
        l_ctx->mRasterizing.mColorMaskBlue = blue;
        l_ctx->mRasterizing.mColorMaskAlpha = alpha;
        observe(observations.mReads);
        mImports.glColorMask(red, green, blue, alpha);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlColorMask coder(observations, red, green, blue, alpha);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteFramebuffers(int32_t count, uint32_t* framebuffers) {
    GAPID_INFO("glDeleteFramebuffers(%" PRId32 ", %p)\n", count, framebuffers);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_549_major = 2;
        uint32_t l_minRequiredVersion_549_minor = 0;
        Slice<FramebufferId> l_f = slice(framebuffers, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_550_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_550_result;
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            l_ctx->mInstances.mFramebuffers[read(l_f, (uint64_t)(l_i))] =
                    std::shared_ptr<Framebuffer>();
        }
        observe(observations.mReads);
        mImports.glDeleteFramebuffers(count, framebuffers);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteFramebuffers coder(
            observations, count,
            gapic::coder::gles::FramebufferId__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(framebuffers), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteRenderbuffers(int32_t count, uint32_t* renderbuffers) {
    GAPID_INFO("glDeleteRenderbuffers(%" PRId32 ", %p)\n", count, renderbuffers);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_551_major = 2;
        uint32_t l_minRequiredVersion_551_minor = 0;
        Slice<RenderbufferId> l_r =
                slice(renderbuffers, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_552_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_552_result;
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            l_ctx->mInstances.mRenderbuffers[read(l_r, (uint64_t)(l_i))] =
                    std::shared_ptr<Renderbuffer>();
        }
        observe(observations.mReads);
        mImports.glDeleteRenderbuffers(count, renderbuffers);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteRenderbuffers coder(
            observations, count,
            gapic::coder::gles::RenderbufferId__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(renderbuffers), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDepthMask(uint8_t enabled) {
    GAPID_INFO("glDepthMask(%" PRIu8 ")\n", enabled);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_553_major = 2;
        uint32_t l_minRequiredVersion_553_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_554_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_554_result;
        l_ctx->mRasterizing.mDepthMask = enabled;
        observe(observations.mReads);
        mImports.glDepthMask(enabled);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDepthMask coder(observations, enabled);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFramebufferParameteri(uint32_t target, uint32_t pname, int32_t param) {
    GAPID_INFO("glFramebufferParameteri(%u, %u, %" PRId32 ")\n", target, pname, param);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_555_major = 3;
        uint32_t l_minRequiredVersion_555_minor = 1;
        switch (target) {
            case GLenum::GL_DRAW_FRAMEBUFFER:  // fall-through...
            case GLenum::GL_FRAMEBUFFER:       // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER: {
                break;
            }
        }
        switch (pname) {
            case GLenum::GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:  // fall-through...
            case GLenum::GL_FRAMEBUFFER_DEFAULT_HEIGHT:                  // fall-through...
            case GLenum::GL_FRAMEBUFFER_DEFAULT_SAMPLES:                 // fall-through...
            case GLenum::GL_FRAMEBUFFER_DEFAULT_WIDTH: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glFramebufferParameteri(target, pname, param);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFramebufferParameteri coder(observations, target, pname, param);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFramebufferRenderbuffer(uint32_t framebuffer_target,
                                               uint32_t framebuffer_attachment,
                                               uint32_t renderbuffer_target,
                                               uint32_t renderbuffer) {
    GAPID_INFO("glFramebufferRenderbuffer(%u, %u, %u, %" PRIu32 ")\n", framebuffer_target,
               framebuffer_attachment, renderbuffer_target, renderbuffer);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_558_major = 2;
        uint32_t l_minRequiredVersion_558_minor = 0;
        switch (framebuffer_target) {
            case GLenum::GL_FRAMEBUFFER: {
                break;
            }
            case GLenum::GL_DRAW_FRAMEBUFFER:  // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER: {
                uint32_t l_minRequiredVersion_559_major = 3;
                uint32_t l_minRequiredVersion_559_minor = 0;
                break;
            }
        }
        switch (framebuffer_attachment) {
            case GLenum::GL_COLOR_ATTACHMENT0:  // fall-through...
            case GLenum::GL_DEPTH_ATTACHMENT:   // fall-through...
            case GLenum::GL_STENCIL_ATTACHMENT: {
                break;
            }
            case GLenum::GL_COLOR_ATTACHMENT1:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT10:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT11:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT12:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT13:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT14:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT15:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT2:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT3:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT4:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT5:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT6:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT7:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT8:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT9:   // fall-through...
            case GLenum::GL_DEPTH_STENCIL_ATTACHMENT: {
                uint32_t l_minRequiredVersion_561_major = 3;
                uint32_t l_minRequiredVersion_561_minor = 0;
                break;
            }
        }
        switch (renderbuffer_target) {
            case GLenum::GL_RENDERBUFFER: {
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_564_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_564_result;
        uint32_t l_target = /* clang-format off */
        /* switch(framebuffer_target) */
            /* case GLenum::GL_FRAMEBUFFER: */(((framebuffer_target) == (GLenum::GL_FRAMEBUFFER))) ? (GLenum::GL_DRAW_FRAMEBUFFER) :
            /* case GLenum::GL_DRAW_FRAMEBUFFER: */(((framebuffer_target) == (GLenum::GL_DRAW_FRAMEBUFFER))) ? (GLenum::GL_DRAW_FRAMEBUFFER) :
            /* case GLenum::GL_READ_FRAMEBUFFER: */(((framebuffer_target) == (GLenum::GL_READ_FRAMEBUFFER))) ? (GLenum::GL_READ_FRAMEBUFFER) :
            /* default: */ 0 /* clang-format on */;
        FramebufferId l_framebufferId = l_ctx->mBoundFramebuffers[l_target];
        std::shared_ptr<Framebuffer> l_framebuffer =
                l_ctx->mInstances.mFramebuffers[l_framebufferId];
        FramebufferAttachmentInfo l_attachment =
                l_framebuffer->mAttachments[framebuffer_attachment];
        if (renderbuffer == (RenderbufferId)(0)) {
            l_attachment.mType = GLenum::GL_NONE;
        } else {
            l_attachment.mType = GLenum::GL_RENDERBUFFER;
        }
        l_attachment.mObject = (uint32_t)(renderbuffer);
        l_attachment.mTextureLevel = (GLint)(0);
        l_attachment.mCubeMapFace = GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X;
        l_framebuffer->mAttachments[framebuffer_attachment] = l_attachment;
        observe(observations.mReads);
        mImports.glFramebufferRenderbuffer(framebuffer_target, framebuffer_attachment,
                                           renderbuffer_target, renderbuffer);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFramebufferRenderbuffer coder(observations, framebuffer_target,
                                                        framebuffer_attachment, renderbuffer_target,
                                                        renderbuffer);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFramebufferTexture2D(uint32_t framebuffer_target,
                                            uint32_t framebuffer_attachment,
                                            uint32_t texture_target, uint32_t texture,
                                            int32_t level) {
    GAPID_INFO("glFramebufferTexture2D(%u, %u, %u, %" PRIu32 ", %" PRId32 ")\n", framebuffer_target,
               framebuffer_attachment, texture_target, texture, level);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_565_major = 2;
        uint32_t l_minRequiredVersion_565_minor = 0;
        switch (framebuffer_target) {
            case GLenum::GL_FRAMEBUFFER: {
                break;
            }
            case GLenum::GL_DRAW_FRAMEBUFFER:  // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER: {
                uint32_t l_minRequiredVersion_566_major = 3;
                uint32_t l_minRequiredVersion_566_minor = 0;
                break;
            }
        }
        switch (framebuffer_attachment) {
            case GLenum::GL_COLOR_ATTACHMENT0:  // fall-through...
            case GLenum::GL_DEPTH_ATTACHMENT:   // fall-through...
            case GLenum::GL_STENCIL_ATTACHMENT: {
                break;
            }
            case GLenum::GL_COLOR_ATTACHMENT1:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT10:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT11:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT12:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT13:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT14:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT15:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT2:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT3:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT4:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT5:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT6:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT7:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT8:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT9:   // fall-through...
            case GLenum::GL_DEPTH_STENCIL_ATTACHMENT: {
                uint32_t l_minRequiredVersion_568_major = 3;
                uint32_t l_minRequiredVersion_568_minor = 0;
                break;
            }
        }
        switch (texture_target) {
            case GLenum::GL_TEXTURE_2D:                   // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
                break;
            }
            case GLenum::GL_TEXTURE_2D_MULTISAMPLE: {
                uint32_t l_minRequiredVersion_570_major = 3;
                uint32_t l_minRequiredVersion_570_minor = 1;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_572_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_572_result;
        uint32_t l_target = /* clang-format off */
        /* switch(framebuffer_target) */
            /* case GLenum::GL_FRAMEBUFFER: */(((framebuffer_target) == (GLenum::GL_FRAMEBUFFER))) ? (GLenum::GL_DRAW_FRAMEBUFFER) :
            /* case GLenum::GL_DRAW_FRAMEBUFFER: */(((framebuffer_target) == (GLenum::GL_DRAW_FRAMEBUFFER))) ? (GLenum::GL_DRAW_FRAMEBUFFER) :
            /* case GLenum::GL_READ_FRAMEBUFFER: */(((framebuffer_target) == (GLenum::GL_READ_FRAMEBUFFER))) ? (GLenum::GL_READ_FRAMEBUFFER) :
            /* default: */ 0 /* clang-format on */;
        FramebufferId l_framebufferId = l_ctx->mBoundFramebuffers[l_target];
        std::shared_ptr<Framebuffer> l_framebuffer =
                l_ctx->mInstances.mFramebuffers[l_framebufferId];
        FramebufferAttachmentInfo l_attachment =
                l_framebuffer->mAttachments[framebuffer_attachment];
        if (texture == (TextureId)(0)) {
            l_attachment.mType = GLenum::GL_NONE;
            l_attachment.mObject = 0;
            l_attachment.mTextureLevel = (GLint)(0);
            l_attachment.mCubeMapFace = GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X;
        } else {
            l_attachment.mType = GLenum::GL_TEXTURE;
            l_attachment.mObject = (uint32_t)(texture);
            l_attachment.mTextureLevel = level;
            l_attachment.mCubeMapFace = /* clang-format off */
            /* switch(texture_target) */
                /* case GLenum::GL_TEXTURE_2D: */(((texture_target) == (GLenum::GL_TEXTURE_2D))) ? (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X) :
                /* case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X: */(((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X))) ? (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X) :
                /* case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y: */(((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y))) ? (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y) :
                /* case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z: */(((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z))) ? (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z) :
                /* case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X: */(((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X))) ? (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X) :
                /* case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: */(((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y))) ? (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) :
                /* case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: */(((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z))) ? (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z) :
                /* default: */ 0 /* clang-format on */;
        }
        l_framebuffer->mAttachments[framebuffer_attachment] = l_attachment;
        observe(observations.mReads);
        mImports.glFramebufferTexture2D(framebuffer_target, framebuffer_attachment, texture_target,
                                        texture, level);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFramebufferTexture2D coder(observations, framebuffer_target,
                                                     framebuffer_attachment, texture_target,
                                                     texture, level);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFramebufferTextureLayer(uint32_t target, uint32_t attachment,
                                               uint32_t texture, int32_t level, int32_t layer) {
    GAPID_INFO("glFramebufferTextureLayer(%u, %u, %" PRIu32 ", %" PRId32 ", %" PRId32 ")\n", target,
               attachment, texture, level, layer);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_573_major = 3;
        uint32_t l_minRequiredVersion_573_minor = 0;
        switch (target) {
            case GLenum::GL_DRAW_FRAMEBUFFER:  // fall-through...
            case GLenum::GL_FRAMEBUFFER:       // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER: {
                break;
            }
        }
        switch (attachment) {
            case GLenum::GL_COLOR_ATTACHMENT0:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT1:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT10:        // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT11:        // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT12:        // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT13:        // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT14:        // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT15:        // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT2:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT3:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT4:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT5:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT6:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT7:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT8:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT9:         // fall-through...
            case GLenum::GL_DEPTH_ATTACHMENT:          // fall-through...
            case GLenum::GL_DEPTH_STENCIL_ATTACHMENT:  // fall-through...
            case GLenum::GL_STENCIL_ATTACHMENT: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glFramebufferTextureLayer(target, attachment, texture, level, layer);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFramebufferTextureLayer coder(observations, target, attachment, texture,
                                                        level, layer);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenFramebuffers(int32_t count, uint32_t* framebuffers) {
    GAPID_INFO("glGenFramebuffers(%" PRId32 ", %p)\n", count, framebuffers);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_576_major = 2;
        uint32_t l_minRequiredVersion_576_minor = 0;
        Slice<FramebufferId> l_f = slice(framebuffers, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_577_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_577_result;
        observe(observations.mReads);
        mImports.glGenFramebuffers(count, framebuffers);
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            FramebufferId l_id = (FramebufferId)(slice(framebuffers, (uint64_t)((GLsizei)(0)),
                                                       (uint64_t)(count))[(uint64_t)(l_i)]);
            l_ctx->mInstances.mFramebuffers[l_id] =
                    std::shared_ptr<Framebuffer>((new Framebuffer()));
            write(l_f, (uint64_t)(l_i), l_id);
        }
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenFramebuffers coder(
            observations, count, gapic::coder::gles::FramebufferId__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(framebuffers), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenRenderbuffers(int32_t count, uint32_t* renderbuffers) {
    GAPID_INFO("glGenRenderbuffers(%" PRId32 ", %p)\n", count, renderbuffers);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_578_major = 2;
        uint32_t l_minRequiredVersion_578_minor = 0;
        Slice<RenderbufferId> l_r =
                slice(renderbuffers, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_579_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_579_result;
        observe(observations.mReads);
        mImports.glGenRenderbuffers(count, renderbuffers);
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            RenderbufferId l_id = (RenderbufferId)(slice(renderbuffers, (uint64_t)((GLsizei)(0)),
                                                         (uint64_t)(count))[(uint64_t)(l_i)]);
            l_ctx->mInstances.mRenderbuffers[l_id] =
                    std::shared_ptr<Renderbuffer>((new Renderbuffer()));
            write(l_r, (uint64_t)(l_i), l_id);
        }
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenRenderbuffers coder(
            observations, count,
            gapic::coder::gles::RenderbufferId__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(renderbuffers), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetFramebufferAttachmentParameteriv(uint32_t framebuffer_target,
                                                           uint32_t attachment, uint32_t parameter,
                                                           int32_t* value) {
    GAPID_INFO("glGetFramebufferAttachmentParameteriv(%u, %u, %u, %p)\n", framebuffer_target,
               attachment, parameter, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_580_major = 2;
        uint32_t l_minRequiredVersion_580_minor = 0;
        switch (framebuffer_target) {
            case GLenum::GL_FRAMEBUFFER: {
                break;
            }
            case GLenum::GL_DRAW_FRAMEBUFFER:  // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER: {
                uint32_t l_minRequiredVersion_581_major = 3;
                uint32_t l_minRequiredVersion_581_minor = 0;
                break;
            }
        }
        switch (attachment) {
            case GLenum::GL_COLOR_ATTACHMENT0:  // fall-through...
            case GLenum::GL_DEPTH_ATTACHMENT:   // fall-through...
            case GLenum::GL_STENCIL_ATTACHMENT: {
                break;
            }
            case GLenum::GL_BACK:                      // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT1:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT10:        // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT11:        // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT12:        // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT13:        // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT14:        // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT15:        // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT2:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT3:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT4:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT5:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT6:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT7:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT8:         // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT9:         // fall-through...
            case GLenum::GL_DEPTH:                     // fall-through...
            case GLenum::GL_DEPTH_STENCIL_ATTACHMENT:  // fall-through...
            case GLenum::GL_STENCIL: {
                uint32_t l_minRequiredVersion_583_major = 3;
                uint32_t l_minRequiredVersion_583_minor = 0;
                break;
            }
        }
        switch (parameter) {
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:            // fall-through...
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:            // fall-through...
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:  // fall-through...
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: {
                break;
            }
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:      // fall-through...
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:       // fall-through...
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:  // fall-through...
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:  // fall-through...
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:      // fall-through...
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:      // fall-through...
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:        // fall-through...
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:    // fall-through...
            case GLenum::GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: {
                uint32_t l_minRequiredVersion_585_major = 3;
                uint32_t l_minRequiredVersion_585_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_587_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_587_result;
        uint32_t l_target = /* clang-format off */
        /* switch(framebuffer_target) */
            /* case GLenum::GL_FRAMEBUFFER: */(((framebuffer_target) == (GLenum::GL_FRAMEBUFFER))) ? (GLenum::GL_DRAW_FRAMEBUFFER) :
            /* case GLenum::GL_DRAW_FRAMEBUFFER: */(((framebuffer_target) == (GLenum::GL_DRAW_FRAMEBUFFER))) ? (GLenum::GL_DRAW_FRAMEBUFFER) :
            /* case GLenum::GL_READ_FRAMEBUFFER: */(((framebuffer_target) == (GLenum::GL_READ_FRAMEBUFFER))) ? (GLenum::GL_READ_FRAMEBUFFER) :
            /* default: */ 0 /* clang-format on */;
        FramebufferId l_framebufferId = l_ctx->mBoundFramebuffers[l_target];
        std::shared_ptr<Framebuffer> l_framebuffer =
                l_ctx->mInstances.mFramebuffers[l_framebufferId];
        FramebufferAttachmentInfo l_a = l_framebuffer->mAttachments[attachment];
        observe(observations.mReads);
        mImports.glGetFramebufferAttachmentParameteriv(framebuffer_target, attachment, parameter,
                                                       value);
        write(slice(value, 0, 1), 0, /* clang-format off */
        /* switch(parameter) */
            /* case GLenum::GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: */(((parameter) == (GLenum::GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE))) ? ((GLint)(l_a.mType)) :
            /* case GLenum::GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: */(((parameter) == (GLenum::GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME))) ? ((GLint)(l_a.mObject)) :
            /* case GLenum::GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: */(((parameter) == (GLenum::GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL))) ? (l_a.mTextureLevel) :
            /* case GLenum::GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: */(((parameter) == (GLenum::GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE))) ? ((GLint)(l_a.mCubeMapFace)) :
            /* default: */ 0 /* clang-format on */);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetFramebufferAttachmentParameteriv coder(
            observations, framebuffer_target, attachment, parameter,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetFramebufferParameteriv(uint32_t target, uint32_t pname, int32_t* params) {
    GAPID_INFO("glGetFramebufferParameteriv(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_588_major = 3;
        uint32_t l_minRequiredVersion_588_minor = 1;
        switch (target) {
            case GLenum::GL_DRAW_FRAMEBUFFER:  // fall-through...
            case GLenum::GL_FRAMEBUFFER:       // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER: {
                break;
            }
        }
        switch (pname) {
            case GLenum::GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:  // fall-through...
            case GLenum::GL_FRAMEBUFFER_DEFAULT_HEIGHT:                  // fall-through...
            case GLenum::GL_FRAMEBUFFER_DEFAULT_SAMPLES:                 // fall-through...
            case GLenum::GL_FRAMEBUFFER_DEFAULT_WIDTH: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetFramebufferParameteriv(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetFramebufferParameteriv coder(
            observations, target, pname, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                                 reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetRenderbufferParameteriv(uint32_t target, uint32_t parameter,
                                                  int32_t* values) {
    GAPID_INFO("glGetRenderbufferParameteriv(%u, %u, %p)\n", target, parameter, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_591_major = 2;
        uint32_t l_minRequiredVersion_591_minor = 0;
        switch (target) {
            case GLenum::GL_RENDERBUFFER: {
                break;
            }
        }
        switch (parameter) {
            case GLenum::GL_RENDERBUFFER_ALPHA_SIZE:       // fall-through...
            case GLenum::GL_RENDERBUFFER_BLUE_SIZE:        // fall-through...
            case GLenum::GL_RENDERBUFFER_DEPTH_SIZE:       // fall-through...
            case GLenum::GL_RENDERBUFFER_GREEN_SIZE:       // fall-through...
            case GLenum::GL_RENDERBUFFER_HEIGHT:           // fall-through...
            case GLenum::GL_RENDERBUFFER_INTERNAL_FORMAT:  // fall-through...
            case GLenum::GL_RENDERBUFFER_RED_SIZE:         // fall-through...
            case GLenum::GL_RENDERBUFFER_STENCIL_SIZE:     // fall-through...
            case GLenum::GL_RENDERBUFFER_WIDTH: {
                break;
            }
            case GLenum::GL_RENDERBUFFER_SAMPLES: {
                uint32_t l_minRequiredVersion_593_major = 3;
                uint32_t l_minRequiredVersion_593_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_595_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_595_result;
        RenderbufferId l_id = l_ctx->mBoundRenderbuffers[target];
        std::shared_ptr<Renderbuffer> l_rb = l_ctx->mInstances.mRenderbuffers[l_id];
        observe(observations.mReads);
        mImports.glGetRenderbufferParameteriv(target, parameter, values);
        write(slice(values, 0, 1), 0, /* clang-format off */
        /* switch(parameter) */
            /* case GLenum::GL_RENDERBUFFER_WIDTH: */(((parameter) == (GLenum::GL_RENDERBUFFER_WIDTH))) ? ((GLint)(l_rb->mWidth)) :
            /* case GLenum::GL_RENDERBUFFER_HEIGHT: */(((parameter) == (GLenum::GL_RENDERBUFFER_HEIGHT))) ? ((GLint)(l_rb->mHeight)) :
            /* case GLenum::GL_RENDERBUFFER_INTERNAL_FORMAT: */(((parameter) == (GLenum::GL_RENDERBUFFER_INTERNAL_FORMAT))) ? ((GLint)(l_rb->mFormat)) :
            /* default: */ 0 /* clang-format on */);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetRenderbufferParameteriv coder(
            observations, target, parameter,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glInvalidateFramebuffer(uint32_t target, int32_t count,
                                             uint32_t* attachments) {
    GAPID_INFO("glInvalidateFramebuffer(%u, %" PRId32 ", %p)\n", target, count, attachments);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_596_major = 3;
        uint32_t l_minRequiredVersion_596_minor = 0;
        switch (target) {
            case GLenum::GL_FRAMEBUFFER: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glInvalidateFramebuffer(target, count, attachments);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlInvalidateFramebuffer coder(
            observations, target, count,
            gapic::coder::gles::GLenum__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(attachments), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glInvalidateSubFramebuffer(uint32_t target, int32_t numAttachments,
                                                uint32_t* attachments, int32_t x, int32_t y,
                                                int32_t width, int32_t height) {
    GAPID_INFO("glInvalidateSubFramebuffer(%u, %" PRId32 ", %p, %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ")\n",
               target, numAttachments, attachments, x, y, width, height);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_598_major = 3;
        uint32_t l_minRequiredVersion_598_minor = 0;
        switch (target) {
            case GLenum::GL_FRAMEBUFFER: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glInvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width,
                                            height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlInvalidateSubFramebuffer coder(
            observations, target, numAttachments,
            gapic::coder::gles::GLenum__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(attachments), 0)),
            x, y, width, height);
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glIsFramebuffer(uint32_t framebuffer) {
    GAPID_INFO("glIsFramebuffer(%" PRIu32 ")\n", framebuffer);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_600_major = 2;
        uint32_t l_minRequiredVersion_600_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_601_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_601_result;
        observe(observations.mReads);
        result = mImports.glIsFramebuffer(framebuffer);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsFramebuffer coder(observations, framebuffer, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsRenderbuffer(uint32_t renderbuffer) {
    GAPID_INFO("glIsRenderbuffer(%" PRIu32 ")\n", renderbuffer);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_602_major = 2;
        uint32_t l_minRequiredVersion_602_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_603_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_603_result;
        observe(observations.mReads);
        result = mImports.glIsRenderbuffer(renderbuffer);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsRenderbuffer coder(observations, renderbuffer, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glReadBuffer(uint32_t src) {
    GAPID_INFO("glReadBuffer(%u)\n", src);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_604_major = 3;
        uint32_t l_minRequiredVersion_604_minor = 0;
        switch (src) {
            case GLenum::GL_BACK:                // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT0:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT1:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT10:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT11:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT12:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT13:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT14:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT15:  // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT2:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT3:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT4:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT5:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT6:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT7:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT8:   // fall-through...
            case GLenum::GL_COLOR_ATTACHMENT9:   // fall-through...
            case GLenum::GL_NONE: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glReadBuffer(src);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlReadBuffer coder(observations, src);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glReadPixels(int32_t x, int32_t y, int32_t width, int32_t height,
                                  uint32_t format, uint32_t type, void* data) {
    GAPID_INFO("glReadPixels(%" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %u, %u, %p)\n", x,
               y, width, height, format, type, data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_606_major = 2;
        uint32_t l_minRequiredVersion_606_minor = 0;
        switch (format) {
            case GLenum::GL_ALPHA:  // fall-through...
            case GLenum::GL_RGB:    // fall-through...
            case GLenum::GL_RGBA: {
                break;
            }
            case GLenum::GL_LUMINANCE:        // fall-through...
            case GLenum::GL_LUMINANCE_ALPHA:  // fall-through...
            case GLenum::GL_RED:              // fall-through...
            case GLenum::GL_RED_INTEGER:      // fall-through...
            case GLenum::GL_RG:               // fall-through...
            case GLenum::GL_RGBA_INTEGER:     // fall-through...
            case GLenum::GL_RGB_INTEGER:      // fall-through...
            case GLenum::GL_RG_INTEGER: {
                uint32_t l_minRequiredVersion_607_major = 3;
                uint32_t l_minRequiredVersion_607_minor = 0;
                break;
            }
        }
        switch (type) {
            case GLenum::GL_UNSIGNED_BYTE:           // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_4_4_4_4:  // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_5_5_5_1:  // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_5_6_5: {
                break;
            }
            case GLenum::GL_BYTE:                          // fall-through...
            case GLenum::GL_FLOAT:                         // fall-through...
            case GLenum::GL_HALF_FLOAT:                    // fall-through...
            case GLenum::GL_INT:                           // fall-through...
            case GLenum::GL_UNSIGNED_INT:                  // fall-through...
            case GLenum::GL_UNSIGNED_INT_10F_11F_11F_REV:  // fall-through...
            case GLenum::GL_UNSIGNED_INT_2_10_10_10_REV:   // fall-through...
            case GLenum::GL_UNSIGNED_INT_5_9_9_9_REV: {
                uint32_t l_minRequiredVersion_609_major = 3;
                uint32_t l_minRequiredVersion_609_minor = 0;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glReadPixels(x, y, width, height, format, type, data);
        write(slice(data, (uint64_t)(0),
                    (uint64_t)(imageSize((uint32_t)(width), (uint32_t)(height), format, type))));
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlReadPixels coder(
            observations, x, y, width, height, format, type,
            gapic::coder::gles::Void__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glRenderbufferStorage(uint32_t target, uint32_t format, int32_t width,
                                           int32_t height) {
    GAPID_INFO("glRenderbufferStorage(%u, %u, %" PRId32 ", %" PRId32 ")\n", target, format, width,
               height);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_611_major = 2;
        uint32_t l_minRequiredVersion_611_minor = 0;
        switch (target) {
            case GLenum::GL_RENDERBUFFER: {
                break;
            }
        }
        switch (format) {
            case GLenum::GL_DEPTH_COMPONENT16:  // fall-through...
            case GLenum::GL_RGB565:             // fall-through...
            case GLenum::GL_RGB5_A1:            // fall-through...
            case GLenum::GL_RGBA4:              // fall-through...
            case GLenum::GL_STENCIL_INDEX8: {
                break;
            }
            case GLenum::GL_DEPTH24_STENCIL8:    // fall-through...
            case GLenum::GL_DEPTH32F_STENCIL8:   // fall-through...
            case GLenum::GL_DEPTH_COMPONENT24:   // fall-through...
            case GLenum::GL_DEPTH_COMPONENT32F:  // fall-through...
            case GLenum::GL_R16I:                // fall-through...
            case GLenum::GL_R16UI:               // fall-through...
            case GLenum::GL_R32I:                // fall-through...
            case GLenum::GL_R32UI:               // fall-through...
            case GLenum::GL_R8:                  // fall-through...
            case GLenum::GL_R8I:                 // fall-through...
            case GLenum::GL_R8UI:                // fall-through...
            case GLenum::GL_RG16I:               // fall-through...
            case GLenum::GL_RG16UI:              // fall-through...
            case GLenum::GL_RG32I:               // fall-through...
            case GLenum::GL_RG32UI:              // fall-through...
            case GLenum::GL_RG8:                 // fall-through...
            case GLenum::GL_RG8I:                // fall-through...
            case GLenum::GL_RG8UI:               // fall-through...
            case GLenum::GL_RGB10_A2:            // fall-through...
            case GLenum::GL_RGB10_A2UI:          // fall-through...
            case GLenum::GL_RGB8:                // fall-through...
            case GLenum::GL_RGBA16I:             // fall-through...
            case GLenum::GL_RGBA16UI:            // fall-through...
            case GLenum::GL_RGBA32I:             // fall-through...
            case GLenum::GL_RGBA32UI:            // fall-through...
            case GLenum::GL_RGBA8:               // fall-through...
            case GLenum::GL_RGBA8I:              // fall-through...
            case GLenum::GL_RGBA8UI:             // fall-through...
            case GLenum::GL_SRGB8_ALPHA8: {
                uint32_t l_minRequiredVersion_613_major = 3;
                uint32_t l_minRequiredVersion_613_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_615_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_615_result;
        RenderbufferId l_id = l_ctx->mBoundRenderbuffers[target];
        std::shared_ptr<Renderbuffer> l_rb = l_ctx->mInstances.mRenderbuffers[l_id];
        l_rb->mFormat = format;
        l_rb->mWidth = width;
        l_rb->mHeight = height;
        observe(observations.mReads);
        mImports.glRenderbufferStorage(target, format, width, height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlRenderbufferStorage coder(observations, target, format, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glRenderbufferStorageMultisample(uint32_t target, int32_t samples,
                                                      uint32_t format, int32_t width,
                                                      int32_t height) {
    GAPID_INFO("glRenderbufferStorageMultisample(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32 ")\n",
               target, samples, format, width, height);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_616_major = 3;
        uint32_t l_minRequiredVersion_616_minor = 0;
        switch (target) {
            case GLenum::GL_RENDERBUFFER: {
                break;
            }
        }
        switch (format) {
            case GLenum::GL_DEPTH24_STENCIL8:    // fall-through...
            case GLenum::GL_DEPTH32F_STENCIL8:   // fall-through...
            case GLenum::GL_DEPTH_COMPONENT16:   // fall-through...
            case GLenum::GL_DEPTH_COMPONENT24:   // fall-through...
            case GLenum::GL_DEPTH_COMPONENT32F:  // fall-through...
            case GLenum::GL_R16I:                // fall-through...
            case GLenum::GL_R16UI:               // fall-through...
            case GLenum::GL_R32I:                // fall-through...
            case GLenum::GL_R32UI:               // fall-through...
            case GLenum::GL_R8:                  // fall-through...
            case GLenum::GL_R8I:                 // fall-through...
            case GLenum::GL_R8UI:                // fall-through...
            case GLenum::GL_RG16I:               // fall-through...
            case GLenum::GL_RG16UI:              // fall-through...
            case GLenum::GL_RG32I:               // fall-through...
            case GLenum::GL_RG32UI:              // fall-through...
            case GLenum::GL_RG8:                 // fall-through...
            case GLenum::GL_RG8I:                // fall-through...
            case GLenum::GL_RG8UI:               // fall-through...
            case GLenum::GL_RGB10_A2:            // fall-through...
            case GLenum::GL_RGB10_A2UI:          // fall-through...
            case GLenum::GL_RGB565:              // fall-through...
            case GLenum::GL_RGB5_A1:             // fall-through...
            case GLenum::GL_RGB8:                // fall-through...
            case GLenum::GL_RGBA16I:             // fall-through...
            case GLenum::GL_RGBA16UI:            // fall-through...
            case GLenum::GL_RGBA32I:             // fall-through...
            case GLenum::GL_RGBA32UI:            // fall-through...
            case GLenum::GL_RGBA4:               // fall-through...
            case GLenum::GL_RGBA8:               // fall-through...
            case GLenum::GL_RGBA8I:              // fall-through...
            case GLenum::GL_RGBA8UI:             // fall-through...
            case GLenum::GL_SRGB8_ALPHA8:        // fall-through...
            case GLenum::GL_STENCIL_INDEX8: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glRenderbufferStorageMultisample(target, samples, format, width, height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlRenderbufferStorageMultisample coder(observations, target, samples,
                                                               format, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilMask(uint32_t mask) {
    GAPID_INFO("glStencilMask(%" PRIu32 ")\n", mask);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_619_major = 2;
        uint32_t l_minRequiredVersion_619_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_620_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_620_result;
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_FRONT] = mask;
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_BACK] = mask;
        observe(observations.mReads);
        mImports.glStencilMask(mask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilMask coder(observations, mask);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glStencilMaskSeparate(uint32_t face, uint32_t mask) {
    GAPID_INFO("glStencilMaskSeparate(%u, %" PRIu32 ")\n", face, mask);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_621_major = 2;
        uint32_t l_minRequiredVersion_621_minor = 0;
        switch (face) {
            case GLenum::GL_BACK:   // fall-through...
            case GLenum::GL_FRONT:  // fall-through...
            case GLenum::GL_FRONT_AND_BACK: {
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_623_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_623_result;
        switch (face) {
            case GLenum::GL_FRONT: {
                l_ctx->mRasterizing.mStencilMask[GLenum::GL_FRONT] = mask;
                break;
            }
            case GLenum::GL_BACK: {
                l_ctx->mRasterizing.mStencilMask[GLenum::GL_BACK] = mask;
                break;
            }
            case GLenum::GL_FRONT_AND_BACK: {
                l_ctx->mRasterizing.mStencilMask[GLenum::GL_FRONT] = mask;
                l_ctx->mRasterizing.mStencilMask[GLenum::GL_BACK] = mask;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glStencilMaskSeparate(face, mask);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlStencilMaskSeparate coder(observations, face, mask);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDisable(uint32_t capability) {
    GAPID_INFO("glDisable(%u)\n", capability);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_624_major = 2;
        uint32_t l_minRequiredVersion_624_minor = 0;
        switch (capability) {
            case GLenum::GL_BLEND:                     // fall-through...
            case GLenum::GL_CULL_FACE:                 // fall-through...
            case GLenum::GL_DEPTH_TEST:                // fall-through...
            case GLenum::GL_DITHER:                    // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FILL:       // fall-through...
            case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE:  // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE:           // fall-through...
            case GLenum::GL_SCISSOR_TEST:              // fall-through...
            case GLenum::GL_STENCIL_TEST: {
                break;
            }
            case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX:  // fall-through...
            case GLenum::GL_RASTERIZER_DISCARD: {
                uint32_t l_minRequiredVersion_625_major = 3;
                uint32_t l_minRequiredVersion_625_minor = 0;
                break;
            }
            case GLenum::GL_SAMPLE_MASK: {
                uint32_t l_minRequiredVersion_626_major = 3;
                uint32_t l_minRequiredVersion_626_minor = 1;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_628_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_628_result;
        l_ctx->mCapabilities[capability] = false;
        observe(observations.mReads);
        mImports.glDisable(capability);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDisable coder(observations, capability);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEnable(uint32_t capability) {
    GAPID_INFO("glEnable(%u)\n", capability);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_629_major = 2;
        uint32_t l_minRequiredVersion_629_minor = 0;
        switch (capability) {
            case GLenum::GL_BLEND:                     // fall-through...
            case GLenum::GL_CULL_FACE:                 // fall-through...
            case GLenum::GL_DEPTH_TEST:                // fall-through...
            case GLenum::GL_DITHER:                    // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FILL:       // fall-through...
            case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE:  // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE:           // fall-through...
            case GLenum::GL_SCISSOR_TEST:              // fall-through...
            case GLenum::GL_STENCIL_TEST: {
                break;
            }
            case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX:  // fall-through...
            case GLenum::GL_RASTERIZER_DISCARD: {
                uint32_t l_minRequiredVersion_630_major = 3;
                uint32_t l_minRequiredVersion_630_minor = 0;
                break;
            }
            case GLenum::GL_SAMPLE_MASK: {
                uint32_t l_minRequiredVersion_631_major = 3;
                uint32_t l_minRequiredVersion_631_minor = 1;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_633_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_633_result;
        l_ctx->mCapabilities[capability] = true;
        observe(observations.mReads);
        mImports.glEnable(capability);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEnable coder(observations, capability);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFinish() {
    GAPID_INFO("glFinish()\n");

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_634_major = 2;
        uint32_t l_minRequiredVersion_634_minor = 0;
        observe(observations.mReads);
        mImports.glFinish();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFinish coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFlush() {
    GAPID_INFO("glFlush()\n");

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_635_major = 2;
        uint32_t l_minRequiredVersion_635_minor = 0;
        observe(observations.mReads);
        mImports.glFlush();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFlush coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFlushMappedBufferRange(uint32_t target, int32_t offset, int32_t length) {
    GAPID_INFO("glFlushMappedBufferRange(%u, %" PRId32 ", %" PRId32 ")\n", target, offset, length);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_636_major = 3;
        uint32_t l_minRequiredVersion_636_minor = 0;
        switch (target) {
            case GLenum::GL_ARRAY_BUFFER:               // fall-through...
            case GLenum::GL_COPY_READ_BUFFER:           // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER:          // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER:       // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER:          // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM_BUFFER: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glFlushMappedBufferRange(target, offset, length);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFlushMappedBufferRange coder(observations, target, offset, length);
    mEncoder->Object(&coder);
}

inline uint32_t GlesSpy::glGetError() {
    GAPID_INFO("glGetError()\n");

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_638_major = 2;
        uint32_t l_minRequiredVersion_638_minor = 0;
        observe(observations.mReads);
        result = mImports.glGetError();
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetError coder(observations, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glHint(uint32_t target, uint32_t mode) {
    GAPID_INFO("glHint(%u, %u)\n", target, mode);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_639_major = 2;
        uint32_t l_minRequiredVersion_639_minor = 0;
        switch (target) {
            case GLenum::GL_GENERATE_MIPMAP_HINT: {
                break;
            }
            case GLenum::GL_FRAGMENT_SHADER_DERIVATIVE_HINT: {
                uint32_t l_minRequiredVersion_640_major = 3;
                uint32_t l_minRequiredVersion_640_minor = 0;
                break;
            }
        }
        switch (mode) {
            case GLenum::GL_DONT_CARE:  // fall-through...
            case GLenum::GL_FASTEST:    // fall-through...
            case GLenum::GL_NICEST: {
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_643_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_643_result;
        l_ctx->mGenerateMipmapHint = mode;
        observe(observations.mReads);
        mImports.glHint(target, mode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlHint coder(observations, target, mode);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glActiveShaderProgram(uint32_t pipeline, uint32_t program) {
    GAPID_INFO("glActiveShaderProgram(%" PRIu32 ", %" PRIu32 ")\n", pipeline, program);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_644_major = 3;
        uint32_t l_minRequiredVersion_644_minor = 1;
        observe(observations.mReads);
        mImports.glActiveShaderProgram(pipeline, program);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlActiveShaderProgram coder(observations, pipeline, program);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glAttachShader(uint32_t program, uint32_t shader) {
    GAPID_INFO("glAttachShader(%" PRIu32 ", %" PRIu32 ")\n", program, shader);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_645_major = 2;
        uint32_t l_minRequiredVersion_645_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_646_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_646_result;
        std::shared_ptr<Program> l_p = l_ctx->mInstances.mPrograms[program];
        std::shared_ptr<Shader> l_s = l_ctx->mInstances.mShaders[shader];
        l_p->mShaders[l_s->mType] = shader;
        observe(observations.mReads);
        mImports.glAttachShader(program, shader);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlAttachShader coder(observations, program, shader);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindAttribLocation(uint32_t program, uint32_t location, char* name) {
    GAPID_INFO("glBindAttribLocation(%" PRIu32 ", %" PRIu32 ", %s)\n", program, location, name);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_647_major = 2;
        uint32_t l_minRequiredVersion_647_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_648_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_648_result;
        std::shared_ptr<Program> l_p = l_ctx->mInstances.mPrograms[program];
        l_p->mAttributeBindings[name] = location;
        observe(observations.mReads);
        mImports.glBindAttribLocation(program, location, name);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindAttribLocation coder(observations, program, location, name);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindProgramPipeline(uint32_t pipeline) {
    GAPID_INFO("glBindProgramPipeline(%" PRIu32 ")\n", pipeline);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_649_major = 3;
        uint32_t l_minRequiredVersion_649_minor = 1;
        observe(observations.mReads);
        mImports.glBindProgramPipeline(pipeline);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindProgramPipeline coder(observations, pipeline);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCompileShader(uint32_t shader) {
    GAPID_INFO("glCompileShader(%" PRIu32 ")\n", shader);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_650_major = 2;
        uint32_t l_minRequiredVersion_650_minor = 0;
        observe(observations.mReads);
        mImports.glCompileShader(shader);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCompileShader coder(observations, shader);
    mEncoder->Object(&coder);
}

inline uint32_t GlesSpy::glCreateProgram() {
    GAPID_INFO("glCreateProgram()\n");

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_651_major = 2;
        uint32_t l_minRequiredVersion_651_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_652_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_652_result;
        observe(observations.mReads);
        result = mImports.glCreateProgram();
        ProgramId l_id = (ProgramId)(result);
        l_ctx->mInstances.mPrograms[l_id] = std::shared_ptr<Program>((new Program()));
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCreateProgram coder(observations, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint32_t GlesSpy::glCreateShader(uint32_t type) {
    GAPID_INFO("glCreateShader(%u)\n", type);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_653_major = 2;
        uint32_t l_minRequiredVersion_653_minor = 0;
        switch (type) {
            case GLenum::GL_FRAGMENT_SHADER:  // fall-through...
            case GLenum::GL_VERTEX_SHADER: {
                break;
            }
            case GLenum::GL_COMPUTE_SHADER: {
                uint32_t l_minRequiredVersion_654_major = 3;
                uint32_t l_minRequiredVersion_654_minor = 1;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_656_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_656_result;
        observe(observations.mReads);
        result = mImports.glCreateShader(type);
        ShaderId l_id = (ShaderId)(result);
        l_ctx->mInstances.mShaders[l_id] = std::shared_ptr<Shader>((new Shader()));
        std::shared_ptr<Shader> l_s = l_ctx->mInstances.mShaders[l_id];
        l_s->mType = type;
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCreateShader coder(observations, type, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint32_t GlesSpy::glCreateShaderProgramv(uint32_t type, int32_t count, char** strings) {
    GAPID_INFO("glCreateShaderProgramv(%u, %" PRId32 ", %p)\n", type, count, strings);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_657_major = 3;
        uint32_t l_minRequiredVersion_657_minor = 1;
        switch (type) {
            case GLenum::GL_COMPUTE_SHADER:   // fall-through...
            case GLenum::GL_FRAGMENT_SHADER:  // fall-through...
            case GLenum::GL_VERTEX_SHADER: {
                break;
            }
        }
        observe(observations.mReads);
        result = mImports.glCreateShaderProgramv(type, count, strings);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCreateShaderProgramv coder(
            observations, type, count,
            gapic::coder::gles::GLchar__CP__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(strings), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glDeleteProgram(uint32_t program) {
    GAPID_INFO("glDeleteProgram(%" PRIu32 ")\n", program);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_659_major = 2;
        uint32_t l_minRequiredVersion_659_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_660_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_660_result;
        l_ctx->mInstances.mPrograms[program] = std::shared_ptr<Program>();
        observe(observations.mReads);
        mImports.glDeleteProgram(program);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteProgram coder(observations, program);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteProgramPipelines(int32_t n, uint32_t* pipelines) {
    GAPID_INFO("glDeleteProgramPipelines(%" PRId32 ", %p)\n", n, pipelines);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_661_major = 3;
        uint32_t l_minRequiredVersion_661_minor = 1;
        observe(observations.mReads);
        mImports.glDeleteProgramPipelines(n, pipelines);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteProgramPipelines coder(
            observations, n, gapic::coder::gles::PipelineId__CP(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(pipelines), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteShader(uint32_t shader) {
    GAPID_INFO("glDeleteShader(%" PRIu32 ")\n", shader);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_662_major = 2;
        uint32_t l_minRequiredVersion_662_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_663_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_663_result;
        std::shared_ptr<Shader> l_s = l_ctx->mInstances.mShaders[shader];
        l_s->mDeletable = true;
        l_ctx->mInstances.mShaders[shader] = std::shared_ptr<Shader>();
        observe(observations.mReads);
        mImports.glDeleteShader(shader);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteShader coder(observations, shader);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDetachShader(uint32_t program, uint32_t shader) {
    GAPID_INFO("glDetachShader(%" PRIu32 ", %" PRIu32 ")\n", program, shader);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_664_major = 2;
        uint32_t l_minRequiredVersion_664_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_665_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_665_result;
        std::shared_ptr<Program> l_p = l_ctx->mInstances.mPrograms[program];
        std::shared_ptr<Shader> l_s = l_ctx->mInstances.mShaders[shader];
        l_p->mShaders[l_s->mType] = 0;
        observe(observations.mReads);
        mImports.glDetachShader(program, shader);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDetachShader coder(observations, program, shader);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDispatchCompute(uint32_t num_groups_x, uint32_t num_groups_y,
                                       uint32_t num_groups_z) {
    GAPID_INFO("glDispatchCompute(%" PRIu32 ", %" PRIu32 ", %" PRIu32 ")\n", num_groups_x,
               num_groups_y, num_groups_z);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_666_major = 3;
        uint32_t l_minRequiredVersion_666_minor = 1;
        observe(observations.mReads);
        mImports.glDispatchCompute(num_groups_x, num_groups_y, num_groups_z);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDispatchCompute coder(observations, num_groups_x, num_groups_y,
                                                num_groups_z);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDispatchComputeIndirect(int32_t indirect) {
    GAPID_INFO("glDispatchComputeIndirect(%" PRId32 ")\n", indirect);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_667_major = 3;
        uint32_t l_minRequiredVersion_667_minor = 1;
        observe(observations.mReads);
        mImports.glDispatchComputeIndirect(indirect);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDispatchComputeIndirect coder(observations, indirect);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenProgramPipelines(int32_t n, uint32_t* pipelines) {
    GAPID_INFO("glGenProgramPipelines(%" PRId32 ", %p)\n", n, pipelines);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_668_major = 3;
        uint32_t l_minRequiredVersion_668_minor = 1;
        observe(observations.mReads);
        mImports.glGenProgramPipelines(n, pipelines);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenProgramPipelines coder(
            observations, n, gapic::coder::gles::PipelineId__P(gapic::coder::memory::Pointer(
                                     reinterpret_cast<uintptr_t>(pipelines), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetActiveAttrib(uint32_t program, uint32_t location, int32_t buffer_size,
                                       int32_t* buffer_bytes_written, int32_t* vector_count,
                                       uint32_t* type, char* name) {
    GAPID_INFO("glGetActiveAttrib(%" PRIu32 ", %" PRIu32 ", %" PRId32 ", %p, %p, %p, %p)\n",
               program, location, buffer_size, buffer_bytes_written, vector_count, type, name);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_669_major = 2;
        uint32_t l_minRequiredVersion_669_minor = 0;
        observe(observations.mReads);
        mImports.glGetActiveAttrib(program, location, buffer_size, buffer_bytes_written,
                                   vector_count, type, name);
        if (buffer_bytes_written != nullptr) {
            GLsizei l_l = (GLsizei)(slice(buffer_bytes_written, 0, 1)[0]);
            write(slice(buffer_bytes_written, 0, 1), 0, l_l);
            write(slice(name, (uint64_t)((GLsizei)(0)), (uint64_t)(l_l)));
        } else {
            write(slice(name, 0, 256));
        }
        write(slice(vector_count, 0, 1), 0, (GLint)(slice(vector_count, 0, 1)[0]));
        write(slice(type, 0, 1), 0, (uint32_t)(slice(type, 0, 1)[0]));
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetActiveAttrib coder(
            observations, program, location, buffer_size,
            gapic::coder::gles::GLsizei__P(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(buffer_bytes_written), 0)),
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(vector_count), 0)),
            gapic::coder::gles::GLenum__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(type), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(name), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetActiveUniform(uint32_t program, uint32_t location, int32_t buffer_size,
                                        int32_t* buffer_bytes_written, int32_t* vector_count,
                                        uint32_t* type, char* name) {
    GAPID_INFO("glGetActiveUniform(%" PRIu32 ", %" PRIu32 ", %" PRId32 ", %p, %p, %p, %p)\n",
               program, location, buffer_size, buffer_bytes_written, vector_count, type, name);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_670_major = 2;
        uint32_t l_minRequiredVersion_670_minor = 0;
        observe(observations.mReads);
        mImports.glGetActiveUniform(program, location, buffer_size, buffer_bytes_written,
                                    vector_count, type, name);
        if (buffer_bytes_written != nullptr) {
            GLsizei l_l = (GLsizei)(slice(buffer_bytes_written, 0, 1)[0]);
            write(slice(buffer_bytes_written, 0, 1), 0, l_l);
            write(slice(name, (uint64_t)((GLsizei)(0)), (uint64_t)(l_l)));
        } else {
            write(slice(name, 0, 256));
        }
        write(slice(vector_count, 0, 1), 0, (GLint)(slice(vector_count, 0, 1)[0]));
        write(slice(type, 0, 1), 0, (uint32_t)(slice(type, 0, 1)[0]));
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetActiveUniform coder(
            observations, program, location, buffer_size,
            gapic::coder::gles::GLsizei__P(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(buffer_bytes_written), 0)),
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(vector_count), 0)),
            gapic::coder::gles::GLenum__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(type), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(name), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetActiveUniformBlockName(uint32_t program, uint32_t uniform_block_index,
                                                 int32_t buffer_size, int32_t* buffer_bytes_written,
                                                 char* name) {
    GAPID_INFO("glGetActiveUniformBlockName(%" PRIu32 ", %" PRIu32 ", %" PRId32 ", %p, %p)\n",
               program, uniform_block_index, buffer_size, buffer_bytes_written, name);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_671_major = 3;
        uint32_t l_minRequiredVersion_671_minor = 0;
        observe(observations.mReads);
        mImports.glGetActiveUniformBlockName(program, uniform_block_index, buffer_size,
                                             buffer_bytes_written, name);
        GLsizei l_l = (GLsizei)(slice(buffer_bytes_written, 0, 1)[0]);
        write(slice(buffer_bytes_written, 0, 1), 0, l_l);
        write(slice(name, (uint64_t)((GLsizei)(0)), (uint64_t)(l_l)));
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetActiveUniformBlockName coder(
            observations, program, uniform_block_index, buffer_size,
            gapic::coder::gles::GLsizei__P(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(buffer_bytes_written), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(name), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetActiveUniformBlockiv(uint32_t program, uint32_t uniform_block_index,
                                               uint32_t parameter_name, int32_t* parameters) {
    GAPID_INFO("glGetActiveUniformBlockiv(%" PRIu32 ", %" PRIu32 ", %u, %p)\n", program,
               uniform_block_index, parameter_name, parameters);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_672_major = 3;
        uint32_t l_minRequiredVersion_672_minor = 0;
        switch (parameter_name) {
            case GLenum::GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:                // fall-through...
            case GLenum::GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:         // fall-through...
            case GLenum::GL_UNIFORM_BLOCK_BINDING:                        // fall-through...
            case GLenum::GL_UNIFORM_BLOCK_DATA_SIZE:                      // fall-through...
            case GLenum::GL_UNIFORM_BLOCK_NAME_LENGTH:                    // fall-through...
            case GLenum::GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:  // fall-through...
            case GLenum::GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetActiveUniformBlockiv(program, uniform_block_index, parameter_name,
                                           parameters);
        write(slice(parameters, 0, 1), 0, slice(parameters, 0, 1)[0]);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetActiveUniformBlockiv coder(
            observations, program, uniform_block_index, parameter_name,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(parameters), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetActiveUniformsiv(uint32_t program, int32_t uniform_count,
                                           uint32_t* uniform_indices, uint32_t parameter_name,
                                           int32_t* parameters) {
    GAPID_INFO("glGetActiveUniformsiv(%" PRIu32 ", %" PRId32 ", %p, %u, %p)\n", program,
               uniform_count, uniform_indices, parameter_name, parameters);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_674_major = 3;
        uint32_t l_minRequiredVersion_674_minor = 0;
        switch (parameter_name) {
            case GLenum::GL_UNIFORM_ARRAY_STRIDE:   // fall-through...
            case GLenum::GL_UNIFORM_BLOCK_INDEX:    // fall-through...
            case GLenum::GL_UNIFORM_IS_ROW_MAJOR:   // fall-through...
            case GLenum::GL_UNIFORM_MATRIX_STRIDE:  // fall-through...
            case GLenum::GL_UNIFORM_NAME_LENGTH:    // fall-through...
            case GLenum::GL_UNIFORM_OFFSET:         // fall-through...
            case GLenum::GL_UNIFORM_SIZE:           // fall-through...
            case GLenum::GL_UNIFORM_TYPE: {
                break;
            }
        }
        read(slice(uniform_indices, (uint64_t)((GLsizei)(0)), (uint64_t)(uniform_count)));
        observe(observations.mReads);
        mImports.glGetActiveUniformsiv(program, uniform_count, uniform_indices, parameter_name,
                                       parameters);
        write(slice(parameters, (uint64_t)((GLsizei)(0)), (uint64_t)(uniform_count)));
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetActiveUniformsiv coder(
            observations, program, uniform_count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(uniform_indices), 0)),
            parameter_name, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                    reinterpret_cast<uintptr_t>(parameters), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetAttachedShaders(uint32_t program, int32_t buffer_length,
                                          int32_t* shaders_length_written, uint32_t* shaders) {
    GAPID_INFO("glGetAttachedShaders(%" PRIu32 ", %" PRId32 ", %p, %p)\n", program, buffer_length,
               shaders_length_written, shaders);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_676_major = 2;
        uint32_t l_minRequiredVersion_676_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_677_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_677_result;
        std::shared_ptr<Program> l_p = l_ctx->mInstances.mPrograms[program];
        int32_t l_min_678_a = (int32_t)(buffer_length);
        int32_t l_min_678_b = int32_t((l_p->mShaders.size()));
        int32_t l_min_678_result = /* clang-format off */
        /* switch(l_min_678_a < l_min_678_b) */
            /* case true: */(((l_min_678_a < l_min_678_b) == (true))) ? (l_min_678_a) :
            /* case false: */(((l_min_678_a < l_min_678_b) == (false))) ? (l_min_678_b) :
            /* default: */ 0 /* clang-format on */;
        int32_t l_l = l_min_678_result;
        observe(observations.mReads);
        mImports.glGetAttachedShaders(program, buffer_length, shaders_length_written, shaders);
        write(slice(shaders_length_written, 0, 1), 0, (GLsizei)(l_l));
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetAttachedShaders coder(
            observations, program, buffer_length,
            gapic::coder::gles::GLsizei__P(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(shaders_length_written), 0)),
            gapic::coder::gles::ShaderId__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(shaders), 0)));
    mEncoder->Object(&coder);
}

inline int32_t GlesSpy::glGetAttribLocation(uint32_t program, char* name) {
    GAPID_INFO("glGetAttribLocation(%" PRIu32 ", %s)\n", program, name);

    int32_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_679_major = 2;
        uint32_t l_minRequiredVersion_679_minor = 0;
        observe(observations.mReads);
        result = mImports.glGetAttribLocation(program, name);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetAttribLocation coder(observations, program, name, result);
    mEncoder->Object(&coder);

    return result;
}

inline int32_t GlesSpy::glGetFragDataLocation(uint32_t program, char* name) {
    GAPID_INFO("glGetFragDataLocation(%" PRIu32 ", %p)\n", program, name);

    int32_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_680_major = 3;
        uint32_t l_minRequiredVersion_680_minor = 0;
        observe(observations.mReads);
        result = mImports.glGetFragDataLocation(program, name);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetFragDataLocation coder(
            observations, program, gapic::coder::gles::GLchar__CP(gapic::coder::memory::Pointer(
                                           reinterpret_cast<uintptr_t>(name), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glGetProgramBinary(uint32_t program, int32_t bufSize, int32_t* length,
                                        uint32_t* binaryFormat, void* binary) {
    GAPID_INFO("glGetProgramBinary(%" PRIu32 ", %" PRId32 ", %p, %p, %p)\n", program, bufSize,
               length, binaryFormat, binary);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_681_major = 3;
        uint32_t l_minRequiredVersion_681_minor = 0;
        observe(observations.mReads);
        mImports.glGetProgramBinary(program, bufSize, length, binaryFormat, binary);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramBinary coder(
            observations, program, bufSize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLenum__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(binaryFormat), 0)),
            gapic::coder::gles::Void__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(binary), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetProgramInfoLog(uint32_t program, int32_t buffer_length,
                                         int32_t* string_length_written, char* info) {
    GAPID_INFO("glGetProgramInfoLog(%" PRIu32 ", %" PRId32 ", %p, %p)\n", program, buffer_length,
               string_length_written, info);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_682_major = 2;
        uint32_t l_minRequiredVersion_682_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_683_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_683_result;
        std::shared_ptr<Program> l_p = l_ctx->mInstances.mPrograms[program];
        int32_t l_min_684_a = (int32_t)(buffer_length);
        int32_t l_min_684_b = int32_t((l_p->mInfoLog.count()));
        int32_t l_min_684_result = /* clang-format off */
        /* switch(l_min_684_a < l_min_684_b) */
            /* case true: */(((l_min_684_a < l_min_684_b) == (true))) ? (l_min_684_a) :
            /* case false: */(((l_min_684_a < l_min_684_b) == (false))) ? (l_min_684_b) :
            /* default: */ 0 /* clang-format on */;
        int32_t l_l = l_min_684_result;
        Slice<GLchar> copy__dst__ = copy(slice(info, (uint64_t)(0), (uint64_t)(l_l)),
                                         slice(l_p->mInfoLog, (uint64_t)(0), (uint64_t)(l_l)));
        observe(observations.mReads);
        mImports.glGetProgramInfoLog(program, buffer_length, string_length_written, info);
        write(copy__dst__);
        write(slice(string_length_written, 0, 1), 0, (GLsizei)(l_l));
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramInfoLog coder(
            observations, program, buffer_length,
            gapic::coder::gles::GLsizei__P(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(string_length_written), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(info), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetProgramInterfaceiv(uint32_t program, uint32_t programInterface,
                                             uint32_t pname, int32_t* params) {
    GAPID_INFO("glGetProgramInterfaceiv(%" PRIu32 ", %u, %u, %p)\n", program, programInterface,
               pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_685_major = 3;
        uint32_t l_minRequiredVersion_685_minor = 1;
        switch (programInterface) {
            case GLenum::GL_ATOMIC_COUNTER_BUFFER:       // fall-through...
            case GLenum::GL_BUFFER_VARIABLE:             // fall-through...
            case GLenum::GL_PROGRAM_INPUT:               // fall-through...
            case GLenum::GL_PROGRAM_OUTPUT:              // fall-through...
            case GLenum::GL_SHADER_STORAGE_BLOCK:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:   // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_VARYING:  // fall-through...
            case GLenum::GL_UNIFORM:                     // fall-through...
            case GLenum::GL_UNIFORM_BLOCK: {
                break;
            }
        }
        switch (pname) {
            case GLenum::GL_ACTIVE_RESOURCES:  // fall-through...
            case GLenum::GL_MAX_NAME_LENGTH:   // fall-through...
            case GLenum::GL_MAX_NUM_ACTIVE_VARIABLES: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetProgramInterfaceiv(program, programInterface, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramInterfaceiv coder(
            observations, program, programInterface, pname,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetProgramPipelineInfoLog(uint32_t pipeline, int32_t bufSize,
                                                 int32_t* length, char* infoLog) {
    GAPID_INFO("glGetProgramPipelineInfoLog(%" PRIu32 ", %" PRId32 ", %p, %p)\n", pipeline, bufSize,
               length, infoLog);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_688_major = 3;
        uint32_t l_minRequiredVersion_688_minor = 1;
        observe(observations.mReads);
        mImports.glGetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramPipelineInfoLog coder(
            observations, pipeline, bufSize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(infoLog), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetProgramPipelineiv(uint32_t pipeline, uint32_t pname, int32_t* params) {
    GAPID_INFO("glGetProgramPipelineiv(%" PRIu32 ", %u, %p)\n", pipeline, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_689_major = 3;
        uint32_t l_minRequiredVersion_689_minor = 1;
        switch (pname) {
            case GLenum::GL_ACTIVE_PROGRAM:   // fall-through...
            case GLenum::GL_COMPUTE_SHADER:   // fall-through...
            case GLenum::GL_FRAGMENT_SHADER:  // fall-through...
            case GLenum::GL_INFO_LOG_LENGTH:  // fall-through...
            case GLenum::GL_VALIDATE_STATUS:  // fall-through...
            case GLenum::GL_VERTEX_SHADER: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetProgramPipelineiv(pipeline, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramPipelineiv coder(
            observations, pipeline, pname,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline uint32_t GlesSpy::glGetProgramResourceIndex(uint32_t program, uint32_t programInterface,
                                                   char* name) {
    GAPID_INFO("glGetProgramResourceIndex(%" PRIu32 ", %u, %p)\n", program, programInterface, name);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_691_major = 3;
        uint32_t l_minRequiredVersion_691_minor = 1;
        switch (programInterface) {
            case GLenum::GL_BUFFER_VARIABLE:             // fall-through...
            case GLenum::GL_PROGRAM_INPUT:               // fall-through...
            case GLenum::GL_PROGRAM_OUTPUT:              // fall-through...
            case GLenum::GL_SHADER_STORAGE_BLOCK:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_VARYING:  // fall-through...
            case GLenum::GL_UNIFORM:                     // fall-through...
            case GLenum::GL_UNIFORM_BLOCK: {
                break;
            }
        }
        observe(observations.mReads);
        result = mImports.glGetProgramResourceIndex(program, programInterface, name);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramResourceIndex coder(
            observations, program, programInterface,
            gapic::coder::gles::GLchar__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(name), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline int32_t GlesSpy::glGetProgramResourceLocation(uint32_t program, uint32_t programInterface,
                                                     char* name) {
    GAPID_INFO("glGetProgramResourceLocation(%" PRIu32 ", %u, %p)\n", program, programInterface,
               name);

    int32_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_693_major = 3;
        uint32_t l_minRequiredVersion_693_minor = 1;
        switch (programInterface) {
            case GLenum::GL_PROGRAM_INPUT:              // fall-through...
            case GLenum::GL_PROGRAM_OUTPUT:             // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:  // fall-through...
            case GLenum::GL_UNIFORM: {
                break;
            }
        }
        observe(observations.mReads);
        result = mImports.glGetProgramResourceLocation(program, programInterface, name);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramResourceLocation coder(
            observations, program, programInterface,
            gapic::coder::gles::GLchar__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(name), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glGetProgramResourceName(uint32_t program, uint32_t programInterface,
                                              uint32_t index, int32_t bufSize, int32_t* length,
                                              char* name) {
    GAPID_INFO("glGetProgramResourceName(%" PRIu32 ", %u, %" PRIu32 ", %" PRId32 ", %p, %p)\n",
               program, programInterface, index, bufSize, length, name);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_695_major = 3;
        uint32_t l_minRequiredVersion_695_minor = 1;
        switch (programInterface) {
            case GLenum::GL_BUFFER_VARIABLE:             // fall-through...
            case GLenum::GL_PROGRAM_INPUT:               // fall-through...
            case GLenum::GL_PROGRAM_OUTPUT:              // fall-through...
            case GLenum::GL_SHADER_STORAGE_BLOCK:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_VARYING:  // fall-through...
            case GLenum::GL_UNIFORM:                     // fall-through...
            case GLenum::GL_UNIFORM_BLOCK: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetProgramResourceName(program, programInterface, index, bufSize, length, name);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramResourceName coder(
            observations, program, programInterface, index, bufSize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(name), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetProgramResourceiv(uint32_t program, uint32_t programInterface,
                                            uint32_t index, int32_t propCount, uint32_t* props,
                                            int32_t bufSize, int32_t* length, int32_t* params) {
    GAPID_INFO("glGetProgramResourceiv(%" PRIu32 ", %u, %" PRIu32 ", %" PRId32 ", %p, %" PRId32
               ", %p, %p)\n",
               program, programInterface, index, propCount, props, bufSize, length, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_697_major = 3;
        uint32_t l_minRequiredVersion_697_minor = 1;
        switch (programInterface) {
            case GLenum::GL_ATOMIC_COUNTER_BUFFER:       // fall-through...
            case GLenum::GL_BUFFER_VARIABLE:             // fall-through...
            case GLenum::GL_PROGRAM_INPUT:               // fall-through...
            case GLenum::GL_PROGRAM_OUTPUT:              // fall-through...
            case GLenum::GL_SHADER_STORAGE_BLOCK:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER:   // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_VARYING:  // fall-through...
            case GLenum::GL_UNIFORM:                     // fall-through...
            case GLenum::GL_UNIFORM_BLOCK: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetProgramResourceiv(program, programInterface, index, propCount, props, bufSize,
                                        length, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramResourceiv coder(
            observations, program, programInterface, index, propCount,
            gapic::coder::gles::GLenum__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(props), 0)),
            bufSize, gapic::coder::gles::GLsizei__P(
                             gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetProgramiv(uint32_t program, uint32_t parameter, int32_t* value) {
    GAPID_INFO("glGetProgramiv(%" PRIu32 ", %u, %p)\n", program, parameter, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_699_major = 2;
        uint32_t l_minRequiredVersion_699_minor = 0;
        switch (parameter) {
            case GLenum::GL_ACTIVE_ATTRIBUTES:            // fall-through...
            case GLenum::GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:  // fall-through...
            case GLenum::GL_ACTIVE_UNIFORMS:              // fall-through...
            case GLenum::GL_ACTIVE_UNIFORM_MAX_LENGTH:    // fall-through...
            case GLenum::GL_ATTACHED_SHADERS:             // fall-through...
            case GLenum::GL_DELETE_STATUS:                // fall-through...
            case GLenum::GL_INFO_LOG_LENGTH:              // fall-through...
            case GLenum::GL_LINK_STATUS:                  // fall-through...
            case GLenum::GL_VALIDATE_STATUS: {
                break;
            }
            case GLenum::GL_ACTIVE_UNIFORM_BLOCKS:                 // fall-through...
            case GLenum::GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:  // fall-through...
            case GLenum::GL_PROGRAM_BINARY_RETRIEVABLE_HINT:       // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_MODE:        // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_VARYINGS:           // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: {
                uint32_t l_minRequiredVersion_700_major = 3;
                uint32_t l_minRequiredVersion_700_minor = 0;
                break;
            }
            case GLenum::GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:  // fall-through...
            case GLenum::GL_COMPUTE_WORK_GROUP_SIZE:        // fall-through...
            case GLenum::GL_PROGRAM_SEPARABLE: {
                uint32_t l_minRequiredVersion_701_major = 3;
                uint32_t l_minRequiredVersion_701_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetProgramiv(program, parameter, value);
        write(slice(value, 0, 1), 0, slice(value, 0, 1)[0]);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetProgramiv coder(
            observations, program, parameter,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetShaderInfoLog(uint32_t shader, int32_t buffer_length,
                                        int32_t* string_length_written, char* info) {
    GAPID_INFO("glGetShaderInfoLog(%" PRIu32 ", %" PRId32 ", %p, %p)\n", shader, buffer_length,
               string_length_written, info);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_703_major = 2;
        uint32_t l_minRequiredVersion_703_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_704_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_704_result;
        std::shared_ptr<Shader> l_s = l_ctx->mInstances.mShaders[shader];
        int32_t l_min_705_a = (int32_t)(buffer_length);
        int32_t l_min_705_b = int32_t((l_s->mInfoLog.count()));
        int32_t l_min_705_result = /* clang-format off */
        /* switch(l_min_705_a < l_min_705_b) */
            /* case true: */(((l_min_705_a < l_min_705_b) == (true))) ? (l_min_705_a) :
            /* case false: */(((l_min_705_a < l_min_705_b) == (false))) ? (l_min_705_b) :
            /* default: */ 0 /* clang-format on */;
        int32_t l_l = l_min_705_result;
        Slice<GLchar> copy__dst__ = copy(slice(info, (uint64_t)(0), (uint64_t)(l_l)),
                                         slice(l_s->mInfoLog, (uint64_t)(0), (uint64_t)(l_l)));
        observe(observations.mReads);
        mImports.glGetShaderInfoLog(shader, buffer_length, string_length_written, info);
        write(copy__dst__);
        write(slice(string_length_written, 0, 1), 0, (GLsizei)(l_l));
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetShaderInfoLog coder(
            observations, shader, buffer_length,
            gapic::coder::gles::GLsizei__P(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(string_length_written), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(info), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetShaderPrecisionFormat(uint32_t shader_type, uint32_t precision_type,
                                                int32_t* range, int32_t* precision) {
    GAPID_INFO("glGetShaderPrecisionFormat(%u, %u, %p, %p)\n", shader_type, precision_type, range,
               precision);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_706_major = 2;
        uint32_t l_minRequiredVersion_706_minor = 0;
        switch (shader_type) {
            case GLenum::GL_FRAGMENT_SHADER:  // fall-through...
            case GLenum::GL_VERTEX_SHADER: {
                break;
            }
        }
        switch (precision_type) {
            case GLenum::GL_HIGH_FLOAT:    // fall-through...
            case GLenum::GL_HIGH_INT:      // fall-through...
            case GLenum::GL_LOW_FLOAT:     // fall-through...
            case GLenum::GL_LOW_INT:       // fall-through...
            case GLenum::GL_MEDIUM_FLOAT:  // fall-through...
            case GLenum::GL_MEDIUM_INT: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetShaderPrecisionFormat(shader_type, precision_type, range, precision);
        write(slice(range, 0, 2));
        write(slice(precision, 0, 1), 0, slice(precision, 0, 1)[0]);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetShaderPrecisionFormat coder(
            observations, shader_type, precision_type,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(range), 0)),
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(precision), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetShaderSource(uint32_t shader, int32_t buffer_length,
                                       int32_t* string_length_written, char* source) {
    GAPID_INFO("glGetShaderSource(%" PRIu32 ", %" PRId32 ", %p, %p)\n", shader, buffer_length,
               string_length_written, source);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_709_major = 2;
        uint32_t l_minRequiredVersion_709_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_710_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_710_result;
        std::shared_ptr<Shader> l_s = l_ctx->mInstances.mShaders[shader];
        int32_t l_min_711_a = (int32_t)(buffer_length);
        int32_t l_min_711_b = int32_t((l_s->mSource.size()));
        int32_t l_min_711_result = /* clang-format off */
        /* switch(l_min_711_a < l_min_711_b) */
            /* case true: */(((l_min_711_a < l_min_711_b) == (true))) ? (l_min_711_a) :
            /* case false: */(((l_min_711_a < l_min_711_b) == (false))) ? (l_min_711_b) :
            /* default: */ 0 /* clang-format on */;
        int32_t l_l = l_min_711_result;
        Slice<char> copy__dst__ = copy(slice((char*)(source), (uint64_t)(0), (uint64_t)(l_l)),
                                       slice(slice(l_s->mSource), (uint64_t)(0), (uint64_t)(l_l)));
        observe(observations.mReads);
        mImports.glGetShaderSource(shader, buffer_length, string_length_written, source);
        write(copy__dst__);
        write(slice(string_length_written, 0, 1), 0, (GLsizei)(l_l));
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetShaderSource coder(
            observations, shader, buffer_length,
            gapic::coder::gles::GLsizei__P(gapic::coder::memory::Pointer(
                    reinterpret_cast<uintptr_t>(string_length_written), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(source), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetShaderiv(uint32_t shader, uint32_t parameter, int32_t* value) {
    GAPID_INFO("glGetShaderiv(%" PRIu32 ", %u, %p)\n", shader, parameter, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_712_major = 2;
        uint32_t l_minRequiredVersion_712_minor = 0;
        switch (parameter) {
            case GLenum::GL_COMPILE_STATUS:        // fall-through...
            case GLenum::GL_DELETE_STATUS:         // fall-through...
            case GLenum::GL_INFO_LOG_LENGTH:       // fall-through...
            case GLenum::GL_SHADER_SOURCE_LENGTH:  // fall-through...
            case GLenum::GL_SHADER_TYPE: {
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_714_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_714_result;
        std::shared_ptr<Shader> l_s = l_ctx->mInstances.mShaders[shader];
        observe(observations.mReads);
        mImports.glGetShaderiv(shader, parameter, value);
        write(slice(value, 0, 1), 0, /* clang-format off */
        /* switch(parameter) */
            /* case GLenum::GL_SHADER_TYPE: */(((parameter) == (GLenum::GL_SHADER_TYPE))) ? ((GLint)(l_s->mType)) :
            /* case GLenum::GL_DELETE_STATUS: */(((parameter) == (GLenum::GL_DELETE_STATUS))) ? (/* clang-format off */
            /* switch(l_s->mDeletable) */
                /* case true: */(((l_s->mDeletable) == (true))) ? ((GLint)(1)) :
                /* case false: */(((l_s->mDeletable) == (false))) ? ((GLint)(0)) :
                /* default: */ 0 /* clang-format on */)
                              :
                              /* case GLenum::GL_COMPILE_STATUS: */ (
                                      ((parameter) == (GLenum::GL_COMPILE_STATUS)))
                                      ? (/* clang-format off */
            /* switch(l_s->mCompiled) */
                /* case true: */(((l_s->mCompiled) == (true))) ? ((GLint)(1)) :
                /* case false: */(((l_s->mCompiled) == (false))) ? ((GLint)(0)) :
                /* default: */ 0 /* clang-format on */)
                                      :
                                      /* case GLenum::GL_INFO_LOG_LENGTH: */ (
                                              ((parameter) == (GLenum::GL_INFO_LOG_LENGTH)))
                                              ? ((GLint)(int32_t((l_s->mInfoLog.count()))))
                                              :
                                              /* case GLenum::GL_SHADER_SOURCE_LENGTH: */ (
                                                      ((parameter) ==
                                                       (GLenum::GL_SHADER_SOURCE_LENGTH)))
                                                      ? ((GLint)(int32_t((l_s->mSource.size()))))
                                                      :
                                                      /* default: */ 0 /* clang-format on */);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetShaderiv coder(
            observations, shader, parameter,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline uint32_t GlesSpy::glGetUniformBlockIndex(uint32_t program, char* uniformBlockName) {
    GAPID_INFO("glGetUniformBlockIndex(%" PRIu32 ", %p)\n", program, uniformBlockName);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_715_major = 3;
        uint32_t l_minRequiredVersion_715_minor = 0;
        observe(observations.mReads);
        result = mImports.glGetUniformBlockIndex(program, uniformBlockName);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetUniformBlockIndex coder(
            observations, program, gapic::coder::gles::GLchar__CP(gapic::coder::memory::Pointer(
                                           reinterpret_cast<uintptr_t>(uniformBlockName), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glGetUniformIndices(uint32_t program, int32_t uniformCount,
                                         char** uniformNames, uint32_t* uniformIndices) {
    GAPID_INFO("glGetUniformIndices(%" PRIu32 ", %" PRId32 ", %p, %p)\n", program, uniformCount,
               uniformNames, uniformIndices);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_716_major = 3;
        uint32_t l_minRequiredVersion_716_minor = 0;
        observe(observations.mReads);
        mImports.glGetUniformIndices(program, uniformCount, uniformNames, uniformIndices);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetUniformIndices coder(
            observations, program, uniformCount,
            gapic::coder::gles::GLchar__CP__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(uniformNames), 0)),
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(uniformIndices), 0)));
    mEncoder->Object(&coder);
}

inline int32_t GlesSpy::glGetUniformLocation(uint32_t program, char* name) {
    GAPID_INFO("glGetUniformLocation(%" PRIu32 ", %s)\n", program, name);

    int32_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_717_major = 2;
        uint32_t l_minRequiredVersion_717_minor = 0;
        observe(observations.mReads);
        result = mImports.glGetUniformLocation(program, name);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetUniformLocation coder(observations, program, name, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glGetUniformfv(uint32_t program, int32_t location, float* values) {
    GAPID_INFO("glGetUniformfv(%" PRIu32 ", %" PRId32 ", %p)\n", program, location, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_718_major = 2;
        uint32_t l_minRequiredVersion_718_minor = 0;
        observe(observations.mReads);
        mImports.glGetUniformfv(program, location, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetUniformfv coder(
            observations, program, location,
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetUniformiv(uint32_t program, int32_t location, int32_t* values) {
    GAPID_INFO("glGetUniformiv(%" PRIu32 ", %" PRId32 ", %p)\n", program, location, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_719_major = 2;
        uint32_t l_minRequiredVersion_719_minor = 0;
        observe(observations.mReads);
        mImports.glGetUniformiv(program, location, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetUniformiv coder(
            observations, program, location,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetUniformuiv(uint32_t program, int32_t location, uint32_t* params) {
    GAPID_INFO("glGetUniformuiv(%" PRIu32 ", %" PRId32 ", %p)\n", program, location, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_720_major = 3;
        uint32_t l_minRequiredVersion_720_minor = 0;
        observe(observations.mReads);
        mImports.glGetUniformuiv(program, location, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetUniformuiv coder(
            observations, program, location,
            gapic::coder::gles::GLuint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glIsProgram(uint32_t program) {
    GAPID_INFO("glIsProgram(%" PRIu32 ")\n", program);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_721_major = 2;
        uint32_t l_minRequiredVersion_721_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_722_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_722_result;
        observe(observations.mReads);
        result = mImports.glIsProgram(program);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsProgram coder(observations, program, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsProgramPipeline(uint32_t pipeline) {
    GAPID_INFO("glIsProgramPipeline(%" PRIu32 ")\n", pipeline);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_723_major = 3;
        uint32_t l_minRequiredVersion_723_minor = 1;
        observe(observations.mReads);
        result = mImports.glIsProgramPipeline(pipeline);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsProgramPipeline coder(observations, pipeline, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsShader(uint32_t shader) {
    GAPID_INFO("glIsShader(%" PRIu32 ")\n", shader);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_724_major = 2;
        uint32_t l_minRequiredVersion_724_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_725_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_725_result;
        observe(observations.mReads);
        result = mImports.glIsShader(shader);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsShader coder(observations, shader, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glLinkProgram(uint32_t program) {
    GAPID_INFO("glLinkProgram(%" PRIu32 ")\n", program);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_726_major = 2;
        uint32_t l_minRequiredVersion_726_minor = 0;
        observe(observations.mReads);
        mImports.glLinkProgram(program);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlLinkProgram coder(observations, program);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMemoryBarrier(uint32_t barriers) {
    GAPID_INFO("glMemoryBarrier(%u)\n", barriers);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_727_major = 3;
        uint32_t l_minRequiredVersion_727_minor = 1;
        uint32_t l_supportsBits_728_seenBits = barriers;
        uint32_t l_supportsBits_728_validBits =
                GLbitfield::GL_ALL_BARRIER_BITS | GLbitfield::GL_ATOMIC_COUNTER_BARRIER_BIT |
                GLbitfield::GL_BUFFER_UPDATE_BARRIER_BIT | GLbitfield::GL_COMMAND_BARRIER_BIT |
                GLbitfield::GL_ELEMENT_ARRAY_BARRIER_BIT | GLbitfield::GL_FRAMEBUFFER_BARRIER_BIT |
                GLbitfield::GL_PIXEL_BUFFER_BARRIER_BIT |
                GLbitfield::GL_SHADER_IMAGE_ACCESS_BARRIER_BIT |
                GLbitfield::GL_SHADER_STORAGE_BARRIER_BIT |
                GLbitfield::GL_TEXTURE_FETCH_BARRIER_BIT |
                GLbitfield::GL_TEXTURE_UPDATE_BARRIER_BIT |
                GLbitfield::GL_TRANSFORM_FEEDBACK_BARRIER_BIT | GLbitfield::GL_UNIFORM_BARRIER_BIT |
                GLbitfield::GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT;
        if ((barriers & GLbitfield::GL_ALL_BARRIER_BITS) != 0) {
        }
        if ((barriers & GLbitfield::GL_ATOMIC_COUNTER_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_BUFFER_UPDATE_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_COMMAND_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_ELEMENT_ARRAY_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_FRAMEBUFFER_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_PIXEL_BUFFER_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_SHADER_IMAGE_ACCESS_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_SHADER_STORAGE_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_TEXTURE_FETCH_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_TEXTURE_UPDATE_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_TRANSFORM_FEEDBACK_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_UNIFORM_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT) != 0) {
        }
        observe(observations.mReads);
        mImports.glMemoryBarrier(barriers);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMemoryBarrier coder(observations, barriers);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glMemoryBarrierByRegion(uint32_t barriers) {
    GAPID_INFO("glMemoryBarrierByRegion(%u)\n", barriers);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_729_major = 3;
        uint32_t l_minRequiredVersion_729_minor = 1;
        uint32_t l_supportsBits_730_seenBits = barriers;
        uint32_t l_supportsBits_730_validBits =
                GLbitfield::GL_ALL_BARRIER_BITS | GLbitfield::GL_ATOMIC_COUNTER_BARRIER_BIT |
                GLbitfield::GL_BUFFER_UPDATE_BARRIER_BIT | GLbitfield::GL_COMMAND_BARRIER_BIT |
                GLbitfield::GL_ELEMENT_ARRAY_BARRIER_BIT | GLbitfield::GL_FRAMEBUFFER_BARRIER_BIT |
                GLbitfield::GL_PIXEL_BUFFER_BARRIER_BIT |
                GLbitfield::GL_SHADER_IMAGE_ACCESS_BARRIER_BIT |
                GLbitfield::GL_SHADER_STORAGE_BARRIER_BIT |
                GLbitfield::GL_TEXTURE_FETCH_BARRIER_BIT |
                GLbitfield::GL_TEXTURE_UPDATE_BARRIER_BIT |
                GLbitfield::GL_TRANSFORM_FEEDBACK_BARRIER_BIT | GLbitfield::GL_UNIFORM_BARRIER_BIT |
                GLbitfield::GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT;
        if ((barriers & GLbitfield::GL_ALL_BARRIER_BITS) != 0) {
        }
        if ((barriers & GLbitfield::GL_ATOMIC_COUNTER_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_BUFFER_UPDATE_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_COMMAND_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_ELEMENT_ARRAY_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_FRAMEBUFFER_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_PIXEL_BUFFER_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_SHADER_IMAGE_ACCESS_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_SHADER_STORAGE_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_TEXTURE_FETCH_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_TEXTURE_UPDATE_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_TRANSFORM_FEEDBACK_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_UNIFORM_BARRIER_BIT) != 0) {
        }
        if ((barriers & GLbitfield::GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT) != 0) {
        }
        observe(observations.mReads);
        mImports.glMemoryBarrierByRegion(barriers);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlMemoryBarrierByRegion coder(observations, barriers);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramBinary(uint32_t program, uint32_t binaryFormat, void* binary,
                                     int32_t length) {
    GAPID_INFO("glProgramBinary(%" PRIu32 ", %u, %p, %" PRId32 ")\n", program, binaryFormat, binary,
               length);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_731_major = 3;
        uint32_t l_minRequiredVersion_731_minor = 0;
        switch (binaryFormat) {}
        observe(observations.mReads);
        mImports.glProgramBinary(program, binaryFormat, binary, length);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramBinary coder(
            observations, program, binaryFormat,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(binary), 0)),
            length);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramParameteri(uint32_t program, uint32_t pname, int32_t value) {
    GAPID_INFO("glProgramParameteri(%" PRIu32 ", %u, %" PRId32 ")\n", program, pname, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_733_major = 3;
        uint32_t l_minRequiredVersion_733_minor = 0;
        switch (pname) {
            case GLenum::GL_PROGRAM_BINARY_RETRIEVABLE_HINT: {
                break;
            }
            case GLenum::GL_PROGRAM_SEPARABLE: {
                uint32_t l_minRequiredVersion_734_major = 3;
                uint32_t l_minRequiredVersion_734_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glProgramParameteri(program, pname, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramParameteri coder(observations, program, pname, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform1f(uint32_t program, int32_t location, float v0) {
    GAPID_INFO("glProgramUniform1f(%" PRIu32 ", %" PRId32 ", %f)\n", program, location, v0);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_736_major = 3;
        uint32_t l_minRequiredVersion_736_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform1f(program, location, v0);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform1f coder(observations, program, location, v0);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform1fv(uint32_t program, int32_t location, int32_t count,
                                         float* value) {
    GAPID_INFO("glProgramUniform1fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_737_major = 3;
        uint32_t l_minRequiredVersion_737_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform1fv(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform1fv coder(
            observations, program, location, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform1i(uint32_t program, int32_t location, int32_t v0) {
    GAPID_INFO("glProgramUniform1i(%" PRIu32 ", %" PRId32 ", %" PRId32 ")\n", program, location,
               v0);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_738_major = 3;
        uint32_t l_minRequiredVersion_738_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform1i(program, location, v0);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform1i coder(observations, program, location, v0);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform1iv(uint32_t program, int32_t location, int32_t count,
                                         int32_t* value) {
    GAPID_INFO("glProgramUniform1iv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_739_major = 3;
        uint32_t l_minRequiredVersion_739_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform1iv(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform1iv coder(
            observations, program, location, count,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform1ui(uint32_t program, int32_t location, uint32_t v0) {
    GAPID_INFO("glProgramUniform1ui(%" PRIu32 ", %" PRId32 ", %" PRIu32 ")\n", program, location,
               v0);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_740_major = 3;
        uint32_t l_minRequiredVersion_740_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform1ui(program, location, v0);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform1ui coder(observations, program, location, v0);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform1uiv(uint32_t program, int32_t location, int32_t count,
                                          uint32_t* value) {
    GAPID_INFO("glProgramUniform1uiv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_741_major = 3;
        uint32_t l_minRequiredVersion_741_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform1uiv(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform1uiv coder(
            observations, program, location, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform2f(uint32_t program, int32_t location, float v0, float v1) {
    GAPID_INFO("glProgramUniform2f(%" PRIu32 ", %" PRId32 ", %f, %f)\n", program, location, v0, v1);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_742_major = 3;
        uint32_t l_minRequiredVersion_742_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform2f(program, location, v0, v1);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform2f coder(observations, program, location, v0, v1);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform2fv(uint32_t program, int32_t location, int32_t count,
                                         float* value) {
    GAPID_INFO("glProgramUniform2fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_743_major = 3;
        uint32_t l_minRequiredVersion_743_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform2fv(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform2fv coder(
            observations, program, location, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform2i(uint32_t program, int32_t location, int32_t v0,
                                        int32_t v1) {
    GAPID_INFO("glProgramUniform2i(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ")\n", program,
               location, v0, v1);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_744_major = 3;
        uint32_t l_minRequiredVersion_744_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform2i(program, location, v0, v1);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform2i coder(observations, program, location, v0, v1);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform2iv(uint32_t program, int32_t location, int32_t count,
                                         int32_t* value) {
    GAPID_INFO("glProgramUniform2iv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_745_major = 3;
        uint32_t l_minRequiredVersion_745_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform2iv(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform2iv coder(
            observations, program, location, count,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform2ui(uint32_t program, int32_t location, uint32_t v0,
                                         uint32_t v1) {
    GAPID_INFO("glProgramUniform2ui(%" PRIu32 ", %" PRId32 ", %" PRIu32 ", %" PRIu32 ")\n", program,
               location, v0, v1);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_746_major = 3;
        uint32_t l_minRequiredVersion_746_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform2ui(program, location, v0, v1);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform2ui coder(observations, program, location, v0, v1);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform2uiv(uint32_t program, int32_t location, int32_t count,
                                          uint32_t* value) {
    GAPID_INFO("glProgramUniform2uiv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_747_major = 3;
        uint32_t l_minRequiredVersion_747_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform2uiv(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform2uiv coder(
            observations, program, location, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform3f(uint32_t program, int32_t location, float v0, float v1,
                                        float v2) {
    GAPID_INFO("glProgramUniform3f(%" PRIu32 ", %" PRId32 ", %f, %f, %f)\n", program, location, v0,
               v1, v2);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_748_major = 3;
        uint32_t l_minRequiredVersion_748_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform3f(program, location, v0, v1, v2);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform3f coder(observations, program, location, v0, v1, v2);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform3fv(uint32_t program, int32_t location, int32_t count,
                                         float* value) {
    GAPID_INFO("glProgramUniform3fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_749_major = 3;
        uint32_t l_minRequiredVersion_749_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform3fv(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform3fv coder(
            observations, program, location, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform3i(uint32_t program, int32_t location, int32_t v0, int32_t v1,
                                        int32_t v2) {
    GAPID_INFO("glProgramUniform3i(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ")\n",
               program, location, v0, v1, v2);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_750_major = 3;
        uint32_t l_minRequiredVersion_750_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform3i(program, location, v0, v1, v2);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform3i coder(observations, program, location, v0, v1, v2);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform3iv(uint32_t program, int32_t location, int32_t count,
                                         int32_t* value) {
    GAPID_INFO("glProgramUniform3iv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_751_major = 3;
        uint32_t l_minRequiredVersion_751_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform3iv(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform3iv coder(
            observations, program, location, count,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform3ui(uint32_t program, int32_t location, uint32_t v0,
                                         uint32_t v1, uint32_t v2) {
    GAPID_INFO("glProgramUniform3ui(%" PRIu32 ", %" PRId32 ", %" PRIu32 ", %" PRIu32 ", %" PRIu32
               ")\n",
               program, location, v0, v1, v2);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_752_major = 3;
        uint32_t l_minRequiredVersion_752_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform3ui(program, location, v0, v1, v2);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform3ui coder(observations, program, location, v0, v1, v2);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform3uiv(uint32_t program, int32_t location, int32_t count,
                                          uint32_t* value) {
    GAPID_INFO("glProgramUniform3uiv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_753_major = 3;
        uint32_t l_minRequiredVersion_753_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform3uiv(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform3uiv coder(
            observations, program, location, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform4f(uint32_t program, int32_t location, float v0, float v1,
                                        float v2, float v3) {
    GAPID_INFO("glProgramUniform4f(%" PRIu32 ", %" PRId32 ", %f, %f, %f, %f)\n", program, location,
               v0, v1, v2, v3);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_754_major = 3;
        uint32_t l_minRequiredVersion_754_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform4f(program, location, v0, v1, v2, v3);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform4f coder(observations, program, location, v0, v1, v2, v3);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform4fv(uint32_t program, int32_t location, int32_t count,
                                         float* value) {
    GAPID_INFO("glProgramUniform4fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_755_major = 3;
        uint32_t l_minRequiredVersion_755_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform4fv(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform4fv coder(
            observations, program, location, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform4i(uint32_t program, int32_t location, int32_t v0, int32_t v1,
                                        int32_t v2, int32_t v3) {
    GAPID_INFO("glProgramUniform4i(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ")\n",
               program, location, v0, v1, v2, v3);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_756_major = 3;
        uint32_t l_minRequiredVersion_756_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform4i(program, location, v0, v1, v2, v3);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform4i coder(observations, program, location, v0, v1, v2, v3);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform4iv(uint32_t program, int32_t location, int32_t count,
                                         int32_t* value) {
    GAPID_INFO("glProgramUniform4iv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_757_major = 3;
        uint32_t l_minRequiredVersion_757_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform4iv(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform4iv coder(
            observations, program, location, count,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform4ui(uint32_t program, int32_t location, uint32_t v0,
                                         uint32_t v1, uint32_t v2, uint32_t v3) {
    GAPID_INFO("glProgramUniform4ui(%" PRIu32 ", %" PRId32 ", %" PRIu32 ", %" PRIu32 ", %" PRIu32
               ", %" PRIu32 ")\n",
               program, location, v0, v1, v2, v3);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_758_major = 3;
        uint32_t l_minRequiredVersion_758_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform4ui(program, location, v0, v1, v2, v3);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform4ui coder(observations, program, location, v0, v1, v2, v3);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniform4uiv(uint32_t program, int32_t location, int32_t count,
                                          uint32_t* value) {
    GAPID_INFO("glProgramUniform4uiv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %p)\n", program,
               location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_759_major = 3;
        uint32_t l_minRequiredVersion_759_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniform4uiv(program, location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniform4uiv coder(
            observations, program, location, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix2fv(uint32_t program, int32_t location, int32_t count,
                                               uint8_t transpose, float* value) {
    GAPID_INFO("glProgramUniformMatrix2fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_760_major = 3;
        uint32_t l_minRequiredVersion_760_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix2fv(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix2fv coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix2x3fv(uint32_t program, int32_t location, int32_t count,
                                                 uint8_t transpose, float* value) {
    GAPID_INFO("glProgramUniformMatrix2x3fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_761_major = 3;
        uint32_t l_minRequiredVersion_761_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix2x3fv(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix2x3fv coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix2x4fv(uint32_t program, int32_t location, int32_t count,
                                                 uint8_t transpose, float* value) {
    GAPID_INFO("glProgramUniformMatrix2x4fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_762_major = 3;
        uint32_t l_minRequiredVersion_762_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix2x4fv(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix2x4fv coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix3fv(uint32_t program, int32_t location, int32_t count,
                                               uint8_t transpose, float* value) {
    GAPID_INFO("glProgramUniformMatrix3fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_763_major = 3;
        uint32_t l_minRequiredVersion_763_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix3fv(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix3fv coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix3x2fv(uint32_t program, int32_t location, int32_t count,
                                                 uint8_t transpose, float* value) {
    GAPID_INFO("glProgramUniformMatrix3x2fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_764_major = 3;
        uint32_t l_minRequiredVersion_764_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix3x2fv(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix3x2fv coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix3x4fv(uint32_t program, int32_t location, int32_t count,
                                                 uint8_t transpose, float* value) {
    GAPID_INFO("glProgramUniformMatrix3x4fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_765_major = 3;
        uint32_t l_minRequiredVersion_765_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix3x4fv(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix3x4fv coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix4fv(uint32_t program, int32_t location, int32_t count,
                                               uint8_t transpose, float* value) {
    GAPID_INFO("glProgramUniformMatrix4fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_766_major = 3;
        uint32_t l_minRequiredVersion_766_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix4fv(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix4fv coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix4x2fv(uint32_t program, int32_t location, int32_t count,
                                                 uint8_t transpose, float* value) {
    GAPID_INFO("glProgramUniformMatrix4x2fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_767_major = 3;
        uint32_t l_minRequiredVersion_767_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix4x2fv(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix4x2fv coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glProgramUniformMatrix4x3fv(uint32_t program, int32_t location, int32_t count,
                                                 uint8_t transpose, float* value) {
    GAPID_INFO("glProgramUniformMatrix4x3fv(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRIu8
               ", %p)\n",
               program, location, count, transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_768_major = 3;
        uint32_t l_minRequiredVersion_768_minor = 1;
        observe(observations.mReads);
        mImports.glProgramUniformMatrix4x3fv(program, location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlProgramUniformMatrix4x3fv coder(
            observations, program, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glReleaseShaderCompiler() {
    GAPID_INFO("glReleaseShaderCompiler()\n");

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_769_major = 2;
        uint32_t l_minRequiredVersion_769_minor = 0;
        observe(observations.mReads);
        mImports.glReleaseShaderCompiler();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlReleaseShaderCompiler coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glShaderBinary(int32_t count, uint32_t* shaders, uint32_t binary_format,
                                    void* binary, int32_t binary_size) {
    GAPID_INFO("glShaderBinary(%" PRId32 ", %p, %u, %p, %" PRId32 ")\n", count, shaders,
               binary_format, binary, binary_size);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_770_major = 2;
        uint32_t l_minRequiredVersion_770_minor = 0;
        switch (binary_format) {}
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
        }
        observe(observations.mReads);
        mImports.glShaderBinary(count, shaders, binary_format, binary, binary_size);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlShaderBinary coder(
            observations, count, gapic::coder::gles::ShaderId__CP(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(shaders), 0)),
            binary_format, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                                   reinterpret_cast<uintptr_t>(binary), 0)),
            binary_size);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glShaderSource(uint32_t shader, int32_t count, char** source,
                                    int32_t* length) {
    GAPID_INFO("glShaderSource(%" PRIu32 ", %" PRId32 ", %p, %p)\n", shader, count, source, length);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_772_major = 2;
        uint32_t l_minRequiredVersion_772_minor = 0;
        Slice<GLchar*> l_sources = slice(source, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        Slice<GLint> l_lengths = slice(length, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_773_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_773_result;
        std::shared_ptr<Shader> l_s = l_ctx->mInstances.mShaders[shader];
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            std::string l_str = /* clang-format off */
            /* switch(length == nullptr || read(l_lengths, (uint64_t)(l_i)) < (GLint)(0)) */
                /* case true: */(((length == nullptr || read(l_lengths, (uint64_t)(l_i)) < (GLint)(0)) == (true))) ? (string((char*)(read(l_sources, (uint64_t)(l_i))))) :
                /* case false: */(((length == nullptr || read(l_lengths, (uint64_t)(l_i)) < (GLint)(0)) == (false))) ? (string(slice((char*)(read(l_sources, (uint64_t)(l_i))), (uint64_t)((GLint)(0)), (uint64_t)(read(l_lengths, (uint64_t)(l_i)))))) :
                /* default: */ "" /* clang-format on */;
            l_s->mSource += l_str;
        }
        observe(observations.mReads);
        mImports.glShaderSource(shader, count, source, length);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlShaderSource coder(
            observations, shader, count,
            gapic::coder::gles::GLchar__CP__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(source), 0)),
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform1f(int32_t location, float value) {
    GAPID_INFO("glUniform1f(%" PRId32 ", %f)\n", location, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_774_major = 2;
        uint32_t l_minRequiredVersion_774_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_775_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_775_result;
        Slice<GLfloat> l_v = make<GLfloat>(1);
        observe(observations.mReads);
        mImports.glUniform1f(location, value);
        write(l_v, 0, value);
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_FLOAT;
        l_uniform.mValue = l_v.as<uint8_t>();
        l_program->mUniforms[location] = l_uniform;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform1f coder(observations, location, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform1fv(int32_t location, int32_t count, float* values) {
    GAPID_INFO("glUniform1fv(%" PRId32 ", %" PRId32 ", %p)\n", location, count, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_776_major = 2;
        uint32_t l_minRequiredVersion_776_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_777_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_777_result;
        Slice<GLfloat> l_v = slice(values, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_FLOAT;
        l_uniform.mValue = clone(l_v.as<uint8_t>());
        l_program->mUniforms[location] = l_uniform;
        observe(observations.mReads);
        mImports.glUniform1fv(location, count, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform1fv coder(
            observations, location, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform1i(int32_t location, int32_t value) {
    GAPID_INFO("glUniform1i(%" PRId32 ", %" PRId32 ")\n", location, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_778_major = 2;
        uint32_t l_minRequiredVersion_778_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_779_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_779_result;
        Slice<GLint> l_v = make<GLint>(1);
        observe(observations.mReads);
        mImports.glUniform1i(location, value);
        write(l_v, 0, value);
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_INT;
        l_uniform.mValue = l_v.as<uint8_t>();
        l_program->mUniforms[location] = l_uniform;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform1i coder(observations, location, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform1iv(int32_t location, int32_t count, int32_t* values) {
    GAPID_INFO("glUniform1iv(%" PRId32 ", %" PRId32 ", %p)\n", location, count, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_780_major = 2;
        uint32_t l_minRequiredVersion_780_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_781_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_781_result;
        Slice<GLint> l_v = slice(values, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_INT;
        l_uniform.mValue = clone(l_v.as<uint8_t>());
        l_program->mUniforms[location] = l_uniform;
        observe(observations.mReads);
        mImports.glUniform1iv(location, count, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform1iv coder(
            observations, location, count,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform1ui(int32_t location, uint32_t v0) {
    GAPID_INFO("glUniform1ui(%" PRId32 ", %" PRIu32 ")\n", location, v0);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_782_major = 3;
        uint32_t l_minRequiredVersion_782_minor = 0;
        observe(observations.mReads);
        mImports.glUniform1ui(location, v0);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform1ui coder(observations, location, v0);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform1uiv(int32_t location, int32_t count, uint32_t* value) {
    GAPID_INFO("glUniform1uiv(%" PRId32 ", %" PRId32 ", %p)\n", location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_783_major = 3;
        uint32_t l_minRequiredVersion_783_minor = 0;
        observe(observations.mReads);
        mImports.glUniform1uiv(location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform1uiv coder(
            observations, location, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform2f(int32_t location, float value0, float value1) {
    GAPID_INFO("glUniform2f(%" PRId32 ", %f, %f)\n", location, value0, value1);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_784_major = 2;
        uint32_t l_minRequiredVersion_784_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_785_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_785_result;
        Slice<Vec2f> l_v = make<Vec2f>(1);
        observe(observations.mReads);
        mImports.glUniform2f(location, value0, value1);
        write(l_v, 0, Vec2f{value0, value1});
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_FLOAT_VEC2;
        l_uniform.mValue = l_v.as<uint8_t>();
        l_program->mUniforms[location] = l_uniform;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform2f coder(observations, location, value0, value1);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform2fv(int32_t location, int32_t count, float* values) {
    GAPID_INFO("glUniform2fv(%" PRId32 ", %" PRId32 ", %p)\n", location, count, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_786_major = 2;
        uint32_t l_minRequiredVersion_786_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_787_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_787_result;
        Slice<Vec2f> l_v = slice((Vec2f*)(values), (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_FLOAT_VEC2;
        l_uniform.mValue = clone(l_v.as<uint8_t>());
        l_program->mUniforms[location] = l_uniform;
        observe(observations.mReads);
        mImports.glUniform2fv(location, count, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform2fv coder(
            observations, location, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform2i(int32_t location, int32_t value0, int32_t value1) {
    GAPID_INFO("glUniform2i(%" PRId32 ", %" PRId32 ", %" PRId32 ")\n", location, value0, value1);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_788_major = 2;
        uint32_t l_minRequiredVersion_788_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_789_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_789_result;
        Slice<Vec2i> l_v = make<Vec2i>(1);
        observe(observations.mReads);
        mImports.glUniform2i(location, value0, value1);
        write(l_v, 0, Vec2i{value0, value1});
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_INT_VEC2;
        l_uniform.mValue = l_v.as<uint8_t>();
        l_program->mUniforms[location] = l_uniform;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform2i coder(observations, location, value0, value1);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform2iv(int32_t location, int32_t count, int32_t* values) {
    GAPID_INFO("glUniform2iv(%" PRId32 ", %" PRId32 ", %p)\n", location, count, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_790_major = 2;
        uint32_t l_minRequiredVersion_790_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_791_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_791_result;
        Slice<Vec2i> l_v = slice((Vec2i*)(values), (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_INT_VEC2;
        l_uniform.mValue = clone(l_v.as<uint8_t>());
        l_program->mUniforms[location] = l_uniform;
        observe(observations.mReads);
        mImports.glUniform2iv(location, count, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform2iv coder(
            observations, location, count,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform2ui(int32_t location, uint32_t v0, uint32_t v1) {
    GAPID_INFO("glUniform2ui(%" PRId32 ", %" PRIu32 ", %" PRIu32 ")\n", location, v0, v1);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_792_major = 3;
        uint32_t l_minRequiredVersion_792_minor = 0;
        observe(observations.mReads);
        mImports.glUniform2ui(location, v0, v1);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform2ui coder(observations, location, v0, v1);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform2uiv(int32_t location, int32_t count, uint32_t* value) {
    GAPID_INFO("glUniform2uiv(%" PRId32 ", %" PRId32 ", %p)\n", location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_793_major = 3;
        uint32_t l_minRequiredVersion_793_minor = 0;
        observe(observations.mReads);
        mImports.glUniform2uiv(location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform2uiv coder(
            observations, location, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform3f(int32_t location, float value0, float value1, float value2) {
    GAPID_INFO("glUniform3f(%" PRId32 ", %f, %f, %f)\n", location, value0, value1, value2);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_794_major = 2;
        uint32_t l_minRequiredVersion_794_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_795_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_795_result;
        Slice<Vec3f> l_v = make<Vec3f>(1);
        observe(observations.mReads);
        mImports.glUniform3f(location, value0, value1, value2);
        write(l_v, 0, Vec3f{value0, value1, value2});
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_FLOAT_VEC3;
        l_uniform.mValue = l_v.as<uint8_t>();
        l_program->mUniforms[location] = l_uniform;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform3f coder(observations, location, value0, value1, value2);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform3fv(int32_t location, int32_t count, float* values) {
    GAPID_INFO("glUniform3fv(%" PRId32 ", %" PRId32 ", %p)\n", location, count, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_796_major = 2;
        uint32_t l_minRequiredVersion_796_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_797_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_797_result;
        Slice<Vec3f> l_v = slice((Vec3f*)(values), (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_FLOAT_VEC3;
        l_uniform.mValue = clone(l_v.as<uint8_t>());
        l_program->mUniforms[location] = l_uniform;
        observe(observations.mReads);
        mImports.glUniform3fv(location, count, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform3fv coder(
            observations, location, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform3i(int32_t location, int32_t value0, int32_t value1, int32_t value2) {
    GAPID_INFO("glUniform3i(%" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ")\n", location,
               value0, value1, value2);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_798_major = 2;
        uint32_t l_minRequiredVersion_798_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_799_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_799_result;
        Slice<Vec3i> l_v = make<Vec3i>(1);
        observe(observations.mReads);
        mImports.glUniform3i(location, value0, value1, value2);
        write(l_v, 0, Vec3i{value0, value1, value2});
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_INT_VEC3;
        l_uniform.mValue = l_v.as<uint8_t>();
        l_program->mUniforms[location] = l_uniform;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform3i coder(observations, location, value0, value1, value2);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform3iv(int32_t location, int32_t count, int32_t* values) {
    GAPID_INFO("glUniform3iv(%" PRId32 ", %" PRId32 ", %p)\n", location, count, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_800_major = 2;
        uint32_t l_minRequiredVersion_800_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_801_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_801_result;
        Slice<Vec3i> l_v = slice((Vec3i*)(values), (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_INT_VEC3;
        l_uniform.mValue = clone(l_v.as<uint8_t>());
        l_program->mUniforms[location] = l_uniform;
        observe(observations.mReads);
        mImports.glUniform3iv(location, count, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform3iv coder(
            observations, location, count,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform3ui(int32_t location, uint32_t v0, uint32_t v1, uint32_t v2) {
    GAPID_INFO("glUniform3ui(%" PRId32 ", %" PRIu32 ", %" PRIu32 ", %" PRIu32 ")\n", location, v0,
               v1, v2);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_802_major = 3;
        uint32_t l_minRequiredVersion_802_minor = 0;
        observe(observations.mReads);
        mImports.glUniform3ui(location, v0, v1, v2);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform3ui coder(observations, location, v0, v1, v2);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform3uiv(int32_t location, int32_t count, uint32_t* value) {
    GAPID_INFO("glUniform3uiv(%" PRId32 ", %" PRId32 ", %p)\n", location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_803_major = 3;
        uint32_t l_minRequiredVersion_803_minor = 0;
        observe(observations.mReads);
        mImports.glUniform3uiv(location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform3uiv coder(
            observations, location, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform4f(int32_t location, float value0, float value1, float value2,
                                 float value3) {
    GAPID_INFO("glUniform4f(%" PRId32 ", %f, %f, %f, %f)\n", location, value0, value1, value2,
               value3);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_804_major = 2;
        uint32_t l_minRequiredVersion_804_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_805_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_805_result;
        Slice<Vec4f> l_v = make<Vec4f>(1);
        observe(observations.mReads);
        mImports.glUniform4f(location, value0, value1, value2, value3);
        write(l_v, 0, Vec4f{value0, value1, value2, value3});
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_FLOAT_VEC4;
        l_uniform.mValue = l_v.as<uint8_t>();
        l_program->mUniforms[location] = l_uniform;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform4f coder(observations, location, value0, value1, value2, value3);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform4fv(int32_t location, int32_t count, float* values) {
    GAPID_INFO("glUniform4fv(%" PRId32 ", %" PRId32 ", %p)\n", location, count, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_806_major = 2;
        uint32_t l_minRequiredVersion_806_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_807_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_807_result;
        Slice<Vec4f> l_v = slice((Vec4f*)(values), (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_FLOAT_VEC4;
        l_uniform.mValue = clone(l_v.as<uint8_t>());
        l_program->mUniforms[location] = l_uniform;
        observe(observations.mReads);
        mImports.glUniform4fv(location, count, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform4fv coder(
            observations, location, count,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform4i(int32_t location, int32_t value0, int32_t value1, int32_t value2,
                                 int32_t value3) {
    GAPID_INFO("glUniform4i(%" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ")\n",
               location, value0, value1, value2, value3);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_808_major = 2;
        uint32_t l_minRequiredVersion_808_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_809_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_809_result;
        Slice<Vec4i> l_v = make<Vec4i>(1);
        observe(observations.mReads);
        mImports.glUniform4i(location, value0, value1, value2, value3);
        write(l_v, 0, Vec4i{value0, value1, value2, value3});
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_INT_VEC4;
        l_uniform.mValue = l_v.as<uint8_t>();
        l_program->mUniforms[location] = l_uniform;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform4i coder(observations, location, value0, value1, value2, value3);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform4iv(int32_t location, int32_t count, int32_t* values) {
    GAPID_INFO("glUniform4iv(%" PRId32 ", %" PRId32 ", %p)\n", location, count, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_810_major = 2;
        uint32_t l_minRequiredVersion_810_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_811_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_811_result;
        Slice<Vec4i> l_v = slice((Vec4i*)(values), (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_INT_VEC4;
        l_uniform.mValue = clone(l_v.as<uint8_t>());
        l_program->mUniforms[location] = l_uniform;
        observe(observations.mReads);
        mImports.glUniform4iv(location, count, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform4iv coder(
            observations, location, count,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform4ui(int32_t location, uint32_t v0, uint32_t v1, uint32_t v2,
                                  uint32_t v3) {
    GAPID_INFO("glUniform4ui(%" PRId32 ", %" PRIu32 ", %" PRIu32 ", %" PRIu32 ", %" PRIu32 ")\n",
               location, v0, v1, v2, v3);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_812_major = 3;
        uint32_t l_minRequiredVersion_812_minor = 0;
        observe(observations.mReads);
        mImports.glUniform4ui(location, v0, v1, v2, v3);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform4ui coder(observations, location, v0, v1, v2, v3);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniform4uiv(int32_t location, int32_t count, uint32_t* value) {
    GAPID_INFO("glUniform4uiv(%" PRId32 ", %" PRId32 ", %p)\n", location, count, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_813_major = 3;
        uint32_t l_minRequiredVersion_813_minor = 0;
        observe(observations.mReads);
        mImports.glUniform4uiv(location, count, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniform4uiv coder(
            observations, location, count,
            gapic::coder::gles::GLuint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformBlockBinding(uint32_t program, uint32_t uniform_block_index,
                                           uint32_t uniform_block_binding) {
    GAPID_INFO("glUniformBlockBinding(%" PRIu32 ", %" PRIu32 ", %" PRIu32 ")\n", program,
               uniform_block_index, uniform_block_binding);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_814_major = 3;
        uint32_t l_minRequiredVersion_814_minor = 0;
        observe(observations.mReads);
        mImports.glUniformBlockBinding(program, uniform_block_index, uniform_block_binding);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformBlockBinding coder(observations, program, uniform_block_index,
                                                    uniform_block_binding);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix2fv(int32_t location, int32_t count, uint8_t transpose,
                                        float* values) {
    GAPID_INFO("glUniformMatrix2fv(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location, count,
               transpose, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_815_major = 2;
        uint32_t l_minRequiredVersion_815_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_816_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_816_result;
        Slice<Mat2f> l_v = slice((Mat2f*)(values), (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_FLOAT_MAT2;
        l_uniform.mValue = clone(l_v.as<uint8_t>());
        l_program->mUniforms[location] = l_uniform;
        observe(observations.mReads);
        mImports.glUniformMatrix2fv(location, count, transpose, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix2fv coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix2x3fv(int32_t location, int32_t count, uint8_t transpose,
                                          float* value) {
    GAPID_INFO("glUniformMatrix2x3fv(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location, count,
               transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_817_major = 3;
        uint32_t l_minRequiredVersion_817_minor = 0;
        observe(observations.mReads);
        mImports.glUniformMatrix2x3fv(location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix2x3fv coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix2x4fv(int32_t location, int32_t count, uint8_t transpose,
                                          float* value) {
    GAPID_INFO("glUniformMatrix2x4fv(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location, count,
               transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_818_major = 3;
        uint32_t l_minRequiredVersion_818_minor = 0;
        observe(observations.mReads);
        mImports.glUniformMatrix2x4fv(location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix2x4fv coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix3fv(int32_t location, int32_t count, uint8_t transpose,
                                        float* values) {
    GAPID_INFO("glUniformMatrix3fv(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location, count,
               transpose, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_819_major = 2;
        uint32_t l_minRequiredVersion_819_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_820_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_820_result;
        Slice<Mat3f> l_v = slice((Mat3f*)(values), (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mType = GLenum::GL_FLOAT_MAT3;
        l_uniform.mValue = clone(l_v.as<uint8_t>());
        l_program->mUniforms[location] = l_uniform;
        observe(observations.mReads);
        mImports.glUniformMatrix3fv(location, count, transpose, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix3fv coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix3x2fv(int32_t location, int32_t count, uint8_t transpose,
                                          float* value) {
    GAPID_INFO("glUniformMatrix3x2fv(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location, count,
               transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_821_major = 3;
        uint32_t l_minRequiredVersion_821_minor = 0;
        observe(observations.mReads);
        mImports.glUniformMatrix3x2fv(location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix3x2fv coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix3x4fv(int32_t location, int32_t count, uint8_t transpose,
                                          float* value) {
    GAPID_INFO("glUniformMatrix3x4fv(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location, count,
               transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_822_major = 3;
        uint32_t l_minRequiredVersion_822_minor = 0;
        observe(observations.mReads);
        mImports.glUniformMatrix3x4fv(location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix3x4fv coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix4fv(int32_t location, int32_t count, uint8_t transpose,
                                        float* values) {
    GAPID_INFO("glUniformMatrix4fv(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location, count,
               transpose, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_823_major = 2;
        uint32_t l_minRequiredVersion_823_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_824_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_824_result;
        Slice<Mat4f> l_v = slice((Mat4f*)(values), (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Program> l_program = l_ctx->mInstances.mPrograms[l_ctx->mBoundProgram];
        Uniform l_uniform = l_program->mUniforms[location];
        l_uniform.mValue = clone(l_v.as<uint8_t>());
        l_program->mUniforms[location] = l_uniform;
        observe(observations.mReads);
        mImports.glUniformMatrix4fv(location, count, transpose, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix4fv coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix4x2fv(int32_t location, int32_t count, uint8_t transpose,
                                          float* value) {
    GAPID_INFO("glUniformMatrix4x2fv(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location, count,
               transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_825_major = 3;
        uint32_t l_minRequiredVersion_825_minor = 0;
        observe(observations.mReads);
        mImports.glUniformMatrix4x2fv(location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix4x2fv coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUniformMatrix4x3fv(int32_t location, int32_t count, uint8_t transpose,
                                          float* value) {
    GAPID_INFO("glUniformMatrix4x3fv(%" PRId32 ", %" PRId32 ", %" PRIu8 ", %p)\n", location, count,
               transpose, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_826_major = 3;
        uint32_t l_minRequiredVersion_826_minor = 0;
        observe(observations.mReads);
        mImports.glUniformMatrix4x3fv(location, count, transpose, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUniformMatrix4x3fv coder(
            observations, location, count, transpose,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUseProgram(uint32_t program) {
    GAPID_INFO("glUseProgram(%" PRIu32 ")\n", program);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_827_major = 2;
        uint32_t l_minRequiredVersion_827_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_828_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_828_result;
        l_ctx->mBoundProgram = program;
        observe(observations.mReads);
        mImports.glUseProgram(program);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUseProgram coder(observations, program);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glUseProgramStages(uint32_t pipeline, uint32_t stages, uint32_t program) {
    GAPID_INFO("glUseProgramStages(%" PRIu32 ", %u, %" PRIu32 ")\n", pipeline, stages, program);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_829_major = 3;
        uint32_t l_minRequiredVersion_829_minor = 1;
        uint32_t l_supportsBits_830_seenBits = stages;
        uint32_t l_supportsBits_830_validBits =
                GLbitfield::GL_ALL_SHADER_BITS | GLbitfield::GL_COMPUTE_SHADER_BIT |
                GLbitfield::GL_FRAGMENT_SHADER_BIT | GLbitfield::GL_VERTEX_SHADER_BIT;
        if ((stages & GLbitfield::GL_ALL_SHADER_BITS) != 0) {
        }
        if ((stages & GLbitfield::GL_COMPUTE_SHADER_BIT) != 0) {
        }
        if ((stages & GLbitfield::GL_FRAGMENT_SHADER_BIT) != 0) {
        }
        if ((stages & GLbitfield::GL_VERTEX_SHADER_BIT) != 0) {
        }
        observe(observations.mReads);
        mImports.glUseProgramStages(pipeline, stages, program);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlUseProgramStages coder(observations, pipeline, stages, program);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glValidateProgram(uint32_t program) {
    GAPID_INFO("glValidateProgram(%" PRIu32 ")\n", program);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_831_major = 2;
        uint32_t l_minRequiredVersion_831_minor = 0;
        observe(observations.mReads);
        mImports.glValidateProgram(program);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlValidateProgram coder(observations, program);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glValidateProgramPipeline(uint32_t pipeline) {
    GAPID_INFO("glValidateProgramPipeline(%" PRIu32 ")\n", pipeline);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_832_major = 3;
        uint32_t l_minRequiredVersion_832_minor = 1;
        observe(observations.mReads);
        mImports.glValidateProgramPipeline(pipeline);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlValidateProgramPipeline coder(observations, pipeline);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCullFace(uint32_t mode) {
    GAPID_INFO("glCullFace(%u)\n", mode);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_833_major = 2;
        uint32_t l_minRequiredVersion_833_minor = 0;
        switch (mode) {
            case GLenum::GL_BACK:   // fall-through...
            case GLenum::GL_FRONT:  // fall-through...
            case GLenum::GL_FRONT_AND_BACK: {
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_835_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_835_result;
        l_ctx->mRasterizing.mCullFace = mode;
        observe(observations.mReads);
        mImports.glCullFace(mode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCullFace coder(observations, mode);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDepthRangef(float near, float far) {
    GAPID_INFO("glDepthRangef(%f, %f)\n", near, far);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_836_major = 2;
        uint32_t l_minRequiredVersion_836_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_837_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_837_result;
        l_ctx->mRasterizing.mDepthNear = near;
        l_ctx->mRasterizing.mDepthFar = far;
        observe(observations.mReads);
        mImports.glDepthRangef(near, far);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDepthRangef coder(observations, near, far);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glFrontFace(uint32_t orientation) {
    GAPID_INFO("glFrontFace(%u)\n", orientation);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_838_major = 2;
        uint32_t l_minRequiredVersion_838_minor = 0;
        switch (orientation) {
            case GLenum::GL_CCW:  // fall-through...
            case GLenum::GL_CW: {
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_840_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_840_result;
        l_ctx->mRasterizing.mFrontFace = orientation;
        observe(observations.mReads);
        mImports.glFrontFace(orientation);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFrontFace coder(observations, orientation);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetMultisamplefv(uint32_t pname, uint32_t index, float* val) {
    GAPID_INFO("glGetMultisamplefv(%u, %" PRIu32 ", %p)\n", pname, index, val);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_841_major = 3;
        uint32_t l_minRequiredVersion_841_minor = 1;
        switch (pname) {
            case GLenum::GL_SAMPLE_POSITION: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetMultisamplefv(pname, index, val);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetMultisamplefv coder(
            observations, pname, index,
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(val), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glLineWidth(float width) {
    GAPID_INFO("glLineWidth(%f)\n", width);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_843_major = 2;
        uint32_t l_minRequiredVersion_843_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_844_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_844_result;
        l_ctx->mRasterizing.mLineWidth = width;
        observe(observations.mReads);
        mImports.glLineWidth(width);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlLineWidth coder(observations, width);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glPolygonOffset(float scale_factor, float units) {
    GAPID_INFO("glPolygonOffset(%f, %f)\n", scale_factor, units);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_845_major = 2;
        uint32_t l_minRequiredVersion_845_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_846_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_846_result;
        l_ctx->mRasterizing.mPolygonOffsetUnits = units;
        l_ctx->mRasterizing.mPolygonOffsetFactor = scale_factor;
        observe(observations.mReads);
        mImports.glPolygonOffset(scale_factor, units);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPolygonOffset coder(observations, scale_factor, units);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glViewport(int32_t x, int32_t y, int32_t width, int32_t height) {
    GAPID_INFO("glViewport(%" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ")\n", x, y, width,
               height);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_847_major = 2;
        uint32_t l_minRequiredVersion_847_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_848_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_848_result;
        l_ctx->mRasterizing.mViewport = Rect().SetX(x).SetY(y).SetWidth(width).SetHeight(height);
        observe(observations.mReads);
        mImports.glViewport(x, y, width, height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlViewport coder(observations, x, y, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetBooleani_v(uint32_t target, uint32_t index, uint8_t* data) {
    GAPID_INFO("glGetBooleani_v(%u, %" PRIu32 ", %p)\n", target, index, data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_849_major = 3;
        uint32_t l_minRequiredVersion_849_minor = 1;
        switch (target) {
            case GLenum::GL_ACTIVE_TEXTURE:                                 // fall-through...
            case GLenum::GL_ALIASED_LINE_WIDTH_RANGE:                       // fall-through...
            case GLenum::GL_ALIASED_POINT_SIZE_RANGE:                       // fall-through...
            case GLenum::GL_ALPHA_BITS:                                     // fall-through...
            case GLenum::GL_ARRAY_BUFFER_BINDING:                           // fall-through...
            case GLenum::GL_BLEND:                                          // fall-through...
            case GLenum::GL_BLEND_COLOR:                                    // fall-through...
            case GLenum::GL_BLEND_DST_ALPHA:                                // fall-through...
            case GLenum::GL_BLEND_DST_RGB:                                  // fall-through...
            case GLenum::GL_BLEND_EQUATION_ALPHA:                           // fall-through...
            case GLenum::GL_BLEND_EQUATION_RGB:                             // fall-through...
            case GLenum::GL_BLEND_SRC_ALPHA:                                // fall-through...
            case GLenum::GL_BLEND_SRC_RGB:                                  // fall-through...
            case GLenum::GL_BLUE_BITS:                                      // fall-through...
            case GLenum::GL_COLOR_CLEAR_VALUE:                              // fall-through...
            case GLenum::GL_COLOR_WRITEMASK:                                // fall-through...
            case GLenum::GL_COMPRESSED_TEXTURE_FORMATS:                     // fall-through...
            case GLenum::GL_COPY_READ_BUFFER_BINDING:                       // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_CULL_FACE:                                      // fall-through...
            case GLenum::GL_CULL_FACE_MODE:                                 // fall-through...
            case GLenum::GL_CURRENT_PROGRAM:                                // fall-through...
            case GLenum::GL_DEPTH_BITS:                                     // fall-through...
            case GLenum::GL_DEPTH_CLEAR_VALUE:                              // fall-through...
            case GLenum::GL_DEPTH_FUNC:                                     // fall-through...
            case GLenum::GL_DEPTH_RANGE:                                    // fall-through...
            case GLenum::GL_DEPTH_TEST:                                     // fall-through...
            case GLenum::GL_DEPTH_WRITEMASK:                                // fall-through...
            case GLenum::GL_DISPATCH_INDIRECT_BUFFER_BINDING:               // fall-through...
            case GLenum::GL_DITHER:                                         // fall-through...
            case GLenum::GL_DRAW_BUFFER:                                    // fall-through...
            case GLenum::GL_DRAW_FRAMEBUFFER_BINDING:                       // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER_BINDING:                   // fall-through...
            case GLenum::GL_FRAGMENT_SHADER_DERIVATIVE_HINT:                // fall-through...
            case GLenum::GL_FRONT_FACE:                                     // fall-through...
            case GLenum::GL_GENERATE_MIPMAP_HINT:                           // fall-through...
            case GLenum::GL_GREEN_BITS:                                     // fall-through...
            case GLenum::GL_IMAGE_BINDING_LAYERED:                          // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_FORMAT:               // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_TYPE:                 // fall-through...
            case GLenum::GL_LINE_WIDTH:                                     // fall-through...
            case GLenum::GL_MAJOR_VERSION:                                  // fall-through...
            case GLenum::GL_MAX_3D_TEXTURE_SIZE:                            // fall-through...
            case GLenum::GL_MAX_ARRAY_TEXTURE_LAYERS:                       // fall-through...
            case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:             // fall-through...
            case GLenum::GL_MAX_COLOR_ATTACHMENTS:                          // fall-through...
            case GLenum::GL_MAX_COLOR_TEXTURE_SAMPLES:                      // fall-through...
            case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTERS:                   // fall-through...
            case GLenum::GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:        // fall-through...
            case GLenum::GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:       // fall-through...
            case GLenum::GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:             // fall-through...
            case GLenum::GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:               // fall-through...
            case GLenum::GL_MAX_COMBINED_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:         // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTERS:                    // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:             // fall-through...
            case GLenum::GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:              // fall-through...
            case GLenum::GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:                // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_BLOCKS:                     // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_COMPONENTS:                 // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_COUNT:                   // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:             // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_SIZE:                    // fall-through...
            case GLenum::GL_MAX_CUBE_MAP_TEXTURE_SIZE:                      // fall-through...
            case GLenum::GL_MAX_DRAW_BUFFERS:                               // fall-through...
            case GLenum::GL_MAX_ELEMENTS_INDICES:                           // fall-through...
            case GLenum::GL_MAX_ELEMENTS_VERTICES:                          // fall-through...
            case GLenum::GL_MAX_ELEMENT_INDEX:                              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTERS:                   // fall-through...
            case GLenum::GL_MAX_FRAGMENT_INPUT_COMPONENTS:                  // fall-through...
            case GLenum::GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:             // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:                // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_VECTORS:                   // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_HEIGHT:                         // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_SAMPLES:                        // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_WIDTH:                          // fall-through...
            case GLenum::GL_MAX_INTEGER_SAMPLES:                            // fall-through...
            case GLenum::GL_MAX_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_MAX_RENDERBUFFER_SIZE:                          // fall-through...
            case GLenum::GL_MAX_SAMPLES:                                    // fall-through...
            case GLenum::GL_MAX_SAMPLE_MASK_WORDS:                          // fall-through...
            case GLenum::GL_MAX_SERVER_WAIT_TIMEOUT:                        // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BLOCK_SIZE:                  // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:             // fall-through...
            case GLenum::GL_MAX_TEXTURE_IMAGE_UNITS:                        // fall-through...
            case GLenum::GL_MAX_TEXTURE_LOD_BIAS:                           // fall-through...
            case GLenum::GL_MAX_TEXTURE_SIZE:                               // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:        // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:     // fall-through...
            case GLenum::GL_MAX_UNIFORM_BLOCK_SIZE:                         // fall-through...
            case GLenum::GL_MAX_UNIFORM_BUFFER_BINDINGS:                    // fall-through...
            case GLenum::GL_MAX_UNIFORM_LOCATIONS:                          // fall-through...
            case GLenum::GL_MAX_VARYING_COMPONENTS:                         // fall-through...
            case GLenum::GL_MAX_VARYING_VECTORS:                            // fall-through...
            case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTERS:                     // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIBS:                             // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_BINDINGS:                     // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:              // fall-through...
            case GLenum::GL_MAX_VERTEX_OUTPUT_COMPONENTS:                   // fall-through...
            case GLenum::GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:                 // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_BLOCKS:                      // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_COMPONENTS:                  // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_VECTORS:                     // fall-through...
            case GLenum::GL_MAX_VIEWPORT_DIMS:                              // fall-through...
            case GLenum::GL_MINOR_VERSION:                                  // fall-through...
            case GLenum::GL_MIN_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_NUM_COMPRESSED_TEXTURE_FORMATS:                 // fall-through...
            case GLenum::GL_NUM_EXTENSIONS:                                 // fall-through...
            case GLenum::GL_NUM_PROGRAM_BINARY_FORMATS:                     // fall-through...
            case GLenum::GL_NUM_SHADER_BINARY_FORMATS:                      // fall-through...
            case GLenum::GL_PACK_ALIGNMENT:                                 // fall-through...
            case GLenum::GL_PACK_ROW_LENGTH:                                // fall-through...
            case GLenum::GL_PACK_SKIP_PIXELS:                               // fall-through...
            case GLenum::GL_PACK_SKIP_ROWS:                                 // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER_BINDING:                    // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FACTOR:                          // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FILL:                            // fall-through...
            case GLenum::GL_POLYGON_OFFSET_UNITS:                           // fall-through...
            case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX:                  // fall-through...
            case GLenum::GL_PROGRAM_BINARY_FORMATS:                         // fall-through...
            case GLenum::GL_PROGRAM_PIPELINE_BINDING:                       // fall-through...
            case GLenum::GL_RASTERIZER_DISCARD:                             // fall-through...
            case GLenum::GL_READ_BUFFER:                                    // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER_BINDING:                       // fall-through...
            case GLenum::GL_RED_BITS:                                       // fall-through...
            case GLenum::GL_RENDERBUFFER_BINDING:                           // fall-through...
            case GLenum::GL_SAMPLER_BINDING:                                // fall-through...
            case GLenum::GL_SAMPLES:                                        // fall-through...
            case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE:                       // fall-through...
            case GLenum::GL_SAMPLE_BUFFERS:                                 // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE:                                // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_INVERT:                         // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_VALUE:                          // fall-through...
            case GLenum::GL_SCISSOR_BOX:                                    // fall-through...
            case GLenum::GL_SCISSOR_TEST:                                   // fall-through...
            case GLenum::GL_SHADER_BINARY_FORMATS:                          // fall-through...
            case GLenum::GL_SHADER_COMPILER:                                // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_BINDING:                  // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:         // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_SIZE:                     // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_START:                    // fall-through...
            case GLenum::GL_STENCIL_BACK_FAIL:                              // fall-through...
            case GLenum::GL_STENCIL_BACK_FUNC:                              // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_FAIL:                   // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_PASS:                   // fall-through...
            case GLenum::GL_STENCIL_BACK_REF:                               // fall-through...
            case GLenum::GL_STENCIL_BACK_VALUE_MASK:                        // fall-through...
            case GLenum::GL_STENCIL_BACK_WRITEMASK:                         // fall-through...
            case GLenum::GL_STENCIL_BITS:                                   // fall-through...
            case GLenum::GL_STENCIL_CLEAR_VALUE:                            // fall-through...
            case GLenum::GL_STENCIL_FAIL:                                   // fall-through...
            case GLenum::GL_STENCIL_FUNC:                                   // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_FAIL:                        // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_PASS:                        // fall-through...
            case GLenum::GL_STENCIL_REF:                                    // fall-through...
            case GLenum::GL_STENCIL_TEST:                                   // fall-through...
            case GLenum::GL_STENCIL_VALUE_MASK:                             // fall-through...
            case GLenum::GL_STENCIL_WRITEMASK:                              // fall-through...
            case GLenum::GL_SUBPIXEL_BITS:                                  // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D:                             // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_ARRAY:                       // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_MULTISAMPLE:                 // fall-through...
            case GLenum::GL_TEXTURE_BINDING_3D:                             // fall-through...
            case GLenum::GL_TEXTURE_BINDING_CUBE_MAP:                       // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_ACTIVE:                      // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BINDING:                     // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:              // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:                 // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_START:                // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_PAUSED:                      // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_BINDING:                         // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:                // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_SIZE:                            // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_START:                           // fall-through...
            case GLenum::GL_UNPACK_ALIGNMENT:                               // fall-through...
            case GLenum::GL_UNPACK_IMAGE_HEIGHT:                            // fall-through...
            case GLenum::GL_UNPACK_ROW_LENGTH:                              // fall-through...
            case GLenum::GL_UNPACK_SKIP_IMAGES:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_PIXELS:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_ROWS:                               // fall-through...
            case GLenum::GL_VERTEX_ARRAY_BINDING:                           // fall-through...
            case GLenum::GL_VERTEX_BINDING_DIVISOR:                         // fall-through...
            case GLenum::GL_VERTEX_BINDING_OFFSET:                          // fall-through...
            case GLenum::GL_VERTEX_BINDING_STRIDE:                          // fall-through...
            case GLenum::GL_VIEWPORT: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetBooleani_v(target, index, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetBooleani_v coder(
            observations, target, index,
            gapic::coder::gles::GLboolean__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetBooleanv(uint32_t param, uint8_t* values) {
    GAPID_INFO("glGetBooleanv(%u, %p)\n", param, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_851_major = 2;
        uint32_t l_minRequiredVersion_851_minor = 0;
        switch (param) {
            case GLenum::GL_ACTIVE_TEXTURE:                    // fall-through...
            case GLenum::GL_ALIASED_LINE_WIDTH_RANGE:          // fall-through...
            case GLenum::GL_ALIASED_POINT_SIZE_RANGE:          // fall-through...
            case GLenum::GL_ALPHA_BITS:                        // fall-through...
            case GLenum::GL_ARRAY_BUFFER_BINDING:              // fall-through...
            case GLenum::GL_BLEND:                             // fall-through...
            case GLenum::GL_BLEND_COLOR:                       // fall-through...
            case GLenum::GL_BLEND_DST_ALPHA:                   // fall-through...
            case GLenum::GL_BLEND_DST_RGB:                     // fall-through...
            case GLenum::GL_BLEND_EQUATION_ALPHA:              // fall-through...
            case GLenum::GL_BLEND_EQUATION_RGB:                // fall-through...
            case GLenum::GL_BLEND_SRC_ALPHA:                   // fall-through...
            case GLenum::GL_BLEND_SRC_RGB:                     // fall-through...
            case GLenum::GL_BLUE_BITS:                         // fall-through...
            case GLenum::GL_COLOR_CLEAR_VALUE:                 // fall-through...
            case GLenum::GL_COLOR_WRITEMASK:                   // fall-through...
            case GLenum::GL_COMPRESSED_TEXTURE_FORMATS:        // fall-through...
            case GLenum::GL_CULL_FACE:                         // fall-through...
            case GLenum::GL_CULL_FACE_MODE:                    // fall-through...
            case GLenum::GL_CURRENT_PROGRAM:                   // fall-through...
            case GLenum::GL_DEPTH_BITS:                        // fall-through...
            case GLenum::GL_DEPTH_CLEAR_VALUE:                 // fall-through...
            case GLenum::GL_DEPTH_FUNC:                        // fall-through...
            case GLenum::GL_DEPTH_RANGE:                       // fall-through...
            case GLenum::GL_DEPTH_TEST:                        // fall-through...
            case GLenum::GL_DEPTH_WRITEMASK:                   // fall-through...
            case GLenum::GL_DITHER:                            // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER_BINDING:      // fall-through...
            case GLenum::GL_DRAW_FRAMEBUFFER_BINDING:          // fall-through...
            case GLenum::GL_FRONT_FACE:                        // fall-through...
            case GLenum::GL_GENERATE_MIPMAP_HINT:              // fall-through...
            case GLenum::GL_GREEN_BITS:                        // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_FORMAT:  // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_TYPE:    // fall-through...
            case GLenum::GL_LINE_WIDTH:                        // fall-through...
            case GLenum::GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:  // fall-through...
            case GLenum::GL_MAX_CUBE_MAP_TEXTURE_SIZE:         // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_VECTORS:      // fall-through...
            case GLenum::GL_MAX_RENDERBUFFER_SIZE:             // fall-through...
            case GLenum::GL_MAX_TEXTURE_IMAGE_UNITS:           // fall-through...
            case GLenum::GL_MAX_TEXTURE_SIZE:                  // fall-through...
            case GLenum::GL_MAX_VARYING_VECTORS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIBS:                // fall-through...
            case GLenum::GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:    // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_VECTORS:        // fall-through...
            case GLenum::GL_MAX_VIEWPORT_DIMS:                 // fall-through...
            case GLenum::GL_NUM_COMPRESSED_TEXTURE_FORMATS:    // fall-through...
            case GLenum::GL_NUM_SHADER_BINARY_FORMATS:         // fall-through...
            case GLenum::GL_PACK_ALIGNMENT:                    // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FACTOR:             // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FILL:               // fall-through...
            case GLenum::GL_POLYGON_OFFSET_UNITS:              // fall-through...
            case GLenum::GL_RED_BITS:                          // fall-through...
            case GLenum::GL_RENDERBUFFER_BINDING:              // fall-through...
            case GLenum::GL_SAMPLES:                           // fall-through...
            case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE:          // fall-through...
            case GLenum::GL_SAMPLE_BUFFERS:                    // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE:                   // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_INVERT:            // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_VALUE:             // fall-through...
            case GLenum::GL_SCISSOR_BOX:                       // fall-through...
            case GLenum::GL_SCISSOR_TEST:                      // fall-through...
            case GLenum::GL_SHADER_BINARY_FORMATS:             // fall-through...
            case GLenum::GL_SHADER_COMPILER:                   // fall-through...
            case GLenum::GL_STENCIL_BACK_FAIL:                 // fall-through...
            case GLenum::GL_STENCIL_BACK_FUNC:                 // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_FAIL:      // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_PASS:      // fall-through...
            case GLenum::GL_STENCIL_BACK_REF:                  // fall-through...
            case GLenum::GL_STENCIL_BACK_VALUE_MASK:           // fall-through...
            case GLenum::GL_STENCIL_BACK_WRITEMASK:            // fall-through...
            case GLenum::GL_STENCIL_BITS:                      // fall-through...
            case GLenum::GL_STENCIL_CLEAR_VALUE:               // fall-through...
            case GLenum::GL_STENCIL_FAIL:                      // fall-through...
            case GLenum::GL_STENCIL_FUNC:                      // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_FAIL:           // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_PASS:           // fall-through...
            case GLenum::GL_STENCIL_REF:                       // fall-through...
            case GLenum::GL_STENCIL_TEST:                      // fall-through...
            case GLenum::GL_STENCIL_VALUE_MASK:                // fall-through...
            case GLenum::GL_STENCIL_WRITEMASK:                 // fall-through...
            case GLenum::GL_SUBPIXEL_BITS:                     // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D:                // fall-through...
            case GLenum::GL_TEXTURE_BINDING_CUBE_MAP:          // fall-through...
            case GLenum::GL_UNPACK_ALIGNMENT:                  // fall-through...
            case GLenum::GL_VIEWPORT: {
                break;
            }
            case GLenum::GL_COPY_READ_BUFFER_BINDING:                       // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_DRAW_BUFFER:                                    // fall-through...
            case GLenum::GL_FRAGMENT_SHADER_DERIVATIVE_HINT:                // fall-through...
            case GLenum::GL_MAJOR_VERSION:                                  // fall-through...
            case GLenum::GL_MAX_3D_TEXTURE_SIZE:                            // fall-through...
            case GLenum::GL_MAX_ARRAY_TEXTURE_LAYERS:                       // fall-through...
            case GLenum::GL_MAX_COLOR_ATTACHMENTS:                          // fall-through...
            case GLenum::GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:       // fall-through...
            case GLenum::GL_MAX_COMBINED_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:         // fall-through...
            case GLenum::GL_MAX_DRAW_BUFFERS:                               // fall-through...
            case GLenum::GL_MAX_ELEMENTS_INDICES:                           // fall-through...
            case GLenum::GL_MAX_ELEMENTS_VERTICES:                          // fall-through...
            case GLenum::GL_MAX_ELEMENT_INDEX:                              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_INPUT_COMPONENTS:                  // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:                // fall-through...
            case GLenum::GL_MAX_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_MAX_SAMPLES:                                    // fall-through...
            case GLenum::GL_MAX_SERVER_WAIT_TIMEOUT:                        // fall-through...
            case GLenum::GL_MAX_TEXTURE_LOD_BIAS:                           // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:        // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:     // fall-through...
            case GLenum::GL_MAX_UNIFORM_BLOCK_SIZE:                         // fall-through...
            case GLenum::GL_MAX_UNIFORM_BUFFER_BINDINGS:                    // fall-through...
            case GLenum::GL_MAX_VARYING_COMPONENTS:                         // fall-through...
            case GLenum::GL_MAX_VERTEX_OUTPUT_COMPONENTS:                   // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_BLOCKS:                      // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_COMPONENTS:                  // fall-through...
            case GLenum::GL_MINOR_VERSION:                                  // fall-through...
            case GLenum::GL_MIN_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_NUM_EXTENSIONS:                                 // fall-through...
            case GLenum::GL_NUM_PROGRAM_BINARY_FORMATS:                     // fall-through...
            case GLenum::GL_PACK_ROW_LENGTH:                                // fall-through...
            case GLenum::GL_PACK_SKIP_PIXELS:                               // fall-through...
            case GLenum::GL_PACK_SKIP_ROWS:                                 // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER_BINDING:                    // fall-through...
            case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX:                  // fall-through...
            case GLenum::GL_PROGRAM_BINARY_FORMATS:                         // fall-through...
            case GLenum::GL_RASTERIZER_DISCARD:                             // fall-through...
            case GLenum::GL_READ_BUFFER:                                    // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER_BINDING:                       // fall-through...
            case GLenum::GL_SAMPLER_BINDING:                                // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_ARRAY:                       // fall-through...
            case GLenum::GL_TEXTURE_BINDING_3D:                             // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_ACTIVE:                      // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BINDING:                     // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:              // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:                 // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_START:                // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_PAUSED:                      // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_BINDING:                         // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:                // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_SIZE:                            // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_START:                           // fall-through...
            case GLenum::GL_UNPACK_IMAGE_HEIGHT:                            // fall-through...
            case GLenum::GL_UNPACK_ROW_LENGTH:                              // fall-through...
            case GLenum::GL_UNPACK_SKIP_IMAGES:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_PIXELS:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_ROWS:                               // fall-through...
            case GLenum::GL_VERTEX_ARRAY_BINDING: {
                uint32_t l_minRequiredVersion_852_major = 3;
                uint32_t l_minRequiredVersion_852_minor = 0;
                break;
            }
            case GLenum::GL_DISPATCH_INDIRECT_BUFFER_BINDING:         // fall-through...
            case GLenum::GL_IMAGE_BINDING_LAYERED:                    // fall-through...
            case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:       // fall-through...
            case GLenum::GL_MAX_COLOR_TEXTURE_SAMPLES:                // fall-through...
            case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTERS:             // fall-through...
            case GLenum::GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTERS:              // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:        // fall-through...
            case GLenum::GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:          // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_BLOCKS:               // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_COMPONENTS:           // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_COUNT:             // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_SIZE:              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTERS:             // fall-through...
            case GLenum::GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:       // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_HEIGHT:                   // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_SAMPLES:                  // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_WIDTH:                    // fall-through...
            case GLenum::GL_MAX_INTEGER_SAMPLES:                      // fall-through...
            case GLenum::GL_MAX_SAMPLE_MASK_WORDS:                    // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BLOCK_SIZE:            // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:       // fall-through...
            case GLenum::GL_MAX_UNIFORM_LOCATIONS:                    // fall-through...
            case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTERS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_BINDINGS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:        // fall-through...
            case GLenum::GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:         // fall-through...
            case GLenum::GL_PROGRAM_PIPELINE_BINDING:                 // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_BINDING:            // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:   // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_SIZE:               // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_START:              // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_MULTISAMPLE:           // fall-through...
            case GLenum::GL_VERTEX_BINDING_DIVISOR:                   // fall-through...
            case GLenum::GL_VERTEX_BINDING_OFFSET:                    // fall-through...
            case GLenum::GL_VERTEX_BINDING_STRIDE: {
                uint32_t l_minRequiredVersion_853_major = 3;
                uint32_t l_minRequiredVersion_853_minor = 1;
                break;
            }
        }
        Slice<GLboolean> l_v = slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_855_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_855_result;
        observe(observations.mReads);
        mImports.glGetBooleanv(param, values);
        switch (param) {
            case GLenum::GL_BLEND: {
                write(l_v, 0, (GLboolean)(l_ctx->mCapabilities[GLenum::GL_BLEND]));
                break;
            }
            case GLenum::GL_CULL_FACE: {
                write(l_v, 0, (GLboolean)(l_ctx->mCapabilities[GLenum::GL_CULL_FACE]));
                break;
            }
            case GLenum::GL_DEPTH_TEST: {
                write(l_v, 0, (GLboolean)(l_ctx->mCapabilities[GLenum::GL_DEPTH_TEST]));
                break;
            }
            case GLenum::GL_DITHER: {
                write(l_v, 0, (GLboolean)(l_ctx->mCapabilities[GLenum::GL_DITHER]));
                break;
            }
            case GLenum::GL_POLYGON_OFFSET_FILL: {
                write(l_v, 0, (GLboolean)(l_ctx->mCapabilities[GLenum::GL_POLYGON_OFFSET_FILL]));
                break;
            }
            case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE: {
                write(l_v, 0,
                      (GLboolean)(l_ctx->mCapabilities[GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE]));
                break;
            }
            case GLenum::GL_SAMPLE_COVERAGE: {
                write(l_v, 0, (GLboolean)(l_ctx->mCapabilities[GLenum::GL_SAMPLE_COVERAGE]));
                break;
            }
            case GLenum::GL_SCISSOR_TEST: {
                write(l_v, 0, (GLboolean)(l_ctx->mCapabilities[GLenum::GL_SCISSOR_TEST]));
                break;
            }
            case GLenum::GL_STENCIL_TEST: {
                write(l_v, 0, (GLboolean)(l_ctx->mCapabilities[GLenum::GL_STENCIL_TEST]));
                break;
            }
            case GLenum::GL_DEPTH_WRITEMASK: {
                write(l_v, 0, l_ctx->mRasterizing.mDepthMask);
                break;
            }
            case GLenum::GL_COLOR_WRITEMASK: {
                write(l_v, 0, l_ctx->mRasterizing.mColorMaskRed);
                write(l_v, 1, l_ctx->mRasterizing.mColorMaskGreen);
                write(l_v, 2, l_ctx->mRasterizing.mColorMaskBlue);
                write(l_v, 3, l_ctx->mRasterizing.mColorMaskAlpha);
                break;
            }
            case GLenum::GL_SAMPLE_COVERAGE_INVERT: {
                write(l_v, 0, l_ctx->mRasterizing.mSampleCoverageInvert);
                break;
            }
            case GLenum::GL_SHADER_COMPILER: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
        }
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetBooleanv coder(
            observations, param, gapic::coder::gles::GLboolean__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetFloatv(uint32_t param, float* values) {
    GAPID_INFO("glGetFloatv(%u, %p)\n", param, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_856_major = 2;
        uint32_t l_minRequiredVersion_856_minor = 0;
        switch (param) {
            case GLenum::GL_ACTIVE_TEXTURE:                    // fall-through...
            case GLenum::GL_ALIASED_LINE_WIDTH_RANGE:          // fall-through...
            case GLenum::GL_ALIASED_POINT_SIZE_RANGE:          // fall-through...
            case GLenum::GL_ALPHA_BITS:                        // fall-through...
            case GLenum::GL_ARRAY_BUFFER_BINDING:              // fall-through...
            case GLenum::GL_BLEND:                             // fall-through...
            case GLenum::GL_BLEND_COLOR:                       // fall-through...
            case GLenum::GL_BLEND_DST_ALPHA:                   // fall-through...
            case GLenum::GL_BLEND_DST_RGB:                     // fall-through...
            case GLenum::GL_BLEND_EQUATION_ALPHA:              // fall-through...
            case GLenum::GL_BLEND_EQUATION_RGB:                // fall-through...
            case GLenum::GL_BLEND_SRC_ALPHA:                   // fall-through...
            case GLenum::GL_BLEND_SRC_RGB:                     // fall-through...
            case GLenum::GL_BLUE_BITS:                         // fall-through...
            case GLenum::GL_COLOR_CLEAR_VALUE:                 // fall-through...
            case GLenum::GL_COLOR_WRITEMASK:                   // fall-through...
            case GLenum::GL_COMPRESSED_TEXTURE_FORMATS:        // fall-through...
            case GLenum::GL_CULL_FACE:                         // fall-through...
            case GLenum::GL_CULL_FACE_MODE:                    // fall-through...
            case GLenum::GL_CURRENT_PROGRAM:                   // fall-through...
            case GLenum::GL_DEPTH_BITS:                        // fall-through...
            case GLenum::GL_DEPTH_CLEAR_VALUE:                 // fall-through...
            case GLenum::GL_DEPTH_FUNC:                        // fall-through...
            case GLenum::GL_DEPTH_RANGE:                       // fall-through...
            case GLenum::GL_DEPTH_TEST:                        // fall-through...
            case GLenum::GL_DEPTH_WRITEMASK:                   // fall-through...
            case GLenum::GL_DITHER:                            // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER_BINDING:      // fall-through...
            case GLenum::GL_DRAW_FRAMEBUFFER_BINDING:          // fall-through...
            case GLenum::GL_FRONT_FACE:                        // fall-through...
            case GLenum::GL_GENERATE_MIPMAP_HINT:              // fall-through...
            case GLenum::GL_GREEN_BITS:                        // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_FORMAT:  // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_TYPE:    // fall-through...
            case GLenum::GL_LINE_WIDTH:                        // fall-through...
            case GLenum::GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:  // fall-through...
            case GLenum::GL_MAX_CUBE_MAP_TEXTURE_SIZE:         // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_VECTORS:      // fall-through...
            case GLenum::GL_MAX_RENDERBUFFER_SIZE:             // fall-through...
            case GLenum::GL_MAX_TEXTURE_IMAGE_UNITS:           // fall-through...
            case GLenum::GL_MAX_TEXTURE_SIZE:                  // fall-through...
            case GLenum::GL_MAX_VARYING_VECTORS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIBS:                // fall-through...
            case GLenum::GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:    // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_VECTORS:        // fall-through...
            case GLenum::GL_MAX_VIEWPORT_DIMS:                 // fall-through...
            case GLenum::GL_NUM_COMPRESSED_TEXTURE_FORMATS:    // fall-through...
            case GLenum::GL_NUM_SHADER_BINARY_FORMATS:         // fall-through...
            case GLenum::GL_PACK_ALIGNMENT:                    // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FACTOR:             // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FILL:               // fall-through...
            case GLenum::GL_POLYGON_OFFSET_UNITS:              // fall-through...
            case GLenum::GL_RED_BITS:                          // fall-through...
            case GLenum::GL_RENDERBUFFER_BINDING:              // fall-through...
            case GLenum::GL_SAMPLES:                           // fall-through...
            case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE:          // fall-through...
            case GLenum::GL_SAMPLE_BUFFERS:                    // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE:                   // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_INVERT:            // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_VALUE:             // fall-through...
            case GLenum::GL_SCISSOR_BOX:                       // fall-through...
            case GLenum::GL_SCISSOR_TEST:                      // fall-through...
            case GLenum::GL_SHADER_BINARY_FORMATS:             // fall-through...
            case GLenum::GL_SHADER_COMPILER:                   // fall-through...
            case GLenum::GL_STENCIL_BACK_FAIL:                 // fall-through...
            case GLenum::GL_STENCIL_BACK_FUNC:                 // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_FAIL:      // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_PASS:      // fall-through...
            case GLenum::GL_STENCIL_BACK_REF:                  // fall-through...
            case GLenum::GL_STENCIL_BACK_VALUE_MASK:           // fall-through...
            case GLenum::GL_STENCIL_BACK_WRITEMASK:            // fall-through...
            case GLenum::GL_STENCIL_BITS:                      // fall-through...
            case GLenum::GL_STENCIL_CLEAR_VALUE:               // fall-through...
            case GLenum::GL_STENCIL_FAIL:                      // fall-through...
            case GLenum::GL_STENCIL_FUNC:                      // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_FAIL:           // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_PASS:           // fall-through...
            case GLenum::GL_STENCIL_REF:                       // fall-through...
            case GLenum::GL_STENCIL_TEST:                      // fall-through...
            case GLenum::GL_STENCIL_VALUE_MASK:                // fall-through...
            case GLenum::GL_STENCIL_WRITEMASK:                 // fall-through...
            case GLenum::GL_SUBPIXEL_BITS:                     // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D:                // fall-through...
            case GLenum::GL_TEXTURE_BINDING_CUBE_MAP:          // fall-through...
            case GLenum::GL_UNPACK_ALIGNMENT:                  // fall-through...
            case GLenum::GL_VIEWPORT: {
                break;
            }
            case GLenum::GL_COPY_READ_BUFFER_BINDING:                       // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_DRAW_BUFFER:                                    // fall-through...
            case GLenum::GL_FRAGMENT_SHADER_DERIVATIVE_HINT:                // fall-through...
            case GLenum::GL_MAJOR_VERSION:                                  // fall-through...
            case GLenum::GL_MAX_3D_TEXTURE_SIZE:                            // fall-through...
            case GLenum::GL_MAX_ARRAY_TEXTURE_LAYERS:                       // fall-through...
            case GLenum::GL_MAX_COLOR_ATTACHMENTS:                          // fall-through...
            case GLenum::GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:       // fall-through...
            case GLenum::GL_MAX_COMBINED_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:         // fall-through...
            case GLenum::GL_MAX_DRAW_BUFFERS:                               // fall-through...
            case GLenum::GL_MAX_ELEMENTS_INDICES:                           // fall-through...
            case GLenum::GL_MAX_ELEMENTS_VERTICES:                          // fall-through...
            case GLenum::GL_MAX_ELEMENT_INDEX:                              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_INPUT_COMPONENTS:                  // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:                // fall-through...
            case GLenum::GL_MAX_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_MAX_SAMPLES:                                    // fall-through...
            case GLenum::GL_MAX_SERVER_WAIT_TIMEOUT:                        // fall-through...
            case GLenum::GL_MAX_TEXTURE_LOD_BIAS:                           // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:        // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:     // fall-through...
            case GLenum::GL_MAX_UNIFORM_BLOCK_SIZE:                         // fall-through...
            case GLenum::GL_MAX_UNIFORM_BUFFER_BINDINGS:                    // fall-through...
            case GLenum::GL_MAX_VARYING_COMPONENTS:                         // fall-through...
            case GLenum::GL_MAX_VERTEX_OUTPUT_COMPONENTS:                   // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_BLOCKS:                      // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_COMPONENTS:                  // fall-through...
            case GLenum::GL_MINOR_VERSION:                                  // fall-through...
            case GLenum::GL_MIN_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_NUM_EXTENSIONS:                                 // fall-through...
            case GLenum::GL_NUM_PROGRAM_BINARY_FORMATS:                     // fall-through...
            case GLenum::GL_PACK_ROW_LENGTH:                                // fall-through...
            case GLenum::GL_PACK_SKIP_PIXELS:                               // fall-through...
            case GLenum::GL_PACK_SKIP_ROWS:                                 // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER_BINDING:                    // fall-through...
            case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX:                  // fall-through...
            case GLenum::GL_PROGRAM_BINARY_FORMATS:                         // fall-through...
            case GLenum::GL_RASTERIZER_DISCARD:                             // fall-through...
            case GLenum::GL_READ_BUFFER:                                    // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER_BINDING:                       // fall-through...
            case GLenum::GL_SAMPLER_BINDING:                                // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_ARRAY:                       // fall-through...
            case GLenum::GL_TEXTURE_BINDING_3D:                             // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_ACTIVE:                      // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BINDING:                     // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:              // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:                 // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_START:                // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_PAUSED:                      // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_BINDING:                         // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:                // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_SIZE:                            // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_START:                           // fall-through...
            case GLenum::GL_UNPACK_IMAGE_HEIGHT:                            // fall-through...
            case GLenum::GL_UNPACK_ROW_LENGTH:                              // fall-through...
            case GLenum::GL_UNPACK_SKIP_IMAGES:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_PIXELS:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_ROWS:                               // fall-through...
            case GLenum::GL_VERTEX_ARRAY_BINDING: {
                uint32_t l_minRequiredVersion_857_major = 3;
                uint32_t l_minRequiredVersion_857_minor = 0;
                break;
            }
            case GLenum::GL_DISPATCH_INDIRECT_BUFFER_BINDING:         // fall-through...
            case GLenum::GL_IMAGE_BINDING_LAYERED:                    // fall-through...
            case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:       // fall-through...
            case GLenum::GL_MAX_COLOR_TEXTURE_SAMPLES:                // fall-through...
            case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTERS:             // fall-through...
            case GLenum::GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTERS:              // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:        // fall-through...
            case GLenum::GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:          // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_BLOCKS:               // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_COMPONENTS:           // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_COUNT:             // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_SIZE:              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTERS:             // fall-through...
            case GLenum::GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:       // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_HEIGHT:                   // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_SAMPLES:                  // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_WIDTH:                    // fall-through...
            case GLenum::GL_MAX_INTEGER_SAMPLES:                      // fall-through...
            case GLenum::GL_MAX_SAMPLE_MASK_WORDS:                    // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BLOCK_SIZE:            // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:       // fall-through...
            case GLenum::GL_MAX_UNIFORM_LOCATIONS:                    // fall-through...
            case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTERS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_BINDINGS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:        // fall-through...
            case GLenum::GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:         // fall-through...
            case GLenum::GL_PROGRAM_PIPELINE_BINDING:                 // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_BINDING:            // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:   // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_SIZE:               // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_START:              // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_MULTISAMPLE:           // fall-through...
            case GLenum::GL_VERTEX_BINDING_DIVISOR:                   // fall-through...
            case GLenum::GL_VERTEX_BINDING_OFFSET:                    // fall-through...
            case GLenum::GL_VERTEX_BINDING_STRIDE: {
                uint32_t l_minRequiredVersion_858_major = 3;
                uint32_t l_minRequiredVersion_858_minor = 1;
                break;
            }
        }
        Slice<GLfloat> l_v = slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_860_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_860_result;
        observe(observations.mReads);
        mImports.glGetFloatv(param, values);
        switch (param) {
            case GLenum::GL_DEPTH_RANGE: {
                write(l_v, 0, l_ctx->mRasterizing.mDepthNear);
                write(l_v, 1, l_ctx->mRasterizing.mDepthFar);
                break;
            }
            case GLenum::GL_LINE_WIDTH: {
                write(l_v, 0, l_ctx->mRasterizing.mLineWidth);
                break;
            }
            case GLenum::GL_POLYGON_OFFSET_FACTOR: {
                write(l_v, 0, l_ctx->mRasterizing.mPolygonOffsetFactor);
                break;
            }
            case GLenum::GL_POLYGON_OFFSET_UNITS: {
                write(l_v, 0, l_ctx->mRasterizing.mPolygonOffsetUnits);
                break;
            }
            case GLenum::GL_SAMPLE_COVERAGE_VALUE: {
                write(l_v, 0, l_ctx->mRasterizing.mSampleCoverageValue);
                break;
            }
            case GLenum::GL_COLOR_CLEAR_VALUE: {
                write(l_v, 0, l_ctx->mClearing.mClearColor.mRed);
                write(l_v, 1, l_ctx->mClearing.mClearColor.mGreen);
                write(l_v, 2, l_ctx->mClearing.mClearColor.mBlue);
                write(l_v, 3, l_ctx->mClearing.mClearColor.mAlpha);
                break;
            }
            case GLenum::GL_DEPTH_CLEAR_VALUE: {
                write(l_v, 0, l_ctx->mClearing.mClearDepth);
                break;
            }
            case GLenum::GL_ALIASED_LINE_WIDTH_RANGE: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                write(l_v, 1,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[1]);
                break;
            }
            case GLenum::GL_ALIASED_POINT_SIZE_RANGE: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                write(l_v, 1,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[1]);
                break;
            }
            case GLenum::GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
        }
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetFloatv coder(
            observations, param, gapic::coder::gles::GLfloat__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetInteger64i_v(uint32_t target, uint32_t index, int64_t* data) {
    GAPID_INFO("glGetInteger64i_v(%u, %" PRIu32 ", %p)\n", target, index, data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_861_major = 3;
        uint32_t l_minRequiredVersion_861_minor = 0;
        switch (target) {
            case GLenum::GL_ACTIVE_TEXTURE:                                 // fall-through...
            case GLenum::GL_ALIASED_LINE_WIDTH_RANGE:                       // fall-through...
            case GLenum::GL_ALIASED_POINT_SIZE_RANGE:                       // fall-through...
            case GLenum::GL_ALPHA_BITS:                                     // fall-through...
            case GLenum::GL_ARRAY_BUFFER_BINDING:                           // fall-through...
            case GLenum::GL_BLEND:                                          // fall-through...
            case GLenum::GL_BLEND_COLOR:                                    // fall-through...
            case GLenum::GL_BLEND_DST_ALPHA:                                // fall-through...
            case GLenum::GL_BLEND_DST_RGB:                                  // fall-through...
            case GLenum::GL_BLEND_EQUATION_ALPHA:                           // fall-through...
            case GLenum::GL_BLEND_EQUATION_RGB:                             // fall-through...
            case GLenum::GL_BLEND_SRC_ALPHA:                                // fall-through...
            case GLenum::GL_BLEND_SRC_RGB:                                  // fall-through...
            case GLenum::GL_BLUE_BITS:                                      // fall-through...
            case GLenum::GL_COLOR_CLEAR_VALUE:                              // fall-through...
            case GLenum::GL_COLOR_WRITEMASK:                                // fall-through...
            case GLenum::GL_COMPRESSED_TEXTURE_FORMATS:                     // fall-through...
            case GLenum::GL_COPY_READ_BUFFER_BINDING:                       // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_CULL_FACE:                                      // fall-through...
            case GLenum::GL_CULL_FACE_MODE:                                 // fall-through...
            case GLenum::GL_CURRENT_PROGRAM:                                // fall-through...
            case GLenum::GL_DEPTH_BITS:                                     // fall-through...
            case GLenum::GL_DEPTH_CLEAR_VALUE:                              // fall-through...
            case GLenum::GL_DEPTH_FUNC:                                     // fall-through...
            case GLenum::GL_DEPTH_RANGE:                                    // fall-through...
            case GLenum::GL_DEPTH_TEST:                                     // fall-through...
            case GLenum::GL_DEPTH_WRITEMASK:                                // fall-through...
            case GLenum::GL_DITHER:                                         // fall-through...
            case GLenum::GL_DRAW_BUFFER:                                    // fall-through...
            case GLenum::GL_DRAW_FRAMEBUFFER_BINDING:                       // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER_BINDING:                   // fall-through...
            case GLenum::GL_FRAGMENT_SHADER_DERIVATIVE_HINT:                // fall-through...
            case GLenum::GL_FRONT_FACE:                                     // fall-through...
            case GLenum::GL_GENERATE_MIPMAP_HINT:                           // fall-through...
            case GLenum::GL_GREEN_BITS:                                     // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_FORMAT:               // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_TYPE:                 // fall-through...
            case GLenum::GL_LINE_WIDTH:                                     // fall-through...
            case GLenum::GL_MAJOR_VERSION:                                  // fall-through...
            case GLenum::GL_MAX_3D_TEXTURE_SIZE:                            // fall-through...
            case GLenum::GL_MAX_ARRAY_TEXTURE_LAYERS:                       // fall-through...
            case GLenum::GL_MAX_COLOR_ATTACHMENTS:                          // fall-through...
            case GLenum::GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:       // fall-through...
            case GLenum::GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:               // fall-through...
            case GLenum::GL_MAX_COMBINED_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:         // fall-through...
            case GLenum::GL_MAX_CUBE_MAP_TEXTURE_SIZE:                      // fall-through...
            case GLenum::GL_MAX_DRAW_BUFFERS:                               // fall-through...
            case GLenum::GL_MAX_ELEMENTS_INDICES:                           // fall-through...
            case GLenum::GL_MAX_ELEMENTS_VERTICES:                          // fall-through...
            case GLenum::GL_MAX_ELEMENT_INDEX:                              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_INPUT_COMPONENTS:                  // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:                // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_VECTORS:                   // fall-through...
            case GLenum::GL_MAX_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_MAX_RENDERBUFFER_SIZE:                          // fall-through...
            case GLenum::GL_MAX_SAMPLES:                                    // fall-through...
            case GLenum::GL_MAX_SERVER_WAIT_TIMEOUT:                        // fall-through...
            case GLenum::GL_MAX_TEXTURE_IMAGE_UNITS:                        // fall-through...
            case GLenum::GL_MAX_TEXTURE_LOD_BIAS:                           // fall-through...
            case GLenum::GL_MAX_TEXTURE_SIZE:                               // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:        // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:     // fall-through...
            case GLenum::GL_MAX_UNIFORM_BLOCK_SIZE:                         // fall-through...
            case GLenum::GL_MAX_UNIFORM_BUFFER_BINDINGS:                    // fall-through...
            case GLenum::GL_MAX_VARYING_COMPONENTS:                         // fall-through...
            case GLenum::GL_MAX_VARYING_VECTORS:                            // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIBS:                             // fall-through...
            case GLenum::GL_MAX_VERTEX_OUTPUT_COMPONENTS:                   // fall-through...
            case GLenum::GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:                 // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_BLOCKS:                      // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_COMPONENTS:                  // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_VECTORS:                     // fall-through...
            case GLenum::GL_MAX_VIEWPORT_DIMS:                              // fall-through...
            case GLenum::GL_MINOR_VERSION:                                  // fall-through...
            case GLenum::GL_MIN_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_NUM_COMPRESSED_TEXTURE_FORMATS:                 // fall-through...
            case GLenum::GL_NUM_EXTENSIONS:                                 // fall-through...
            case GLenum::GL_NUM_PROGRAM_BINARY_FORMATS:                     // fall-through...
            case GLenum::GL_NUM_SHADER_BINARY_FORMATS:                      // fall-through...
            case GLenum::GL_PACK_ALIGNMENT:                                 // fall-through...
            case GLenum::GL_PACK_ROW_LENGTH:                                // fall-through...
            case GLenum::GL_PACK_SKIP_PIXELS:                               // fall-through...
            case GLenum::GL_PACK_SKIP_ROWS:                                 // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER_BINDING:                    // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FACTOR:                          // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FILL:                            // fall-through...
            case GLenum::GL_POLYGON_OFFSET_UNITS:                           // fall-through...
            case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX:                  // fall-through...
            case GLenum::GL_PROGRAM_BINARY_FORMATS:                         // fall-through...
            case GLenum::GL_RASTERIZER_DISCARD:                             // fall-through...
            case GLenum::GL_READ_BUFFER:                                    // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER_BINDING:                       // fall-through...
            case GLenum::GL_RED_BITS:                                       // fall-through...
            case GLenum::GL_RENDERBUFFER_BINDING:                           // fall-through...
            case GLenum::GL_SAMPLER_BINDING:                                // fall-through...
            case GLenum::GL_SAMPLES:                                        // fall-through...
            case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE:                       // fall-through...
            case GLenum::GL_SAMPLE_BUFFERS:                                 // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE:                                // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_INVERT:                         // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_VALUE:                          // fall-through...
            case GLenum::GL_SCISSOR_BOX:                                    // fall-through...
            case GLenum::GL_SCISSOR_TEST:                                   // fall-through...
            case GLenum::GL_SHADER_BINARY_FORMATS:                          // fall-through...
            case GLenum::GL_SHADER_COMPILER:                                // fall-through...
            case GLenum::GL_STENCIL_BACK_FAIL:                              // fall-through...
            case GLenum::GL_STENCIL_BACK_FUNC:                              // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_FAIL:                   // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_PASS:                   // fall-through...
            case GLenum::GL_STENCIL_BACK_REF:                               // fall-through...
            case GLenum::GL_STENCIL_BACK_VALUE_MASK:                        // fall-through...
            case GLenum::GL_STENCIL_BACK_WRITEMASK:                         // fall-through...
            case GLenum::GL_STENCIL_BITS:                                   // fall-through...
            case GLenum::GL_STENCIL_CLEAR_VALUE:                            // fall-through...
            case GLenum::GL_STENCIL_FAIL:                                   // fall-through...
            case GLenum::GL_STENCIL_FUNC:                                   // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_FAIL:                        // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_PASS:                        // fall-through...
            case GLenum::GL_STENCIL_REF:                                    // fall-through...
            case GLenum::GL_STENCIL_TEST:                                   // fall-through...
            case GLenum::GL_STENCIL_VALUE_MASK:                             // fall-through...
            case GLenum::GL_STENCIL_WRITEMASK:                              // fall-through...
            case GLenum::GL_SUBPIXEL_BITS:                                  // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D:                             // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_ARRAY:                       // fall-through...
            case GLenum::GL_TEXTURE_BINDING_3D:                             // fall-through...
            case GLenum::GL_TEXTURE_BINDING_CUBE_MAP:                       // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_ACTIVE:                      // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BINDING:                     // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:              // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:                 // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_START:                // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_PAUSED:                      // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_BINDING:                         // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:                // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_SIZE:                            // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_START:                           // fall-through...
            case GLenum::GL_UNPACK_ALIGNMENT:                               // fall-through...
            case GLenum::GL_UNPACK_IMAGE_HEIGHT:                            // fall-through...
            case GLenum::GL_UNPACK_ROW_LENGTH:                              // fall-through...
            case GLenum::GL_UNPACK_SKIP_IMAGES:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_PIXELS:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_ROWS:                               // fall-through...
            case GLenum::GL_VERTEX_ARRAY_BINDING:                           // fall-through...
            case GLenum::GL_VIEWPORT: {
                break;
            }
            case GLenum::GL_DISPATCH_INDIRECT_BUFFER_BINDING:         // fall-through...
            case GLenum::GL_IMAGE_BINDING_LAYERED:                    // fall-through...
            case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:       // fall-through...
            case GLenum::GL_MAX_COLOR_TEXTURE_SAMPLES:                // fall-through...
            case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTERS:             // fall-through...
            case GLenum::GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTERS:              // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:        // fall-through...
            case GLenum::GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:          // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_BLOCKS:               // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_COMPONENTS:           // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_COUNT:             // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_SIZE:              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTERS:             // fall-through...
            case GLenum::GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:       // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_HEIGHT:                   // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_SAMPLES:                  // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_WIDTH:                    // fall-through...
            case GLenum::GL_MAX_INTEGER_SAMPLES:                      // fall-through...
            case GLenum::GL_MAX_SAMPLE_MASK_WORDS:                    // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BLOCK_SIZE:            // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:       // fall-through...
            case GLenum::GL_MAX_UNIFORM_LOCATIONS:                    // fall-through...
            case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTERS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_BINDINGS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:        // fall-through...
            case GLenum::GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:         // fall-through...
            case GLenum::GL_PROGRAM_PIPELINE_BINDING:                 // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_BINDING:            // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:   // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_SIZE:               // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_START:              // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_MULTISAMPLE:           // fall-through...
            case GLenum::GL_VERTEX_BINDING_DIVISOR:                   // fall-through...
            case GLenum::GL_VERTEX_BINDING_OFFSET:                    // fall-through...
            case GLenum::GL_VERTEX_BINDING_STRIDE: {
                uint32_t l_minRequiredVersion_862_major = 3;
                uint32_t l_minRequiredVersion_862_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetInteger64i_v(target, index, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetInteger64i_v coder(
            observations, target, index,
            gapic::coder::gles::GLint64__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetInteger64v(uint32_t pname, int64_t* data) {
    GAPID_INFO("glGetInteger64v(%u, %p)\n", pname, data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_864_major = 3;
        uint32_t l_minRequiredVersion_864_minor = 0;
        switch (pname) {
            case GLenum::GL_ACTIVE_TEXTURE:                                 // fall-through...
            case GLenum::GL_ALIASED_LINE_WIDTH_RANGE:                       // fall-through...
            case GLenum::GL_ALIASED_POINT_SIZE_RANGE:                       // fall-through...
            case GLenum::GL_ALPHA_BITS:                                     // fall-through...
            case GLenum::GL_ARRAY_BUFFER_BINDING:                           // fall-through...
            case GLenum::GL_BLEND:                                          // fall-through...
            case GLenum::GL_BLEND_COLOR:                                    // fall-through...
            case GLenum::GL_BLEND_DST_ALPHA:                                // fall-through...
            case GLenum::GL_BLEND_DST_RGB:                                  // fall-through...
            case GLenum::GL_BLEND_EQUATION_ALPHA:                           // fall-through...
            case GLenum::GL_BLEND_EQUATION_RGB:                             // fall-through...
            case GLenum::GL_BLEND_SRC_ALPHA:                                // fall-through...
            case GLenum::GL_BLEND_SRC_RGB:                                  // fall-through...
            case GLenum::GL_BLUE_BITS:                                      // fall-through...
            case GLenum::GL_COLOR_CLEAR_VALUE:                              // fall-through...
            case GLenum::GL_COLOR_WRITEMASK:                                // fall-through...
            case GLenum::GL_COMPRESSED_TEXTURE_FORMATS:                     // fall-through...
            case GLenum::GL_COPY_READ_BUFFER_BINDING:                       // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_CULL_FACE:                                      // fall-through...
            case GLenum::GL_CULL_FACE_MODE:                                 // fall-through...
            case GLenum::GL_CURRENT_PROGRAM:                                // fall-through...
            case GLenum::GL_DEPTH_BITS:                                     // fall-through...
            case GLenum::GL_DEPTH_CLEAR_VALUE:                              // fall-through...
            case GLenum::GL_DEPTH_FUNC:                                     // fall-through...
            case GLenum::GL_DEPTH_RANGE:                                    // fall-through...
            case GLenum::GL_DEPTH_TEST:                                     // fall-through...
            case GLenum::GL_DEPTH_WRITEMASK:                                // fall-through...
            case GLenum::GL_DITHER:                                         // fall-through...
            case GLenum::GL_DRAW_BUFFER:                                    // fall-through...
            case GLenum::GL_DRAW_FRAMEBUFFER_BINDING:                       // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER_BINDING:                   // fall-through...
            case GLenum::GL_FRAGMENT_SHADER_DERIVATIVE_HINT:                // fall-through...
            case GLenum::GL_FRONT_FACE:                                     // fall-through...
            case GLenum::GL_GENERATE_MIPMAP_HINT:                           // fall-through...
            case GLenum::GL_GREEN_BITS:                                     // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_FORMAT:               // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_TYPE:                 // fall-through...
            case GLenum::GL_LINE_WIDTH:                                     // fall-through...
            case GLenum::GL_MAJOR_VERSION:                                  // fall-through...
            case GLenum::GL_MAX_3D_TEXTURE_SIZE:                            // fall-through...
            case GLenum::GL_MAX_ARRAY_TEXTURE_LAYERS:                       // fall-through...
            case GLenum::GL_MAX_COLOR_ATTACHMENTS:                          // fall-through...
            case GLenum::GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:       // fall-through...
            case GLenum::GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:               // fall-through...
            case GLenum::GL_MAX_COMBINED_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:         // fall-through...
            case GLenum::GL_MAX_CUBE_MAP_TEXTURE_SIZE:                      // fall-through...
            case GLenum::GL_MAX_DRAW_BUFFERS:                               // fall-through...
            case GLenum::GL_MAX_ELEMENTS_INDICES:                           // fall-through...
            case GLenum::GL_MAX_ELEMENTS_VERTICES:                          // fall-through...
            case GLenum::GL_MAX_ELEMENT_INDEX:                              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_INPUT_COMPONENTS:                  // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:                // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_VECTORS:                   // fall-through...
            case GLenum::GL_MAX_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_MAX_RENDERBUFFER_SIZE:                          // fall-through...
            case GLenum::GL_MAX_SAMPLES:                                    // fall-through...
            case GLenum::GL_MAX_SERVER_WAIT_TIMEOUT:                        // fall-through...
            case GLenum::GL_MAX_TEXTURE_IMAGE_UNITS:                        // fall-through...
            case GLenum::GL_MAX_TEXTURE_LOD_BIAS:                           // fall-through...
            case GLenum::GL_MAX_TEXTURE_SIZE:                               // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:        // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:     // fall-through...
            case GLenum::GL_MAX_UNIFORM_BLOCK_SIZE:                         // fall-through...
            case GLenum::GL_MAX_UNIFORM_BUFFER_BINDINGS:                    // fall-through...
            case GLenum::GL_MAX_VARYING_COMPONENTS:                         // fall-through...
            case GLenum::GL_MAX_VARYING_VECTORS:                            // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIBS:                             // fall-through...
            case GLenum::GL_MAX_VERTEX_OUTPUT_COMPONENTS:                   // fall-through...
            case GLenum::GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:                 // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_BLOCKS:                      // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_COMPONENTS:                  // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_VECTORS:                     // fall-through...
            case GLenum::GL_MAX_VIEWPORT_DIMS:                              // fall-through...
            case GLenum::GL_MINOR_VERSION:                                  // fall-through...
            case GLenum::GL_MIN_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_NUM_COMPRESSED_TEXTURE_FORMATS:                 // fall-through...
            case GLenum::GL_NUM_EXTENSIONS:                                 // fall-through...
            case GLenum::GL_NUM_PROGRAM_BINARY_FORMATS:                     // fall-through...
            case GLenum::GL_NUM_SHADER_BINARY_FORMATS:                      // fall-through...
            case GLenum::GL_PACK_ALIGNMENT:                                 // fall-through...
            case GLenum::GL_PACK_ROW_LENGTH:                                // fall-through...
            case GLenum::GL_PACK_SKIP_PIXELS:                               // fall-through...
            case GLenum::GL_PACK_SKIP_ROWS:                                 // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER_BINDING:                    // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FACTOR:                          // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FILL:                            // fall-through...
            case GLenum::GL_POLYGON_OFFSET_UNITS:                           // fall-through...
            case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX:                  // fall-through...
            case GLenum::GL_PROGRAM_BINARY_FORMATS:                         // fall-through...
            case GLenum::GL_RASTERIZER_DISCARD:                             // fall-through...
            case GLenum::GL_READ_BUFFER:                                    // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER_BINDING:                       // fall-through...
            case GLenum::GL_RED_BITS:                                       // fall-through...
            case GLenum::GL_RENDERBUFFER_BINDING:                           // fall-through...
            case GLenum::GL_SAMPLER_BINDING:                                // fall-through...
            case GLenum::GL_SAMPLES:                                        // fall-through...
            case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE:                       // fall-through...
            case GLenum::GL_SAMPLE_BUFFERS:                                 // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE:                                // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_INVERT:                         // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_VALUE:                          // fall-through...
            case GLenum::GL_SCISSOR_BOX:                                    // fall-through...
            case GLenum::GL_SCISSOR_TEST:                                   // fall-through...
            case GLenum::GL_SHADER_BINARY_FORMATS:                          // fall-through...
            case GLenum::GL_SHADER_COMPILER:                                // fall-through...
            case GLenum::GL_STENCIL_BACK_FAIL:                              // fall-through...
            case GLenum::GL_STENCIL_BACK_FUNC:                              // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_FAIL:                   // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_PASS:                   // fall-through...
            case GLenum::GL_STENCIL_BACK_REF:                               // fall-through...
            case GLenum::GL_STENCIL_BACK_VALUE_MASK:                        // fall-through...
            case GLenum::GL_STENCIL_BACK_WRITEMASK:                         // fall-through...
            case GLenum::GL_STENCIL_BITS:                                   // fall-through...
            case GLenum::GL_STENCIL_CLEAR_VALUE:                            // fall-through...
            case GLenum::GL_STENCIL_FAIL:                                   // fall-through...
            case GLenum::GL_STENCIL_FUNC:                                   // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_FAIL:                        // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_PASS:                        // fall-through...
            case GLenum::GL_STENCIL_REF:                                    // fall-through...
            case GLenum::GL_STENCIL_TEST:                                   // fall-through...
            case GLenum::GL_STENCIL_VALUE_MASK:                             // fall-through...
            case GLenum::GL_STENCIL_WRITEMASK:                              // fall-through...
            case GLenum::GL_SUBPIXEL_BITS:                                  // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D:                             // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_ARRAY:                       // fall-through...
            case GLenum::GL_TEXTURE_BINDING_3D:                             // fall-through...
            case GLenum::GL_TEXTURE_BINDING_CUBE_MAP:                       // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_ACTIVE:                      // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BINDING:                     // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:              // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:                 // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_START:                // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_PAUSED:                      // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_BINDING:                         // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:                // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_SIZE:                            // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_START:                           // fall-through...
            case GLenum::GL_UNPACK_ALIGNMENT:                               // fall-through...
            case GLenum::GL_UNPACK_IMAGE_HEIGHT:                            // fall-through...
            case GLenum::GL_UNPACK_ROW_LENGTH:                              // fall-through...
            case GLenum::GL_UNPACK_SKIP_IMAGES:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_PIXELS:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_ROWS:                               // fall-through...
            case GLenum::GL_VERTEX_ARRAY_BINDING:                           // fall-through...
            case GLenum::GL_VIEWPORT: {
                break;
            }
            case GLenum::GL_DISPATCH_INDIRECT_BUFFER_BINDING:         // fall-through...
            case GLenum::GL_IMAGE_BINDING_LAYERED:                    // fall-through...
            case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:       // fall-through...
            case GLenum::GL_MAX_COLOR_TEXTURE_SAMPLES:                // fall-through...
            case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTERS:             // fall-through...
            case GLenum::GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTERS:              // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:        // fall-through...
            case GLenum::GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:          // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_BLOCKS:               // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_COMPONENTS:           // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_COUNT:             // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_SIZE:              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTERS:             // fall-through...
            case GLenum::GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:       // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_HEIGHT:                   // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_SAMPLES:                  // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_WIDTH:                    // fall-through...
            case GLenum::GL_MAX_INTEGER_SAMPLES:                      // fall-through...
            case GLenum::GL_MAX_SAMPLE_MASK_WORDS:                    // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BLOCK_SIZE:            // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:       // fall-through...
            case GLenum::GL_MAX_UNIFORM_LOCATIONS:                    // fall-through...
            case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTERS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_BINDINGS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:        // fall-through...
            case GLenum::GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:         // fall-through...
            case GLenum::GL_PROGRAM_PIPELINE_BINDING:                 // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_BINDING:            // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:   // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_SIZE:               // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_START:              // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_MULTISAMPLE:           // fall-through...
            case GLenum::GL_VERTEX_BINDING_DIVISOR:                   // fall-through...
            case GLenum::GL_VERTEX_BINDING_OFFSET:                    // fall-through...
            case GLenum::GL_VERTEX_BINDING_STRIDE: {
                uint32_t l_minRequiredVersion_865_major = 3;
                uint32_t l_minRequiredVersion_865_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetInteger64v(pname, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetInteger64v coder(
            observations, pname, gapic::coder::gles::GLint64__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetIntegeri_v(uint32_t target, uint32_t index, int32_t* data) {
    GAPID_INFO("glGetIntegeri_v(%u, %" PRIu32 ", %p)\n", target, index, data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_867_major = 3;
        uint32_t l_minRequiredVersion_867_minor = 0;
        switch (target) {
            case GLenum::GL_ACTIVE_TEXTURE:                                 // fall-through...
            case GLenum::GL_ALIASED_LINE_WIDTH_RANGE:                       // fall-through...
            case GLenum::GL_ALIASED_POINT_SIZE_RANGE:                       // fall-through...
            case GLenum::GL_ALPHA_BITS:                                     // fall-through...
            case GLenum::GL_ARRAY_BUFFER_BINDING:                           // fall-through...
            case GLenum::GL_BLEND:                                          // fall-through...
            case GLenum::GL_BLEND_COLOR:                                    // fall-through...
            case GLenum::GL_BLEND_DST_ALPHA:                                // fall-through...
            case GLenum::GL_BLEND_DST_RGB:                                  // fall-through...
            case GLenum::GL_BLEND_EQUATION_ALPHA:                           // fall-through...
            case GLenum::GL_BLEND_EQUATION_RGB:                             // fall-through...
            case GLenum::GL_BLEND_SRC_ALPHA:                                // fall-through...
            case GLenum::GL_BLEND_SRC_RGB:                                  // fall-through...
            case GLenum::GL_BLUE_BITS:                                      // fall-through...
            case GLenum::GL_COLOR_CLEAR_VALUE:                              // fall-through...
            case GLenum::GL_COLOR_WRITEMASK:                                // fall-through...
            case GLenum::GL_COMPRESSED_TEXTURE_FORMATS:                     // fall-through...
            case GLenum::GL_COPY_READ_BUFFER_BINDING:                       // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_CULL_FACE:                                      // fall-through...
            case GLenum::GL_CULL_FACE_MODE:                                 // fall-through...
            case GLenum::GL_CURRENT_PROGRAM:                                // fall-through...
            case GLenum::GL_DEPTH_BITS:                                     // fall-through...
            case GLenum::GL_DEPTH_CLEAR_VALUE:                              // fall-through...
            case GLenum::GL_DEPTH_FUNC:                                     // fall-through...
            case GLenum::GL_DEPTH_RANGE:                                    // fall-through...
            case GLenum::GL_DEPTH_TEST:                                     // fall-through...
            case GLenum::GL_DEPTH_WRITEMASK:                                // fall-through...
            case GLenum::GL_DITHER:                                         // fall-through...
            case GLenum::GL_DRAW_BUFFER:                                    // fall-through...
            case GLenum::GL_DRAW_FRAMEBUFFER_BINDING:                       // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER_BINDING:                   // fall-through...
            case GLenum::GL_FRAGMENT_SHADER_DERIVATIVE_HINT:                // fall-through...
            case GLenum::GL_FRONT_FACE:                                     // fall-through...
            case GLenum::GL_GENERATE_MIPMAP_HINT:                           // fall-through...
            case GLenum::GL_GREEN_BITS:                                     // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_FORMAT:               // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_TYPE:                 // fall-through...
            case GLenum::GL_LINE_WIDTH:                                     // fall-through...
            case GLenum::GL_MAJOR_VERSION:                                  // fall-through...
            case GLenum::GL_MAX_3D_TEXTURE_SIZE:                            // fall-through...
            case GLenum::GL_MAX_ARRAY_TEXTURE_LAYERS:                       // fall-through...
            case GLenum::GL_MAX_COLOR_ATTACHMENTS:                          // fall-through...
            case GLenum::GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:       // fall-through...
            case GLenum::GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:               // fall-through...
            case GLenum::GL_MAX_COMBINED_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:         // fall-through...
            case GLenum::GL_MAX_CUBE_MAP_TEXTURE_SIZE:                      // fall-through...
            case GLenum::GL_MAX_DRAW_BUFFERS:                               // fall-through...
            case GLenum::GL_MAX_ELEMENTS_INDICES:                           // fall-through...
            case GLenum::GL_MAX_ELEMENTS_VERTICES:                          // fall-through...
            case GLenum::GL_MAX_ELEMENT_INDEX:                              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_INPUT_COMPONENTS:                  // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:                // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_VECTORS:                   // fall-through...
            case GLenum::GL_MAX_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_MAX_RENDERBUFFER_SIZE:                          // fall-through...
            case GLenum::GL_MAX_SAMPLES:                                    // fall-through...
            case GLenum::GL_MAX_SERVER_WAIT_TIMEOUT:                        // fall-through...
            case GLenum::GL_MAX_TEXTURE_IMAGE_UNITS:                        // fall-through...
            case GLenum::GL_MAX_TEXTURE_LOD_BIAS:                           // fall-through...
            case GLenum::GL_MAX_TEXTURE_SIZE:                               // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:        // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:     // fall-through...
            case GLenum::GL_MAX_UNIFORM_BLOCK_SIZE:                         // fall-through...
            case GLenum::GL_MAX_UNIFORM_BUFFER_BINDINGS:                    // fall-through...
            case GLenum::GL_MAX_VARYING_COMPONENTS:                         // fall-through...
            case GLenum::GL_MAX_VARYING_VECTORS:                            // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIBS:                             // fall-through...
            case GLenum::GL_MAX_VERTEX_OUTPUT_COMPONENTS:                   // fall-through...
            case GLenum::GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:                 // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_BLOCKS:                      // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_COMPONENTS:                  // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_VECTORS:                     // fall-through...
            case GLenum::GL_MAX_VIEWPORT_DIMS:                              // fall-through...
            case GLenum::GL_MINOR_VERSION:                                  // fall-through...
            case GLenum::GL_MIN_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_NUM_COMPRESSED_TEXTURE_FORMATS:                 // fall-through...
            case GLenum::GL_NUM_EXTENSIONS:                                 // fall-through...
            case GLenum::GL_NUM_PROGRAM_BINARY_FORMATS:                     // fall-through...
            case GLenum::GL_NUM_SHADER_BINARY_FORMATS:                      // fall-through...
            case GLenum::GL_PACK_ALIGNMENT:                                 // fall-through...
            case GLenum::GL_PACK_ROW_LENGTH:                                // fall-through...
            case GLenum::GL_PACK_SKIP_PIXELS:                               // fall-through...
            case GLenum::GL_PACK_SKIP_ROWS:                                 // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER_BINDING:                    // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FACTOR:                          // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FILL:                            // fall-through...
            case GLenum::GL_POLYGON_OFFSET_UNITS:                           // fall-through...
            case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX:                  // fall-through...
            case GLenum::GL_PROGRAM_BINARY_FORMATS:                         // fall-through...
            case GLenum::GL_RASTERIZER_DISCARD:                             // fall-through...
            case GLenum::GL_READ_BUFFER:                                    // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER_BINDING:                       // fall-through...
            case GLenum::GL_RED_BITS:                                       // fall-through...
            case GLenum::GL_RENDERBUFFER_BINDING:                           // fall-through...
            case GLenum::GL_SAMPLER_BINDING:                                // fall-through...
            case GLenum::GL_SAMPLES:                                        // fall-through...
            case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE:                       // fall-through...
            case GLenum::GL_SAMPLE_BUFFERS:                                 // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE:                                // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_INVERT:                         // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_VALUE:                          // fall-through...
            case GLenum::GL_SCISSOR_BOX:                                    // fall-through...
            case GLenum::GL_SCISSOR_TEST:                                   // fall-through...
            case GLenum::GL_SHADER_BINARY_FORMATS:                          // fall-through...
            case GLenum::GL_SHADER_COMPILER:                                // fall-through...
            case GLenum::GL_STENCIL_BACK_FAIL:                              // fall-through...
            case GLenum::GL_STENCIL_BACK_FUNC:                              // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_FAIL:                   // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_PASS:                   // fall-through...
            case GLenum::GL_STENCIL_BACK_REF:                               // fall-through...
            case GLenum::GL_STENCIL_BACK_VALUE_MASK:                        // fall-through...
            case GLenum::GL_STENCIL_BACK_WRITEMASK:                         // fall-through...
            case GLenum::GL_STENCIL_BITS:                                   // fall-through...
            case GLenum::GL_STENCIL_CLEAR_VALUE:                            // fall-through...
            case GLenum::GL_STENCIL_FAIL:                                   // fall-through...
            case GLenum::GL_STENCIL_FUNC:                                   // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_FAIL:                        // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_PASS:                        // fall-through...
            case GLenum::GL_STENCIL_REF:                                    // fall-through...
            case GLenum::GL_STENCIL_TEST:                                   // fall-through...
            case GLenum::GL_STENCIL_VALUE_MASK:                             // fall-through...
            case GLenum::GL_STENCIL_WRITEMASK:                              // fall-through...
            case GLenum::GL_SUBPIXEL_BITS:                                  // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D:                             // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_ARRAY:                       // fall-through...
            case GLenum::GL_TEXTURE_BINDING_3D:                             // fall-through...
            case GLenum::GL_TEXTURE_BINDING_CUBE_MAP:                       // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_ACTIVE:                      // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BINDING:                     // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:              // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:                 // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_START:                // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_PAUSED:                      // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_BINDING:                         // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:                // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_SIZE:                            // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_START:                           // fall-through...
            case GLenum::GL_UNPACK_ALIGNMENT:                               // fall-through...
            case GLenum::GL_UNPACK_IMAGE_HEIGHT:                            // fall-through...
            case GLenum::GL_UNPACK_ROW_LENGTH:                              // fall-through...
            case GLenum::GL_UNPACK_SKIP_IMAGES:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_PIXELS:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_ROWS:                               // fall-through...
            case GLenum::GL_VERTEX_ARRAY_BINDING:                           // fall-through...
            case GLenum::GL_VIEWPORT: {
                break;
            }
            case GLenum::GL_DISPATCH_INDIRECT_BUFFER_BINDING:         // fall-through...
            case GLenum::GL_IMAGE_BINDING_LAYERED:                    // fall-through...
            case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:       // fall-through...
            case GLenum::GL_MAX_COLOR_TEXTURE_SAMPLES:                // fall-through...
            case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTERS:             // fall-through...
            case GLenum::GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTERS:              // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:        // fall-through...
            case GLenum::GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:          // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_BLOCKS:               // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_COMPONENTS:           // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_COUNT:             // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_SIZE:              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTERS:             // fall-through...
            case GLenum::GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:       // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_HEIGHT:                   // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_SAMPLES:                  // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_WIDTH:                    // fall-through...
            case GLenum::GL_MAX_INTEGER_SAMPLES:                      // fall-through...
            case GLenum::GL_MAX_SAMPLE_MASK_WORDS:                    // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BLOCK_SIZE:            // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:       // fall-through...
            case GLenum::GL_MAX_UNIFORM_LOCATIONS:                    // fall-through...
            case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTERS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_BINDINGS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:        // fall-through...
            case GLenum::GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:         // fall-through...
            case GLenum::GL_PROGRAM_PIPELINE_BINDING:                 // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_BINDING:            // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:   // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_SIZE:               // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_START:              // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_MULTISAMPLE:           // fall-through...
            case GLenum::GL_VERTEX_BINDING_DIVISOR:                   // fall-through...
            case GLenum::GL_VERTEX_BINDING_OFFSET:                    // fall-through...
            case GLenum::GL_VERTEX_BINDING_STRIDE: {
                uint32_t l_minRequiredVersion_868_major = 3;
                uint32_t l_minRequiredVersion_868_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetIntegeri_v(target, index, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetIntegeri_v coder(
            observations, target, index, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                                 reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetIntegerv(uint32_t param, int32_t* values) {
    GAPID_INFO("glGetIntegerv(%u, %p)\n", param, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_870_major = 2;
        uint32_t l_minRequiredVersion_870_minor = 0;
        switch (param) {
            case GLenum::GL_ACTIVE_TEXTURE:                    // fall-through...
            case GLenum::GL_ALIASED_LINE_WIDTH_RANGE:          // fall-through...
            case GLenum::GL_ALIASED_POINT_SIZE_RANGE:          // fall-through...
            case GLenum::GL_ALPHA_BITS:                        // fall-through...
            case GLenum::GL_ARRAY_BUFFER_BINDING:              // fall-through...
            case GLenum::GL_BLEND:                             // fall-through...
            case GLenum::GL_BLEND_COLOR:                       // fall-through...
            case GLenum::GL_BLEND_DST_ALPHA:                   // fall-through...
            case GLenum::GL_BLEND_DST_RGB:                     // fall-through...
            case GLenum::GL_BLEND_EQUATION_ALPHA:              // fall-through...
            case GLenum::GL_BLEND_EQUATION_RGB:                // fall-through...
            case GLenum::GL_BLEND_SRC_ALPHA:                   // fall-through...
            case GLenum::GL_BLEND_SRC_RGB:                     // fall-through...
            case GLenum::GL_BLUE_BITS:                         // fall-through...
            case GLenum::GL_COLOR_CLEAR_VALUE:                 // fall-through...
            case GLenum::GL_COLOR_WRITEMASK:                   // fall-through...
            case GLenum::GL_COMPRESSED_TEXTURE_FORMATS:        // fall-through...
            case GLenum::GL_CULL_FACE:                         // fall-through...
            case GLenum::GL_CULL_FACE_MODE:                    // fall-through...
            case GLenum::GL_CURRENT_PROGRAM:                   // fall-through...
            case GLenum::GL_DEPTH_BITS:                        // fall-through...
            case GLenum::GL_DEPTH_CLEAR_VALUE:                 // fall-through...
            case GLenum::GL_DEPTH_FUNC:                        // fall-through...
            case GLenum::GL_DEPTH_RANGE:                       // fall-through...
            case GLenum::GL_DEPTH_TEST:                        // fall-through...
            case GLenum::GL_DEPTH_WRITEMASK:                   // fall-through...
            case GLenum::GL_DITHER:                            // fall-through...
            case GLenum::GL_ELEMENT_ARRAY_BUFFER_BINDING:      // fall-through...
            case GLenum::GL_DRAW_FRAMEBUFFER_BINDING:          // fall-through...
            case GLenum::GL_FRONT_FACE:                        // fall-through...
            case GLenum::GL_GENERATE_MIPMAP_HINT:              // fall-through...
            case GLenum::GL_GREEN_BITS:                        // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_FORMAT:  // fall-through...
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_TYPE:    // fall-through...
            case GLenum::GL_LINE_WIDTH:                        // fall-through...
            case GLenum::GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:  // fall-through...
            case GLenum::GL_MAX_CUBE_MAP_TEXTURE_SIZE:         // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_VECTORS:      // fall-through...
            case GLenum::GL_MAX_RENDERBUFFER_SIZE:             // fall-through...
            case GLenum::GL_MAX_TEXTURE_IMAGE_UNITS:           // fall-through...
            case GLenum::GL_MAX_TEXTURE_SIZE:                  // fall-through...
            case GLenum::GL_MAX_VARYING_VECTORS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIBS:                // fall-through...
            case GLenum::GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:    // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_VECTORS:        // fall-through...
            case GLenum::GL_MAX_VIEWPORT_DIMS:                 // fall-through...
            case GLenum::GL_NUM_COMPRESSED_TEXTURE_FORMATS:    // fall-through...
            case GLenum::GL_NUM_SHADER_BINARY_FORMATS:         // fall-through...
            case GLenum::GL_PACK_ALIGNMENT:                    // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FACTOR:             // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FILL:               // fall-through...
            case GLenum::GL_POLYGON_OFFSET_UNITS:              // fall-through...
            case GLenum::GL_RED_BITS:                          // fall-through...
            case GLenum::GL_RENDERBUFFER_BINDING:              // fall-through...
            case GLenum::GL_SAMPLES:                           // fall-through...
            case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE:          // fall-through...
            case GLenum::GL_SAMPLE_BUFFERS:                    // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE:                   // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_INVERT:            // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE_VALUE:             // fall-through...
            case GLenum::GL_SCISSOR_BOX:                       // fall-through...
            case GLenum::GL_SCISSOR_TEST:                      // fall-through...
            case GLenum::GL_SHADER_BINARY_FORMATS:             // fall-through...
            case GLenum::GL_SHADER_COMPILER:                   // fall-through...
            case GLenum::GL_STENCIL_BACK_FAIL:                 // fall-through...
            case GLenum::GL_STENCIL_BACK_FUNC:                 // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_FAIL:      // fall-through...
            case GLenum::GL_STENCIL_BACK_PASS_DEPTH_PASS:      // fall-through...
            case GLenum::GL_STENCIL_BACK_REF:                  // fall-through...
            case GLenum::GL_STENCIL_BACK_VALUE_MASK:           // fall-through...
            case GLenum::GL_STENCIL_BACK_WRITEMASK:            // fall-through...
            case GLenum::GL_STENCIL_BITS:                      // fall-through...
            case GLenum::GL_STENCIL_CLEAR_VALUE:               // fall-through...
            case GLenum::GL_STENCIL_FAIL:                      // fall-through...
            case GLenum::GL_STENCIL_FUNC:                      // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_FAIL:           // fall-through...
            case GLenum::GL_STENCIL_PASS_DEPTH_PASS:           // fall-through...
            case GLenum::GL_STENCIL_REF:                       // fall-through...
            case GLenum::GL_STENCIL_TEST:                      // fall-through...
            case GLenum::GL_STENCIL_VALUE_MASK:                // fall-through...
            case GLenum::GL_STENCIL_WRITEMASK:                 // fall-through...
            case GLenum::GL_SUBPIXEL_BITS:                     // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D:                // fall-through...
            case GLenum::GL_TEXTURE_BINDING_CUBE_MAP:          // fall-through...
            case GLenum::GL_UNPACK_ALIGNMENT:                  // fall-through...
            case GLenum::GL_VIEWPORT: {
                break;
            }
            case GLenum::GL_COPY_READ_BUFFER_BINDING:                       // fall-through...
            case GLenum::GL_COPY_WRITE_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_DRAW_BUFFER:                                    // fall-through...
            case GLenum::GL_FRAGMENT_SHADER_DERIVATIVE_HINT:                // fall-through...
            case GLenum::GL_MAJOR_VERSION:                                  // fall-through...
            case GLenum::GL_MAX_3D_TEXTURE_SIZE:                            // fall-through...
            case GLenum::GL_MAX_ARRAY_TEXTURE_LAYERS:                       // fall-through...
            case GLenum::GL_MAX_COLOR_ATTACHMENTS:                          // fall-through...
            case GLenum::GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:       // fall-through...
            case GLenum::GL_MAX_COMBINED_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:         // fall-through...
            case GLenum::GL_MAX_DRAW_BUFFERS:                               // fall-through...
            case GLenum::GL_MAX_ELEMENTS_INDICES:                           // fall-through...
            case GLenum::GL_MAX_ELEMENTS_VERTICES:                          // fall-through...
            case GLenum::GL_MAX_ELEMENT_INDEX:                              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_INPUT_COMPONENTS:                  // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_BLOCKS:                    // fall-through...
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:                // fall-through...
            case GLenum::GL_MAX_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_MAX_SAMPLES:                                    // fall-through...
            case GLenum::GL_MAX_SERVER_WAIT_TIMEOUT:                        // fall-through...
            case GLenum::GL_MAX_TEXTURE_LOD_BIAS:                           // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:        // fall-through...
            case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:     // fall-through...
            case GLenum::GL_MAX_UNIFORM_BLOCK_SIZE:                         // fall-through...
            case GLenum::GL_MAX_UNIFORM_BUFFER_BINDINGS:                    // fall-through...
            case GLenum::GL_MAX_VARYING_COMPONENTS:                         // fall-through...
            case GLenum::GL_MAX_VERTEX_OUTPUT_COMPONENTS:                   // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_BLOCKS:                      // fall-through...
            case GLenum::GL_MAX_VERTEX_UNIFORM_COMPONENTS:                  // fall-through...
            case GLenum::GL_MINOR_VERSION:                                  // fall-through...
            case GLenum::GL_MIN_PROGRAM_TEXEL_OFFSET:                       // fall-through...
            case GLenum::GL_NUM_EXTENSIONS:                                 // fall-through...
            case GLenum::GL_NUM_PROGRAM_BINARY_FORMATS:                     // fall-through...
            case GLenum::GL_PACK_ROW_LENGTH:                                // fall-through...
            case GLenum::GL_PACK_SKIP_PIXELS:                               // fall-through...
            case GLenum::GL_PACK_SKIP_ROWS:                                 // fall-through...
            case GLenum::GL_PIXEL_PACK_BUFFER_BINDING:                      // fall-through...
            case GLenum::GL_PIXEL_UNPACK_BUFFER_BINDING:                    // fall-through...
            case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX:                  // fall-through...
            case GLenum::GL_PROGRAM_BINARY_FORMATS:                         // fall-through...
            case GLenum::GL_RASTERIZER_DISCARD:                             // fall-through...
            case GLenum::GL_READ_BUFFER:                                    // fall-through...
            case GLenum::GL_READ_FRAMEBUFFER_BINDING:                       // fall-through...
            case GLenum::GL_SAMPLER_BINDING:                                // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_ARRAY:                       // fall-through...
            case GLenum::GL_TEXTURE_BINDING_3D:                             // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_ACTIVE:                      // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BINDING:                     // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:              // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:                 // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_START:                // fall-through...
            case GLenum::GL_TRANSFORM_FEEDBACK_PAUSED:                      // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_BINDING:                         // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:                // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_SIZE:                            // fall-through...
            case GLenum::GL_UNIFORM_BUFFER_START:                           // fall-through...
            case GLenum::GL_UNPACK_IMAGE_HEIGHT:                            // fall-through...
            case GLenum::GL_UNPACK_ROW_LENGTH:                              // fall-through...
            case GLenum::GL_UNPACK_SKIP_IMAGES:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_PIXELS:                             // fall-through...
            case GLenum::GL_UNPACK_SKIP_ROWS:                               // fall-through...
            case GLenum::GL_VERTEX_ARRAY_BINDING: {
                uint32_t l_minRequiredVersion_871_major = 3;
                uint32_t l_minRequiredVersion_871_minor = 0;
                break;
            }
            case GLenum::GL_DISPATCH_INDIRECT_BUFFER_BINDING:         // fall-through...
            case GLenum::GL_IMAGE_BINDING_LAYERED:                    // fall-through...
            case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:       // fall-through...
            case GLenum::GL_MAX_COLOR_TEXTURE_SAMPLES:                // fall-through...
            case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTERS:             // fall-through...
            case GLenum::GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:  // fall-through...
            case GLenum::GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTERS:              // fall-through...
            case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:        // fall-through...
            case GLenum::GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:          // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_BLOCKS:               // fall-through...
            case GLenum::GL_MAX_COMPUTE_UNIFORM_COMPONENTS:           // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_COUNT:             // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:       // fall-through...
            case GLenum::GL_MAX_COMPUTE_WORK_GROUP_SIZE:              // fall-through...
            case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTERS:             // fall-through...
            case GLenum::GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:       // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_HEIGHT:                   // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_SAMPLES:                  // fall-through...
            case GLenum::GL_MAX_FRAMEBUFFER_WIDTH:                    // fall-through...
            case GLenum::GL_MAX_INTEGER_SAMPLES:                      // fall-through...
            case GLenum::GL_MAX_SAMPLE_MASK_WORDS:                    // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BLOCK_SIZE:            // fall-through...
            case GLenum::GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:       // fall-through...
            case GLenum::GL_MAX_UNIFORM_LOCATIONS:                    // fall-through...
            case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTERS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_BINDINGS:               // fall-through...
            case GLenum::GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:        // fall-through...
            case GLenum::GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:         // fall-through...
            case GLenum::GL_PROGRAM_PIPELINE_BINDING:                 // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_BINDING:            // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:   // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_SIZE:               // fall-through...
            case GLenum::GL_SHADER_STORAGE_BUFFER_START:              // fall-through...
            case GLenum::GL_TEXTURE_BINDING_2D_MULTISAMPLE:           // fall-through...
            case GLenum::GL_VERTEX_BINDING_DIVISOR:                   // fall-through...
            case GLenum::GL_VERTEX_BINDING_OFFSET:                    // fall-through...
            case GLenum::GL_VERTEX_BINDING_STRIDE: {
                uint32_t l_minRequiredVersion_872_major = 3;
                uint32_t l_minRequiredVersion_872_minor = 1;
                break;
            }
        }
        Slice<GLint> l_v = slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_874_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_874_result;
        observe(observations.mReads);
        mImports.glGetIntegerv(param, values);
        switch (param) {
            case GLenum::GL_ACTIVE_TEXTURE: {
                write(l_v, 0, (GLint)(l_ctx->mActiveTextureUnit));
                break;
            }
            case GLenum::GL_ARRAY_BUFFER_BINDING: {
                write(l_v, 0, (GLint)(l_ctx->mBoundBuffers[GLenum::GL_ARRAY_BUFFER]));
                break;
            }
            case GLenum::GL_ELEMENT_ARRAY_BUFFER_BINDING: {
                write(l_v, 0, (GLint)(l_ctx->mBoundBuffers[GLenum::GL_ELEMENT_ARRAY_BUFFER]));
                break;
            }
            case GLenum::GL_BLEND_SRC_ALPHA: {
                write(l_v, 0, (GLint)(l_ctx->mBlending.mSrcAlphaBlendFactor));
                break;
            }
            case GLenum::GL_BLEND_SRC_RGB: {
                write(l_v, 0, (GLint)(l_ctx->mBlending.mSrcRgbBlendFactor));
                break;
            }
            case GLenum::GL_BLEND_DST_ALPHA: {
                write(l_v, 0, (GLint)(l_ctx->mBlending.mDstAlphaBlendFactor));
                break;
            }
            case GLenum::GL_BLEND_DST_RGB: {
                write(l_v, 0, (GLint)(l_ctx->mBlending.mDstRgbBlendFactor));
                break;
            }
            case GLenum::GL_BLEND_EQUATION_RGB: {
                write(l_v, 0, (GLint)(l_ctx->mBlending.mBlendEquationRgb));
                break;
            }
            case GLenum::GL_BLEND_EQUATION_ALPHA: {
                write(l_v, 0, (GLint)(l_ctx->mBlending.mBlendEquationAlpha));
                break;
            }
            case GLenum::GL_BLEND_COLOR: {
                write(l_v, 0, (GLint)(l_ctx->mBlending.mBlendColor.mRed));
                write(l_v, 1, (GLint)(l_ctx->mBlending.mBlendColor.mGreen));
                write(l_v, 2, (GLint)(l_ctx->mBlending.mBlendColor.mBlue));
                write(l_v, 3, (GLint)(l_ctx->mBlending.mBlendColor.mAlpha));
                break;
            }
            case GLenum::GL_DEPTH_FUNC: {
                write(l_v, 0, (GLint)(l_ctx->mRasterizing.mDepthTestFunction));
                break;
            }
            case GLenum::GL_DEPTH_CLEAR_VALUE: {
                write(l_v, 0, (GLint)(l_ctx->mClearing.mClearDepth));
                break;
            }
            case GLenum::GL_STENCIL_WRITEMASK: {
                write(l_v, 0, (GLint)(l_ctx->mRasterizing.mStencilMask[GLenum::GL_FRONT]));
                break;
            }
            case GLenum::GL_STENCIL_BACK_WRITEMASK: {
                write(l_v, 0, (GLint)(l_ctx->mRasterizing.mStencilMask[GLenum::GL_BACK]));
                break;
            }
            case GLenum::GL_VIEWPORT: {
                write(l_v, 0, l_ctx->mRasterizing.mViewport.mX);
                write(l_v, 1, l_ctx->mRasterizing.mViewport.mY);
                write(l_v, 2, (GLint)(l_ctx->mRasterizing.mViewport.mWidth));
                write(l_v, 3, (GLint)(l_ctx->mRasterizing.mViewport.mHeight));
                break;
            }
            case GLenum::GL_SCISSOR_BOX: {
                write(l_v, 0, l_ctx->mRasterizing.mScissor.mX);
                write(l_v, 1, l_ctx->mRasterizing.mScissor.mY);
                write(l_v, 2, (GLint)(l_ctx->mRasterizing.mScissor.mWidth));
                write(l_v, 3, (GLint)(l_ctx->mRasterizing.mScissor.mHeight));
                break;
            }
            case GLenum::GL_FRONT_FACE: {
                write(l_v, 0, (GLint)(l_ctx->mRasterizing.mFrontFace));
                break;
            }
            case GLenum::GL_CULL_FACE_MODE: {
                write(l_v, 0, (GLint)(l_ctx->mRasterizing.mCullFace));
                break;
            }
            case GLenum::GL_STENCIL_CLEAR_VALUE: {
                write(l_v, 0, l_ctx->mClearing.mClearStencil);
                break;
            }
            case GLenum::GL_DRAW_FRAMEBUFFER_BINDING: {
                write(l_v, 0, (GLint)(l_ctx->mBoundFramebuffers[GLenum::GL_FRAMEBUFFER]));
                break;
            }
            case GLenum::GL_READ_FRAMEBUFFER_BINDING: {
                write(l_v, 0, (GLint)(l_ctx->mBoundFramebuffers[GLenum::GL_READ_FRAMEBUFFER]));
                break;
            }
            case GLenum::GL_RENDERBUFFER_BINDING: {
                write(l_v, 0, (GLint)(l_ctx->mBoundRenderbuffers[GLenum::GL_RENDERBUFFER]));
                break;
            }
            case GLenum::GL_CURRENT_PROGRAM: {
                write(l_v, 0, (GLint)(l_ctx->mBoundProgram));
                break;
            }
            case GLenum::GL_TEXTURE_BINDING_2D: {
                write(l_v, 0, (GLint)(l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit]
                                                          [GLenum::GL_TEXTURE_2D]));
                break;
            }
            case GLenum::GL_TEXTURE_BINDING_CUBE_MAP: {
                write(l_v, 0, (GLint)(l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit]
                                                          [GLenum::GL_TEXTURE_CUBE_MAP]));
                break;
            }
            case GLenum::GL_GENERATE_MIPMAP_HINT: {
                write(l_v, 0, (GLint)(l_ctx->mGenerateMipmapHint));
                break;
            }
            case GLenum::GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: {
                auto l_result =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                write(l_v, 0, l_result);
                break;
            }
            case GLenum::GL_MAX_CUBE_MAP_TEXTURE_SIZE: {
                auto l_result =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                write(l_v, 0, l_result);
                break;
            }
            case GLenum::GL_MAX_FRAGMENT_UNIFORM_VECTORS: {
                auto l_result =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                write(l_v, 0, l_result);
                break;
            }
            case GLenum::GL_MAX_RENDERBUFFER_SIZE: {
                auto l_result =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                write(l_v, 0, l_result);
                break;
            }
            case GLenum::GL_MAX_TEXTURE_IMAGE_UNITS: {
                auto l_result =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                write(l_v, 0, l_result);
                break;
            }
            case GLenum::GL_MAX_TEXTURE_SIZE: {
                auto l_result =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                write(l_v, 0, l_result);
                break;
            }
            case GLenum::GL_MAX_VARYING_VECTORS: {
                auto l_result =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                write(l_v, 0, l_result);
                break;
            }
            case GLenum::GL_MAX_VERTEX_ATTRIBS: {
                auto l_result =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                write(l_v, 0, l_result);
                break;
            }
            case GLenum::GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_MAX_VERTEX_UNIFORM_VECTORS: {
                auto l_result =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                write(l_v, 0, l_result);
                break;
            }
            case GLenum::GL_MAX_VIEWPORT_DIMS: {
                auto l_max_width =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                auto l_max_height =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[1];
                write(l_v, 0, l_max_width);
                write(l_v, 1, l_max_height);
                break;
            }
            case GLenum::GL_NUM_COMPRESSED_TEXTURE_FORMATS: {
                auto l_result =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                write(l_v, 0, l_result);
                break;
            }
            case GLenum::GL_NUM_SHADER_BINARY_FORMATS: {
                auto l_result =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                write(l_v, 0, l_result);
                break;
            }
            case GLenum::GL_PACK_ALIGNMENT: {
                write(l_v, 0, l_ctx->mPixelStorage[GLenum::GL_PACK_ALIGNMENT]);
                break;
            }
            case GLenum::GL_UNPACK_ALIGNMENT: {
                write(l_v, 0, l_ctx->mPixelStorage[GLenum::GL_UNPACK_ALIGNMENT]);
                break;
            }
            case GLenum::GL_ALPHA_BITS: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_BLUE_BITS: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_GREEN_BITS: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_RED_BITS: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_DEPTH_BITS: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_SAMPLE_BUFFERS: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_SAMPLES: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_STENCIL_BITS: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_SUBPIXEL_BITS: {
                auto l_result =
                        slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0];
                write(l_v, 0, l_result);
                break;
            }
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_FORMAT: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_IMPLEMENTATION_COLOR_READ_TYPE: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
            case GLenum::GL_GPU_DISJOINT_EXT: {
                write(l_v, 0,
                      slice(values, (uint64_t)(0), (uint64_t)(stateVariableSize(param)))[0]);
                break;
            }
        }
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetIntegerv coder(
            observations, param, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetInternalformativ(uint32_t target, uint32_t internalformat, uint32_t pname,
                                           int32_t bufSize, int32_t* params) {
    GAPID_INFO("glGetInternalformativ(%u, %u, %u, %" PRId32 ", %p)\n", target, internalformat,
               pname, bufSize, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_875_major = 3;
        uint32_t l_minRequiredVersion_875_minor = 0;
        switch (target) {
            case GLenum::GL_RENDERBUFFER: {
                break;
            }
            case GLenum::GL_TEXTURE_2D_MULTISAMPLE: {
                uint32_t l_minRequiredVersion_876_major = 3;
                uint32_t l_minRequiredVersion_876_minor = 1;
                break;
            }
        }
        switch (internalformat) {
            case GLenum::GL_DEPTH24_STENCIL8:    // fall-through...
            case GLenum::GL_DEPTH32F_STENCIL8:   // fall-through...
            case GLenum::GL_DEPTH_COMPONENT16:   // fall-through...
            case GLenum::GL_DEPTH_COMPONENT24:   // fall-through...
            case GLenum::GL_DEPTH_COMPONENT32F:  // fall-through...
            case GLenum::GL_R11F_G11F_B10F:      // fall-through...
            case GLenum::GL_R16F:                // fall-through...
            case GLenum::GL_R16I:                // fall-through...
            case GLenum::GL_R16UI:               // fall-through...
            case GLenum::GL_R32F:                // fall-through...
            case GLenum::GL_R32I:                // fall-through...
            case GLenum::GL_R32UI:               // fall-through...
            case GLenum::GL_R8:                  // fall-through...
            case GLenum::GL_R8I:                 // fall-through...
            case GLenum::GL_R8UI:                // fall-through...
            case GLenum::GL_R8_SNORM:            // fall-through...
            case GLenum::GL_RG16F:               // fall-through...
            case GLenum::GL_RG16I:               // fall-through...
            case GLenum::GL_RG16UI:              // fall-through...
            case GLenum::GL_RG32F:               // fall-through...
            case GLenum::GL_RG32I:               // fall-through...
            case GLenum::GL_RG32UI:              // fall-through...
            case GLenum::GL_RG8:                 // fall-through...
            case GLenum::GL_RG8I:                // fall-through...
            case GLenum::GL_RG8UI:               // fall-through...
            case GLenum::GL_RG8_SNORM:           // fall-through...
            case GLenum::GL_RGB10_A2:            // fall-through...
            case GLenum::GL_RGB10_A2UI:          // fall-through...
            case GLenum::GL_RGB16F:              // fall-through...
            case GLenum::GL_RGB16I:              // fall-through...
            case GLenum::GL_RGB16UI:             // fall-through...
            case GLenum::GL_RGB32F:              // fall-through...
            case GLenum::GL_RGB32I:              // fall-through...
            case GLenum::GL_RGB32UI:             // fall-through...
            case GLenum::GL_RGB565:              // fall-through...
            case GLenum::GL_RGB5_A1:             // fall-through...
            case GLenum::GL_RGB8:                // fall-through...
            case GLenum::GL_RGB8I:               // fall-through...
            case GLenum::GL_RGB8UI:              // fall-through...
            case GLenum::GL_RGB8_SNORM:          // fall-through...
            case GLenum::GL_RGB9_E5:             // fall-through...
            case GLenum::GL_RGBA16F:             // fall-through...
            case GLenum::GL_RGBA16I:             // fall-through...
            case GLenum::GL_RGBA16UI:            // fall-through...
            case GLenum::GL_RGBA32F:             // fall-through...
            case GLenum::GL_RGBA32I:             // fall-through...
            case GLenum::GL_RGBA32UI:            // fall-through...
            case GLenum::GL_RGBA4:               // fall-through...
            case GLenum::GL_RGBA8:               // fall-through...
            case GLenum::GL_RGBA8I:              // fall-through...
            case GLenum::GL_RGBA8UI:             // fall-through...
            case GLenum::GL_RGBA8_SNORM:         // fall-through...
            case GLenum::GL_SRGB8:               // fall-through...
            case GLenum::GL_SRGB8_ALPHA8: {
                break;
            }
        }
        switch (pname) {
            case GLenum::GL_NUM_SAMPLE_COUNTS:  // fall-through...
            case GLenum::GL_SAMPLES: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetInternalformativ(target, internalformat, pname, bufSize, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetInternalformativ coder(
            observations, target, internalformat, pname, bufSize,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline uint8_t* GlesSpy::glGetString(uint32_t param) {
    GAPID_INFO("glGetString(%u)\n", param);

    uint8_t* result = nullptr;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_880_major = 2;
        uint32_t l_minRequiredVersion_880_minor = 0;
        switch (param) {
            case GLenum::GL_EXTENSIONS:                // fall-through...
            case GLenum::GL_RENDERER:                  // fall-through...
            case GLenum::GL_SHADING_LANGUAGE_VERSION:  // fall-through...
            case GLenum::GL_VENDOR:                    // fall-through...
            case GLenum::GL_VERSION: {
                break;
            }
        }
        observe(observations.mReads);
        result = mImports.glGetString(param);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetString coder(
            observations, param, gapic::coder::gles::GLubyte__CP(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(result), 0)));
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t* GlesSpy::glGetStringi(uint32_t name, uint32_t index) {
    GAPID_INFO("glGetStringi(%u, %" PRIu32 ")\n", name, index);

    uint8_t* result = nullptr;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_882_major = 3;
        uint32_t l_minRequiredVersion_882_minor = 0;
        switch (name) {
            case GLenum::GL_EXTENSIONS: {
                break;
            }
        }
        observe(observations.mReads);
        result = mImports.glGetStringi(name, index);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetStringi coder(
            observations, name, index,
            gapic::coder::gles::GLubyte__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(result), 0)));
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsEnabled(uint32_t capability) {
    GAPID_INFO("glIsEnabled(%u)\n", capability);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_884_major = 2;
        uint32_t l_minRequiredVersion_884_minor = 0;
        switch (capability) {
            case GLenum::GL_BLEND:                     // fall-through...
            case GLenum::GL_CULL_FACE:                 // fall-through...
            case GLenum::GL_DEPTH_TEST:                // fall-through...
            case GLenum::GL_DITHER:                    // fall-through...
            case GLenum::GL_POLYGON_OFFSET_FILL:       // fall-through...
            case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE:  // fall-through...
            case GLenum::GL_SAMPLE_COVERAGE:           // fall-through...
            case GLenum::GL_SCISSOR_TEST:              // fall-through...
            case GLenum::GL_STENCIL_TEST: {
                break;
            }
            case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX:  // fall-through...
            case GLenum::GL_RASTERIZER_DISCARD: {
                uint32_t l_minRequiredVersion_885_major = 3;
                uint32_t l_minRequiredVersion_885_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_887_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_887_result;
        observe(observations.mReads);
        result = mImports.glIsEnabled(capability);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsEnabled coder(observations, capability, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint32_t GlesSpy::glClientWaitSync(uint64_t sync, uint32_t syncFlags, uint64_t timeout) {
    GAPID_INFO("glClientWaitSync(%" PRIu64 ", %u, %" PRIu64 ")\n", sync, syncFlags, timeout);

    uint32_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_888_major = 3;
        uint32_t l_minRequiredVersion_888_minor = 0;
        uint32_t l_supportsBits_889_seenBits = syncFlags;
        uint32_t l_supportsBits_889_validBits = GLbitfield::GL_SYNC_FLUSH_COMMANDS_BIT;
        if ((syncFlags & GLbitfield::GL_SYNC_FLUSH_COMMANDS_BIT) != 0) {
        }
        observe(observations.mReads);
        result = mImports.glClientWaitSync(sync, syncFlags, timeout);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlClientWaitSync coder(observations, sync, syncFlags, timeout, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glDeleteSync(uint64_t sync) {
    GAPID_INFO("glDeleteSync(%" PRIu64 ")\n", sync);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_890_major = 3;
        uint32_t l_minRequiredVersion_890_minor = 0;
        observe(observations.mReads);
        mImports.glDeleteSync(sync);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteSync coder(observations, sync);
    mEncoder->Object(&coder);
}

inline uint64_t GlesSpy::glFenceSync(uint32_t condition, uint32_t syncFlags) {
    GAPID_INFO("glFenceSync(%u, %u)\n", condition, syncFlags);

    uint64_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_891_major = 3;
        uint32_t l_minRequiredVersion_891_minor = 0;
        switch (condition) {
            case GLenum::GL_SYNC_GPU_COMMANDS_COMPLETE: {
                break;
            }
        }
        observe(observations.mReads);
        result = mImports.glFenceSync(condition, syncFlags);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlFenceSync coder(observations, condition, syncFlags, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glGetSynciv(uint64_t sync, uint32_t pname, int32_t bufSize, int32_t* length,
                                 int32_t* values) {
    GAPID_INFO("glGetSynciv(%" PRIu64 ", %u, %" PRId32 ", %p, %p)\n", sync, pname, bufSize, length,
               values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_893_major = 3;
        uint32_t l_minRequiredVersion_893_minor = 0;
        switch (pname) {
            case GLenum::GL_OBJECT_TYPE:     // fall-through...
            case GLenum::GL_SYNC_CONDITION:  // fall-through...
            case GLenum::GL_SYNC_FLAGS:      // fall-through...
            case GLenum::GL_SYNC_STATUS: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetSynciv(sync, pname, bufSize, length, values);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetSynciv coder(
            observations, sync, pname, bufSize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glIsSync(uint64_t sync) {
    GAPID_INFO("glIsSync(%" PRIu64 ")\n", sync);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_895_major = 3;
        uint32_t l_minRequiredVersion_895_minor = 0;
        observe(observations.mReads);
        result = mImports.glIsSync(sync);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsSync coder(observations, sync, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glWaitSync(uint64_t sync, uint32_t syncFlags, uint64_t timeout) {
    GAPID_INFO("glWaitSync(%" PRIu64 ", %u, %" PRIu64 ")\n", sync, syncFlags, timeout);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_896_major = 3;
        uint32_t l_minRequiredVersion_896_minor = 0;
        observe(observations.mReads);
        mImports.glWaitSync(sync, syncFlags, timeout);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlWaitSync coder(observations, sync, syncFlags, timeout);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glActiveTexture(uint32_t unit) {
    GAPID_INFO("glActiveTexture(%u)\n", unit);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_897_major = 2;
        uint32_t l_minRequiredVersion_897_minor = 0;
        switch (unit) {
            case GLenum::GL_TEXTURE0:   // fall-through...
            case GLenum::GL_TEXTURE1:   // fall-through...
            case GLenum::GL_TEXTURE10:  // fall-through...
            case GLenum::GL_TEXTURE11:  // fall-through...
            case GLenum::GL_TEXTURE12:  // fall-through...
            case GLenum::GL_TEXTURE13:  // fall-through...
            case GLenum::GL_TEXTURE14:  // fall-through...
            case GLenum::GL_TEXTURE15:  // fall-through...
            case GLenum::GL_TEXTURE16:  // fall-through...
            case GLenum::GL_TEXTURE17:  // fall-through...
            case GLenum::GL_TEXTURE18:  // fall-through...
            case GLenum::GL_TEXTURE19:  // fall-through...
            case GLenum::GL_TEXTURE2:   // fall-through...
            case GLenum::GL_TEXTURE20:  // fall-through...
            case GLenum::GL_TEXTURE21:  // fall-through...
            case GLenum::GL_TEXTURE22:  // fall-through...
            case GLenum::GL_TEXTURE23:  // fall-through...
            case GLenum::GL_TEXTURE24:  // fall-through...
            case GLenum::GL_TEXTURE25:  // fall-through...
            case GLenum::GL_TEXTURE26:  // fall-through...
            case GLenum::GL_TEXTURE27:  // fall-through...
            case GLenum::GL_TEXTURE28:  // fall-through...
            case GLenum::GL_TEXTURE29:  // fall-through...
            case GLenum::GL_TEXTURE3:   // fall-through...
            case GLenum::GL_TEXTURE30:  // fall-through...
            case GLenum::GL_TEXTURE31:  // fall-through...
            case GLenum::GL_TEXTURE4:   // fall-through...
            case GLenum::GL_TEXTURE5:   // fall-through...
            case GLenum::GL_TEXTURE6:   // fall-through...
            case GLenum::GL_TEXTURE7:   // fall-through...
            case GLenum::GL_TEXTURE8:   // fall-through...
            case GLenum::GL_TEXTURE9: {
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_899_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_899_result;
        l_ctx->mActiveTextureUnit = unit;
        if (!(l_ctx->mTextureUnits.count(unit) > 0)) {
            l_ctx->mTextureUnits[unit] = l_ctx->mTextureUnits[unit];
        }
        observe(observations.mReads);
        mImports.glActiveTexture(unit);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlActiveTexture coder(observations, unit);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindImageTexture(uint32_t unit, uint32_t texture, int32_t level,
                                        uint8_t layered, int32_t layer, uint32_t access,
                                        uint32_t format) {
    GAPID_INFO("glBindImageTexture(%" PRIu32 ", %" PRIu32 ", %" PRId32 ", %" PRIu8 ", %" PRId32
               ", %u, %u)\n",
               unit, texture, level, layered, layer, access, format);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_900_major = 3;
        uint32_t l_minRequiredVersion_900_minor = 1;
        switch (access) {
            case GLenum::GL_READ_ONLY:   // fall-through...
            case GLenum::GL_READ_WRITE:  // fall-through...
            case GLenum::GL_WRITE_ONLY: {
                break;
            }
        }
        switch (format) {
            case GLenum::GL_R32F:      // fall-through...
            case GLenum::GL_R32I:      // fall-through...
            case GLenum::GL_R32UI:     // fall-through...
            case GLenum::GL_RGBA16F:   // fall-through...
            case GLenum::GL_RGBA16I:   // fall-through...
            case GLenum::GL_RGBA16UI:  // fall-through...
            case GLenum::GL_RGBA32F:   // fall-through...
            case GLenum::GL_RGBA32I:   // fall-through...
            case GLenum::GL_RGBA32UI:  // fall-through...
            case GLenum::GL_RGBA8:     // fall-through...
            case GLenum::GL_RGBA8I:    // fall-through...
            case GLenum::GL_RGBA8UI:   // fall-through...
            case GLenum::GL_RGBA8_SNORM: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glBindImageTexture(unit, texture, level, layered, layer, access, format);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindImageTexture coder(observations, unit, texture, level, layered, layer,
                                                 access, format);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindSampler(uint32_t unit, uint32_t sampler) {
    GAPID_INFO("glBindSampler(%" PRIu32 ", %" PRIu32 ")\n", unit, sampler);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_903_major = 3;
        uint32_t l_minRequiredVersion_903_minor = 0;
        observe(observations.mReads);
        mImports.glBindSampler(unit, sampler);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindSampler coder(observations, unit, sampler);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindTexture(uint32_t target, uint32_t texture) {
    GAPID_INFO("glBindTexture(%u, %" PRIu32 ")\n", target, texture);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_904_major = 2;
        uint32_t l_minRequiredVersion_904_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP: {
                break;
            }
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                uint32_t l_minRequiredVersion_905_major = 3;
                uint32_t l_minRequiredVersion_905_minor = 0;
                break;
            }
            case GLenum::GL_TEXTURE_2D_MULTISAMPLE: {
                uint32_t l_minRequiredVersion_906_major = 3;
                uint32_t l_minRequiredVersion_906_minor = 1;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_908_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_908_result;
        if (!(l_ctx->mInstances.mTextures.count(texture) > 0)) {
            l_ctx->mInstances.mTextures[texture] = std::shared_ptr<Texture>((new Texture()));
        }
        l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit][target] = texture;
        observe(observations.mReads);
        mImports.glBindTexture(target, texture);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindTexture coder(observations, target, texture);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCompressedTexImage2D(uint32_t target, int32_t level, uint32_t format,
                                            int32_t width, int32_t height, int32_t border,
                                            int32_t image_size, void* data) {
    GAPID_INFO("glCompressedTexImage2D(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %p)\n",
               target, level, format, width, height, border, image_size, data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_909_major = 2;
        uint32_t l_minRequiredVersion_909_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:                   // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
                break;
            }
        }
        switch (format) {
            case GLenum::GL_COMPRESSED_R11_EAC:                        // fall-through...
            case GLenum::GL_COMPRESSED_RG11_EAC:                       // fall-through...
            case GLenum::GL_COMPRESSED_RGB8_ETC2:                      // fall-through...
            case GLenum::GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:  // fall-through...
            case GLenum::GL_COMPRESSED_RGBA8_ETC2_EAC:                 // fall-through...
            case GLenum::GL_COMPRESSED_SIGNED_R11_EAC:                 // fall-through...
            case GLenum::GL_COMPRESSED_SIGNED_RG11_EAC:                // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:          // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_ETC2:                     // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: {
                uint32_t l_minRequiredVersion_911_major = 3;
                uint32_t l_minRequiredVersion_911_minor = 0;
                break;
            }
            case GLenum::GL_ATC_RGB_AMD:                  // fall-through...
            case GLenum::GL_ATC_RGBA_EXPLICIT_ALPHA_AMD:  // fall-through...
            case GLenum::GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: {
                uint32_t l_requiresExtension_912_ext = ExtensionId::GL_AMD_compressed_ATC_texture;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_914_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_914_result;
        switch (target) {
            case GLenum::GL_TEXTURE_2D: {
                TextureId l_id =
                        l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit][GLenum::GL_TEXTURE_2D];
                std::shared_ptr<Texture> l_t = l_ctx->mInstances.mTextures[l_id];
                Image l_l = Image()
                                    .SetWidth(width)
                                    .SetHeight(height)
                                    .SetSize((uint32_t)(image_size))
                                    .SetFormat(format);
                if (l_ctx->mBoundBuffers[GLenum::GL_PIXEL_UNPACK_BUFFER] == (BufferId)(0) &&
                    data != nullptr) {
                    l_l.mData =
                            clone(slice((uint8_t*)(data), (uint64_t)(0), (uint64_t)(l_l.mSize)));
                }
                l_t->mTexture2D[level] = l_l;
                l_t->mKind = TextureKind::TEXTURE2D;
                l_t->mFormat = format;
                break;
            }
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: {
                TextureId l_id = l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit]
                                                     [GLenum::GL_TEXTURE_CUBE_MAP];
                std::shared_ptr<Texture> l_t = l_ctx->mInstances.mTextures[l_id];
                Image l_l = Image()
                                    .SetWidth(width)
                                    .SetHeight(height)
                                    .SetSize((uint32_t)(image_size))
                                    .SetFormat(format);
                if (l_ctx->mBoundBuffers[GLenum::GL_PIXEL_UNPACK_BUFFER] == (BufferId)(0) &&
                    data != nullptr) {
                    l_l.mData =
                            clone(slice((uint8_t*)(data), (uint64_t)(0), (uint64_t)(l_l.mSize)));
                }
                CubemapLevel l_cube = l_t->mCubemap[level];
                l_cube.mFaces[target] = l_l;
                l_t->mCubemap[level] = l_cube;
                l_t->mKind = TextureKind::CUBEMAP;
                l_t->mFormat = format;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glCompressedTexImage2D(target, level, format, width, height, border, image_size,
                                        data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCompressedTexImage2D coder(
            observations, target, level, format, width, height, border, image_size,
            gapic::coder::gles::TexturePointer(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCompressedTexImage3D(uint32_t target, int32_t level, uint32_t internalformat,
                                            int32_t width, int32_t height, int32_t depth,
                                            int32_t border, int32_t imageSize, void* data) {
    GAPID_INFO("glCompressedTexImage3D(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %p)\n",
               target, level, internalformat, width, height, depth, border, imageSize, data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_915_major = 3;
        uint32_t l_minRequiredVersion_915_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                break;
            }
        }
        switch (internalformat) {
            case GLenum::GL_COMPRESSED_R11_EAC:                        // fall-through...
            case GLenum::GL_COMPRESSED_RG11_EAC:                       // fall-through...
            case GLenum::GL_COMPRESSED_RGB8_ETC2:                      // fall-through...
            case GLenum::GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:  // fall-through...
            case GLenum::GL_COMPRESSED_RGBA8_ETC2_EAC:                 // fall-through...
            case GLenum::GL_COMPRESSED_SIGNED_R11_EAC:                 // fall-through...
            case GLenum::GL_COMPRESSED_SIGNED_RG11_EAC:                // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:          // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_ETC2:                     // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glCompressedTexImage3D(target, level, internalformat, width, height, depth, border,
                                        imageSize, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCompressedTexImage3D coder(
            observations, target, level, internalformat, width, height, depth, border, imageSize,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCompressedTexSubImage2D(uint32_t target, int32_t level, int32_t xoffset,
                                               int32_t yoffset, int32_t width, int32_t height,
                                               uint32_t format, int32_t image_size, void* data) {
    GAPID_INFO("glCompressedTexSubImage2D(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %u, %" PRId32 ", %p)\n",
               target, level, xoffset, yoffset, width, height, format, image_size, data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_918_major = 2;
        uint32_t l_minRequiredVersion_918_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:                   // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
                break;
            }
        }
        switch (format) {
            case GLenum::GL_COMPRESSED_R11_EAC:                        // fall-through...
            case GLenum::GL_COMPRESSED_RG11_EAC:                       // fall-through...
            case GLenum::GL_COMPRESSED_RGB8_ETC2:                      // fall-through...
            case GLenum::GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:  // fall-through...
            case GLenum::GL_COMPRESSED_RGBA8_ETC2_EAC:                 // fall-through...
            case GLenum::GL_COMPRESSED_SIGNED_R11_EAC:                 // fall-through...
            case GLenum::GL_COMPRESSED_SIGNED_RG11_EAC:                // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:          // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_ETC2:                     // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: {
                uint32_t l_minRequiredVersion_920_major = 3;
                uint32_t l_minRequiredVersion_920_minor = 0;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format,
                                           image_size, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCompressedTexSubImage2D coder(
            observations, target, level, xoffset, yoffset, width, height, format, image_size,
            gapic::coder::gles::TexturePointer(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCompressedTexSubImage3D(uint32_t target, int32_t level, int32_t xoffset,
                                               int32_t yoffset, int32_t zoffset, int32_t width,
                                               int32_t height, int32_t depth, uint32_t format,
                                               int32_t imageSize, void* data) {
    GAPID_INFO("glCompressedTexSubImage3D(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %u, %" PRId32 ", %p)\n",
               target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize,
               data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_922_major = 3;
        uint32_t l_minRequiredVersion_922_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                break;
            }
        }
        switch (format) {
            case GLenum::GL_COMPRESSED_R11_EAC:                        // fall-through...
            case GLenum::GL_COMPRESSED_RG11_EAC:                       // fall-through...
            case GLenum::GL_COMPRESSED_RGB8_ETC2:                      // fall-through...
            case GLenum::GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:  // fall-through...
            case GLenum::GL_COMPRESSED_RGBA8_ETC2_EAC:                 // fall-through...
            case GLenum::GL_COMPRESSED_SIGNED_R11_EAC:                 // fall-through...
            case GLenum::GL_COMPRESSED_SIGNED_RG11_EAC:                // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:          // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_ETC2:                     // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height,
                                           depth, format, imageSize, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCompressedTexSubImage3D coder(
            observations, target, level, xoffset, yoffset, zoffset, width, height, depth, format,
            imageSize, gapic::coder::gles::Void__CP(gapic::coder::memory::Pointer(
                               reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCopyTexImage2D(uint32_t target, int32_t level, uint32_t format, int32_t x,
                                      int32_t y, int32_t width, int32_t height, int32_t border) {
    GAPID_INFO("glCopyTexImage2D(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ")\n",
               target, level, format, x, y, width, height, border);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_925_major = 2;
        uint32_t l_minRequiredVersion_925_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:                   // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
                break;
            }
        }
        switch (format) {
            case GLenum::GL_ALPHA:            // fall-through...
            case GLenum::GL_LUMINANCE:        // fall-through...
            case GLenum::GL_LUMINANCE_ALPHA:  // fall-through...
            case GLenum::GL_RGB:              // fall-through...
            case GLenum::GL_RGBA: {
                break;
            }
            case GLenum::GL_R16I:        // fall-through...
            case GLenum::GL_R16UI:       // fall-through...
            case GLenum::GL_R32I:        // fall-through...
            case GLenum::GL_R32UI:       // fall-through...
            case GLenum::GL_R8:          // fall-through...
            case GLenum::GL_R8I:         // fall-through...
            case GLenum::GL_R8UI:        // fall-through...
            case GLenum::GL_RG16I:       // fall-through...
            case GLenum::GL_RG16UI:      // fall-through...
            case GLenum::GL_RG32I:       // fall-through...
            case GLenum::GL_RG32UI:      // fall-through...
            case GLenum::GL_RG8:         // fall-through...
            case GLenum::GL_RG8I:        // fall-through...
            case GLenum::GL_RG8UI:       // fall-through...
            case GLenum::GL_RGB10_A2:    // fall-through...
            case GLenum::GL_RGB10_A2UI:  // fall-through...
            case GLenum::GL_RGB565:      // fall-through...
            case GLenum::GL_RGB5_A1:     // fall-through...
            case GLenum::GL_RGB8:        // fall-through...
            case GLenum::GL_RGBA16I:     // fall-through...
            case GLenum::GL_RGBA16UI:    // fall-through...
            case GLenum::GL_RGBA32I:     // fall-through...
            case GLenum::GL_RGBA32UI:    // fall-through...
            case GLenum::GL_RGBA4:       // fall-through...
            case GLenum::GL_RGBA8:       // fall-through...
            case GLenum::GL_RGBA8I:      // fall-through...
            case GLenum::GL_RGBA8UI:     // fall-through...
            case GLenum::GL_SRGB8:       // fall-through...
            case GLenum::GL_SRGB8_ALPHA8: {
                uint32_t l_minRequiredVersion_927_major = 3;
                uint32_t l_minRequiredVersion_927_minor = 0;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glCopyTexImage2D(target, level, format, x, y, width, height, border);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCopyTexImage2D coder(observations, target, level, format, x, y, width,
                                               height, border);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCopyTexSubImage2D(uint32_t target, int32_t level, int32_t xoffset,
                                         int32_t yoffset, int32_t x, int32_t y, int32_t width,
                                         int32_t height) {
    GAPID_INFO("glCopyTexSubImage2D(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %" PRId32 ")\n",
               target, level, xoffset, yoffset, x, y, width, height);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_929_major = 2;
        uint32_t l_minRequiredVersion_929_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:                   // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCopyTexSubImage2D coder(observations, target, level, xoffset, yoffset, x,
                                                  y, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glCopyTexSubImage3D(uint32_t target, int32_t level, int32_t xoffset,
                                         int32_t yoffset, int32_t zoffset, int32_t x, int32_t y,
                                         int32_t width, int32_t height) {
    GAPID_INFO("glCopyTexSubImage3D(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ")\n",
               target, level, xoffset, yoffset, zoffset, x, y, width, height);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_931_major = 3;
        uint32_t l_minRequiredVersion_931_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlCopyTexSubImage3D coder(observations, target, level, xoffset, yoffset,
                                                  zoffset, x, y, width, height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteSamplers(int32_t count, uint32_t* samplers) {
    GAPID_INFO("glDeleteSamplers(%" PRId32 ", %p)\n", count, samplers);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_933_major = 3;
        uint32_t l_minRequiredVersion_933_minor = 0;
        observe(observations.mReads);
        mImports.glDeleteSamplers(count, samplers);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteSamplers coder(
            observations, count, gapic::coder::gles::SamplerId__CP(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(samplers), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteTextures(int32_t count, uint32_t* textures) {
    GAPID_INFO("glDeleteTextures(%" PRId32 ", %p)\n", count, textures);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_934_major = 2;
        uint32_t l_minRequiredVersion_934_minor = 0;
        Slice<TextureId> l_t = slice(textures, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_935_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_935_result;
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            l_ctx->mInstances.mTextures[read(l_t, (uint64_t)(l_i))] = std::shared_ptr<Texture>();
        }
        observe(observations.mReads);
        mImports.glDeleteTextures(count, textures);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteTextures coder(
            observations, count, gapic::coder::gles::TextureId__CP(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(textures), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenSamplers(int32_t count, uint32_t* samplers) {
    GAPID_INFO("glGenSamplers(%" PRId32 ", %p)\n", count, samplers);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_936_major = 3;
        uint32_t l_minRequiredVersion_936_minor = 0;
        observe(observations.mReads);
        mImports.glGenSamplers(count, samplers);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenSamplers coder(
            observations, count, gapic::coder::gles::SamplerId__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(samplers), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenTextures(int32_t count, uint32_t* textures) {
    GAPID_INFO("glGenTextures(%" PRId32 ", %p)\n", count, textures);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_937_major = 2;
        uint32_t l_minRequiredVersion_937_minor = 0;
        Slice<TextureId> l_t = slice(textures, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_938_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_938_result;
        observe(observations.mReads);
        mImports.glGenTextures(count, textures);
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            TextureId l_id = (TextureId)(
                    slice(textures, (uint64_t)((GLsizei)(0)), (uint64_t)(count))[(uint64_t)(l_i)]);
            l_ctx->mInstances.mTextures[l_id] = std::shared_ptr<Texture>((new Texture()));
            write(l_t, (uint64_t)(l_i), l_id);
        }
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenTextures coder(
            observations, count, gapic::coder::gles::TextureId__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(textures), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenerateMipmap(uint32_t target) {
    GAPID_INFO("glGenerateMipmap(%u)\n", target);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_939_major = 2;
        uint32_t l_minRequiredVersion_939_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP: {
                break;
            }
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                uint32_t l_minRequiredVersion_940_major = 3;
                uint32_t l_minRequiredVersion_940_minor = 0;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGenerateMipmap(target);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenerateMipmap coder(observations, target);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetSamplerParameterfv(uint32_t sampler, uint32_t pname, float* params) {
    GAPID_INFO("glGetSamplerParameterfv(%" PRIu32 ", %u, %p)\n", sampler, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_942_major = 3;
        uint32_t l_minRequiredVersion_942_minor = 0;
        switch (pname) {
            case GLenum::GL_TEXTURE_COMPARE_FUNC:  // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_MODE:  // fall-through...
            case GLenum::GL_TEXTURE_MAG_FILTER:    // fall-through...
            case GLenum::GL_TEXTURE_MAX_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_MIN_FILTER:    // fall-through...
            case GLenum::GL_TEXTURE_MIN_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_WRAP_R:        // fall-through...
            case GLenum::GL_TEXTURE_WRAP_S:        // fall-through...
            case GLenum::GL_TEXTURE_WRAP_T: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetSamplerParameterfv(sampler, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetSamplerParameterfv coder(
            observations, sampler, pname,
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetSamplerParameteriv(uint32_t sampler, uint32_t pname, int32_t* params) {
    GAPID_INFO("glGetSamplerParameteriv(%" PRIu32 ", %u, %p)\n", sampler, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_944_major = 3;
        uint32_t l_minRequiredVersion_944_minor = 0;
        switch (pname) {
            case GLenum::GL_TEXTURE_COMPARE_FUNC:  // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_MODE:  // fall-through...
            case GLenum::GL_TEXTURE_MAG_FILTER:    // fall-through...
            case GLenum::GL_TEXTURE_MAX_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_MIN_FILTER:    // fall-through...
            case GLenum::GL_TEXTURE_MIN_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_WRAP_R:        // fall-through...
            case GLenum::GL_TEXTURE_WRAP_S:        // fall-through...
            case GLenum::GL_TEXTURE_WRAP_T: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetSamplerParameteriv(sampler, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetSamplerParameteriv coder(
            observations, sampler, pname,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetTexLevelParameterfv(uint32_t target, int32_t level, uint32_t pname,
                                              float* params) {
    GAPID_INFO("glGetTexLevelParameterfv(%u, %" PRId32 ", %u, %p)\n", target, level, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_946_major = 3;
        uint32_t l_minRequiredVersion_946_minor = 1;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:                   // fall-through...
            case GLenum::GL_TEXTURE_2D_ARRAY:             // fall-through...
            case GLenum::GL_TEXTURE_2D_MULTISAMPLE:       // fall-through...
            case GLenum::GL_TEXTURE_3D:                   // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
                break;
            }
        }
        switch (pname) {
            case GLenum::GL_TEXTURE_ALPHA_SIZE:              // fall-through...
            case GLenum::GL_TEXTURE_ALPHA_TYPE:              // fall-through...
            case GLenum::GL_TEXTURE_BLUE_SIZE:               // fall-through...
            case GLenum::GL_TEXTURE_BLUE_TYPE:               // fall-through...
            case GLenum::GL_TEXTURE_COMPRESSED:              // fall-through...
            case GLenum::GL_TEXTURE_DEPTH:                   // fall-through...
            case GLenum::GL_TEXTURE_DEPTH_SIZE:              // fall-through...
            case GLenum::GL_TEXTURE_DEPTH_TYPE:              // fall-through...
            case GLenum::GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:  // fall-through...
            case GLenum::GL_TEXTURE_GREEN_SIZE:              // fall-through...
            case GLenum::GL_TEXTURE_GREEN_TYPE:              // fall-through...
            case GLenum::GL_TEXTURE_HEIGHT:                  // fall-through...
            case GLenum::GL_TEXTURE_INTERNAL_FORMAT:         // fall-through...
            case GLenum::GL_TEXTURE_RED_SIZE:                // fall-through...
            case GLenum::GL_TEXTURE_RED_TYPE:                // fall-through...
            case GLenum::GL_TEXTURE_SAMPLES:                 // fall-through...
            case GLenum::GL_TEXTURE_SHARED_SIZE:             // fall-through...
            case GLenum::GL_TEXTURE_STENCIL_SIZE:            // fall-through...
            case GLenum::GL_TEXTURE_WIDTH: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetTexLevelParameterfv(target, level, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetTexLevelParameterfv coder(
            observations, target, level, pname,
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetTexLevelParameteriv(uint32_t target, int32_t level, uint32_t pname,
                                              int32_t* params) {
    GAPID_INFO("glGetTexLevelParameteriv(%u, %" PRId32 ", %u, %p)\n", target, level, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_949_major = 3;
        uint32_t l_minRequiredVersion_949_minor = 1;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:                   // fall-through...
            case GLenum::GL_TEXTURE_2D_ARRAY:             // fall-through...
            case GLenum::GL_TEXTURE_2D_MULTISAMPLE:       // fall-through...
            case GLenum::GL_TEXTURE_3D:                   // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
                break;
            }
        }
        switch (pname) {
            case GLenum::GL_TEXTURE_ALPHA_SIZE:              // fall-through...
            case GLenum::GL_TEXTURE_ALPHA_TYPE:              // fall-through...
            case GLenum::GL_TEXTURE_BLUE_SIZE:               // fall-through...
            case GLenum::GL_TEXTURE_BLUE_TYPE:               // fall-through...
            case GLenum::GL_TEXTURE_COMPRESSED:              // fall-through...
            case GLenum::GL_TEXTURE_DEPTH:                   // fall-through...
            case GLenum::GL_TEXTURE_DEPTH_SIZE:              // fall-through...
            case GLenum::GL_TEXTURE_DEPTH_TYPE:              // fall-through...
            case GLenum::GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:  // fall-through...
            case GLenum::GL_TEXTURE_GREEN_SIZE:              // fall-through...
            case GLenum::GL_TEXTURE_GREEN_TYPE:              // fall-through...
            case GLenum::GL_TEXTURE_HEIGHT:                  // fall-through...
            case GLenum::GL_TEXTURE_INTERNAL_FORMAT:         // fall-through...
            case GLenum::GL_TEXTURE_RED_SIZE:                // fall-through...
            case GLenum::GL_TEXTURE_RED_TYPE:                // fall-through...
            case GLenum::GL_TEXTURE_SAMPLES:                 // fall-through...
            case GLenum::GL_TEXTURE_SHARED_SIZE:             // fall-through...
            case GLenum::GL_TEXTURE_STENCIL_SIZE:            // fall-through...
            case GLenum::GL_TEXTURE_WIDTH: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetTexLevelParameteriv(target, level, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetTexLevelParameteriv coder(
            observations, target, level, pname,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetTexParameterfv(uint32_t target, uint32_t parameter, float* values) {
    GAPID_INFO("glGetTexParameterfv(%u, %u, %p)\n", target, parameter, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_952_major = 2;
        uint32_t l_minRequiredVersion_952_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP: {
                break;
            }
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                uint32_t l_minRequiredVersion_953_major = 3;
                uint32_t l_minRequiredVersion_953_minor = 0;
                break;
            }
            case GLenum::GL_TEXTURE_2D_MULTISAMPLE: {
                uint32_t l_minRequiredVersion_954_major = 3;
                uint32_t l_minRequiredVersion_954_minor = 1;
                break;
            }
        }
        switch (parameter) {
            case GLenum::GL_TEXTURE_MAG_FILTER:  // fall-through...
            case GLenum::GL_TEXTURE_MIN_FILTER:  // fall-through...
            case GLenum::GL_TEXTURE_WRAP_S:      // fall-through...
            case GLenum::GL_TEXTURE_WRAP_T: {
                break;
            }
            case GLenum::GL_TEXTURE_BASE_LEVEL:        // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_FUNC:      // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_MODE:      // fall-through...
            case GLenum::GL_TEXTURE_IMMUTABLE_FORMAT:  // fall-through...
            case GLenum::GL_TEXTURE_MAX_LEVEL:         // fall-through...
            case GLenum::GL_TEXTURE_MAX_LOD:           // fall-through...
            case GLenum::GL_TEXTURE_MIN_LOD:           // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_A:         // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_B:         // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_G:         // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_R:         // fall-through...
            case GLenum::GL_TEXTURE_WRAP_R: {
                uint32_t l_minRequiredVersion_956_major = 3;
                uint32_t l_minRequiredVersion_956_minor = 0;
                break;
            }
            case GLenum::GL_DEPTH_STENCIL_TEXTURE_MODE:       // fall-through...
            case GLenum::GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:  // fall-through...
            case GLenum::GL_TEXTURE_IMMUTABLE_LEVELS: {
                uint32_t l_minRequiredVersion_957_major = 3;
                uint32_t l_minRequiredVersion_957_minor = 1;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_959_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_959_result;
        TextureId l_id = l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit][target];
        std::shared_ptr<Texture> l_t = l_ctx->mInstances.mTextures[l_id];
        observe(observations.mReads);
        mImports.glGetTexParameterfv(target, parameter, values);
        write(slice(values, 0, 1), 0, /* clang-format off */
        /* switch(parameter) */
            /* case GLenum::GL_TEXTURE_MAG_FILTER: */(((parameter) == (GLenum::GL_TEXTURE_MAG_FILTER))) ? ((GLfloat)(l_t->mMagFilter)) :
            /* case GLenum::GL_TEXTURE_MIN_FILTER: */(((parameter) == (GLenum::GL_TEXTURE_MIN_FILTER))) ? ((GLfloat)(l_t->mMinFilter)) :
            /* case GLenum::GL_TEXTURE_WRAP_S: */(((parameter) == (GLenum::GL_TEXTURE_WRAP_S))) ? ((GLfloat)(l_t->mWrapS)) :
            /* case GLenum::GL_TEXTURE_WRAP_T: */(((parameter) == (GLenum::GL_TEXTURE_WRAP_T))) ? ((GLfloat)(l_t->mWrapT)) :
            /* case GLenum::GL_TEXTURE_MAX_ANISOTROPY_EXT: */(((parameter) == (GLenum::GL_TEXTURE_MAX_ANISOTROPY_EXT))) ? ((GLfloat)(l_t->mMaxAnisotropy)) :
            /* case GLenum::GL_TEXTURE_SWIZZLE_R: */(((parameter) == (GLenum::GL_TEXTURE_SWIZZLE_R))) ? ((GLfloat)(l_t->mSwizzleR)) :
            /* case GLenum::GL_TEXTURE_SWIZZLE_G: */(((parameter) == (GLenum::GL_TEXTURE_SWIZZLE_G))) ? ((GLfloat)(l_t->mSwizzleG)) :
            /* case GLenum::GL_TEXTURE_SWIZZLE_B: */(((parameter) == (GLenum::GL_TEXTURE_SWIZZLE_B))) ? ((GLfloat)(l_t->mSwizzleB)) :
            /* case GLenum::GL_TEXTURE_SWIZZLE_A: */(((parameter) == (GLenum::GL_TEXTURE_SWIZZLE_A))) ? ((GLfloat)(l_t->mSwizzleA)) :
            /* default: */ 0 /* clang-format on */);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetTexParameterfv coder(
            observations, target, parameter,
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetTexParameteriv(uint32_t target, uint32_t parameter, int32_t* values) {
    GAPID_INFO("glGetTexParameteriv(%u, %u, %p)\n", target, parameter, values);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_960_major = 2;
        uint32_t l_minRequiredVersion_960_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP: {
                break;
            }
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                uint32_t l_minRequiredVersion_961_major = 3;
                uint32_t l_minRequiredVersion_961_minor = 0;
                break;
            }
            case GLenum::GL_TEXTURE_2D_MULTISAMPLE: {
                uint32_t l_minRequiredVersion_962_major = 3;
                uint32_t l_minRequiredVersion_962_minor = 1;
                break;
            }
        }
        switch (parameter) {
            case GLenum::GL_TEXTURE_MAG_FILTER:  // fall-through...
            case GLenum::GL_TEXTURE_MIN_FILTER:  // fall-through...
            case GLenum::GL_TEXTURE_WRAP_S:      // fall-through...
            case GLenum::GL_TEXTURE_WRAP_T: {
                break;
            }
            case GLenum::GL_TEXTURE_BASE_LEVEL:        // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_FUNC:      // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_MODE:      // fall-through...
            case GLenum::GL_TEXTURE_IMMUTABLE_FORMAT:  // fall-through...
            case GLenum::GL_TEXTURE_MAX_LEVEL:         // fall-through...
            case GLenum::GL_TEXTURE_MAX_LOD:           // fall-through...
            case GLenum::GL_TEXTURE_MIN_LOD:           // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_A:         // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_B:         // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_G:         // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_R:         // fall-through...
            case GLenum::GL_TEXTURE_WRAP_R: {
                uint32_t l_minRequiredVersion_964_major = 3;
                uint32_t l_minRequiredVersion_964_minor = 0;
                break;
            }
            case GLenum::GL_DEPTH_STENCIL_TEXTURE_MODE:       // fall-through...
            case GLenum::GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:  // fall-through...
            case GLenum::GL_TEXTURE_IMMUTABLE_LEVELS: {
                uint32_t l_minRequiredVersion_965_major = 3;
                uint32_t l_minRequiredVersion_965_minor = 1;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_967_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_967_result;
        TextureId l_id = l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit][target];
        std::shared_ptr<Texture> l_t = l_ctx->mInstances.mTextures[l_id];
        observe(observations.mReads);
        mImports.glGetTexParameteriv(target, parameter, values);
        write(slice(values, 0, 1), 0, /* clang-format off */
        /* switch(parameter) */
            /* case GLenum::GL_TEXTURE_MAG_FILTER: */(((parameter) == (GLenum::GL_TEXTURE_MAG_FILTER))) ? ((GLint)(l_t->mMagFilter)) :
            /* case GLenum::GL_TEXTURE_MIN_FILTER: */(((parameter) == (GLenum::GL_TEXTURE_MIN_FILTER))) ? ((GLint)(l_t->mMinFilter)) :
            /* case GLenum::GL_TEXTURE_WRAP_S: */(((parameter) == (GLenum::GL_TEXTURE_WRAP_S))) ? ((GLint)(l_t->mWrapS)) :
            /* case GLenum::GL_TEXTURE_WRAP_T: */(((parameter) == (GLenum::GL_TEXTURE_WRAP_T))) ? ((GLint)(l_t->mWrapT)) :
            /* case GLenum::GL_TEXTURE_MAX_ANISOTROPY_EXT: */(((parameter) == (GLenum::GL_TEXTURE_MAX_ANISOTROPY_EXT))) ? ((GLint)(l_t->mMaxAnisotropy)) :
            /* case GLenum::GL_TEXTURE_SWIZZLE_R: */(((parameter) == (GLenum::GL_TEXTURE_SWIZZLE_R))) ? ((GLint)(l_t->mSwizzleR)) :
            /* case GLenum::GL_TEXTURE_SWIZZLE_G: */(((parameter) == (GLenum::GL_TEXTURE_SWIZZLE_G))) ? ((GLint)(l_t->mSwizzleG)) :
            /* case GLenum::GL_TEXTURE_SWIZZLE_B: */(((parameter) == (GLenum::GL_TEXTURE_SWIZZLE_B))) ? ((GLint)(l_t->mSwizzleB)) :
            /* case GLenum::GL_TEXTURE_SWIZZLE_A: */(((parameter) == (GLenum::GL_TEXTURE_SWIZZLE_A))) ? ((GLint)(l_t->mSwizzleA)) :
            /* default: */ 0 /* clang-format on */);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetTexParameteriv coder(
            observations, target, parameter,
            gapic::coder::gles::GLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(values), 0)));
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glIsSampler(uint32_t sampler) {
    GAPID_INFO("glIsSampler(%" PRIu32 ")\n", sampler);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_968_major = 3;
        uint32_t l_minRequiredVersion_968_minor = 0;
        observe(observations.mReads);
        result = mImports.glIsSampler(sampler);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsSampler coder(observations, sampler, result);
    mEncoder->Object(&coder);

    return result;
}

inline uint8_t GlesSpy::glIsTexture(uint32_t texture) {
    GAPID_INFO("glIsTexture(%" PRIu32 ")\n", texture);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_969_major = 2;
        uint32_t l_minRequiredVersion_969_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_970_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_970_result;
        observe(observations.mReads);
        result = mImports.glIsTexture(texture);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsTexture coder(observations, texture, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glPixelStorei(uint32_t parameter, int32_t value) {
    GAPID_INFO("glPixelStorei(%u, %" PRId32 ")\n", parameter, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_971_major = 2;
        uint32_t l_minRequiredVersion_971_minor = 0;
        switch (parameter) {
            case GLenum::GL_PACK_ALIGNMENT:  // fall-through...
            case GLenum::GL_UNPACK_ALIGNMENT: {
                break;
            }
            case GLenum::GL_PACK_IMAGE_HEIGHT:    // fall-through...
            case GLenum::GL_PACK_ROW_LENGTH:      // fall-through...
            case GLenum::GL_PACK_SKIP_IMAGES:     // fall-through...
            case GLenum::GL_PACK_SKIP_PIXELS:     // fall-through...
            case GLenum::GL_PACK_SKIP_ROWS:       // fall-through...
            case GLenum::GL_UNPACK_IMAGE_HEIGHT:  // fall-through...
            case GLenum::GL_UNPACK_ROW_LENGTH:    // fall-through...
            case GLenum::GL_UNPACK_SKIP_IMAGES:   // fall-through...
            case GLenum::GL_UNPACK_SKIP_PIXELS:   // fall-through...
            case GLenum::GL_UNPACK_SKIP_ROWS: {
                uint32_t l_minRequiredVersion_972_major = 3;
                uint32_t l_minRequiredVersion_972_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_974_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_974_result;
        l_ctx->mPixelStorage[parameter] = value;
        observe(observations.mReads);
        mImports.glPixelStorei(parameter, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPixelStorei coder(observations, parameter, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSamplerParameterf(uint32_t sampler, uint32_t pname, float param) {
    GAPID_INFO("glSamplerParameterf(%" PRIu32 ", %u, %f)\n", sampler, pname, param);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_975_major = 3;
        uint32_t l_minRequiredVersion_975_minor = 0;
        switch (pname) {
            case GLenum::GL_TEXTURE_COMPARE_FUNC:  // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_MODE:  // fall-through...
            case GLenum::GL_TEXTURE_MAG_FILTER:    // fall-through...
            case GLenum::GL_TEXTURE_MAX_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_MIN_FILTER:    // fall-through...
            case GLenum::GL_TEXTURE_MIN_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_WRAP_R:        // fall-through...
            case GLenum::GL_TEXTURE_WRAP_S:        // fall-through...
            case GLenum::GL_TEXTURE_WRAP_T: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glSamplerParameterf(sampler, pname, param);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSamplerParameterf coder(observations, sampler, pname, param);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSamplerParameterfv(uint32_t sampler, uint32_t pname, float* param) {
    GAPID_INFO("glSamplerParameterfv(%" PRIu32 ", %u, %p)\n", sampler, pname, param);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_977_major = 3;
        uint32_t l_minRequiredVersion_977_minor = 0;
        switch (pname) {
            case GLenum::GL_TEXTURE_COMPARE_FUNC:  // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_MODE:  // fall-through...
            case GLenum::GL_TEXTURE_MAG_FILTER:    // fall-through...
            case GLenum::GL_TEXTURE_MAX_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_MIN_FILTER:    // fall-through...
            case GLenum::GL_TEXTURE_MIN_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_WRAP_R:        // fall-through...
            case GLenum::GL_TEXTURE_WRAP_S:        // fall-through...
            case GLenum::GL_TEXTURE_WRAP_T: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glSamplerParameterfv(sampler, pname, param);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSamplerParameterfv coder(
            observations, sampler, pname,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(param), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSamplerParameteri(uint32_t sampler, uint32_t pname, int32_t param) {
    GAPID_INFO("glSamplerParameteri(%" PRIu32 ", %u, %" PRId32 ")\n", sampler, pname, param);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_979_major = 3;
        uint32_t l_minRequiredVersion_979_minor = 0;
        switch (pname) {
            case GLenum::GL_TEXTURE_COMPARE_FUNC:  // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_MODE:  // fall-through...
            case GLenum::GL_TEXTURE_MAG_FILTER:    // fall-through...
            case GLenum::GL_TEXTURE_MAX_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_MIN_FILTER:    // fall-through...
            case GLenum::GL_TEXTURE_MIN_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_WRAP_R:        // fall-through...
            case GLenum::GL_TEXTURE_WRAP_S:        // fall-through...
            case GLenum::GL_TEXTURE_WRAP_T: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glSamplerParameteri(sampler, pname, param);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSamplerParameteri coder(observations, sampler, pname, param);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glSamplerParameteriv(uint32_t sampler, uint32_t pname, int32_t* param) {
    GAPID_INFO("glSamplerParameteriv(%" PRIu32 ", %u, %p)\n", sampler, pname, param);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_981_major = 3;
        uint32_t l_minRequiredVersion_981_minor = 0;
        switch (pname) {
            case GLenum::GL_TEXTURE_COMPARE_FUNC:  // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_MODE:  // fall-through...
            case GLenum::GL_TEXTURE_MAG_FILTER:    // fall-through...
            case GLenum::GL_TEXTURE_MAX_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_MIN_FILTER:    // fall-through...
            case GLenum::GL_TEXTURE_MIN_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_WRAP_R:        // fall-through...
            case GLenum::GL_TEXTURE_WRAP_S:        // fall-through...
            case GLenum::GL_TEXTURE_WRAP_T: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glSamplerParameteriv(sampler, pname, param);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlSamplerParameteriv coder(
            observations, sampler, pname,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(param), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexImage2D(uint32_t target, int32_t level, int32_t internal_format,
                                  int32_t width, int32_t height, int32_t border, uint32_t format,
                                  uint32_t type, void* data) {
    GAPID_INFO("glTexImage2D(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %u, %u, %p)\n",
               target, level, internal_format, width, height, border, format, type, data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_983_major = 2;
        uint32_t l_minRequiredVersion_983_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:                   // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
                break;
            }
        }
        switch (format) {
            case GLenum::GL_ALPHA:            // fall-through...
            case GLenum::GL_LUMINANCE:        // fall-through...
            case GLenum::GL_LUMINANCE_ALPHA:  // fall-through...
            case GLenum::GL_RGB:              // fall-through...
            case GLenum::GL_RGBA: {
                break;
            }
            case GLenum::GL_DEPTH_COMPONENT:  // fall-through...
            case GLenum::GL_DEPTH_STENCIL:    // fall-through...
            case GLenum::GL_RED:              // fall-through...
            case GLenum::GL_RED_INTEGER:      // fall-through...
            case GLenum::GL_RG:               // fall-through...
            case GLenum::GL_RGBA_INTEGER:     // fall-through...
            case GLenum::GL_RGB_INTEGER:      // fall-through...
            case GLenum::GL_RG_INTEGER: {
                uint32_t l_minRequiredVersion_985_major = 3;
                uint32_t l_minRequiredVersion_985_minor = 0;
                break;
            }
        }
        switch (type) {
            case GLenum::GL_UNSIGNED_BYTE:           // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_4_4_4_4:  // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_5_5_5_1:  // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_5_6_5: {
                break;
            }
            case GLenum::GL_HALF_FLOAT_OES: {
                uint32_t l_requiresExtension_987_ext = ExtensionId::GL_OES_texture_half_float;
                break;
            }
            case GLenum::GL_BYTE:                            // fall-through...
            case GLenum::GL_FLOAT:                           // fall-through...
            case GLenum::GL_FLOAT_32_UNSIGNED_INT_24_8_REV:  // fall-through...
            case GLenum::GL_HALF_FLOAT:                      // fall-through...
            case GLenum::GL_INT:                             // fall-through...
            case GLenum::GL_SHORT:                           // fall-through...
            case GLenum::GL_UNSIGNED_INT:                    // fall-through...
            case GLenum::GL_UNSIGNED_INT_10F_11F_11F_REV:    // fall-through...
            case GLenum::GL_UNSIGNED_INT_24_8:               // fall-through...
            case GLenum::GL_UNSIGNED_INT_2_10_10_10_REV:     // fall-through...
            case GLenum::GL_UNSIGNED_INT_5_9_9_9_REV:        // fall-through...
            case GLenum::GL_UNSIGNED_SHORT: {
                uint32_t l_minRequiredVersion_988_major = 3;
                uint32_t l_minRequiredVersion_988_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_990_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_990_result;
        switch (target) {
            case GLenum::GL_TEXTURE_2D: {
                TextureId l_id =
                        l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit][GLenum::GL_TEXTURE_2D];
                std::shared_ptr<Texture> l_t = l_ctx->mInstances.mTextures[l_id];
                Image l_l = Image()
                                    .SetWidth(width)
                                    .SetHeight(height)
                                    .SetSize(imageSize((uint32_t)(width), (uint32_t)(height),
                                                       format, type))
                                    .SetFormat(format);
                if (data != nullptr) {
                    if (l_ctx->mBoundBuffers[GLenum::GL_PIXEL_UNPACK_BUFFER] == (BufferId)(0)) {
                        l_l.mData = clone(
                                slice((uint8_t*)(data), (uint64_t)(0), (uint64_t)(l_l.mSize)));
                    }
                } else {
                    l_l.mData = make<uint8_t>((uint64_t)(l_l.mSize));
                }
                l_t->mTexture2D[level] = l_l;
                l_t->mKind = TextureKind::TEXTURE2D;
                l_t->mFormat = format;
                break;
            }
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: {
                TextureId l_id = l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit]
                                                     [GLenum::GL_TEXTURE_CUBE_MAP];
                std::shared_ptr<Texture> l_t = l_ctx->mInstances.mTextures[l_id];
                Image l_l = Image()
                                    .SetWidth(width)
                                    .SetHeight(height)
                                    .SetSize(imageSize((uint32_t)(width), (uint32_t)(height),
                                                       format, type))
                                    .SetFormat(format);
                if (data != nullptr) {
                    if (l_ctx->mBoundBuffers[GLenum::GL_PIXEL_UNPACK_BUFFER] == (BufferId)(0)) {
                        l_l.mData = clone(
                                slice((uint8_t*)(data), (uint64_t)(0), (uint64_t)(l_l.mSize)));
                    }
                } else {
                    l_l.mData = make<uint8_t>((uint64_t)(l_l.mSize));
                }
                CubemapLevel l_cube = l_t->mCubemap[level];
                l_cube.mFaces[target] = l_l;
                l_t->mCubemap[level] = l_cube;
                l_t->mKind = TextureKind::CUBEMAP;
                l_t->mFormat = format;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glTexImage2D(target, level, internal_format, width, height, border, format, type,
                              data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexImage2D coder(
            observations, target, level, internal_format, width, height, border, format, type,
            gapic::coder::gles::TexturePointer(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexImage3D(uint32_t target, int32_t level, int32_t internalformat,
                                  int32_t width, int32_t height, int32_t depth, int32_t border,
                                  uint32_t format, uint32_t type, void* pixels) {
    GAPID_INFO("glTexImage3D(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %u, %u, %p)\n",
               target, level, internalformat, width, height, depth, border, format, type, pixels);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_991_major = 3;
        uint32_t l_minRequiredVersion_991_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                break;
            }
        }
        switch (format) {
            case GLenum::GL_ALPHA:            // fall-through...
            case GLenum::GL_DEPTH_COMPONENT:  // fall-through...
            case GLenum::GL_DEPTH_STENCIL:    // fall-through...
            case GLenum::GL_LUMINANCE:        // fall-through...
            case GLenum::GL_LUMINANCE_ALPHA:  // fall-through...
            case GLenum::GL_RED:              // fall-through...
            case GLenum::GL_RED_INTEGER:      // fall-through...
            case GLenum::GL_RG:               // fall-through...
            case GLenum::GL_RGB:              // fall-through...
            case GLenum::GL_RGBA:             // fall-through...
            case GLenum::GL_RGBA_INTEGER:     // fall-through...
            case GLenum::GL_RGB_INTEGER:      // fall-through...
            case GLenum::GL_RG_INTEGER: {
                break;
            }
        }
        switch (type) {
            case GLenum::GL_HALF_FLOAT_OES: {
                uint32_t l_requiresExtension_994_ext = ExtensionId::GL_OES_texture_half_float;
                break;
            }
            case GLenum::GL_BYTE:                            // fall-through...
            case GLenum::GL_FLOAT:                           // fall-through...
            case GLenum::GL_FLOAT_32_UNSIGNED_INT_24_8_REV:  // fall-through...
            case GLenum::GL_HALF_FLOAT:                      // fall-through...
            case GLenum::GL_INT:                             // fall-through...
            case GLenum::GL_SHORT:                           // fall-through...
            case GLenum::GL_UNSIGNED_BYTE:                   // fall-through...
            case GLenum::GL_UNSIGNED_INT:                    // fall-through...
            case GLenum::GL_UNSIGNED_INT_10F_11F_11F_REV:    // fall-through...
            case GLenum::GL_UNSIGNED_INT_24_8:               // fall-through...
            case GLenum::GL_UNSIGNED_INT_2_10_10_10_REV:     // fall-through...
            case GLenum::GL_UNSIGNED_INT_5_9_9_9_REV:        // fall-through...
            case GLenum::GL_UNSIGNED_SHORT:                  // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_4_4_4_4:          // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_5_5_5_1:          // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_5_6_5: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glTexImage3D(target, level, internalformat, width, height, depth, border, format,
                              type, pixels);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexImage3D coder(
            observations, target, level, internalformat, width, height, depth, border, format, type,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(pixels), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexParameterf(uint32_t target, uint32_t parameter, float value) {
    GAPID_INFO("glTexParameterf(%u, %u, %f)\n", target, parameter, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_996_major = 2;
        uint32_t l_minRequiredVersion_996_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP: {
                break;
            }
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                uint32_t l_minRequiredVersion_997_major = 3;
                uint32_t l_minRequiredVersion_997_minor = 0;
                break;
            }
            case GLenum::GL_TEXTURE_2D_MULTISAMPLE: {
                uint32_t l_minRequiredVersion_998_major = 3;
                uint32_t l_minRequiredVersion_998_minor = 1;
                break;
            }
        }
        switch (parameter) {
            case GLenum::GL_TEXTURE_MAG_FILTER:  // fall-through...
            case GLenum::GL_TEXTURE_MIN_FILTER:  // fall-through...
            case GLenum::GL_TEXTURE_WRAP_S:      // fall-through...
            case GLenum::GL_TEXTURE_WRAP_T: {
                break;
            }
            case GLenum::GL_TEXTURE_BASE_LEVEL:    // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_FUNC:  // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_MODE:  // fall-through...
            case GLenum::GL_TEXTURE_MAX_LEVEL:     // fall-through...
            case GLenum::GL_TEXTURE_MAX_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_MIN_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_A:     // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_B:     // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_G:     // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_R:     // fall-through...
            case GLenum::GL_TEXTURE_WRAP_R: {
                uint32_t l_minRequiredVersion_1000_major = 3;
                uint32_t l_minRequiredVersion_1000_minor = 0;
                break;
            }
            case GLenum::GL_DEPTH_STENCIL_TEXTURE_MODE: {
                uint32_t l_minRequiredVersion_1001_major = 3;
                uint32_t l_minRequiredVersion_1001_minor = 1;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_1003_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_1003_result;
        TextureId l_id = l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit][target];
        std::shared_ptr<Texture> l_t = l_ctx->mInstances.mTextures[l_id];
        switch (parameter) {
            case GLenum::GL_TEXTURE_MAG_FILTER: {
                l_t->mMagFilter = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_MIN_FILTER: {
                l_t->mMinFilter = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_WRAP_S: {
                l_t->mWrapS = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_WRAP_T: {
                l_t->mWrapT = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_MAX_ANISOTROPY_EXT: {
                l_t->mMaxAnisotropy = (float)(value);
                break;
            }
            case GLenum::GL_TEXTURE_SWIZZLE_R: {
                l_t->mSwizzleR = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_SWIZZLE_G: {
                l_t->mSwizzleG = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_SWIZZLE_B: {
                l_t->mSwizzleB = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_SWIZZLE_A: {
                l_t->mSwizzleA = (uint32_t)(value);
                break;
            }
        }
        observe(observations.mReads);
        mImports.glTexParameterf(target, parameter, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexParameterf coder(observations, target, parameter, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexParameterfv(uint32_t target, uint32_t pname, float* params) {
    GAPID_INFO("glTexParameterfv(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1004_major = 2;
        uint32_t l_minRequiredVersion_1004_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP: {
                break;
            }
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                uint32_t l_minRequiredVersion_1005_major = 3;
                uint32_t l_minRequiredVersion_1005_minor = 0;
                break;
            }
            case GLenum::GL_TEXTURE_2D_MULTISAMPLE: {
                uint32_t l_minRequiredVersion_1006_major = 3;
                uint32_t l_minRequiredVersion_1006_minor = 1;
                break;
            }
        }
        switch (pname) {
            case GLenum::GL_TEXTURE_MAG_FILTER:  // fall-through...
            case GLenum::GL_TEXTURE_MIN_FILTER:  // fall-through...
            case GLenum::GL_TEXTURE_WRAP_S:      // fall-through...
            case GLenum::GL_TEXTURE_WRAP_T: {
                break;
            }
            case GLenum::GL_TEXTURE_BASE_LEVEL:    // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_FUNC:  // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_MODE:  // fall-through...
            case GLenum::GL_TEXTURE_MAX_LEVEL:     // fall-through...
            case GLenum::GL_TEXTURE_MAX_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_MIN_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_A:     // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_B:     // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_G:     // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_R:     // fall-through...
            case GLenum::GL_TEXTURE_WRAP_R: {
                uint32_t l_minRequiredVersion_1008_major = 3;
                uint32_t l_minRequiredVersion_1008_minor = 0;
                break;
            }
            case GLenum::GL_DEPTH_STENCIL_TEXTURE_MODE: {
                uint32_t l_minRequiredVersion_1009_major = 3;
                uint32_t l_minRequiredVersion_1009_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glTexParameterfv(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexParameterfv coder(
            observations, target, pname,
            gapic::coder::gles::GLfloat__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexParameteri(uint32_t target, uint32_t parameter, int32_t value) {
    GAPID_INFO("glTexParameteri(%u, %u, %" PRId32 ")\n", target, parameter, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1011_major = 2;
        uint32_t l_minRequiredVersion_1011_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP: {
                break;
            }
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                uint32_t l_minRequiredVersion_1012_major = 3;
                uint32_t l_minRequiredVersion_1012_minor = 0;
                break;
            }
            case GLenum::GL_TEXTURE_2D_MULTISAMPLE: {
                uint32_t l_minRequiredVersion_1013_major = 3;
                uint32_t l_minRequiredVersion_1013_minor = 1;
                break;
            }
        }
        switch (parameter) {
            case GLenum::GL_TEXTURE_MAG_FILTER:  // fall-through...
            case GLenum::GL_TEXTURE_MIN_FILTER:  // fall-through...
            case GLenum::GL_TEXTURE_WRAP_S:      // fall-through...
            case GLenum::GL_TEXTURE_WRAP_T: {
                break;
            }
            case GLenum::GL_TEXTURE_BASE_LEVEL:    // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_FUNC:  // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_MODE:  // fall-through...
            case GLenum::GL_TEXTURE_MAX_LEVEL:     // fall-through...
            case GLenum::GL_TEXTURE_MAX_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_MIN_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_A:     // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_B:     // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_G:     // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_R:     // fall-through...
            case GLenum::GL_TEXTURE_WRAP_R: {
                uint32_t l_minRequiredVersion_1015_major = 3;
                uint32_t l_minRequiredVersion_1015_minor = 0;
                break;
            }
            case GLenum::GL_DEPTH_STENCIL_TEXTURE_MODE: {
                uint32_t l_minRequiredVersion_1016_major = 3;
                uint32_t l_minRequiredVersion_1016_minor = 1;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_1018_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_1018_result;
        TextureId l_id = l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit][target];
        std::shared_ptr<Texture> l_t = l_ctx->mInstances.mTextures[l_id];
        switch (parameter) {
            case GLenum::GL_TEXTURE_MAG_FILTER: {
                l_t->mMagFilter = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_MIN_FILTER: {
                l_t->mMinFilter = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_WRAP_S: {
                l_t->mWrapS = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_WRAP_T: {
                l_t->mWrapT = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_MAX_ANISOTROPY_EXT: {
                l_t->mMaxAnisotropy = (float)(value);
                break;
            }
            case GLenum::GL_TEXTURE_SWIZZLE_R: {
                l_t->mSwizzleR = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_SWIZZLE_G: {
                l_t->mSwizzleG = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_SWIZZLE_B: {
                l_t->mSwizzleB = (uint32_t)(value);
                break;
            }
            case GLenum::GL_TEXTURE_SWIZZLE_A: {
                l_t->mSwizzleA = (uint32_t)(value);
                break;
            }
        }
        observe(observations.mReads);
        mImports.glTexParameteri(target, parameter, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexParameteri coder(observations, target, parameter, value);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexParameteriv(uint32_t target, uint32_t pname, int32_t* params) {
    GAPID_INFO("glTexParameteriv(%u, %u, %p)\n", target, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1019_major = 2;
        uint32_t l_minRequiredVersion_1019_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP: {
                break;
            }
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                uint32_t l_minRequiredVersion_1020_major = 3;
                uint32_t l_minRequiredVersion_1020_minor = 0;
                break;
            }
            case GLenum::GL_TEXTURE_2D_MULTISAMPLE: {
                uint32_t l_minRequiredVersion_1021_major = 3;
                uint32_t l_minRequiredVersion_1021_minor = 1;
                break;
            }
        }
        switch (pname) {
            case GLenum::GL_TEXTURE_MAG_FILTER:  // fall-through...
            case GLenum::GL_TEXTURE_MIN_FILTER:  // fall-through...
            case GLenum::GL_TEXTURE_WRAP_S:      // fall-through...
            case GLenum::GL_TEXTURE_WRAP_T: {
                break;
            }
            case GLenum::GL_TEXTURE_BASE_LEVEL:    // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_FUNC:  // fall-through...
            case GLenum::GL_TEXTURE_COMPARE_MODE:  // fall-through...
            case GLenum::GL_TEXTURE_MAX_LEVEL:     // fall-through...
            case GLenum::GL_TEXTURE_MAX_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_MIN_LOD:       // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_A:     // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_B:     // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_G:     // fall-through...
            case GLenum::GL_TEXTURE_SWIZZLE_R:     // fall-through...
            case GLenum::GL_TEXTURE_WRAP_R: {
                uint32_t l_minRequiredVersion_1023_major = 3;
                uint32_t l_minRequiredVersion_1023_minor = 0;
                break;
            }
            case GLenum::GL_DEPTH_STENCIL_TEXTURE_MODE: {
                uint32_t l_minRequiredVersion_1024_major = 3;
                uint32_t l_minRequiredVersion_1024_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glTexParameteriv(target, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexParameteriv coder(
            observations, target, pname,
            gapic::coder::gles::GLint__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexStorage2D(uint32_t target, int32_t levels, uint32_t internalformat,
                                    int32_t width, int32_t height) {
    GAPID_INFO("glTexStorage2D(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32 ")\n", target, levels,
               internalformat, width, height);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1026_major = 3;
        uint32_t l_minRequiredVersion_1026_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP: {
                break;
            }
        }
        switch (internalformat) {
            case GLenum::GL_COMPRESSED_R11_EAC:                         // fall-through...
            case GLenum::GL_COMPRESSED_RG11_EAC:                        // fall-through...
            case GLenum::GL_COMPRESSED_RGB8_ETC2:                       // fall-through...
            case GLenum::GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:   // fall-through...
            case GLenum::GL_COMPRESSED_RGBA8_ETC2_EAC:                  // fall-through...
            case GLenum::GL_COMPRESSED_SIGNED_R11_EAC:                  // fall-through...
            case GLenum::GL_COMPRESSED_SIGNED_RG11_EAC:                 // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:           // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_ETC2:                      // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:  // fall-through...
            case GLenum::GL_DEPTH24_STENCIL8:                           // fall-through...
            case GLenum::GL_DEPTH32F_STENCIL8:                          // fall-through...
            case GLenum::GL_DEPTH_COMPONENT16:                          // fall-through...
            case GLenum::GL_DEPTH_COMPONENT24:                          // fall-through...
            case GLenum::GL_DEPTH_COMPONENT32F:                         // fall-through...
            case GLenum::GL_R11F_G11F_B10F:                             // fall-through...
            case GLenum::GL_R16F:                                       // fall-through...
            case GLenum::GL_R16I:                                       // fall-through...
            case GLenum::GL_R16UI:                                      // fall-through...
            case GLenum::GL_R32F:                                       // fall-through...
            case GLenum::GL_R32I:                                       // fall-through...
            case GLenum::GL_R32UI:                                      // fall-through...
            case GLenum::GL_R8:                                         // fall-through...
            case GLenum::GL_R8I:                                        // fall-through...
            case GLenum::GL_R8UI:                                       // fall-through...
            case GLenum::GL_R8_SNORM:                                   // fall-through...
            case GLenum::GL_RG16F:                                      // fall-through...
            case GLenum::GL_RG16I:                                      // fall-through...
            case GLenum::GL_RG16UI:                                     // fall-through...
            case GLenum::GL_RG32F:                                      // fall-through...
            case GLenum::GL_RG32I:                                      // fall-through...
            case GLenum::GL_RG32UI:                                     // fall-through...
            case GLenum::GL_RG8:                                        // fall-through...
            case GLenum::GL_RG8I:                                       // fall-through...
            case GLenum::GL_RG8UI:                                      // fall-through...
            case GLenum::GL_RG8_SNORM:                                  // fall-through...
            case GLenum::GL_RGB10_A2:                                   // fall-through...
            case GLenum::GL_RGB10_A2UI:                                 // fall-through...
            case GLenum::GL_RGB16F:                                     // fall-through...
            case GLenum::GL_RGB16I:                                     // fall-through...
            case GLenum::GL_RGB16UI:                                    // fall-through...
            case GLenum::GL_RGB32F:                                     // fall-through...
            case GLenum::GL_RGB32I:                                     // fall-through...
            case GLenum::GL_RGB32UI:                                    // fall-through...
            case GLenum::GL_RGB565:                                     // fall-through...
            case GLenum::GL_RGB5_A1:                                    // fall-through...
            case GLenum::GL_RGB8:                                       // fall-through...
            case GLenum::GL_RGB8I:                                      // fall-through...
            case GLenum::GL_RGB8UI:                                     // fall-through...
            case GLenum::GL_RGB8_SNORM:                                 // fall-through...
            case GLenum::GL_RGB9_E5:                                    // fall-through...
            case GLenum::GL_RGBA16F:                                    // fall-through...
            case GLenum::GL_RGBA16I:                                    // fall-through...
            case GLenum::GL_RGBA16UI:                                   // fall-through...
            case GLenum::GL_RGBA32F:                                    // fall-through...
            case GLenum::GL_RGBA32I:                                    // fall-through...
            case GLenum::GL_RGBA32UI:                                   // fall-through...
            case GLenum::GL_RGBA4:                                      // fall-through...
            case GLenum::GL_RGBA8:                                      // fall-through...
            case GLenum::GL_RGBA8I:                                     // fall-through...
            case GLenum::GL_RGBA8UI:                                    // fall-through...
            case GLenum::GL_RGBA8_SNORM:                                // fall-through...
            case GLenum::GL_SRGB8:                                      // fall-through...
            case GLenum::GL_SRGB8_ALPHA8: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glTexStorage2D(target, levels, internalformat, width, height);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexStorage2D coder(observations, target, levels, internalformat, width,
                                             height);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexStorage2DMultisample(uint32_t target, int32_t samples,
                                               uint32_t internalformat, int32_t width,
                                               int32_t height, uint8_t fixedsamplelocations) {
    GAPID_INFO("glTexStorage2DMultisample(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32 ", %" PRIu8
               ")\n",
               target, samples, internalformat, width, height, fixedsamplelocations);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1029_major = 3;
        uint32_t l_minRequiredVersion_1029_minor = 1;
        switch (target) {
            case GLenum::GL_TEXTURE_2D_MULTISAMPLE: {
                break;
            }
        }
        switch (internalformat) {
            case GLenum::GL_DEPTH24_STENCIL8:    // fall-through...
            case GLenum::GL_DEPTH32F_STENCIL8:   // fall-through...
            case GLenum::GL_DEPTH_COMPONENT16:   // fall-through...
            case GLenum::GL_DEPTH_COMPONENT24:   // fall-through...
            case GLenum::GL_DEPTH_COMPONENT32F:  // fall-through...
            case GLenum::GL_R11F_G11F_B10F:      // fall-through...
            case GLenum::GL_R16F:                // fall-through...
            case GLenum::GL_R16I:                // fall-through...
            case GLenum::GL_R16UI:               // fall-through...
            case GLenum::GL_R32F:                // fall-through...
            case GLenum::GL_R32I:                // fall-through...
            case GLenum::GL_R32UI:               // fall-through...
            case GLenum::GL_R8:                  // fall-through...
            case GLenum::GL_R8I:                 // fall-through...
            case GLenum::GL_R8UI:                // fall-through...
            case GLenum::GL_R8_SNORM:            // fall-through...
            case GLenum::GL_RG16F:               // fall-through...
            case GLenum::GL_RG16I:               // fall-through...
            case GLenum::GL_RG16UI:              // fall-through...
            case GLenum::GL_RG32F:               // fall-through...
            case GLenum::GL_RG32I:               // fall-through...
            case GLenum::GL_RG32UI:              // fall-through...
            case GLenum::GL_RG8:                 // fall-through...
            case GLenum::GL_RG8I:                // fall-through...
            case GLenum::GL_RG8UI:               // fall-through...
            case GLenum::GL_RG8_SNORM:           // fall-through...
            case GLenum::GL_RGB10_A2:            // fall-through...
            case GLenum::GL_RGB10_A2UI:          // fall-through...
            case GLenum::GL_RGB16F:              // fall-through...
            case GLenum::GL_RGB16I:              // fall-through...
            case GLenum::GL_RGB16UI:             // fall-through...
            case GLenum::GL_RGB32F:              // fall-through...
            case GLenum::GL_RGB32I:              // fall-through...
            case GLenum::GL_RGB32UI:             // fall-through...
            case GLenum::GL_RGB565:              // fall-through...
            case GLenum::GL_RGB5_A1:             // fall-through...
            case GLenum::GL_RGB8:                // fall-through...
            case GLenum::GL_RGB8I:               // fall-through...
            case GLenum::GL_RGB8UI:              // fall-through...
            case GLenum::GL_RGB8_SNORM:          // fall-through...
            case GLenum::GL_RGB9_E5:             // fall-through...
            case GLenum::GL_RGBA16F:             // fall-through...
            case GLenum::GL_RGBA16I:             // fall-through...
            case GLenum::GL_RGBA16UI:            // fall-through...
            case GLenum::GL_RGBA32F:             // fall-through...
            case GLenum::GL_RGBA32I:             // fall-through...
            case GLenum::GL_RGBA32UI:            // fall-through...
            case GLenum::GL_RGBA4:               // fall-through...
            case GLenum::GL_RGBA8:               // fall-through...
            case GLenum::GL_RGBA8I:              // fall-through...
            case GLenum::GL_RGBA8UI:             // fall-through...
            case GLenum::GL_RGBA8_SNORM:         // fall-through...
            case GLenum::GL_SRGB8:               // fall-through...
            case GLenum::GL_SRGB8_ALPHA8: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glTexStorage2DMultisample(target, samples, internalformat, width, height,
                                           fixedsamplelocations);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexStorage2DMultisample coder(
            observations, target, samples, internalformat, width, height, fixedsamplelocations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexStorage3D(uint32_t target, int32_t levels, uint32_t internalformat,
                                    int32_t width, int32_t height, int32_t depth) {
    GAPID_INFO("glTexStorage3D(%u, %" PRId32 ", %u, %" PRId32 ", %" PRId32 ", %" PRId32 ")\n",
               target, levels, internalformat, width, height, depth);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1032_major = 3;
        uint32_t l_minRequiredVersion_1032_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                break;
            }
        }
        switch (internalformat) {
            case GLenum::GL_COMPRESSED_R11_EAC:                         // fall-through...
            case GLenum::GL_COMPRESSED_RG11_EAC:                        // fall-through...
            case GLenum::GL_COMPRESSED_RGB8_ETC2:                       // fall-through...
            case GLenum::GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:   // fall-through...
            case GLenum::GL_COMPRESSED_RGBA8_ETC2_EAC:                  // fall-through...
            case GLenum::GL_COMPRESSED_SIGNED_R11_EAC:                  // fall-through...
            case GLenum::GL_COMPRESSED_SIGNED_RG11_EAC:                 // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:           // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_ETC2:                      // fall-through...
            case GLenum::GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:  // fall-through...
            case GLenum::GL_DEPTH24_STENCIL8:                           // fall-through...
            case GLenum::GL_DEPTH32F_STENCIL8:                          // fall-through...
            case GLenum::GL_DEPTH_COMPONENT16:                          // fall-through...
            case GLenum::GL_DEPTH_COMPONENT24:                          // fall-through...
            case GLenum::GL_DEPTH_COMPONENT32F:                         // fall-through...
            case GLenum::GL_R11F_G11F_B10F:                             // fall-through...
            case GLenum::GL_R16F:                                       // fall-through...
            case GLenum::GL_R16I:                                       // fall-through...
            case GLenum::GL_R16UI:                                      // fall-through...
            case GLenum::GL_R32F:                                       // fall-through...
            case GLenum::GL_R32I:                                       // fall-through...
            case GLenum::GL_R32UI:                                      // fall-through...
            case GLenum::GL_R8:                                         // fall-through...
            case GLenum::GL_R8I:                                        // fall-through...
            case GLenum::GL_R8UI:                                       // fall-through...
            case GLenum::GL_R8_SNORM:                                   // fall-through...
            case GLenum::GL_RG16F:                                      // fall-through...
            case GLenum::GL_RG16I:                                      // fall-through...
            case GLenum::GL_RG16UI:                                     // fall-through...
            case GLenum::GL_RG32F:                                      // fall-through...
            case GLenum::GL_RG32I:                                      // fall-through...
            case GLenum::GL_RG32UI:                                     // fall-through...
            case GLenum::GL_RG8:                                        // fall-through...
            case GLenum::GL_RG8I:                                       // fall-through...
            case GLenum::GL_RG8UI:                                      // fall-through...
            case GLenum::GL_RG8_SNORM:                                  // fall-through...
            case GLenum::GL_RGB10_A2:                                   // fall-through...
            case GLenum::GL_RGB10_A2UI:                                 // fall-through...
            case GLenum::GL_RGB16F:                                     // fall-through...
            case GLenum::GL_RGB16I:                                     // fall-through...
            case GLenum::GL_RGB16UI:                                    // fall-through...
            case GLenum::GL_RGB32F:                                     // fall-through...
            case GLenum::GL_RGB32I:                                     // fall-through...
            case GLenum::GL_RGB32UI:                                    // fall-through...
            case GLenum::GL_RGB565:                                     // fall-through...
            case GLenum::GL_RGB5_A1:                                    // fall-through...
            case GLenum::GL_RGB8:                                       // fall-through...
            case GLenum::GL_RGB8I:                                      // fall-through...
            case GLenum::GL_RGB8UI:                                     // fall-through...
            case GLenum::GL_RGB8_SNORM:                                 // fall-through...
            case GLenum::GL_RGB9_E5:                                    // fall-through...
            case GLenum::GL_RGBA16F:                                    // fall-through...
            case GLenum::GL_RGBA16I:                                    // fall-through...
            case GLenum::GL_RGBA16UI:                                   // fall-through...
            case GLenum::GL_RGBA32F:                                    // fall-through...
            case GLenum::GL_RGBA32I:                                    // fall-through...
            case GLenum::GL_RGBA32UI:                                   // fall-through...
            case GLenum::GL_RGBA4:                                      // fall-through...
            case GLenum::GL_RGBA8:                                      // fall-through...
            case GLenum::GL_RGBA8I:                                     // fall-through...
            case GLenum::GL_RGBA8UI:                                    // fall-through...
            case GLenum::GL_RGBA8_SNORM:                                // fall-through...
            case GLenum::GL_SRGB8:                                      // fall-through...
            case GLenum::GL_SRGB8_ALPHA8: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glTexStorage3D(target, levels, internalformat, width, height, depth);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexStorage3D coder(observations, target, levels, internalformat, width,
                                             height, depth);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexSubImage2D(uint32_t target, int32_t level, int32_t xoffset,
                                     int32_t yoffset, int32_t width, int32_t height,
                                     uint32_t format, uint32_t type, void* data) {
    GAPID_INFO("glTexSubImage2D(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %u, %u, %p)\n",
               target, level, xoffset, yoffset, width, height, format, type, data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1035_major = 2;
        uint32_t l_minRequiredVersion_1035_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D:                   // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z: {
                break;
            }
        }
        switch (format) {
            case GLenum::GL_ALPHA:            // fall-through...
            case GLenum::GL_LUMINANCE:        // fall-through...
            case GLenum::GL_LUMINANCE_ALPHA:  // fall-through...
            case GLenum::GL_RGB:              // fall-through...
            case GLenum::GL_RGBA: {
                break;
            }
            case GLenum::GL_DEPTH_COMPONENT:  // fall-through...
            case GLenum::GL_DEPTH_STENCIL:    // fall-through...
            case GLenum::GL_RED:              // fall-through...
            case GLenum::GL_RED_INTEGER:      // fall-through...
            case GLenum::GL_RG:               // fall-through...
            case GLenum::GL_RGBA_INTEGER:     // fall-through...
            case GLenum::GL_RGB_INTEGER:      // fall-through...
            case GLenum::GL_RG_INTEGER: {
                uint32_t l_minRequiredVersion_1037_major = 3;
                uint32_t l_minRequiredVersion_1037_minor = 0;
                break;
            }
        }
        switch (type) {
            case GLenum::GL_UNSIGNED_BYTE:           // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_4_4_4_4:  // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_5_5_5_1:  // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_5_6_5: {
                break;
            }
            case GLenum::GL_HALF_FLOAT_OES: {
                uint32_t l_requiresExtension_1039_ext = ExtensionId::GL_OES_texture_half_float;
                break;
            }
            case GLenum::GL_BYTE:                            // fall-through...
            case GLenum::GL_FLOAT:                           // fall-through...
            case GLenum::GL_FLOAT_32_UNSIGNED_INT_24_8_REV:  // fall-through...
            case GLenum::GL_HALF_FLOAT:                      // fall-through...
            case GLenum::GL_INT:                             // fall-through...
            case GLenum::GL_SHORT:                           // fall-through...
            case GLenum::GL_UNSIGNED_INT:                    // fall-through...
            case GLenum::GL_UNSIGNED_INT_10F_11F_11F_REV:    // fall-through...
            case GLenum::GL_UNSIGNED_INT_24_8:               // fall-through...
            case GLenum::GL_UNSIGNED_INT_2_10_10_10_REV:     // fall-through...
            case GLenum::GL_UNSIGNED_INT_5_9_9_9_REV:        // fall-through...
            case GLenum::GL_UNSIGNED_SHORT: {
                uint32_t l_minRequiredVersion_1040_major = 3;
                uint32_t l_minRequiredVersion_1040_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_1042_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_1042_result;
        switch (target) {
            case GLenum::GL_TEXTURE_2D: {
                TextureId l_id =
                        l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit][GLenum::GL_TEXTURE_2D];
                std::shared_ptr<Texture> l_t = l_ctx->mInstances.mTextures[l_id];
                Image l_l = Image()
                                    .SetWidth(width)
                                    .SetHeight(height)
                                    .SetSize(imageSize((uint32_t)(width), (uint32_t)(height),
                                                       format, type))
                                    .SetFormat(format);
                if (l_ctx->mBoundBuffers[GLenum::GL_PIXEL_UNPACK_BUFFER] == (BufferId)(0) &&
                    data != nullptr) {
                    l_l.mData =
                            clone(slice((uint8_t*)(data), (uint64_t)(0), (uint64_t)(l_l.mSize)));
                }
                l_t->mTexture2D[level] = l_l;
                l_t->mKind = TextureKind::TEXTURE2D;
                l_t->mFormat = format;
                break;
            }
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:  // fall-through...
            case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: {
                TextureId l_id = l_ctx->mTextureUnits[l_ctx->mActiveTextureUnit]
                                                     [GLenum::GL_TEXTURE_CUBE_MAP];
                std::shared_ptr<Texture> l_t = l_ctx->mInstances.mTextures[l_id];
                Image l_l = Image()
                                    .SetWidth(width)
                                    .SetHeight(height)
                                    .SetSize(imageSize((uint32_t)(width), (uint32_t)(height),
                                                       format, type))
                                    .SetFormat(format);
                if (l_ctx->mBoundBuffers[GLenum::GL_PIXEL_UNPACK_BUFFER] == (BufferId)(0) &&
                    data != nullptr) {
                    l_l.mData =
                            clone(slice((uint8_t*)(data), (uint64_t)(0), (uint64_t)(l_l.mSize)));
                }
                CubemapLevel l_cube = l_t->mCubemap[level];
                l_cube.mFaces[target] = l_l;
                l_t->mCubemap[level] = l_cube;
                l_t->mKind = TextureKind::CUBEMAP;
                l_t->mFormat = format;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type,
                                 data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexSubImage2D coder(
            observations, target, level, xoffset, yoffset, width, height, format, type,
            gapic::coder::gles::TexturePointer(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTexSubImage3D(uint32_t target, int32_t level, int32_t xoffset,
                                     int32_t yoffset, int32_t zoffset, int32_t width,
                                     int32_t height, int32_t depth, uint32_t format, uint32_t type,
                                     void* pixels) {
    GAPID_INFO("glTexSubImage3D(%u, %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ", %" PRId32 ", %" PRId32 ", %u, %u, %p)\n",
               target, level, xoffset, yoffset, zoffset, width, height, depth, format, type,
               pixels);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1043_major = 3;
        uint32_t l_minRequiredVersion_1043_minor = 0;
        switch (target) {
            case GLenum::GL_TEXTURE_2D_ARRAY:  // fall-through...
            case GLenum::GL_TEXTURE_3D: {
                break;
            }
        }
        switch (format) {
            case GLenum::GL_ALPHA:            // fall-through...
            case GLenum::GL_DEPTH_COMPONENT:  // fall-through...
            case GLenum::GL_DEPTH_STENCIL:    // fall-through...
            case GLenum::GL_LUMINANCE:        // fall-through...
            case GLenum::GL_LUMINANCE_ALPHA:  // fall-through...
            case GLenum::GL_RED:              // fall-through...
            case GLenum::GL_RED_INTEGER:      // fall-through...
            case GLenum::GL_RG:               // fall-through...
            case GLenum::GL_RGB:              // fall-through...
            case GLenum::GL_RGBA:             // fall-through...
            case GLenum::GL_RGBA_INTEGER:     // fall-through...
            case GLenum::GL_RGB_INTEGER:      // fall-through...
            case GLenum::GL_RG_INTEGER: {
                break;
            }
        }
        switch (type) {
            case GLenum::GL_HALF_FLOAT_OES: {
                uint32_t l_requiresExtension_1046_ext = ExtensionId::GL_OES_texture_half_float;
                break;
            }
            case GLenum::GL_BYTE:                            // fall-through...
            case GLenum::GL_FLOAT:                           // fall-through...
            case GLenum::GL_FLOAT_32_UNSIGNED_INT_24_8_REV:  // fall-through...
            case GLenum::GL_HALF_FLOAT:                      // fall-through...
            case GLenum::GL_INT:                             // fall-through...
            case GLenum::GL_SHORT:                           // fall-through...
            case GLenum::GL_UNSIGNED_BYTE:                   // fall-through...
            case GLenum::GL_UNSIGNED_INT:                    // fall-through...
            case GLenum::GL_UNSIGNED_INT_10F_11F_11F_REV:    // fall-through...
            case GLenum::GL_UNSIGNED_INT_24_8:               // fall-through...
            case GLenum::GL_UNSIGNED_INT_2_10_10_10_REV:     // fall-through...
            case GLenum::GL_UNSIGNED_INT_5_9_9_9_REV:        // fall-through...
            case GLenum::GL_UNSIGNED_SHORT:                  // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_4_4_4_4:          // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_5_5_5_1:          // fall-through...
            case GLenum::GL_UNSIGNED_SHORT_5_6_5: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth,
                                 format, type, pixels);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTexSubImage3D coder(
            observations, target, level, xoffset, yoffset, zoffset, width, height, depth, format,
            type, gapic::coder::gles::Void__CP(
                          gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(pixels), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBeginTransformFeedback(uint32_t primitiveMode) {
    GAPID_INFO("glBeginTransformFeedback(%u)\n", primitiveMode);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1048_major = 3;
        uint32_t l_minRequiredVersion_1048_minor = 0;
        switch (primitiveMode) {
            case GLenum::GL_LINES:   // fall-through...
            case GLenum::GL_POINTS:  // fall-through...
            case GLenum::GL_TRIANGLES: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glBeginTransformFeedback(primitiveMode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBeginTransformFeedback coder(observations, primitiveMode);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindTransformFeedback(uint32_t target, uint32_t id) {
    GAPID_INFO("glBindTransformFeedback(%u, %" PRIu32 ")\n", target, id);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1050_major = 3;
        uint32_t l_minRequiredVersion_1050_minor = 0;
        switch (target) {
            case GLenum::GL_TRANSFORM_FEEDBACK: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glBindTransformFeedback(target, id);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindTransformFeedback coder(observations, target, id);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteTransformFeedbacks(int32_t n, uint32_t* ids) {
    GAPID_INFO("glDeleteTransformFeedbacks(%" PRId32 ", %p)\n", n, ids);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1052_major = 3;
        uint32_t l_minRequiredVersion_1052_minor = 0;
        observe(observations.mReads);
        mImports.glDeleteTransformFeedbacks(n, ids);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteTransformFeedbacks coder(
            observations, n,
            gapic::coder::gles::TransformFeedbackId__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(ids), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEndTransformFeedback() {
    GAPID_INFO("glEndTransformFeedback()\n");

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1053_major = 3;
        uint32_t l_minRequiredVersion_1053_minor = 0;
        observe(observations.mReads);
        mImports.glEndTransformFeedback();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEndTransformFeedback coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenTransformFeedbacks(int32_t n, uint32_t* ids) {
    GAPID_INFO("glGenTransformFeedbacks(%" PRId32 ", %p)\n", n, ids);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1054_major = 3;
        uint32_t l_minRequiredVersion_1054_minor = 0;
        observe(observations.mReads);
        mImports.glGenTransformFeedbacks(n, ids);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenTransformFeedbacks coder(
            observations, n,
            gapic::coder::gles::TransformFeedbackId__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(ids), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetTransformFeedbackVarying(uint32_t program, uint32_t index,
                                                   int32_t bufSize, int32_t* length, int32_t* size,
                                                   uint32_t* type, char* name) {
    GAPID_INFO("glGetTransformFeedbackVarying(%" PRIu32 ", %" PRIu32 ", %" PRId32
               ", %p, %p, %p, %p)\n",
               program, index, bufSize, length, size, type, name);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1055_major = 3;
        uint32_t l_minRequiredVersion_1055_minor = 0;
        observe(observations.mReads);
        mImports.glGetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetTransformFeedbackVarying coder(
            observations, program, index, bufSize,
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(length), 0)),
            gapic::coder::gles::GLsizei__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(size), 0)),
            gapic::coder::gles::GLenum__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(type), 0)),
            gapic::coder::gles::GLchar__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(name), 0)));
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glIsTransformFeedback(uint32_t id) {
    GAPID_INFO("glIsTransformFeedback(%" PRIu32 ")\n", id);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1056_major = 3;
        uint32_t l_minRequiredVersion_1056_minor = 0;
        observe(observations.mReads);
        result = mImports.glIsTransformFeedback(id);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsTransformFeedback coder(observations, id, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glPauseTransformFeedback() {
    GAPID_INFO("glPauseTransformFeedback()\n");

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1057_major = 3;
        uint32_t l_minRequiredVersion_1057_minor = 0;
        observe(observations.mReads);
        mImports.glPauseTransformFeedback();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlPauseTransformFeedback coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glResumeTransformFeedback() {
    GAPID_INFO("glResumeTransformFeedback()\n");

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1058_major = 3;
        uint32_t l_minRequiredVersion_1058_minor = 0;
        observe(observations.mReads);
        mImports.glResumeTransformFeedback();
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlResumeTransformFeedback coder(observations);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glTransformFeedbackVaryings(uint32_t program, int32_t count, char** varyings,
                                                 uint32_t bufferMode) {
    GAPID_INFO("glTransformFeedbackVaryings(%" PRIu32 ", %" PRId32 ", %p, %u)\n", program, count,
               varyings, bufferMode);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1059_major = 3;
        uint32_t l_minRequiredVersion_1059_minor = 0;
        switch (bufferMode) {
            case GLenum::GL_INTERLEAVED_ATTRIBS:  // fall-through...
            case GLenum::GL_SEPARATE_ATTRIBS: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glTransformFeedbackVaryings(program, count, varyings, bufferMode);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlTransformFeedbackVaryings coder(
            observations, program, count,
            gapic::coder::gles::GLchar__CP__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(varyings), 0)),
            bufferMode);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindVertexArray(uint32_t array) {
    GAPID_INFO("glBindVertexArray(%" PRIu32 ")\n", array);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1061_major = 3;
        uint32_t l_minRequiredVersion_1061_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_1062_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_1062_result;
        if (!(l_ctx->mInstances.mVertexArrays.count(array) > 0)) {
            l_ctx->mInstances.mVertexArrays[array] =
                    std::shared_ptr<VertexArray>((new VertexArray()));
        }
        l_ctx->mBoundVertexArray = array;
        observe(observations.mReads);
        mImports.glBindVertexArray(array);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindVertexArray coder(observations, array);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glBindVertexBuffer(uint32_t bindingindex, uint32_t buffer, int32_t offset,
                                        int32_t stride) {
    GAPID_INFO("glBindVertexBuffer(%" PRIu32 ", %" PRIu32 ", %" PRId32 ", %" PRId32 ")\n",
               bindingindex, buffer, offset, stride);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1063_major = 3;
        uint32_t l_minRequiredVersion_1063_minor = 1;
        observe(observations.mReads);
        mImports.glBindVertexBuffer(bindingindex, buffer, offset, stride);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlBindVertexBuffer coder(observations, bindingindex, buffer, offset,
                                                 stride);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDeleteVertexArrays(int32_t count, uint32_t* arrays) {
    GAPID_INFO("glDeleteVertexArrays(%" PRId32 ", %p)\n", count, arrays);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1064_major = 3;
        uint32_t l_minRequiredVersion_1064_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_1065_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_1065_result;
        Slice<VertexArrayId> l_a = slice(arrays, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            l_ctx->mInstances.mVertexArrays[read(l_a, (uint64_t)(l_i))] =
                    std::shared_ptr<VertexArray>();
        }
        observe(observations.mReads);
        mImports.glDeleteVertexArrays(count, arrays);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDeleteVertexArrays coder(
            observations, count,
            gapic::coder::gles::VertexArrayId__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(arrays), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glDisableVertexAttribArray(uint32_t location) {
    GAPID_INFO("glDisableVertexAttribArray(%" PRIu32 ")\n", location);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1066_major = 2;
        uint32_t l_minRequiredVersion_1066_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_1067_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_1067_result;
        l_ctx->mVertexAttributeArrays[location]->mEnabled = false;
        observe(observations.mReads);
        mImports.glDisableVertexAttribArray(location);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlDisableVertexAttribArray coder(observations, location);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glEnableVertexAttribArray(uint32_t location) {
    GAPID_INFO("glEnableVertexAttribArray(%" PRIu32 ")\n", location);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1068_major = 2;
        uint32_t l_minRequiredVersion_1068_minor = 0;
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_1069_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_1069_result;
        l_ctx->mVertexAttributeArrays[location]->mEnabled = true;
        observe(observations.mReads);
        mImports.glEnableVertexAttribArray(location);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlEnableVertexAttribArray coder(observations, location);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGenVertexArrays(int32_t count, uint32_t* arrays) {
    GAPID_INFO("glGenVertexArrays(%" PRId32 ", %p)\n", count, arrays);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1070_major = 3;
        uint32_t l_minRequiredVersion_1070_minor = 0;
        Slice<VertexArrayId> l_a = slice(arrays, (uint64_t)((GLsizei)(0)), (uint64_t)(count));
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_1071_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_1071_result;
        observe(observations.mReads);
        mImports.glGenVertexArrays(count, arrays);
        for (GLsizei l_i = (GLsizei)(0); l_i < count; ++l_i) {
            VertexArrayId l_id = (VertexArrayId)(
                    slice(arrays, (uint64_t)((GLsizei)(0)), (uint64_t)(count))[(uint64_t)(l_i)]);
            l_ctx->mInstances.mVertexArrays[l_id] =
                    std::shared_ptr<VertexArray>((new VertexArray()));
            write(l_a, (uint64_t)(l_i), l_id);
        }
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGenVertexArrays coder(
            observations, count, gapic::coder::gles::VertexArrayId__P(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(arrays), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetVertexAttribIiv(uint32_t index, uint32_t pname, int32_t* params) {
    GAPID_INFO("glGetVertexAttribIiv(%" PRIu32 ", %u, %p)\n", index, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1072_major = 3;
        uint32_t l_minRequiredVersion_1072_minor = 0;
        switch (pname) {
            case GLenum::GL_CURRENT_VERTEX_ATTRIB:               // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:  // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_DIVISOR:         // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_ENABLED:         // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_INTEGER:         // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:      // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_SIZE:            // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_STRIDE:          // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_TYPE: {
                break;
            }
            case GLenum::GL_VERTEX_ATTRIB_BINDING: {
                uint32_t l_minRequiredVersion_1073_major = 3;
                uint32_t l_minRequiredVersion_1073_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetVertexAttribIiv(index, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetVertexAttribIiv coder(
            observations, index, pname, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                                reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetVertexAttribIuiv(uint32_t index, uint32_t pname, uint32_t* params) {
    GAPID_INFO("glGetVertexAttribIuiv(%" PRIu32 ", %u, %p)\n", index, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1075_major = 3;
        uint32_t l_minRequiredVersion_1075_minor = 0;
        switch (pname) {
            case GLenum::GL_CURRENT_VERTEX_ATTRIB:               // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:  // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_DIVISOR:         // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_ENABLED:         // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_INTEGER:         // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:      // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_SIZE:            // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_STRIDE:          // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_TYPE: {
                break;
            }
            case GLenum::GL_VERTEX_ATTRIB_BINDING: {
                uint32_t l_minRequiredVersion_1076_major = 3;
                uint32_t l_minRequiredVersion_1076_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetVertexAttribIuiv(index, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetVertexAttribIuiv coder(
            observations, index, pname, gapic::coder::gles::GLuint__P(gapic::coder::memory::Pointer(
                                                reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetVertexAttribPointerv(uint32_t index, uint32_t pname, void** pointer) {
    GAPID_INFO("glGetVertexAttribPointerv(%" PRIu32 ", %u, %p)\n", index, pname, pointer);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1078_major = 2;
        uint32_t l_minRequiredVersion_1078_minor = 0;
        switch (pname) {
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_POINTER: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetVertexAttribPointerv(index, pname, pointer);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetVertexAttribPointerv coder(
            observations, index, pname,
            gapic::coder::gles::Void__P__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(pointer), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetVertexAttribfv(uint32_t index, uint32_t pname, float* params) {
    GAPID_INFO("glGetVertexAttribfv(%" PRIu32 ", %u, %p)\n", index, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1080_major = 2;
        uint32_t l_minRequiredVersion_1080_minor = 0;
        switch (pname) {
            case GLenum::GL_CURRENT_VERTEX_ATTRIB:               // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:  // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_ENABLED:         // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:      // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_SIZE:            // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_STRIDE:          // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_TYPE: {
                break;
            }
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_DIVISOR:  // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_INTEGER: {
                uint32_t l_minRequiredVersion_1081_major = 3;
                uint32_t l_minRequiredVersion_1081_minor = 0;
                break;
            }
            case GLenum::GL_VERTEX_ATTRIB_BINDING: {
                uint32_t l_minRequiredVersion_1082_major = 3;
                uint32_t l_minRequiredVersion_1082_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetVertexAttribfv(index, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetVertexAttribfv coder(
            observations, index, pname,
            gapic::coder::gles::GLfloat__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetVertexAttribiv(uint32_t index, uint32_t pname, int32_t* params) {
    GAPID_INFO("glGetVertexAttribiv(%" PRIu32 ", %u, %p)\n", index, pname, params);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1084_major = 2;
        uint32_t l_minRequiredVersion_1084_minor = 0;
        switch (pname) {
            case GLenum::GL_CURRENT_VERTEX_ATTRIB:               // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:  // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_ENABLED:         // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:      // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_SIZE:            // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_STRIDE:          // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_TYPE: {
                break;
            }
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_DIVISOR:  // fall-through...
            case GLenum::GL_VERTEX_ATTRIB_ARRAY_INTEGER: {
                uint32_t l_minRequiredVersion_1085_major = 3;
                uint32_t l_minRequiredVersion_1085_minor = 0;
                break;
            }
            case GLenum::GL_VERTEX_ATTRIB_BINDING: {
                uint32_t l_minRequiredVersion_1086_major = 3;
                uint32_t l_minRequiredVersion_1086_minor = 1;
                break;
            }
        }
        observe(observations.mReads);
        mImports.glGetVertexAttribiv(index, pname, params);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetVertexAttribiv coder(
            observations, index, pname, gapic::coder::gles::GLint__P(gapic::coder::memory::Pointer(
                                                reinterpret_cast<uintptr_t>(params), 0)));
    mEncoder->Object(&coder);
}

inline uint8_t GlesSpy::glIsVertexArray(uint32_t array) {
    GAPID_INFO("glIsVertexArray(%" PRIu32 ")\n", array);

    uint8_t result = 0;

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1088_major = 3;
        uint32_t l_minRequiredVersion_1088_minor = 0;
        observe(observations.mReads);
        result = mImports.glIsVertexArray(array);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlIsVertexArray coder(observations, array, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glVertexAttrib1f(uint32_t location, float value0) {
    GAPID_INFO("glVertexAttrib1f(%" PRIu32 ", %f)\n", location, value0);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1089_major = 2;
        uint32_t l_minRequiredVersion_1089_minor = 0;
        observe(observations.mReads);
        mImports.glVertexAttrib1f(location, value0);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttrib1f coder(observations, location, value0);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttrib1fv(uint32_t location, float* value) {
    GAPID_INFO("glVertexAttrib1fv(%" PRIu32 ", %p)\n", location, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1090_major = 2;
        uint32_t l_minRequiredVersion_1090_minor = 0;
        read(slice(value, 0, 1));
        observe(observations.mReads);
        mImports.glVertexAttrib1fv(location, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttrib1fv coder(
            observations, location, gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                                            reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttrib2f(uint32_t location, float value0, float value1) {
    GAPID_INFO("glVertexAttrib2f(%" PRIu32 ", %f, %f)\n", location, value0, value1);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1091_major = 2;
        uint32_t l_minRequiredVersion_1091_minor = 0;
        observe(observations.mReads);
        mImports.glVertexAttrib2f(location, value0, value1);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttrib2f coder(observations, location, value0, value1);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttrib2fv(uint32_t location, float* value) {
    GAPID_INFO("glVertexAttrib2fv(%" PRIu32 ", %p)\n", location, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1092_major = 2;
        uint32_t l_minRequiredVersion_1092_minor = 0;
        read(slice(value, 0, 2));
        observe(observations.mReads);
        mImports.glVertexAttrib2fv(location, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttrib2fv coder(
            observations, location, gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                                            reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttrib3f(uint32_t location, float value0, float value1, float value2) {
    GAPID_INFO("glVertexAttrib3f(%" PRIu32 ", %f, %f, %f)\n", location, value0, value1, value2);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1093_major = 2;
        uint32_t l_minRequiredVersion_1093_minor = 0;
        observe(observations.mReads);
        mImports.glVertexAttrib3f(location, value0, value1, value2);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttrib3f coder(observations, location, value0, value1, value2);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttrib3fv(uint32_t location, float* value) {
    GAPID_INFO("glVertexAttrib3fv(%" PRIu32 ", %p)\n", location, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1094_major = 2;
        uint32_t l_minRequiredVersion_1094_minor = 0;
        read(slice(value, 0, 3));
        observe(observations.mReads);
        mImports.glVertexAttrib3fv(location, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttrib3fv coder(
            observations, location, gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                                            reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttrib4f(uint32_t location, float value0, float value1, float value2,
                                      float value3) {
    GAPID_INFO("glVertexAttrib4f(%" PRIu32 ", %f, %f, %f, %f)\n", location, value0, value1, value2,
               value3);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1095_major = 2;
        uint32_t l_minRequiredVersion_1095_minor = 0;
        observe(observations.mReads);
        mImports.glVertexAttrib4f(location, value0, value1, value2, value3);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttrib4f coder(observations, location, value0, value1, value2,
                                               value3);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttrib4fv(uint32_t location, float* value) {
    GAPID_INFO("glVertexAttrib4fv(%" PRIu32 ", %p)\n", location, value);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1096_major = 2;
        uint32_t l_minRequiredVersion_1096_minor = 0;
        read(slice(value, 0, 4));
        observe(observations.mReads);
        mImports.glVertexAttrib4fv(location, value);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttrib4fv coder(
            observations, location, gapic::coder::gles::GLfloat__CP(gapic::coder::memory::Pointer(
                                            reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribBinding(uint32_t attribindex, uint32_t bindingindex) {
    GAPID_INFO("glVertexAttribBinding(%" PRIu32 ", %" PRIu32 ")\n", attribindex, bindingindex);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1097_major = 3;
        uint32_t l_minRequiredVersion_1097_minor = 1;
        observe(observations.mReads);
        mImports.glVertexAttribBinding(attribindex, bindingindex);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribBinding coder(observations, attribindex, bindingindex);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribDivisor(uint32_t index, uint32_t divisor) {
    GAPID_INFO("glVertexAttribDivisor(%" PRIu32 ", %" PRIu32 ")\n", index, divisor);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1098_major = 3;
        uint32_t l_minRequiredVersion_1098_minor = 0;
        observe(observations.mReads);
        mImports.glVertexAttribDivisor(index, divisor);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribDivisor coder(observations, index, divisor);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribFormat(uint32_t attribindex, int32_t size, uint32_t type,
                                          uint8_t normalized, uint32_t relativeoffset) {
    GAPID_INFO("glVertexAttribFormat(%" PRIu32 ", %" PRId32 ", %u, %" PRIu8 ", %" PRIu32 ")\n",
               attribindex, size, type, normalized, relativeoffset);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1099_major = 3;
        uint32_t l_minRequiredVersion_1099_minor = 1;
        switch (type) {
            case GLenum::GL_BYTE:                         // fall-through...
            case GLenum::GL_FIXED:                        // fall-through...
            case GLenum::GL_FLOAT:                        // fall-through...
            case GLenum::GL_HALF_FLOAT:                   // fall-through...
            case GLenum::GL_INT:                          // fall-through...
            case GLenum::GL_INT_2_10_10_10_REV:           // fall-through...
            case GLenum::GL_SHORT:                        // fall-through...
            case GLenum::GL_UNSIGNED_BYTE:                // fall-through...
            case GLenum::GL_UNSIGNED_INT:                 // fall-through...
            case GLenum::GL_UNSIGNED_INT_2_10_10_10_REV:  // fall-through...
            case GLenum::GL_UNSIGNED_SHORT: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribFormat coder(observations, attribindex, size, type,
                                                   normalized, relativeoffset);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribI4i(uint32_t index, int32_t x, int32_t y, int32_t z, int32_t w) {
    GAPID_INFO("glVertexAttribI4i(%" PRIu32 ", %" PRId32 ", %" PRId32 ", %" PRId32 ", %" PRId32
               ")\n",
               index, x, y, z, w);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1101_major = 3;
        uint32_t l_minRequiredVersion_1101_minor = 0;
        observe(observations.mReads);
        mImports.glVertexAttribI4i(index, x, y, z, w);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribI4i coder(observations, index, x, y, z, w);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribI4iv(uint32_t index, int32_t* v) {
    GAPID_INFO("glVertexAttribI4iv(%" PRIu32 ", %p)\n", index, v);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1102_major = 3;
        uint32_t l_minRequiredVersion_1102_minor = 0;
        observe(observations.mReads);
        mImports.glVertexAttribI4iv(index, v);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribI4iv coder(
            observations, index, gapic::coder::gles::GLint__CP(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(v), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribI4ui(uint32_t index, uint32_t x, uint32_t y, uint32_t z,
                                        uint32_t w) {
    GAPID_INFO("glVertexAttribI4ui(%" PRIu32 ", %" PRIu32 ", %" PRIu32 ", %" PRIu32 ", %" PRIu32
               ")\n",
               index, x, y, z, w);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1103_major = 3;
        uint32_t l_minRequiredVersion_1103_minor = 0;
        observe(observations.mReads);
        mImports.glVertexAttribI4ui(index, x, y, z, w);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribI4ui coder(observations, index, x, y, z, w);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribI4uiv(uint32_t index, uint32_t* v) {
    GAPID_INFO("glVertexAttribI4uiv(%" PRIu32 ", %p)\n", index, v);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1104_major = 3;
        uint32_t l_minRequiredVersion_1104_minor = 0;
        observe(observations.mReads);
        mImports.glVertexAttribI4uiv(index, v);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribI4uiv coder(
            observations, index, gapic::coder::gles::GLuint__CP(gapic::coder::memory::Pointer(
                                         reinterpret_cast<uintptr_t>(v), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribIFormat(uint32_t attribindex, int32_t size, uint32_t type,
                                           uint32_t relativeoffset) {
    GAPID_INFO("glVertexAttribIFormat(%" PRIu32 ", %" PRId32 ", %u, %" PRIu32 ")\n", attribindex,
               size, type, relativeoffset);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1105_major = 3;
        uint32_t l_minRequiredVersion_1105_minor = 1;
        switch (type) {
            case GLenum::GL_BYTE:                         // fall-through...
            case GLenum::GL_FIXED:                        // fall-through...
            case GLenum::GL_FLOAT:                        // fall-through...
            case GLenum::GL_HALF_FLOAT:                   // fall-through...
            case GLenum::GL_INT:                          // fall-through...
            case GLenum::GL_INT_2_10_10_10_REV:           // fall-through...
            case GLenum::GL_SHORT:                        // fall-through...
            case GLenum::GL_UNSIGNED_BYTE:                // fall-through...
            case GLenum::GL_UNSIGNED_INT:                 // fall-through...
            case GLenum::GL_UNSIGNED_INT_2_10_10_10_REV:  // fall-through...
            case GLenum::GL_UNSIGNED_SHORT: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glVertexAttribIFormat(attribindex, size, type, relativeoffset);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribIFormat coder(observations, attribindex, size, type,
                                                    relativeoffset);
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribIPointer(uint32_t index, int32_t size, uint32_t type,
                                            int32_t stride, void* pointer) {
    GAPID_INFO("glVertexAttribIPointer(%" PRIu32 ", %" PRId32 ", %u, %" PRId32 ", %p)\n", index,
               size, type, stride, pointer);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1107_major = 3;
        uint32_t l_minRequiredVersion_1107_minor = 0;
        switch (type) {
            case GLenum::GL_HALF_FLOAT_OES: {
                uint32_t l_requiresExtension_1108_ext = ExtensionId::GL_OES_vertex_half_float;
                break;
            }
            case GLenum::GL_BYTE:           // fall-through...
            case GLenum::GL_INT:            // fall-through...
            case GLenum::GL_SHORT:          // fall-through...
            case GLenum::GL_UNSIGNED_BYTE:  // fall-through...
            case GLenum::GL_UNSIGNED_INT:   // fall-through...
            case GLenum::GL_UNSIGNED_SHORT: {
                break;
            }
        }
        observe(observations.mReads);
        mImports.glVertexAttribIPointer(index, size, type, stride, pointer);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribIPointer coder(
            observations, index, size, type, stride,
            gapic::coder::gles::Void__CP(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(pointer), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexAttribPointer(uint32_t location, int32_t size, uint32_t type,
                                           uint8_t normalized, int32_t stride, void* data) {
    GAPID_INFO("glVertexAttribPointer(%" PRIu32 ", %" PRId32 ", %u, %" PRIu8 ", %" PRId32 ", %p)\n",
               location, size, type, normalized, stride, data);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1110_major = 2;
        uint32_t l_minRequiredVersion_1110_minor = 0;
        switch (type) {
            case GLenum::GL_BYTE:           // fall-through...
            case GLenum::GL_FIXED:          // fall-through...
            case GLenum::GL_FLOAT:          // fall-through...
            case GLenum::GL_SHORT:          // fall-through...
            case GLenum::GL_UNSIGNED_BYTE:  // fall-through...
            case GLenum::GL_UNSIGNED_SHORT: {
                break;
            }
            case GLenum::GL_HALF_FLOAT_OES: {
                uint32_t l_requiresExtension_1111_ext = ExtensionId::GL_OES_vertex_half_float;
                break;
            }
            case GLenum::GL_HALF_FLOAT:          // fall-through...
            case GLenum::GL_INT:                 // fall-through...
            case GLenum::GL_INT_2_10_10_10_REV:  // fall-through...
            case GLenum::GL_UNSIGNED_INT:        // fall-through...
            case GLenum::GL_UNSIGNED_INT_2_10_10_10_REV: {
                uint32_t l_minRequiredVersion_1112_major = 3;
                uint32_t l_minRequiredVersion_1112_minor = 0;
                break;
            }
        }
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_1114_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_1114_result;
        std::shared_ptr<VertexAttributeArray> l_a = l_ctx->mVertexAttributeArrays[location];
        l_a->mSize = (uint32_t)(size);
        l_a->mType = type;
        l_a->mNormalized = normalized;
        l_a->mStride = stride;
        l_a->mPointer = data;
        l_a->mBuffer = l_ctx->mBoundBuffers[GLenum::GL_ARRAY_BUFFER];
        observe(observations.mReads);
        mImports.glVertexAttribPointer(location, size, type, normalized, stride, data);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexAttribPointer coder(
            observations, location, size, type, normalized, stride,
            gapic::coder::gles::VertexPointer(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(data), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glVertexBindingDivisor(uint32_t bindingindex, uint32_t divisor) {
    GAPID_INFO("glVertexBindingDivisor(%" PRIu32 ", %" PRIu32 ")\n", bindingindex, divisor);

    Observations observations;
    do {
        uint32_t l_minRequiredVersion_1115_major = 3;
        uint32_t l_minRequiredVersion_1115_minor = 1;
        observe(observations.mReads);
        mImports.glVertexBindingDivisor(bindingindex, divisor);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlVertexBindingDivisor coder(observations, bindingindex, divisor);
    mEncoder->Object(&coder);
}

inline int GlesSpy::eglInitialize(void* dpy, int* major, int* minor) {
    GAPID_INFO("eglInitialize(%p, %p, %p)\n", dpy, major, minor);

    int result = 0;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.eglInitialize(dpy, major, minor);
        if (major != nullptr) {
            write(slice(major, 0, 1), 0, slice(major, 0, 1)[0]);
        }
        if (major != nullptr) {
            write(slice(minor, 0, 1), 0, slice(minor, 0, 1)[0]);
        }
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::EglInitialize coder(
            observations, gapic::coder::gles::EGLDisplay(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(dpy), 0)),
            gapic::coder::gles::EGLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(major), 0)),
            gapic::coder::gles::EGLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(minor), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void* GlesSpy::eglCreateContext(void* display, void* config, void* share_context,
                                       int* attrib_list) {
    GAPID_INFO("eglCreateContext(%p, %p, %p, %p)\n", display, config, share_context, attrib_list);

    void* result = nullptr;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.eglCreateContext(display, config, share_context, attrib_list);
        EGLContext l_context = (EGLContext)(result);
        ContextID l_identifier = this->NextContextID;
        this->NextContextID = this->NextContextID + (ContextID)(1);
        std::shared_ptr<Context> l_ctx = std::shared_ptr<Context>((new Context()));
        l_ctx->mIdentifier = l_identifier;
        l_ctx->mInstances.mBuffers[(BufferId)(0)] = std::shared_ptr<Buffer>((new Buffer()));
        l_ctx->mInstances.mTextures[(TextureId)(0)] = std::shared_ptr<Texture>((new Texture()));
        l_ctx->mInstances.mRenderbuffers[(RenderbufferId)(0)] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        RenderbufferId l_color_id = (RenderbufferId)(4294967295);
        RenderbufferId l_depth_id = (RenderbufferId)(4294967294);
        RenderbufferId l_stencil_id = (RenderbufferId)(4294967293);
        l_ctx->mInstances.mRenderbuffers[l_color_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        l_ctx->mInstances.mRenderbuffers[l_depth_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        l_ctx->mInstances.mRenderbuffers[l_stencil_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        std::shared_ptr<Framebuffer> l_backbuffer =
                std::shared_ptr<Framebuffer>((new Framebuffer()));
        l_backbuffer->mAttachments[GLenum::GL_COLOR_ATTACHMENT0] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_color_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_backbuffer->mAttachments[GLenum::GL_DEPTH_ATTACHMENT] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_depth_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_backbuffer->mAttachments[GLenum::GL_STENCIL_ATTACHMENT] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_stencil_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_ctx->mInstances.mFramebuffers[(FramebufferId)(0)] = l_backbuffer;
        l_ctx->mBoundFramebuffers[GLenum::GL_DRAW_FRAMEBUFFER] = (FramebufferId)(0);
        l_ctx->mBoundFramebuffers[GLenum::GL_READ_FRAMEBUFFER] = (FramebufferId)(0);
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_FRONT] = (GLuint)(4294967295);
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_BACK] = (GLuint)(4294967295);
        l_ctx->mPixelStorage[GLenum::GL_PACK_ALIGNMENT] = (GLint)(4);
        l_ctx->mPixelStorage[GLenum::GL_UNPACK_ALIGNMENT] = (GLint)(4);
        for (int32_t l_i = 0; l_i < 64; ++l_i) {
            l_ctx->mVertexAttributeArrays[(AttributeLocation)(l_i)] =
                    std::shared_ptr<VertexAttributeArray>((new VertexAttributeArray()));
        }
        std::shared_ptr<Context> l_CreateContext_1116_result = l_ctx;
        this->EGLContexts[l_context] = l_CreateContext_1116_result;
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::EglCreateContext coder(
            observations, gapic::coder::gles::EGLDisplay(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(display), 0)),
            gapic::coder::gles::EGLConfig(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(config), 0)),
            gapic::coder::gles::EGLContext(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(share_context), 0)),
            gapic::coder::gles::EGLint__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(attrib_list), 0)),
            gapic::coder::gles::EGLContext(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(result), 0)));
    mEncoder->Object(&coder);

    return result;
}

inline int GlesSpy::eglMakeCurrent(void* display, void* draw, void* read, void* context) {
    GAPID_INFO("eglMakeCurrent(%p, %p, %p, %p)\n", display, draw, read, context);

    int result = 0;

    Observations observations;
    do {
        std::shared_ptr<Context> l_SetContext_1117_context = this->EGLContexts[context];
        this->Contexts[this->CurrentThread] = l_SetContext_1117_context;
        observe(observations.mReads);
        result = mImports.eglMakeCurrent(display, draw, read, context);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::EglMakeCurrent coder(
            observations, gapic::coder::gles::EGLDisplay(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(display), 0)),
            gapic::coder::gles::EGLSurface(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(draw), 0)),
            gapic::coder::gles::EGLSurface(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(read), 0)),
            gapic::coder::gles::EGLContext(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(context), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline int GlesSpy::eglSwapBuffers(void* display, void* surface) {
    GAPID_INFO("eglSwapBuffers(%p, %p)\n", display, surface);

    int result = 0;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.eglSwapBuffers(display, surface);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::EglSwapBuffers coder(
            observations, gapic::coder::gles::EGLDisplay(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(display), 0)),
            gapic::coder::gles::Void__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(surface), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline int GlesSpy::eglQuerySurface(void* display, void* surface, int attribute, int* value) {
    GAPID_INFO("eglQuerySurface(%p, %p, %d, %p)\n", display, surface, attribute, value);

    int result = 0;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.eglQuerySurface(display, surface, attribute, value);
        write(slice(value, 0, 1), 0, slice(value, 0, 1)[0]);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::EglQuerySurface coder(
            observations, gapic::coder::gles::EGLDisplay(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(display), 0)),
            gapic::coder::gles::EGLSurface(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(surface), 0)),
            attribute, gapic::coder::gles::EGLint__P(gapic::coder::memory::Pointer(
                               reinterpret_cast<uintptr_t>(value), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void* GlesSpy::glXCreateContext(void* dpy, void* vis, void* shareList, bool direct) {
    GAPID_INFO("glXCreateContext(%p, %p, %p, %d)\n", dpy, vis, shareList, direct);

    void* result = nullptr;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.glXCreateContext(dpy, vis, shareList, direct);
        GLXContext l_context = (GLXContext)(result);
        ContextID l_identifier = this->NextContextID;
        this->NextContextID = this->NextContextID + (ContextID)(1);
        std::shared_ptr<Context> l_ctx = std::shared_ptr<Context>((new Context()));
        l_ctx->mIdentifier = l_identifier;
        l_ctx->mInstances.mBuffers[(BufferId)(0)] = std::shared_ptr<Buffer>((new Buffer()));
        l_ctx->mInstances.mTextures[(TextureId)(0)] = std::shared_ptr<Texture>((new Texture()));
        l_ctx->mInstances.mRenderbuffers[(RenderbufferId)(0)] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        RenderbufferId l_color_id = (RenderbufferId)(4294967295);
        RenderbufferId l_depth_id = (RenderbufferId)(4294967294);
        RenderbufferId l_stencil_id = (RenderbufferId)(4294967293);
        l_ctx->mInstances.mRenderbuffers[l_color_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        l_ctx->mInstances.mRenderbuffers[l_depth_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        l_ctx->mInstances.mRenderbuffers[l_stencil_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        std::shared_ptr<Framebuffer> l_backbuffer =
                std::shared_ptr<Framebuffer>((new Framebuffer()));
        l_backbuffer->mAttachments[GLenum::GL_COLOR_ATTACHMENT0] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_color_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_backbuffer->mAttachments[GLenum::GL_DEPTH_ATTACHMENT] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_depth_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_backbuffer->mAttachments[GLenum::GL_STENCIL_ATTACHMENT] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_stencil_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_ctx->mInstances.mFramebuffers[(FramebufferId)(0)] = l_backbuffer;
        l_ctx->mBoundFramebuffers[GLenum::GL_DRAW_FRAMEBUFFER] = (FramebufferId)(0);
        l_ctx->mBoundFramebuffers[GLenum::GL_READ_FRAMEBUFFER] = (FramebufferId)(0);
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_FRONT] = (GLuint)(4294967295);
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_BACK] = (GLuint)(4294967295);
        l_ctx->mPixelStorage[GLenum::GL_PACK_ALIGNMENT] = (GLint)(4);
        l_ctx->mPixelStorage[GLenum::GL_UNPACK_ALIGNMENT] = (GLint)(4);
        for (int32_t l_i = 0; l_i < 64; ++l_i) {
            l_ctx->mVertexAttributeArrays[(AttributeLocation)(l_i)] =
                    std::shared_ptr<VertexAttributeArray>((new VertexAttributeArray()));
        }
        std::shared_ptr<Context> l_CreateContext_1118_result = l_ctx;
        this->GLXContexts[l_context] = l_CreateContext_1118_result;
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlXCreateContext coder(
            observations, gapic::coder::gles::Void__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(dpy), 0)),
            gapic::coder::gles::Void__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(vis), 0)),
            gapic::coder::gles::GLXContext(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(shareList), 0)),
            direct, gapic::coder::gles::GLXContext(
                            gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(result), 0)));
    mEncoder->Object(&coder);

    return result;
}

inline void* GlesSpy::glXCreateNewContext(void* display, void* fbconfig, uint32_t type,
                                          void* shared, bool direct) {
    GAPID_INFO("glXCreateNewContext(%p, %p, %" PRIu32 ", %p, %d)\n", display, fbconfig, type,
               shared, direct);

    void* result = nullptr;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.glXCreateNewContext(display, fbconfig, type, shared, direct);
        GLXContext l_context = (GLXContext)(result);
        ContextID l_identifier = this->NextContextID;
        this->NextContextID = this->NextContextID + (ContextID)(1);
        std::shared_ptr<Context> l_ctx = std::shared_ptr<Context>((new Context()));
        l_ctx->mIdentifier = l_identifier;
        l_ctx->mInstances.mBuffers[(BufferId)(0)] = std::shared_ptr<Buffer>((new Buffer()));
        l_ctx->mInstances.mTextures[(TextureId)(0)] = std::shared_ptr<Texture>((new Texture()));
        l_ctx->mInstances.mRenderbuffers[(RenderbufferId)(0)] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        RenderbufferId l_color_id = (RenderbufferId)(4294967295);
        RenderbufferId l_depth_id = (RenderbufferId)(4294967294);
        RenderbufferId l_stencil_id = (RenderbufferId)(4294967293);
        l_ctx->mInstances.mRenderbuffers[l_color_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        l_ctx->mInstances.mRenderbuffers[l_depth_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        l_ctx->mInstances.mRenderbuffers[l_stencil_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        std::shared_ptr<Framebuffer> l_backbuffer =
                std::shared_ptr<Framebuffer>((new Framebuffer()));
        l_backbuffer->mAttachments[GLenum::GL_COLOR_ATTACHMENT0] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_color_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_backbuffer->mAttachments[GLenum::GL_DEPTH_ATTACHMENT] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_depth_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_backbuffer->mAttachments[GLenum::GL_STENCIL_ATTACHMENT] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_stencil_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_ctx->mInstances.mFramebuffers[(FramebufferId)(0)] = l_backbuffer;
        l_ctx->mBoundFramebuffers[GLenum::GL_DRAW_FRAMEBUFFER] = (FramebufferId)(0);
        l_ctx->mBoundFramebuffers[GLenum::GL_READ_FRAMEBUFFER] = (FramebufferId)(0);
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_FRONT] = (GLuint)(4294967295);
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_BACK] = (GLuint)(4294967295);
        l_ctx->mPixelStorage[GLenum::GL_PACK_ALIGNMENT] = (GLint)(4);
        l_ctx->mPixelStorage[GLenum::GL_UNPACK_ALIGNMENT] = (GLint)(4);
        for (int32_t l_i = 0; l_i < 64; ++l_i) {
            l_ctx->mVertexAttributeArrays[(AttributeLocation)(l_i)] =
                    std::shared_ptr<VertexAttributeArray>((new VertexAttributeArray()));
        }
        std::shared_ptr<Context> l_CreateContext_1119_result = l_ctx;
        this->GLXContexts[l_context] = l_CreateContext_1119_result;
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlXCreateNewContext coder(
            observations, gapic::coder::gles::Void__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(display), 0)),
            gapic::coder::gles::Void__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(fbconfig), 0)),
            type, gapic::coder::gles::GLXContext(
                          gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(shared), 0)),
            direct, gapic::coder::gles::GLXContext(
                            gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(result), 0)));
    mEncoder->Object(&coder);

    return result;
}

inline int GlesSpy::glXMakeContextCurrent(void* display, void* draw, void* read, void* ctx) {
    GAPID_INFO("glXMakeContextCurrent(%p, %p, %p, %p)\n", display, draw, read, ctx);

    int result = 0;

    Observations observations;
    do {
        std::shared_ptr<Context> l_SetContext_1120_context = this->GLXContexts[ctx];
        this->Contexts[this->CurrentThread] = l_SetContext_1120_context;
        observe(observations.mReads);
        result = mImports.glXMakeContextCurrent(display, draw, read, ctx);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlXMakeContextCurrent coder(
            observations, gapic::coder::gles::Void__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(display), 0)),
            gapic::coder::gles::GLXDrawable(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(draw), 0)),
            gapic::coder::gles::GLXDrawable(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(read), 0)),
            gapic::coder::gles::GLXContext(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(ctx), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline int GlesSpy::glXMakeCurrent(void* display, void* drawable, void* ctx) {
    GAPID_INFO("glXMakeCurrent(%p, %p, %p)\n", display, drawable, ctx);

    int result = 0;

    Observations observations;
    do {
        std::shared_ptr<Context> l_SetContext_1121_context = this->GLXContexts[ctx];
        this->Contexts[this->CurrentThread] = l_SetContext_1121_context;
        observe(observations.mReads);
        result = mImports.glXMakeCurrent(display, drawable, ctx);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlXMakeCurrent coder(
            observations, gapic::coder::gles::Void__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(display), 0)),
            gapic::coder::gles::GLXDrawable(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(drawable), 0)),
            gapic::coder::gles::GLXContext(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(ctx), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glXSwapBuffers(void* display, void* drawable) {
    GAPID_INFO("glXSwapBuffers(%p, %p)\n", display, drawable);

    Observations observations;
    do {
        observe(observations.mReads);
        mImports.glXSwapBuffers(display, drawable);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlXSwapBuffers coder(
            observations, gapic::coder::gles::Void__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(display), 0)),
            gapic::coder::gles::GLXDrawable(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(drawable), 0)));
    mEncoder->Object(&coder);
}

inline int GlesSpy::glXQueryDrawable(void* display, void* draw, int attribute, int* value) {
    GAPID_INFO("glXQueryDrawable(%p, %p, %d, %p)\n", display, draw, attribute, value);

    int result = 0;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.glXQueryDrawable(display, draw, attribute, value);
        write(slice(value, 0, 1), 0, slice(value, 0, 1)[0]);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlXQueryDrawable coder(
            observations, gapic::coder::gles::Void__P(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(display), 0)),
            gapic::coder::gles::GLXDrawable(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(draw), 0)),
            attribute, gapic::coder::gles::Int__P(gapic::coder::memory::Pointer(
                               reinterpret_cast<uintptr_t>(value), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void* GlesSpy::wglCreateContext(void* hdc) {
    GAPID_INFO("wglCreateContext(%p)\n", hdc);

    void* result = nullptr;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.wglCreateContext(hdc);
        HGLRC l_context = (HGLRC)(result);
        ContextID l_identifier = this->NextContextID;
        this->NextContextID = this->NextContextID + (ContextID)(1);
        std::shared_ptr<Context> l_ctx = std::shared_ptr<Context>((new Context()));
        l_ctx->mIdentifier = l_identifier;
        l_ctx->mInstances.mBuffers[(BufferId)(0)] = std::shared_ptr<Buffer>((new Buffer()));
        l_ctx->mInstances.mTextures[(TextureId)(0)] = std::shared_ptr<Texture>((new Texture()));
        l_ctx->mInstances.mRenderbuffers[(RenderbufferId)(0)] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        RenderbufferId l_color_id = (RenderbufferId)(4294967295);
        RenderbufferId l_depth_id = (RenderbufferId)(4294967294);
        RenderbufferId l_stencil_id = (RenderbufferId)(4294967293);
        l_ctx->mInstances.mRenderbuffers[l_color_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        l_ctx->mInstances.mRenderbuffers[l_depth_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        l_ctx->mInstances.mRenderbuffers[l_stencil_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        std::shared_ptr<Framebuffer> l_backbuffer =
                std::shared_ptr<Framebuffer>((new Framebuffer()));
        l_backbuffer->mAttachments[GLenum::GL_COLOR_ATTACHMENT0] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_color_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_backbuffer->mAttachments[GLenum::GL_DEPTH_ATTACHMENT] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_depth_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_backbuffer->mAttachments[GLenum::GL_STENCIL_ATTACHMENT] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_stencil_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_ctx->mInstances.mFramebuffers[(FramebufferId)(0)] = l_backbuffer;
        l_ctx->mBoundFramebuffers[GLenum::GL_DRAW_FRAMEBUFFER] = (FramebufferId)(0);
        l_ctx->mBoundFramebuffers[GLenum::GL_READ_FRAMEBUFFER] = (FramebufferId)(0);
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_FRONT] = (GLuint)(4294967295);
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_BACK] = (GLuint)(4294967295);
        l_ctx->mPixelStorage[GLenum::GL_PACK_ALIGNMENT] = (GLint)(4);
        l_ctx->mPixelStorage[GLenum::GL_UNPACK_ALIGNMENT] = (GLint)(4);
        for (int32_t l_i = 0; l_i < 64; ++l_i) {
            l_ctx->mVertexAttributeArrays[(AttributeLocation)(l_i)] =
                    std::shared_ptr<VertexAttributeArray>((new VertexAttributeArray()));
        }
        std::shared_ptr<Context> l_CreateContext_1122_result = l_ctx;
        this->WGLContexts[l_context] = l_CreateContext_1122_result;
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::WglCreateContext coder(
            observations, gapic::coder::gles::HDC(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(hdc), 0)),
            gapic::coder::gles::HGLRC(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(result), 0)));
    mEncoder->Object(&coder);

    return result;
}

inline void* GlesSpy::wglCreateContextAttribsARB(void* hdc, void* hShareContext, int* attribList) {
    GAPID_INFO("wglCreateContextAttribsARB(%p, %p, %p)\n", hdc, hShareContext, attribList);

    void* result = nullptr;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.wglCreateContextAttribsARB(hdc, hShareContext, attribList);
        HGLRC l_context = (HGLRC)(result);
        ContextID l_identifier = this->NextContextID;
        this->NextContextID = this->NextContextID + (ContextID)(1);
        std::shared_ptr<Context> l_ctx = std::shared_ptr<Context>((new Context()));
        l_ctx->mIdentifier = l_identifier;
        l_ctx->mInstances.mBuffers[(BufferId)(0)] = std::shared_ptr<Buffer>((new Buffer()));
        l_ctx->mInstances.mTextures[(TextureId)(0)] = std::shared_ptr<Texture>((new Texture()));
        l_ctx->mInstances.mRenderbuffers[(RenderbufferId)(0)] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        RenderbufferId l_color_id = (RenderbufferId)(4294967295);
        RenderbufferId l_depth_id = (RenderbufferId)(4294967294);
        RenderbufferId l_stencil_id = (RenderbufferId)(4294967293);
        l_ctx->mInstances.mRenderbuffers[l_color_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        l_ctx->mInstances.mRenderbuffers[l_depth_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        l_ctx->mInstances.mRenderbuffers[l_stencil_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        std::shared_ptr<Framebuffer> l_backbuffer =
                std::shared_ptr<Framebuffer>((new Framebuffer()));
        l_backbuffer->mAttachments[GLenum::GL_COLOR_ATTACHMENT0] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_color_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_backbuffer->mAttachments[GLenum::GL_DEPTH_ATTACHMENT] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_depth_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_backbuffer->mAttachments[GLenum::GL_STENCIL_ATTACHMENT] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_stencil_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_ctx->mInstances.mFramebuffers[(FramebufferId)(0)] = l_backbuffer;
        l_ctx->mBoundFramebuffers[GLenum::GL_DRAW_FRAMEBUFFER] = (FramebufferId)(0);
        l_ctx->mBoundFramebuffers[GLenum::GL_READ_FRAMEBUFFER] = (FramebufferId)(0);
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_FRONT] = (GLuint)(4294967295);
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_BACK] = (GLuint)(4294967295);
        l_ctx->mPixelStorage[GLenum::GL_PACK_ALIGNMENT] = (GLint)(4);
        l_ctx->mPixelStorage[GLenum::GL_UNPACK_ALIGNMENT] = (GLint)(4);
        for (int32_t l_i = 0; l_i < 64; ++l_i) {
            l_ctx->mVertexAttributeArrays[(AttributeLocation)(l_i)] =
                    std::shared_ptr<VertexAttributeArray>((new VertexAttributeArray()));
        }
        std::shared_ptr<Context> l_CreateContext_1123_result = l_ctx;
        this->WGLContexts[l_context] = l_CreateContext_1123_result;
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::WglCreateContextAttribsARB coder(
            observations, gapic::coder::gles::HDC(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(hdc), 0)),
            gapic::coder::gles::HGLRC(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(hShareContext), 0)),
            gapic::coder::gles::Int__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(attribList), 0)),
            gapic::coder::gles::HGLRC(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(result), 0)));
    mEncoder->Object(&coder);

    return result;
}

inline int GlesSpy::wglMakeCurrent(void* hdc, void* hglrc) {
    GAPID_INFO("wglMakeCurrent(%p, %p)\n", hdc, hglrc);

    int result = 0;

    Observations observations;
    do {
        std::shared_ptr<Context> l_SetContext_1124_context = this->WGLContexts[hglrc];
        this->Contexts[this->CurrentThread] = l_SetContext_1124_context;
        observe(observations.mReads);
        result = mImports.wglMakeCurrent(hdc, hglrc);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::WglMakeCurrent coder(
            observations, gapic::coder::gles::HDC(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(hdc), 0)),
            gapic::coder::gles::HGLRC(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(hglrc), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::wglSwapBuffers(void* hdc) {
    GAPID_INFO("wglSwapBuffers(%p)\n", hdc);

    Observations observations;
    do {
        observe(observations.mReads);
        mImports.wglSwapBuffers(hdc);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::WglSwapBuffers coder(observations,
                                             gapic::coder::gles::HDC(gapic::coder::memory::Pointer(
                                                     reinterpret_cast<uintptr_t>(hdc), 0)));
    mEncoder->Object(&coder);
}

inline int GlesSpy::CGLCreateContext(void* pix, void* share, void** ctx) {
    GAPID_INFO("CGLCreateContext(%p, %p, %p)\n", pix, share, ctx);

    int result = 0;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.CGLCreateContext(pix, share, ctx);
        CGLContextObj l_context = (CGLContextObj)(slice(ctx, 0, 1)[0]);
        ContextID l_identifier = this->NextContextID;
        this->NextContextID = this->NextContextID + (ContextID)(1);
        std::shared_ptr<Context> l_ctx = std::shared_ptr<Context>((new Context()));
        l_ctx->mIdentifier = l_identifier;
        l_ctx->mInstances.mBuffers[(BufferId)(0)] = std::shared_ptr<Buffer>((new Buffer()));
        l_ctx->mInstances.mTextures[(TextureId)(0)] = std::shared_ptr<Texture>((new Texture()));
        l_ctx->mInstances.mRenderbuffers[(RenderbufferId)(0)] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        RenderbufferId l_color_id = (RenderbufferId)(4294967295);
        RenderbufferId l_depth_id = (RenderbufferId)(4294967294);
        RenderbufferId l_stencil_id = (RenderbufferId)(4294967293);
        l_ctx->mInstances.mRenderbuffers[l_color_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        l_ctx->mInstances.mRenderbuffers[l_depth_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        l_ctx->mInstances.mRenderbuffers[l_stencil_id] =
                std::shared_ptr<Renderbuffer>((new Renderbuffer()));
        std::shared_ptr<Framebuffer> l_backbuffer =
                std::shared_ptr<Framebuffer>((new Framebuffer()));
        l_backbuffer->mAttachments[GLenum::GL_COLOR_ATTACHMENT0] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_color_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_backbuffer->mAttachments[GLenum::GL_DEPTH_ATTACHMENT] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_depth_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_backbuffer->mAttachments[GLenum::GL_STENCIL_ATTACHMENT] =
                FramebufferAttachmentInfo()
                        .SetObject((uint32_t)(l_stencil_id))
                        .SetType(GLenum::GL_RENDERBUFFER)
                        .SetCubeMapFace(GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X);
        l_ctx->mInstances.mFramebuffers[(FramebufferId)(0)] = l_backbuffer;
        l_ctx->mBoundFramebuffers[GLenum::GL_DRAW_FRAMEBUFFER] = (FramebufferId)(0);
        l_ctx->mBoundFramebuffers[GLenum::GL_READ_FRAMEBUFFER] = (FramebufferId)(0);
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_FRONT] = (GLuint)(4294967295);
        l_ctx->mRasterizing.mStencilMask[GLenum::GL_BACK] = (GLuint)(4294967295);
        l_ctx->mPixelStorage[GLenum::GL_PACK_ALIGNMENT] = (GLint)(4);
        l_ctx->mPixelStorage[GLenum::GL_UNPACK_ALIGNMENT] = (GLint)(4);
        for (int32_t l_i = 0; l_i < 64; ++l_i) {
            l_ctx->mVertexAttributeArrays[(AttributeLocation)(l_i)] =
                    std::shared_ptr<VertexAttributeArray>((new VertexAttributeArray()));
        }
        std::shared_ptr<Context> l_CreateContext_1125_result = l_ctx;
        this->CGLContexts[l_context] = l_CreateContext_1125_result;
        write(slice(ctx, 0, 1), 0, l_context);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::CGLCreateContext coder(
            observations, gapic::coder::gles::CGLPixelFormatObj(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(pix), 0)),
            gapic::coder::gles::CGLContextObj(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(share), 0)),
            gapic::coder::gles::CGLContextObj__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(ctx), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline int GlesSpy::CGLSetCurrentContext(void* ctx) {
    GAPID_INFO("CGLSetCurrentContext(%p)\n", ctx);

    int result = 0;

    Observations observations;
    do {
        std::shared_ptr<Context> l_SetContext_1126_context = this->CGLContexts[ctx];
        this->Contexts[this->CurrentThread] = l_SetContext_1126_context;
        observe(observations.mReads);
        result = mImports.CGLSetCurrentContext(ctx);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::CGLSetCurrentContext coder(
            observations, gapic::coder::gles::CGLContextObj(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(ctx), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline int GlesSpy::CGLGetSurface(void* ctx, void** cid, int32_t* wid, int32_t* sid) {
    GAPID_INFO("CGLGetSurface(%p, %p, %p, %p)\n", ctx, cid, wid, sid);

    int result = 0;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.CGLGetSurface(ctx, cid, wid, sid);
        write(slice(cid, 0, 1), 0, slice(cid, 0, 1)[0]);
        write(slice(wid, 0, 1), 0, slice(wid, 0, 1)[0]);
        write(slice(sid, 0, 1), 0, slice(sid, 0, 1)[0]);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::CGLGetSurface coder(
            observations, gapic::coder::gles::CGLContextObj(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(ctx), 0)),
            gapic::coder::gles::CGSConnectionID__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(cid), 0)),
            gapic::coder::gles::CGSWindowID__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(wid), 0)),
            gapic::coder::gles::CGSSurfaceID__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(sid), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline int GlesSpy::CGSGetSurfaceBounds(void* cid, int32_t wid, int32_t sid, double* bounds) {
    GAPID_INFO("CGSGetSurfaceBounds(%p, %" PRId32 ", %" PRId32 ", %p)\n", cid, wid, sid, bounds);

    int result = 0;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.CGSGetSurfaceBounds(cid, wid, sid, bounds);
        write(slice(bounds, 0, 4));
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::CGSGetSurfaceBounds coder(
            observations, gapic::coder::gles::CGSConnectionID(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(cid), 0)),
            wid, sid, gapic::coder::gles::F64__P(gapic::coder::memory::Pointer(
                              reinterpret_cast<uintptr_t>(bounds), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline int GlesSpy::CGLFlushDrawable(void* ctx) {
    GAPID_INFO("CGLFlushDrawable(%p)\n", ctx);

    int result = 0;

    Observations observations;
    do {
        observe(observations.mReads);
        result = mImports.CGLFlushDrawable(ctx);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::CGLFlushDrawable coder(
            observations, gapic::coder::gles::CGLContextObj(gapic::coder::memory::Pointer(
                                  reinterpret_cast<uintptr_t>(ctx), 0)),
            result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::glGetQueryObjecti64v(uint32_t query, uint32_t parameter, int64_t* value) {
    GAPID_INFO("glGetQueryObjecti64v(%" PRIu32 ", %u, %p)\n", query, parameter, value);

    Observations observations;
    do {
        observe(observations.mReads);
        mImports.glGetQueryObjecti64v(query, parameter, value);
        write(slice(value, 0, 1), 0, slice(value, 0, 1)[0]);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetQueryObjecti64v coder(
            observations, query, parameter,
            gapic::coder::gles::S64__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::glGetQueryObjectui64v(uint32_t query, uint32_t parameter, uint64_t* value) {
    GAPID_INFO("glGetQueryObjectui64v(%" PRIu32 ", %u, %p)\n", query, parameter, value);

    Observations observations;
    do {
        observe(observations.mReads);
        mImports.glGetQueryObjectui64v(query, parameter, value);
        write(slice(value, 0, 1), 0, slice(value, 0, 1)[0]);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::GlGetQueryObjectui64v coder(
            observations, query, parameter,
            gapic::coder::gles::U64__P(
                    gapic::coder::memory::Pointer(reinterpret_cast<uintptr_t>(value), 0)));
    mEncoder->Object(&coder);
}

inline void GlesSpy::architecture(uint32_t pointer_alignment, uint32_t pointer_size,
                                  uint32_t integer_size, bool little_endian) {
    GAPID_INFO("architecture(%" PRIu32 ", %" PRIu32 ", %" PRIu32 ", %d)\n", pointer_alignment,
               pointer_size, integer_size, little_endian);

    Observations observations;
    do {
        observe(observations.mReads);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::Architecture coder(observations, pointer_alignment, pointer_size,
                                           integer_size, little_endian);
    mEncoder->Object(&coder);
}

inline void GlesSpy::replayCreateRenderer(uint32_t id) {
    GAPID_INFO("replayCreateRenderer(%" PRIu32 ")\n", id);

    Observations observations;
    do {
        observe(observations.mReads);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::ReplayCreateRenderer coder(observations, id);
    mEncoder->Object(&coder);
}

inline void GlesSpy::replayBindRenderer(uint32_t id) {
    GAPID_INFO("replayBindRenderer(%" PRIu32 ")\n", id);

    Observations observations;
    do {
        observe(observations.mReads);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::ReplayBindRenderer coder(observations, id);
    mEncoder->Object(&coder);
}

inline void GlesSpy::switchThread(uint64_t threadID) {
    GAPID_INFO("switchThread(%" PRIu64 ")\n", threadID);

    Observations observations;
    do {
        this->CurrentThread = threadID;
        observe(observations.mReads);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::SwitchThread coder(observations, threadID);
    mEncoder->Object(&coder);
}

inline void GlesSpy::backbufferInfo(int32_t width, int32_t height, uint32_t color_fmt,
                                    uint32_t depth_fmt, uint32_t stencil_fmt,
                                    bool resetViewportScissor, bool preserveBuffersOnSwap) {
    GAPID_INFO("backbufferInfo(%" PRId32 ", %" PRId32 ", %u, %u, %u, %d, %d)\n", width, height,
               color_fmt, depth_fmt, stencil_fmt, resetViewportScissor, preserveBuffersOnSwap);

    Observations observations;
    do {
        std::shared_ptr<Context> l_context = this->Contexts[this->CurrentThread];
        std::shared_ptr<Context> l_GetContext_1127_result = l_context;
        std::shared_ptr<Context> l_ctx = l_GetContext_1127_result;
        l_ctx->mPreserveBuffersOnSwap = preserveBuffersOnSwap;
        std::shared_ptr<Framebuffer> l_backbuffer =
                l_ctx->mInstances.mFramebuffers[(FramebufferId)(0)];
        RenderbufferId l_color_id =
                (RenderbufferId)(l_backbuffer->mAttachments[GLenum::GL_COLOR_ATTACHMENT0].mObject);
        std::shared_ptr<Renderbuffer> l_color_buffer = l_ctx->mInstances.mRenderbuffers[l_color_id];
        RenderbufferId l_depth_id =
                (RenderbufferId)(l_backbuffer->mAttachments[GLenum::GL_DEPTH_ATTACHMENT].mObject);
        std::shared_ptr<Renderbuffer> l_depth_buffer = l_ctx->mInstances.mRenderbuffers[l_depth_id];
        RenderbufferId l_stencil_id =
                (RenderbufferId)(l_backbuffer->mAttachments[GLenum::GL_STENCIL_ATTACHMENT].mObject);
        std::shared_ptr<Renderbuffer> l_stencil_buffer =
                l_ctx->mInstances.mRenderbuffers[l_stencil_id];
        l_color_buffer->mWidth = width;
        l_color_buffer->mHeight = height;
        l_color_buffer->mFormat = color_fmt;
        l_depth_buffer->mWidth = width;
        l_depth_buffer->mHeight = height;
        l_depth_buffer->mFormat = depth_fmt;
        l_stencil_buffer->mWidth = width;
        l_stencil_buffer->mHeight = height;
        l_stencil_buffer->mFormat = stencil_fmt;
        if (resetViewportScissor) {
            l_ctx->mRasterizing.mScissor.mWidth = width;
            l_ctx->mRasterizing.mScissor.mHeight = height;
            l_ctx->mRasterizing.mViewport.mWidth = width;
            l_ctx->mRasterizing.mViewport.mHeight = height;
        }
        observe(observations.mReads);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::BackbufferInfo coder(observations, width, height, color_fmt, depth_fmt,
                                             stencil_fmt, resetViewportScissor,
                                             preserveBuffersOnSwap);
    mEncoder->Object(&coder);
}

inline void GlesSpy::startTimer(uint8_t index) {
    GAPID_INFO("startTimer(%" PRIu8 ")\n", index);

    Observations observations;
    do {
        observe(observations.mReads);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::StartTimer coder(observations, index);
    mEncoder->Object(&coder);
}

inline uint64_t GlesSpy::stopTimer(uint8_t index) {
    GAPID_INFO("stopTimer(%" PRIu8 ")\n", index);

    uint64_t result = 0;

    Observations observations;
    do {
        observe(observations.mReads);
        break;
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::StopTimer coder(observations, index, result);
    mEncoder->Object(&coder);

    return result;
}

inline void GlesSpy::flushPostBuffer() {
    GAPID_INFO("flushPostBuffer()\n");

    Observations observations;
    do {
        observe(observations.mReads);
    } while (false);
    observe(observations.mWrites);

    gapic::coder::gles::FlushPostBuffer coder(observations);
    mEncoder->Object(&coder);
}

}  // namespace gapii

#endif  // GAPII_GLES_SPY_H
