/*
 * 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.
 */


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

#include "gles_spy.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 <stdint.h>

#include <memory>
#include <string>

namespace gapii {

void GlesSpy::subBindBufferRange(CallObserver* observer, const std::function<void()>& call, uint32_t target, GLuint index, BufferId buffer, GLintptr offset, GLsizeiptr size) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    BufferBinding l_bufferBinding = BufferBinding(buffer, offset, size);
    switch (target) {
        case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            checkNotNull(l_ctx).mBoundBuffers.mTransformFeedbackBuffer = buffer;
            std::shared_ptr<TransformFeedback> l__res_0 = subGetBoundTransformFeedback(observer, call);
            checkNotNull(l__res_0).mBuffers[index] = l_bufferBinding;
            break;
        }
        case GLenum::GL_UNIFORM_BUFFER: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            checkNotNull(l_ctx).mBoundBuffers.mUniformBuffer = buffer;
            checkNotNull(l_ctx).mBoundBuffers.mUniformBuffers[index] = l_bufferBinding;
            break;
        }
        case GLenum::GL_ATOMIC_COUNTER_BUFFER: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            checkNotNull(l_ctx).mBoundBuffers.mAtomicCounterBuffer = buffer;
            checkNotNull(l_ctx).mBoundBuffers.mAtomicCounterBuffers[index] = l_bufferBinding;
            break;
        }
        case GLenum::GL_SHADER_STORAGE_BUFFER: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            checkNotNull(l_ctx).mBoundBuffers.mShaderStorageBuffer = buffer;
            checkNotNull(l_ctx).mBoundBuffers.mShaderStorageBuffers[index] = l_bufferBinding;
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, target);
        }
    }
    if (!(checkNotNull(l_ctx).mInstances.mBuffers.count(buffer) > 0)) {
        checkNotNull(l_ctx).mInstances.mBuffers[buffer] = std::shared_ptr<Buffer>(new Buffer(Slice<uint8_t>(), (GLsizeiptr)(0L), GLenum::GL_STATIC_DRAW, 0, GLbooleanLabels::GL_FALSE, nullptr, (GLintptr)(0L), (GLsizeiptr)(0L), ""));
    }
    return;
}

void GlesSpy::subMapBuffer(CallObserver* observer, const std::function<void()>& call, uint32_t target, uint32_t access, uint8_t* ptr) {
    std::shared_ptr<Buffer> l_b = subGetBoundBufferOrError(observer, call, target);
    uint32_t l_accessBits = /* switch(access) */
        /* case GLenum::GL_READ_ONLY: */(((access) == (GLenum::GL_READ_ONLY))) ? (GLbitfield::GL_MAP_READ_BIT) :
        /* case GLenum::GL_WRITE_ONLY: */(((access) == (GLenum::GL_WRITE_ONLY))) ? (GLbitfield::GL_MAP_WRITE_BIT) :
        /* case GLenum::GL_READ_WRITE: */(((access) == (GLenum::GL_READ_WRITE))) ? ((GLbitfield::GL_MAP_READ_BIT) | (GLbitfield::GL_MAP_WRITE_BIT)) :
        /* default: */ 0;
    subMapBufferRange(observer, call, target, (GLintptr)(0L), checkNotNull(l_b).mSize, l_accessBits, ptr);
    return;
}

void GlesSpy::subFlushMappedBufferRange(CallObserver* observer, const std::function<void()>& call, uint32_t target, GLintptr offset, GLsizeiptr length) {
    std::shared_ptr<Buffer> l_b = subGetBoundBufferOrError(observer, call, target);
    if ((checkNotNull(l_b).mMapped) == (GLbooleanLabels::GL_FALSE)) {
        subGlErrorInvalidOperation(observer, call);
    }
    if (!((checkNotNull(l_b).mAccessFlags & GLbitfield::GL_MAP_FLUSH_EXPLICIT_BIT) != 0)) {
        subGlErrorInvalidOperation(observer, call);
    }
    if (((offset) < ((GLintptr)(0L))) || (((length) < ((GLsizeiptr)(0L))) || ((((GLsizeiptr)(offset)) + (length)) > (checkNotNull(l_b).mMapLength)))) {
        subGlErrorInvalidValue(observer, call);
    }
    GLintptr l_dstOffset = (checkNotNull(l_b).mMapOffset) + (offset);
    observer->copy(slice(checkNotNull(l_b).mData, (uint64_t)(l_dstOffset), (uint64_t)((l_dstOffset) + ((GLintptr)(length)))), slice(checkNotNull(l_b).mMapPointer, (uint64_t)(offset), (uint64_t)((offset) + ((GLintptr)(length)))));
    return;
}

void GlesSpy::subSetConstant(CallObserver* observer, const std::function<void()>& call, std::shared_ptr<StaticContextState> ctx, uint32_t name, Slice<uint8_t> value) {
    switch (name) {
        case GLenum::GL_RENDERER: {
            checkNotNull(ctx).mConstants.mRenderer = observer->string(value.as<char>());
            break;
        }
        case GLenum::GL_VENDOR: {
            checkNotNull(ctx).mConstants.mVendor = observer->string(value.as<char>());
            break;
        }
        case GLenum::GL_VERSION: {
            checkNotNull(ctx).mConstants.mVersion = observer->string(value.as<char>());
            break;
        }
        case GLenum::GL_EXTENSIONS: {
            Slice<char> l_extensions = value.as<char>();
            for (int32_t l_start = 0L; l_start < int32_t((value.count())); ++l_start) {
                if (((l_start) == (0L)) || ((observer->string(slice(l_extensions, (uint64_t)((l_start) - (1L)), (uint64_t)(l_start)))) == (" "))) {
                    uint32_t l_idx = uint32_t((checkNotNull(ctx).mConstants.mExtensions.size()));
                    for (int32_t l_end = l_start; l_end < (int32_t((value.count()))) + (1L); ++l_end) {
                        if (((l_end) == (int32_t((value.count())))) || ((observer->string(slice(l_extensions, (uint64_t)(l_end), (uint64_t)((l_end) + (1L))))) == (" "))) {
                            if (!(checkNotNull(ctx).mConstants.mExtensions.count(l_idx) > 0)) {
                                checkNotNull(ctx).mConstants.mExtensions[l_idx] = observer->string(slice(l_extensions, (uint64_t)(l_start), (uint64_t)(l_end)));
                            }
                        }
                    }
                }
            }
            break;
        }
        case GLenum::GL_SHADING_LANGUAGE_VERSION: {
            checkNotNull(ctx).mConstants.mShadingLanguageVersion = observer->string(value.as<char>());
            break;
        }
        case GLenum::GL_SUBPIXEL_BITS: {
            checkNotNull(ctx).mConstants.mSubpixelBits = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_ELEMENT_INDEX: {
            checkNotNull(ctx).mConstants.mMaxElementIndex = observer->read(value.as<GLint64>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_3D_TEXTURE_SIZE: {
            checkNotNull(ctx).mConstants.mMax3dTextureSize = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TEXTURE_SIZE: {
            checkNotNull(ctx).mConstants.mMaxTextureSize = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_ARRAY_TEXTURE_LAYERS: {
            checkNotNull(ctx).mConstants.mMaxArrayTextureLayers = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TEXTURE_LOD_BIAS: {
            checkNotNull(ctx).mConstants.mMaxTextureLodBias = observer->read(value.as<GLfloat>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_CUBE_MAP_TEXTURE_SIZE: {
            checkNotNull(ctx).mConstants.mMaxCubeMapTextureSize = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_RENDERBUFFER_SIZE: {
            checkNotNull(ctx).mConstants.mMaxRenderbufferSize = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_ALIASED_POINT_SIZE_RANGE: {
            checkNotNull(ctx).mConstants.mAliasedPointSizeRange[0ULL] = observer->read(value.as<GLfloat>(), 0ULL);
            checkNotNull(ctx).mConstants.mAliasedPointSizeRange[1ULL] = observer->read(value.as<GLfloat>(), 1ULL);
            break;
        }
        case GLenum::GL_ALIASED_LINE_WIDTH_RANGE: {
            checkNotNull(ctx).mConstants.mAliasedLineWidthRange[0ULL] = observer->read(value.as<GLfloat>(), 0ULL);
            checkNotNull(ctx).mConstants.mAliasedLineWidthRange[1ULL] = observer->read(value.as<GLfloat>(), 1ULL);
            break;
        }
        case GLenum::GL_MULTISAMPLE_LINE_WIDTH_RANGE: {
            checkNotNull(ctx).mConstants.mMultisampleLineWidthRange[0ULL] = observer->read(value.as<GLfloat>(), 0ULL);
            checkNotNull(ctx).mConstants.mMultisampleLineWidthRange[1ULL] = observer->read(value.as<GLfloat>(), 1ULL);
            break;
        }
        case GLenum::GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY: {
            checkNotNull(ctx).mConstants.mMultisampleLineWidthGranularity = observer->read(value.as<GLfloat>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_DRAW_BUFFERS: {
            checkNotNull(ctx).mConstants.mMaxDrawBuffers = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAMEBUFFER_WIDTH: {
            checkNotNull(ctx).mConstants.mMaxFramebufferWidth = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAMEBUFFER_HEIGHT: {
            checkNotNull(ctx).mConstants.mMaxFramebufferHeight = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAMEBUFFER_LAYERS: {
            checkNotNull(ctx).mConstants.mMaxFramebufferLayers = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAMEBUFFER_SAMPLES: {
            checkNotNull(ctx).mConstants.mMaxFramebufferSamples = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COLOR_ATTACHMENTS: {
            checkNotNull(ctx).mConstants.mMaxColorAttachments = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MIN_FRAGMENT_INTERPOLATION_OFFSET: {
            checkNotNull(ctx).mConstants.mMinFragmentInterpolationOffset = observer->read(value.as<GLfloat>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_INTERPOLATION_OFFSET: {
            checkNotNull(ctx).mConstants.mMaxFragmentInterpolationOffset = observer->read(value.as<GLfloat>(), 0ULL);
            break;
        }
        case GLenum::GL_FRAGMENT_INTERPOLATION_OFFSET_BITS: {
            checkNotNull(ctx).mConstants.mFragmentInterpolationOffsetBits = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VIEWPORT_DIMS: {
            checkNotNull(ctx).mConstants.mMaxViewportDims[0ULL] = observer->read(value.as<GLint>(), 0ULL);
            checkNotNull(ctx).mConstants.mMaxViewportDims[1ULL] = observer->read(value.as<GLint>(), 1ULL);
            break;
        }
        case GLenum::GL_MAX_SAMPLE_MASK_WORDS: {
            checkNotNull(ctx).mConstants.mMaxSampleMaskWords = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COLOR_TEXTURE_SAMPLES: {
            checkNotNull(ctx).mConstants.mMaxColorTextureSamples = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_DEPTH_TEXTURE_SAMPLES: {
            checkNotNull(ctx).mConstants.mMaxDepthTextureSamples = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_INTEGER_SAMPLES: {
            checkNotNull(ctx).mConstants.mMaxIntegerSamples = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_SERVER_WAIT_TIMEOUT: {
            checkNotNull(ctx).mConstants.mMaxServerWaitTimeout = observer->read(value.as<GLint64>(), 0ULL);
            break;
        }
        case GLenum::GL_LAYER_PROVOKING_VERTEX: {
            checkNotNull(ctx).mConstants.mLayerProvokingVertex = observer->read(value.as<uint32_t>(), 0ULL);
            break;
        }
        case GLenum::GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED: {
            checkNotNull(ctx).mConstants.mPrimitiveRestartForPatchesSupported = observer->read(value.as<GLboolean>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET: {
            checkNotNull(ctx).mConstants.mMaxVertexAttribRelativeOffset = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATTRIB_BINDINGS: {
            checkNotNull(ctx).mConstants.mMaxVertexAttribBindings = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATTRIB_STRIDE: {
            checkNotNull(ctx).mConstants.mMaxVertexAttribStride = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_ELEMENTS_INDICES: {
            checkNotNull(ctx).mConstants.mMaxElementsIndices = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_ELEMENTS_VERTICES: {
            checkNotNull(ctx).mConstants.mMaxElementsVertices = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TEXTURE_BUFFER_SIZE: {
            checkNotNull(ctx).mConstants.mMaxTextureBufferSize = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_COMPRESSED_TEXTURE_FORMATS: {
            Slice<uint32_t> l_formats = value.as<uint32_t>();
            for (uint32_t l_i = 0UL; l_i < uint32_t((l_formats.count())); ++l_i) {
                checkNotNull(ctx).mConstants.mCompressedTextureFormats[l_i] = observer->read(l_formats, (uint64_t)(l_i));
            }
            break;
        }
        case GLenum::GL_PROGRAM_BINARY_FORMATS: {
            Slice<uint32_t> l_formats = value.as<uint32_t>();
            for (uint32_t l_i = 0UL; l_i < uint32_t((l_formats.count())); ++l_i) {
                checkNotNull(ctx).mConstants.mProgramBinaryFormats[l_i] = observer->read(l_formats, (uint64_t)(l_i));
            }
            break;
        }
        case GLenum::GL_SHADER_BINARY_FORMATS: {
            Slice<uint32_t> l_formats = value.as<uint32_t>();
            for (uint32_t l_i = 0UL; l_i < uint32_t((l_formats.count())); ++l_i) {
                checkNotNull(ctx).mConstants.mShaderBinaryFormats[l_i] = observer->read(l_formats, (uint64_t)(l_i));
            }
            break;
        }
        case GLenum::GL_SHADER_COMPILER: {
            checkNotNull(ctx).mConstants.mShaderCompiler = observer->read(value.as<GLboolean>(), 0ULL);
            break;
        }
        case GLenum::GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT: {
            checkNotNull(ctx).mConstants.mTextureBufferOffsetAlignment = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAJOR_VERSION: {
            checkNotNull(ctx).mConstants.mMajorVersion = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MINOR_VERSION: {
            checkNotNull(ctx).mConstants.mMinorVersion = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_CONTEXT_FLAGS: {
            checkNotNull(ctx).mConstants.mContextFlags = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATTRIBS: {
            checkNotNull(ctx).mConstants.mMaxVertexAttribs = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_UNIFORM_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxVertexUniformComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_UNIFORM_VECTORS: {
            checkNotNull(ctx).mConstants.mMaxVertexUniformVectors = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_UNIFORM_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxVertexUniformBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_OUTPUT_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxVertexOutputComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: {
            checkNotNull(ctx).mConstants.mMaxVertexTextureImageUnits = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS: {
            checkNotNull(ctx).mConstants.mMaxVertexAtomicCounterBuffers = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTERS: {
            checkNotNull(ctx).mConstants.mMaxVertexAtomicCounters = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxVertexShaderStorageBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_GEN_LEVEL: {
            checkNotNull(ctx).mConstants.mMaxTessGenLevel = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_PATCH_VERTICES: {
            checkNotNull(ctx).mConstants.mMaxPatchVertices = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxTessControlUniformComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS: {
            checkNotNull(ctx).mConstants.mMaxTessControlTextureImageUnits = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxTessControlOutputComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_PATCH_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxTessPatchComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxTessControlTotalOutputComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_INPUT_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxTessControlInputComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxTessControlUniformBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS: {
            checkNotNull(ctx).mConstants.mMaxTessControlAtomicCounterBuffers = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS: {
            checkNotNull(ctx).mConstants.mMaxTessControlAtomicCounters = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxTessControlShaderStorageBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxTessEvaluationUniformComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS: {
            checkNotNull(ctx).mConstants.mMaxTessEvaluationTextureImageUnits = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxTessEvaluationOutputComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxTessEvaluationInputComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxTessEvaluationUniformBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS: {
            checkNotNull(ctx).mConstants.mMaxTessEvaluationAtomicCounterBuffers = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS: {
            checkNotNull(ctx).mConstants.mMaxTessEvaluationAtomicCounters = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxTessEvaluationShaderStorageBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_UNIFORM_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxGeometryUniformComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_UNIFORM_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxGeometryUniformBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_INPUT_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxGeometryInputComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_OUTPUT_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxGeometryOutputComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_OUTPUT_VERTICES: {
            checkNotNull(ctx).mConstants.mMaxGeometryOutputVertices = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxGeometryTotalOutputComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS: {
            checkNotNull(ctx).mConstants.mMaxGeometryTextureImageUnits = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_SHADER_INVOCATIONS: {
            checkNotNull(ctx).mConstants.mMaxGeometryShaderInvocations = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS: {
            checkNotNull(ctx).mConstants.mMaxGeometryAtomicCounterBuffers = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_ATOMIC_COUNTERS: {
            checkNotNull(ctx).mConstants.mMaxGeometryAtomicCounters = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxGeometryShaderStorageBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxFragmentUniformComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_UNIFORM_VECTORS: {
            checkNotNull(ctx).mConstants.mMaxFragmentUniformVectors = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_UNIFORM_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxFragmentUniformBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_INPUT_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxFragmentInputComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TEXTURE_IMAGE_UNITS: {
            checkNotNull(ctx).mConstants.mMaxTextureImageUnits = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS: {
            checkNotNull(ctx).mConstants.mMaxFragmentAtomicCounterBuffers = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTERS: {
            checkNotNull(ctx).mConstants.mMaxFragmentAtomicCounters = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxFragmentShaderStorageBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET: {
            checkNotNull(ctx).mConstants.mMinProgramTextureGatherOffset = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET: {
            checkNotNull(ctx).mConstants.mMaxProgramTextureGatherOffset = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MIN_PROGRAM_TEXEL_OFFSET: {
            checkNotNull(ctx).mConstants.mMinProgramTexelOffset = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_PROGRAM_TEXEL_OFFSET: {
            checkNotNull(ctx).mConstants.mMaxProgramTexelOffset = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_WORK_GROUP_COUNT: {
            checkNotNull(ctx).mConstants.mMaxComputeWorkGroupCount[0ULL] = observer->read(value.as<GLint>(), 0ULL);
            checkNotNull(ctx).mConstants.mMaxComputeWorkGroupCount[1ULL] = observer->read(value.as<GLint>(), 1ULL);
            checkNotNull(ctx).mConstants.mMaxComputeWorkGroupCount[2ULL] = observer->read(value.as<GLint>(), 2ULL);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_WORK_GROUP_SIZE: {
            checkNotNull(ctx).mConstants.mMaxComputeWorkGroupSize[0ULL] = observer->read(value.as<GLint>(), 0ULL);
            checkNotNull(ctx).mConstants.mMaxComputeWorkGroupSize[1ULL] = observer->read(value.as<GLint>(), 1ULL);
            checkNotNull(ctx).mConstants.mMaxComputeWorkGroupSize[2ULL] = observer->read(value.as<GLint>(), 2ULL);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS: {
            checkNotNull(ctx).mConstants.mMaxComputeWorkGroupInvocations = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_UNIFORM_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxComputeUniformBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS: {
            checkNotNull(ctx).mConstants.mMaxComputeTextureImageUnits = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_SHARED_MEMORY_SIZE: {
            checkNotNull(ctx).mConstants.mMaxComputeSharedMemorySize = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_UNIFORM_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxComputeUniformComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS: {
            checkNotNull(ctx).mConstants.mMaxComputeAtomicCounterBuffers = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTERS: {
            checkNotNull(ctx).mConstants.mMaxComputeAtomicCounters = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxCombinedComputeUniformComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxComputeShaderStorageBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_UNIFORM_BUFFER_BINDINGS: {
            checkNotNull(ctx).mConstants.mMaxUniformBufferBindings = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_UNIFORM_BLOCK_SIZE: {
            checkNotNull(ctx).mConstants.mMaxUniformBlockSize = observer->read(value.as<GLint64>(), 0ULL);
            break;
        }
        case GLenum::GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: {
            checkNotNull(ctx).mConstants.mUniformBufferOffsetAlignment = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_UNIFORM_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxCombinedUniformBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxCombinedVertexUniformComponents = observer->read(value.as<GLint64>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxCombinedTessControlUniformComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxCombinedTessEvaluationUniformComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxCombinedGeometryUniformComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxCombinedFragmentUniformComponents = observer->read(value.as<GLint64>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VARYING_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxVaryingComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VARYING_VECTORS: {
            checkNotNull(ctx).mConstants.mMaxVaryingVectors = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: {
            checkNotNull(ctx).mConstants.mMaxCombinedTextureImageUnits = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES: {
            checkNotNull(ctx).mConstants.mMaxCombinedShaderOutputResources = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_UNIFORM_LOCATIONS: {
            checkNotNull(ctx).mConstants.mMaxUniformLocations = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS: {
            checkNotNull(ctx).mConstants.mMaxAtomicCounterBufferBindings = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE: {
            checkNotNull(ctx).mConstants.mMaxAtomicCounterBufferSize = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS: {
            checkNotNull(ctx).mConstants.mMaxCombinedAtomicCounterBuffers = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTERS: {
            checkNotNull(ctx).mConstants.mMaxCombinedAtomicCounters = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_IMAGE_UNITS: {
            checkNotNull(ctx).mConstants.mMaxImageUnits = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_VERTEX_IMAGE_UNIFORMS: {
            checkNotNull(ctx).mConstants.mMaxVertexImageUniforms = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS: {
            checkNotNull(ctx).mConstants.mMaxTessControlImageUniforms = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS: {
            checkNotNull(ctx).mConstants.mMaxTessEvaluationImageUniforms = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_IMAGE_UNIFORMS: {
            checkNotNull(ctx).mConstants.mMaxGeometryImageUniforms = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_IMAGE_UNIFORMS: {
            checkNotNull(ctx).mConstants.mMaxFragmentImageUniforms = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_IMAGE_UNIFORMS: {
            checkNotNull(ctx).mConstants.mMaxComputeImageUniforms = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_IMAGE_UNIFORMS: {
            checkNotNull(ctx).mConstants.mMaxCombinedImageUniforms = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS: {
            checkNotNull(ctx).mConstants.mMaxShaderStorageBufferBindings = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_SHADER_STORAGE_BLOCK_SIZE: {
            checkNotNull(ctx).mConstants.mMaxShaderStorageBlockSize = observer->read(value.as<GLint64>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS: {
            checkNotNull(ctx).mConstants.mMaxCombinedShaderStorageBlocks = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT: {
            checkNotNull(ctx).mConstants.mShaderStorageBufferOffsetAlignment = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_DEBUG_MESSAGE_LENGTH: {
            checkNotNull(ctx).mConstants.mMaxDebugMessageLength = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_DEBUG_LOGGED_MESSAGES: {
            checkNotNull(ctx).mConstants.mMaxDebugLoggedMessages = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_DEBUG_GROUP_STACK_DEPTH: {
            checkNotNull(ctx).mConstants.mMaxDebugGroupStackDepth = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_LABEL_LENGTH: {
            checkNotNull(ctx).mConstants.mMaxLabelLength = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxTransformFeedbackInterleavedComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: {
            checkNotNull(ctx).mConstants.mMaxTransformFeedbackSeparateAttribs = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: {
            checkNotNull(ctx).mConstants.mMaxTransformFeedbackSeparateComponents = observer->read(value.as<GLint>(), 0ULL);
            break;
        }
        case GLenum::GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: {
            checkNotNull(ctx).mConstants.mMaxTextureMaxAnisotropyExt = observer->read(value.as<GLfloat>(), 0ULL);
            break;
        }
        case GLenum::GL_LOW_FLOAT: // fall-through...
        case GLenum::GL_MEDIUM_FLOAT: // fall-through...
        case GLenum::GL_HIGH_FLOAT: // fall-through...
        case GLenum::GL_LOW_INT: // fall-through...
        case GLenum::GL_MEDIUM_INT: // fall-through...
        case GLenum::GL_HIGH_INT: {
            PrecisionFormat l_vsPrecisionFormat = PrecisionFormat(observer->read(value.as<GLint>(), 0ULL), observer->read(value.as<GLint>(), 1ULL), observer->read(value.as<GLint>(), 2ULL));
            PrecisionFormat l_fsPrecisionFormat = PrecisionFormat(observer->read(value.as<GLint>(), 3ULL), observer->read(value.as<GLint>(), 4ULL), observer->read(value.as<GLint>(), 5ULL));
            switch (name) {
                case GLenum::GL_LOW_FLOAT: {
                    checkNotNull(ctx).mConstants.mVertexShaderPrecisionFormat.mLowFloat = l_vsPrecisionFormat;
                    checkNotNull(ctx).mConstants.mFragmentShaderPrecisionFormat.mLowFloat = l_fsPrecisionFormat;
                    break;
                }
                case GLenum::GL_MEDIUM_FLOAT: {
                    checkNotNull(ctx).mConstants.mVertexShaderPrecisionFormat.mMediumFloat = l_vsPrecisionFormat;
                    checkNotNull(ctx).mConstants.mFragmentShaderPrecisionFormat.mMediumFloat = l_fsPrecisionFormat;
                    break;
                }
                case GLenum::GL_HIGH_FLOAT: {
                    checkNotNull(ctx).mConstants.mVertexShaderPrecisionFormat.mHighFloat = l_vsPrecisionFormat;
                    checkNotNull(ctx).mConstants.mFragmentShaderPrecisionFormat.mHighFloat = l_fsPrecisionFormat;
                    break;
                }
                case GLenum::GL_LOW_INT: {
                    checkNotNull(ctx).mConstants.mVertexShaderPrecisionFormat.mLowInt = l_vsPrecisionFormat;
                    checkNotNull(ctx).mConstants.mFragmentShaderPrecisionFormat.mLowInt = l_fsPrecisionFormat;
                    break;
                }
                case GLenum::GL_MEDIUM_INT: {
                    checkNotNull(ctx).mConstants.mVertexShaderPrecisionFormat.mMediumInt = l_vsPrecisionFormat;
                    checkNotNull(ctx).mConstants.mFragmentShaderPrecisionFormat.mMediumInt = l_fsPrecisionFormat;
                    break;
                }
                case GLenum::GL_HIGH_INT: {
                    checkNotNull(ctx).mConstants.mVertexShaderPrecisionFormat.mHighInt = l_vsPrecisionFormat;
                    checkNotNull(ctx).mConstants.mFragmentShaderPrecisionFormat.mHighInt = l_fsPrecisionFormat;
                    break;
                }
            }
            break;
        }
        default: {
        }
    }
    return;
}

void GlesSpy::subGetDebugMessageLog(CallObserver* observer, const std::function<void()>& call, GLuint count, GLsizei bufSize, uint32_t* sources, uint32_t* types, GLuint* ids, uint32_t* severities, GLsizei* lengths, GLchar* messageLog, GLuint gotCount) {
    (void)count;
    if ((sources) != (nullptr)) {
        observer->write(slice(sources, (uint64_t)((GLuint)(0UL)), (uint64_t)(gotCount)));
    }
    if ((types) != (nullptr)) {
        observer->write(slice(types, (uint64_t)((GLuint)(0UL)), (uint64_t)(gotCount)));
    }
    if ((ids) != (nullptr)) {
        observer->write(slice(ids, (uint64_t)((GLuint)(0UL)), (uint64_t)(gotCount)));
    }
    if ((severities) != (nullptr)) {
        observer->write(slice(severities, (uint64_t)((GLuint)(0UL)), (uint64_t)(gotCount)));
    }
    if ((lengths) != (nullptr)) {
        observer->write(slice(lengths, (uint64_t)((GLuint)(0UL)), (uint64_t)(gotCount)));
    }
    if ((gotCount) > ((GLuint)(0UL))) {
        observer->write(slice(messageLog, (uint64_t)((GLsizei)(0L)), (uint64_t)(bufSize)));
    }
    return;
}

void GlesSpy::subPushDebugGroup(CallObserver* observer, const std::function<void()>& call, uint32_t source, GLuint id, GLsizei length, GLchar* message) {
    switch (source) {
        case GLenum::GL_DEBUG_SOURCE_APPLICATION: // fall-through...
        case GLenum::GL_DEBUG_SOURCE_THIRD_PARTY: {
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, source);
        }
    }
    (void)id;
    subReadString(observer, call, length, message);
    return;
}

void GlesSpy::subDrawElementsBaseVertex(CallObserver* observer, const std::function<void()>& call, uint32_t draw_mode, GLsizei indices_count, uint32_t indices_type, IndicesPointer indices, GLint base_vertex) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subDrawElements(observer, call, l_ctx, draw_mode, indices_count, indices_type, indices, (GLsizei)(1L), base_vertex);
    return;
}

void GlesSpy::subDrawElementsInstanced(CallObserver* observer, const std::function<void()>& call, uint32_t draw_mode, GLsizei indices_count, uint32_t indices_type, IndicesPointer indices, GLsizei instance_count) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subDrawElements(observer, call, l_ctx, draw_mode, indices_count, indices_type, indices, instance_count, (GLint)(0L));
    return;
}

void GlesSpy::subPatchParameteri(CallObserver* observer, const std::function<void()>& call, uint32_t pname, GLint value) {
    if ((pname) != (GLenum::GL_PATCH_VERTICES)) {
        subGlErrorInvalidEnum(observer, call, pname);
    }
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    checkNotNull(l_ctx).mMiscellaneous.mPatchVertices = value;
    return;
}

void GlesSpy::subPrimitiveBoundingBox(CallObserver* observer, const std::function<void()>& call, GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    checkNotNull(l_ctx).mRasterization.mPrimitiveBoundingBox.mMin = {minX, minY, minZ, minW};
    checkNotNull(l_ctx).mRasterization.mPrimitiveBoundingBox.mMax = {maxX, maxY, maxZ, maxW};
    return;
}

void GlesSpy::subApplyProgramInfoExtra(CallObserver* observer, const std::function<void()>& call, ProgramId programId, std::shared_ptr<ProgramInfo> info) {
    if ((info) != (std::shared_ptr<ProgramInfo>())) {
        std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
        std::shared_ptr<Program> l_program = findOrZero(checkNotNull(l_ctx).mInstances.mPrograms, programId);
        checkNotNull(l_program).mLinkStatus = checkNotNull(info).mLinkStatus;
        checkNotNull(l_program).mInfoLog = checkNotNull(info).mInfoLog;
        checkNotNull(l_program).mActiveAttributes = AttributeIndexToActiveAttribute();
        checkNotNull(l_program).mActiveUniforms = UniformIndexToActiveUniform();
        checkNotNull(l_program).mUniforms = UniformLocationToUniform();
        for (AttributeIndex l_i = (AttributeIndex)(0UL); l_i < (AttributeIndex)(uint32_t((checkNotNull(info).mActiveAttributes.size()))); ++l_i) {
            checkNotNull(l_program).mActiveAttributes[l_i] = findOrZero(checkNotNull(info).mActiveAttributes, l_i);
        }
        for (UniformIndex l_i = (UniformIndex)(0UL); l_i < (UniformIndex)(uint32_t((checkNotNull(info).mActiveUniforms.size()))); ++l_i) {
            ActiveUniform l_u = findOrZero(checkNotNull(info).mActiveUniforms, l_i);
            checkNotNull(l_program).mActiveUniforms[l_i] = l_u;
            for (UniformLocation l_j = (UniformLocation)(0L); l_j < (UniformLocation)(l_u.mArraySize); ++l_j) {
                checkNotNull(l_program).mUniforms[(l_u.mLocation) + (l_j)] = Uniform(make<uint8_t>(0ULL), l_u.mType);
            }
        }
    }
    return;
}

void GlesSpy::subBlendBarrier(CallObserver* observer, const std::function<void()>& call) {
    return;
}

void GlesSpy::subBlendEquationi(CallObserver* observer, const std::function<void()>& call, DrawBufferIndex buf, uint32_t mode) {
    subSetBlendEquation(observer, call, buf, 1L, mode, mode);
    return;
}

void GlesSpy::subBlendFunci(CallObserver* observer, const std::function<void()>& call, DrawBufferIndex buf, uint32_t src, uint32_t dst) {
    subSetBlendFunc(observer, call, buf, 1L, src, dst, src, dst);
    return;
}

void GlesSpy::subStencilOpSeparate(CallObserver* observer, const std::function<void()>& call, uint32_t face, uint32_t fail, uint32_t pass_depth_fail, uint32_t pass_depth_pass) {
    switch (face) {
        case GLenum::GL_BACK: // fall-through...
        case GLenum::GL_FRONT: // fall-through...
        case GLenum::GL_FRONT_AND_BACK: {
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, face);
        }
    }
    subCheckStencilOp(observer, call, fail);
    subCheckStencilOp(observer, call, pass_depth_fail);
    subCheckStencilOp(observer, call, pass_depth_pass);
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    if (((face) == (GLenum::GL_FRONT)) || ((face) == (GLenum::GL_FRONT_AND_BACK))) {
        checkNotNull(l_ctx).mFragmentOperations.mStencil.mFail = fail;
        checkNotNull(l_ctx).mFragmentOperations.mStencil.mPassDepthFail = pass_depth_fail;
        checkNotNull(l_ctx).mFragmentOperations.mStencil.mPassDepthPass = pass_depth_pass;
    }
    if (((face) == (GLenum::GL_BACK)) || ((face) == (GLenum::GL_FRONT_AND_BACK))) {
        checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackFail = fail;
        checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackPassDepthFail = pass_depth_fail;
        checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackPassDepthPass = pass_depth_pass;
    }
    return;
}

std::shared_ptr<Framebuffer> GlesSpy::subGetBoundFramebufferOrErrorInvalidEnum(CallObserver* observer, const std::function<void()>& call, uint32_t framebuffer_target) {
    switch (framebuffer_target) {
        case GLenum::GL_FRAMEBUFFER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            break;
        }
        case GLenum::GL_DRAW_FRAMEBUFFER: // fall-through...
        case GLenum::GL_READ_FRAMEBUFFER: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, framebuffer_target);
        }
    }
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    FramebufferId l_framebufferId = /* switch(framebuffer_target) */
        /* case GLenum::GL_FRAMEBUFFER: */(((framebuffer_target) == (GLenum::GL_FRAMEBUFFER))) ? (findOrZero(checkNotNull(l_ctx).mBoundFramebuffers, GLenum::GL_DRAW_FRAMEBUFFER)) :
        /* case GLenum::GL_DRAW_FRAMEBUFFER: */(((framebuffer_target) == (GLenum::GL_DRAW_FRAMEBUFFER))) ? (findOrZero(checkNotNull(l_ctx).mBoundFramebuffers, GLenum::GL_DRAW_FRAMEBUFFER)) :
        /* case GLenum::GL_READ_FRAMEBUFFER: */(((framebuffer_target) == (GLenum::GL_READ_FRAMEBUFFER))) ? (findOrZero(checkNotNull(l_ctx).mBoundFramebuffers, GLenum::GL_READ_FRAMEBUFFER)) :
        /* default: */ 0;
    return findOrZero(checkNotNull(l_ctx).mInstances.mFramebuffers, l_framebufferId);
}

bool GlesSpy::subIsDefaultFramebuffer(CallObserver* observer, const std::function<void()>& call, std::shared_ptr<Framebuffer> framebuffer) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    return (framebuffer) == (findOrZero(checkNotNull(l_ctx).mInstances.mFramebuffers, (FramebufferId)(0UL)));
}

void GlesSpy::subSetFramebufferAttachment(CallObserver* observer, const std::function<void()>& call, uint32_t framebuffer_target, uint32_t framebuffer_attachment, FramebufferAttachment attachment) {
    std::shared_ptr<Framebuffer> l_framebuffer = subGetBoundFramebufferOrErrorInvalidEnum(observer, call, framebuffer_target);
    bool l__res_0 = subIsDefaultFramebuffer(observer, call, l_framebuffer);
    if (l__res_0) {
        subGlErrorInvalidOperation(observer, call);
    }
    if ((framebuffer_attachment) == (GLenum::GL_DEPTH_STENCIL_ATTACHMENT)) {
        checkNotNull(l_framebuffer).mAttachments[GLenum::GL_DEPTH_ATTACHMENT] = attachment;
        checkNotNull(l_framebuffer).mAttachments[GLenum::GL_STENCIL_ATTACHMENT] = attachment;
    } else {
        checkNotNull(l_framebuffer).mAttachments[framebuffer_attachment] = attachment;
    }
    return;
}

void GlesSpy::subBlitFramebuffer(CallObserver* observer, const std::function<void()>& call, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, uint32_t mask, uint32_t filter) {
    subSupportsBits(observer, call, mask, (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;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, filter);
        }
    }
    (void)srcX0;
    (void)srcY0;
    (void)srcX1;
    (void)srcY1;
    (void)dstX0;
    (void)dstY0;
    (void)dstX1;
    (void)dstY1;
    return;
}

void GlesSpy::subColorMaski(CallObserver* observer, const std::function<void()>& call, DrawBufferIndex index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    checkNotNull(l_ctx).mFramebuffer.mColorWritemask[index] = {r, g, b, a};
    return;
}

void GlesSpy::subFramebufferTexture(CallObserver* observer, const std::function<void()>& call, uint32_t target, uint32_t attachment, TextureId texture, GLint level) {
    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;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, attachment);
        }
    }
    FramebufferAttachment l_attachment_info = FramebufferAttachment(GLenum::GL_NONE, (GLuint)(0UL), (GLint)(0L), GLenum::GL_NONE, (GLint)(0L), GLbooleanLabels::GL_FALSE);
    if ((texture) != ((TextureId)(0UL))) {
        l_attachment_info.mObjectType = GLenum::GL_TEXTURE;
        l_attachment_info.mObjectName = (GLuint)(texture);
        l_attachment_info.mTextureLevel = level;
        l_attachment_info.mLayered = (GLboolean)(0U);
    }
    subSetFramebufferAttachment(observer, call, target, attachment, l_attachment_info);
    return;
}

void GlesSpy::subFramebufferTexture2D(CallObserver* observer, const std::function<void()>& call, uint32_t framebuffer_target, uint32_t framebuffer_attachment, uint32_t texture_target, TextureId texture, GLint level) {
    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: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, framebuffer_attachment);
        }
    }
    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: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, texture_target);
        }
    }
    if ((level) != ((GLint)(0L))) {
        subGlErrorInvalidValue(observer, call);
    }
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    FramebufferAttachment l_attachment = FramebufferAttachment(GLenum::GL_NONE, (GLuint)(0UL), (GLint)(0L), GLenum::GL_NONE, (GLint)(0L), GLbooleanLabels::GL_FALSE);
    if ((texture) != ((TextureId)(0UL))) {
        if (!(checkNotNull(l_ctx).mInstances.mTextures.count(texture) > 0)) {
            subGlErrorInvalidOperation(observer, call);
        }
        uint32_t l_kind = /* switch(texture_target) */
            /* case GLenum::GL_TEXTURE_2D: */(((texture_target) == (GLenum::GL_TEXTURE_2D))) ? (GLenum::GL_TEXTURE_2D) :
            /* case GLenum::GL_TEXTURE_2D_MULTISAMPLE: */(((texture_target) == (GLenum::GL_TEXTURE_2D_MULTISAMPLE))) ? (GLenum::GL_TEXTURE_2D_MULTISAMPLE) :
            /* case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X, GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z: */(((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X))|| ((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y))|| ((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z))|| ((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X))|| ((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y))|| ((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z))) ? (GLenum::GL_TEXTURE_CUBE_MAP) :
            /* default: */ (uint32_t)(0L);
        if ((checkNotNull(findOrZero(checkNotNull(l_ctx).mInstances.mTextures, texture)).mKind) != (l_kind)) {
            subGlErrorInvalidOperation(observer, call);
        }
        l_attachment.mObjectType = GLenum::GL_TEXTURE;
        l_attachment.mObjectName = (GLuint)(texture);
        l_attachment.mTextureLevel = level;
        l_attachment.mTextureCubeMapFace = /* switch(texture_target) */
            /* case GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X, GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z: */(((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X))|| ((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y))|| ((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z))|| ((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X))|| ((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y))|| ((texture_target) == (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z))) ? (texture_target) :
            /* default: */ GLenum::GL_NONE;
    }
    subSetFramebufferAttachment(observer, call, framebuffer_target, framebuffer_attachment, l_attachment);
    return;
}

void GlesSpy::subInvalidateFramebuffer(CallObserver* observer, const std::function<void()>& call, uint32_t target, GLsizei count, uint32_t* attachments) {
    std::shared_ptr<Framebuffer> l_framebuffer = subGetBoundFramebufferOrErrorInvalidEnum(observer, call, target);
    Slice<uint32_t> l_a = slice(attachments, (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    bool l__res_0 = subIsDefaultFramebuffer(observer, call, l_framebuffer);
    if (l__res_0) {
        for (GLsizei l_i = (GLsizei)(0L); l_i < count; ++l_i) {
            switch (observer->read(l_a, (uint64_t)(l_i))) {
                case GLenum::GL_COLOR: // fall-through...
                case GLenum::GL_DEPTH: // fall-through...
                case GLenum::GL_STENCIL: {
                    break;
                }
                default: {
                    subGlErrorInvalidEnum(observer, call, observer->read(l_a, (uint64_t)(l_i)));
                }
            }
        }
    } else {
        for (GLsizei l_i = (GLsizei)(0L); l_i < count; ++l_i) {
            switch (observer->read(l_a, (uint64_t)(l_i))) {
                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;
                }
                default: {
                    subGlErrorInvalidEnum(observer, call, observer->read(l_a, (uint64_t)(l_i)));
                }
            }
        }
    }
    return;
}

void GlesSpy::subRenderbufferStorageMultisample(CallObserver* observer, const std::function<void()>& call, uint32_t target, GLsizei samples, uint32_t internalformat, GLsizei width, GLsizei height) {
    switch (target) {
        case GLenum::GL_RENDERBUFFER: {
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, target);
        }
    }
    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_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;
        }
        case GLenum::GL_R16: // fall-through...
        case GLenum::GL_RG16: // fall-through...
        case GLenum::GL_RGBA16: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_norm16);
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, internalformat);
        }
    }
    (void)samples;
    (void)width;
    (void)height;
    return;
}

uint32_t GlesSpy::subImageSize(CallObserver* observer, const std::function<void()>& call, uint32_t width, uint32_t height, uint32_t format, uint32_t ty) {
    uint32_t l_ups = subUncompressedPixelSize(observer, call, format, ty);
    return /* switch(ty) */
        /* case GLenum::GL_COMPRESSED_R11_EAC, GLenum::GL_COMPRESSED_SIGNED_R11_EAC, GLenum::GL_COMPRESSED_RGB8_ETC2, GLenum::GL_COMPRESSED_SRGB8_ETC2, GLenum::GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GLenum::GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: */(((ty) == (GLenum::GL_COMPRESSED_R11_EAC))|| ((ty) == (GLenum::GL_COMPRESSED_SIGNED_R11_EAC))|| ((ty) == (GLenum::GL_COMPRESSED_RGB8_ETC2))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ETC2))|| ((ty) == (GLenum::GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2))) ? ((((width) + (3UL)) / (4UL)) * ((((height) + (3UL)) / (4UL)) * (8UL))) :
        /* case GLenum::GL_COMPRESSED_RG11_EAC, GLenum::GL_COMPRESSED_SIGNED_RG11_EAC, GLenum::GL_COMPRESSED_RGBA8_ETC2_EAC, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GLenum::GL_COMPRESSED_RGBA_ASTC_4x4, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4: */(((ty) == (GLenum::GL_COMPRESSED_RG11_EAC))|| ((ty) == (GLenum::GL_COMPRESSED_SIGNED_RG11_EAC))|| ((ty) == (GLenum::GL_COMPRESSED_RGBA8_ETC2_EAC))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC))|| ((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_4x4))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4))) ? ((((width) + (3UL)) / (4UL)) * ((((height) + (3UL)) / (4UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_5x4, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_5x4))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4))) ? ((((width) + (4UL)) / (5UL)) * ((((height) + (3UL)) / (4UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_5x5, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_5x5))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5))) ? ((((width) + (4UL)) / (5UL)) * ((((height) + (4UL)) / (5UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_6x5, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_6x5))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5))) ? ((((width) + (5UL)) / (6UL)) * ((((height) + (4UL)) / (5UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_6x6, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_6x6))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6))) ? ((((width) + (5UL)) / (6UL)) * ((((height) + (5UL)) / (6UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_8x5, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_8x5))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5))) ? ((((width) + (7UL)) / (8UL)) * ((((height) + (4UL)) / (5UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_8x6, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_8x6))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6))) ? ((((width) + (7UL)) / (8UL)) * ((((height) + (5UL)) / (6UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_8x8, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_8x8))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8))) ? ((((width) + (7UL)) / (8UL)) * ((((height) + (7UL)) / (8UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_10x5, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_10x5))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5))) ? ((((width) + (9UL)) / (10UL)) * ((((height) + (4UL)) / (5UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_10x6, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_10x6))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6))) ? ((((width) + (9UL)) / (10UL)) * ((((height) + (5UL)) / (6UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_10x8, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_10x8))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8))) ? ((((width) + (9UL)) / (10UL)) * ((((height) + (7UL)) / (8UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_10x10, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_10x10))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10))) ? ((((width) + (9UL)) / (10UL)) * ((((height) + (9UL)) / (10UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_12x10, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_12x10))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10))) ? ((((width) + (11UL)) / (12UL)) * ((((height) + (9UL)) / (10UL)) * (16UL))) :
        /* case GLenum::GL_COMPRESSED_RGBA_ASTC_12x12, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12: */(((ty) == (GLenum::GL_COMPRESSED_RGBA_ASTC_12x12))|| ((ty) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12))) ? ((((width) + (11UL)) / (12UL)) * ((((height) + (11UL)) / (12UL)) * (16UL))) :
        /* case GLenum::GL_ETC1_RGB8_OES: */(((ty) == (GLenum::GL_ETC1_RGB8_OES))) ? ((((width) + (3UL)) / (4UL)) * ((((height) + (3UL)) / (4UL)) * (8UL))) :
        /* default: */ (width) * ((height) * (l_ups));
}

uint32_t GlesSpy::subComponentCount(CallObserver* observer, const std::function<void()>& call, uint32_t format) {
    return /* switch(format) */
        /* case GLenum::GL_ALPHA: */(((format) == (GLenum::GL_ALPHA))) ? (1UL) :
        /* case GLenum::GL_LUMINANCE: */(((format) == (GLenum::GL_LUMINANCE))) ? (1UL) :
        /* case GLenum::GL_LUMINANCE_ALPHA: */(((format) == (GLenum::GL_LUMINANCE_ALPHA))) ? (2UL) :
        /* case GLenum::GL_RED: */(((format) == (GLenum::GL_RED))) ? (1UL) :
        /* case GLenum::GL_RED_INTEGER: */(((format) == (GLenum::GL_RED_INTEGER))) ? (1UL) :
        /* case GLenum::GL_RG: */(((format) == (GLenum::GL_RG))) ? (2UL) :
        /* case GLenum::GL_RG_INTEGER: */(((format) == (GLenum::GL_RG_INTEGER))) ? (2UL) :
        /* case GLenum::GL_RGB: */(((format) == (GLenum::GL_RGB))) ? (3UL) :
        /* case GLenum::GL_RGB_INTEGER: */(((format) == (GLenum::GL_RGB_INTEGER))) ? (3UL) :
        /* case GLenum::GL_RGBA: */(((format) == (GLenum::GL_RGBA))) ? (4UL) :
        /* case GLenum::GL_RGBA_INTEGER: */(((format) == (GLenum::GL_RGBA_INTEGER))) ? (4UL) :
        /* case GLenum::GL_DEPTH_COMPONENT: */(((format) == (GLenum::GL_DEPTH_COMPONENT))) ? (1UL) :
        /* case GLenum::GL_DEPTH_STENCIL: */(((format) == (GLenum::GL_DEPTH_STENCIL))) ? (2UL) :
        /* case GLenum::GL_STENCIL_INDEX: */(((format) == (GLenum::GL_STENCIL_INDEX))) ? (1UL) :
        /* case GLenum::GL_BGRA_EXT: */(((format) == (GLenum::GL_BGRA_EXT))) ? (4UL) :
        /* default: */ 0;
}

uint32_t GlesSpy::subImageFormat(CallObserver* observer, const std::function<void()>& call, uint32_t internalFormat) {
    return /* switch(internalFormat) */
        /* case GLenum::GL_ALPHA8_EXT: */(((internalFormat) == (GLenum::GL_ALPHA8_EXT))) ? (GLenum::GL_ALPHA) :
        /* case GLenum::GL_R8, GLenum::GL_R8_SNORM, GLenum::GL_R16, GLenum::GL_R16_SNORM, GLenum::GL_R16F, GLenum::GL_R32F, GLenum::GL_COMPRESSED_R11_EAC, GLenum::GL_COMPRESSED_SIGNED_R11_EAC: */(((internalFormat) == (GLenum::GL_R8))|| ((internalFormat) == (GLenum::GL_R8_SNORM))|| ((internalFormat) == (GLenum::GL_R16))|| ((internalFormat) == (GLenum::GL_R16_SNORM))|| ((internalFormat) == (GLenum::GL_R16F))|| ((internalFormat) == (GLenum::GL_R32F))|| ((internalFormat) == (GLenum::GL_COMPRESSED_R11_EAC))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SIGNED_R11_EAC))) ? (GLenum::GL_RED) :
        /* case GLenum::GL_R8UI, GLenum::GL_R8I, GLenum::GL_R16UI, GLenum::GL_R16I, GLenum::GL_R32UI, GLenum::GL_R32I: */(((internalFormat) == (GLenum::GL_R8UI))|| ((internalFormat) == (GLenum::GL_R8I))|| ((internalFormat) == (GLenum::GL_R16UI))|| ((internalFormat) == (GLenum::GL_R16I))|| ((internalFormat) == (GLenum::GL_R32UI))|| ((internalFormat) == (GLenum::GL_R32I))) ? (GLenum::GL_RED_INTEGER) :
        /* case GLenum::GL_RG8, GLenum::GL_RG8_SNORM, GLenum::GL_RG16, GLenum::GL_RG16_SNORM, GLenum::GL_RG16F, GLenum::GL_RG32F, GLenum::GL_COMPRESSED_RG11_EAC, GLenum::GL_COMPRESSED_SIGNED_RG11_EAC: */(((internalFormat) == (GLenum::GL_RG8))|| ((internalFormat) == (GLenum::GL_RG8_SNORM))|| ((internalFormat) == (GLenum::GL_RG16))|| ((internalFormat) == (GLenum::GL_RG16_SNORM))|| ((internalFormat) == (GLenum::GL_RG16F))|| ((internalFormat) == (GLenum::GL_RG32F))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RG11_EAC))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SIGNED_RG11_EAC))) ? (GLenum::GL_RG) :
        /* case GLenum::GL_RG8UI, GLenum::GL_RG8I, GLenum::GL_RG16UI, GLenum::GL_RG16I, GLenum::GL_RG32UI, GLenum::GL_RG32I: */(((internalFormat) == (GLenum::GL_RG8UI))|| ((internalFormat) == (GLenum::GL_RG8I))|| ((internalFormat) == (GLenum::GL_RG16UI))|| ((internalFormat) == (GLenum::GL_RG16I))|| ((internalFormat) == (GLenum::GL_RG32UI))|| ((internalFormat) == (GLenum::GL_RG32I))) ? (GLenum::GL_RG_INTEGER) :
        /* case GLenum::GL_RGB8, GLenum::GL_SRGB8, GLenum::GL_RGB8_SNORM, GLenum::GL_RGB16, GLenum::GL_RGB16_SNORM, GLenum::GL_RGB565, GLenum::GL_R11F_G11F_B10F, GLenum::GL_RGB9_E5, GLenum::GL_RGB16F, GLenum::GL_RGB32F, GLenum::GL_COMPRESSED_RGB8_ETC2, GLenum::GL_COMPRESSED_SRGB8_ETC2, GLenum::GL_ETC1_RGB8_OES: */(((internalFormat) == (GLenum::GL_RGB8))|| ((internalFormat) == (GLenum::GL_SRGB8))|| ((internalFormat) == (GLenum::GL_RGB8_SNORM))|| ((internalFormat) == (GLenum::GL_RGB16))|| ((internalFormat) == (GLenum::GL_RGB16_SNORM))|| ((internalFormat) == (GLenum::GL_RGB565))|| ((internalFormat) == (GLenum::GL_R11F_G11F_B10F))|| ((internalFormat) == (GLenum::GL_RGB9_E5))|| ((internalFormat) == (GLenum::GL_RGB16F))|| ((internalFormat) == (GLenum::GL_RGB32F))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGB8_ETC2))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ETC2))|| ((internalFormat) == (GLenum::GL_ETC1_RGB8_OES))) ? (GLenum::GL_RGB) :
        /* case GLenum::GL_RGB8UI, GLenum::GL_RGB8I, GLenum::GL_RGB16UI, GLenum::GL_RGB16I, GLenum::GL_RGB32UI, GLenum::GL_RGB32I: */(((internalFormat) == (GLenum::GL_RGB8UI))|| ((internalFormat) == (GLenum::GL_RGB8I))|| ((internalFormat) == (GLenum::GL_RGB16UI))|| ((internalFormat) == (GLenum::GL_RGB16I))|| ((internalFormat) == (GLenum::GL_RGB32UI))|| ((internalFormat) == (GLenum::GL_RGB32I))) ? (GLenum::GL_RGB_INTEGER) :
        /* case GLenum::GL_RGBA8, GLenum::GL_SRGB8_ALPHA8, GLenum::GL_RGBA8_SNORM, GLenum::GL_RGBA16, GLenum::GL_RGBA16_SNORM, GLenum::GL_RGB5_A1, GLenum::GL_RGBA4, GLenum::GL_RGB10_A2, GLenum::GL_RGBA16F, GLenum::GL_RGBA32F, GLenum::GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GLenum::GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GLenum::GL_COMPRESSED_RGBA8_ETC2_EAC, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GLenum::GL_COMPRESSED_RGBA_ASTC_4x4, GLenum::GL_COMPRESSED_RGBA_ASTC_5x4, GLenum::GL_COMPRESSED_RGBA_ASTC_5x5, GLenum::GL_COMPRESSED_RGBA_ASTC_6x5, GLenum::GL_COMPRESSED_RGBA_ASTC_6x6, GLenum::GL_COMPRESSED_RGBA_ASTC_8x5, GLenum::GL_COMPRESSED_RGBA_ASTC_8x6, GLenum::GL_COMPRESSED_RGBA_ASTC_8x8, GLenum::GL_COMPRESSED_RGBA_ASTC_10x5, GLenum::GL_COMPRESSED_RGBA_ASTC_10x6, GLenum::GL_COMPRESSED_RGBA_ASTC_10x8, GLenum::GL_COMPRESSED_RGBA_ASTC_10x10, GLenum::GL_COMPRESSED_RGBA_ASTC_12x10, GLenum::GL_COMPRESSED_RGBA_ASTC_12x12, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10, GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12: */(((internalFormat) == (GLenum::GL_RGBA8))|| ((internalFormat) == (GLenum::GL_SRGB8_ALPHA8))|| ((internalFormat) == (GLenum::GL_RGBA8_SNORM))|| ((internalFormat) == (GLenum::GL_RGBA16))|| ((internalFormat) == (GLenum::GL_RGBA16_SNORM))|| ((internalFormat) == (GLenum::GL_RGB5_A1))|| ((internalFormat) == (GLenum::GL_RGBA4))|| ((internalFormat) == (GLenum::GL_RGB10_A2))|| ((internalFormat) == (GLenum::GL_RGBA16F))|| ((internalFormat) == (GLenum::GL_RGBA32F))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA8_ETC2_EAC))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_4x4))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_5x4))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_5x5))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_6x5))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_6x6))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_8x5))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_8x6))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_8x8))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_10x5))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_10x6))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_10x8))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_10x10))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_12x10))|| ((internalFormat) == (GLenum::GL_COMPRESSED_RGBA_ASTC_12x12))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10))|| ((internalFormat) == (GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12))) ? (GLenum::GL_RGBA) :
        /* case GLenum::GL_RGBA8UI, GLenum::GL_RGBA8I, GLenum::GL_RGB10_A2UI, GLenum::GL_RGBA16UI, GLenum::GL_RGBA16I, GLenum::GL_RGBA32I, GLenum::GL_RGBA32UI: */(((internalFormat) == (GLenum::GL_RGBA8UI))|| ((internalFormat) == (GLenum::GL_RGBA8I))|| ((internalFormat) == (GLenum::GL_RGB10_A2UI))|| ((internalFormat) == (GLenum::GL_RGBA16UI))|| ((internalFormat) == (GLenum::GL_RGBA16I))|| ((internalFormat) == (GLenum::GL_RGBA32I))|| ((internalFormat) == (GLenum::GL_RGBA32UI))) ? (GLenum::GL_RGBA_INTEGER) :
        /* case GLenum::GL_DEPTH_COMPONENT16, GLenum::GL_DEPTH_COMPONENT24, GLenum::GL_DEPTH_COMPONENT32F: */(((internalFormat) == (GLenum::GL_DEPTH_COMPONENT16))|| ((internalFormat) == (GLenum::GL_DEPTH_COMPONENT24))|| ((internalFormat) == (GLenum::GL_DEPTH_COMPONENT32F))) ? (GLenum::GL_DEPTH_COMPONENT) :
        /* case GLenum::GL_DEPTH24_STENCIL8, GLenum::GL_DEPTH32F_STENCIL8: */(((internalFormat) == (GLenum::GL_DEPTH24_STENCIL8))|| ((internalFormat) == (GLenum::GL_DEPTH32F_STENCIL8))) ? (GLenum::GL_DEPTH_STENCIL) :
        /* default: */ internalFormat;
}

void GlesSpy::subSetCapability(CallObserver* observer, const std::function<void()>& call, uint32_t capability, bool isIndexed, GLuint index, GLboolean enabled) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    switch (capability) {
        case GLenum::GL_BLEND: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            if (isIndexed) {
                BlendState l_blend = findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, (DrawBufferIndex)(index));
                l_blend.mEnabled = enabled;
                checkNotNull(l_ctx).mFragmentOperations.mBlend[(DrawBufferIndex)(index)] = l_blend;
            } else {
                for (DrawBufferIndex l_i = (DrawBufferIndex)(0UL); l_i < (DrawBufferIndex)(uint32_t((checkNotNull(l_ctx).mFragmentOperations.mBlend.size()))); ++l_i) {
                    BlendState l_blend = findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i);
                    l_blend.mEnabled = enabled;
                    checkNotNull(l_ctx).mFragmentOperations.mBlend[l_i] = l_blend;
                }
            }
            break;
        }
        case GLenum::GL_CULL_FACE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            checkNotNull(l_ctx).mRasterization.mCullFace = enabled;
            break;
        }
        case GLenum::GL_DEPTH_TEST: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            checkNotNull(l_ctx).mFragmentOperations.mDepth.mTest = enabled;
            break;
        }
        case GLenum::GL_DITHER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            checkNotNull(l_ctx).mFragmentOperations.mDither = enabled;
            break;
        }
        case GLenum::GL_POLYGON_OFFSET_FILL: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            checkNotNull(l_ctx).mRasterization.mPolygonOffsetFill = enabled;
            break;
        }
        case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            checkNotNull(l_ctx).mRasterization.mSampleAlphaToCoverage = enabled;
            break;
        }
        case GLenum::GL_SAMPLE_COVERAGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            checkNotNull(l_ctx).mRasterization.mSampleCoverage = enabled;
            break;
        }
        case GLenum::GL_SCISSOR_TEST: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            checkNotNull(l_ctx).mFragmentOperations.mScissor.mTest = enabled;
            break;
        }
        case GLenum::GL_STENCIL_TEST: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            checkNotNull(l_ctx).mFragmentOperations.mStencil.mTest = enabled;
            break;
        }
        case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            checkNotNull(l_ctx).mMiscellaneous.mPrimitiveRestartFixedIndex = enabled;
            break;
        }
        case GLenum::GL_RASTERIZER_DISCARD: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            checkNotNull(l_ctx).mRasterization.mRasterizerDiscard = enabled;
            break;
        }
        case GLenum::GL_SAMPLE_MASK: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            checkNotNull(l_ctx).mRasterization.mSampleMask = enabled;
            break;
        }
        case GLenum::GL_DEBUG_OUTPUT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            checkNotNull(l_ctx).mDebug.mOutput = enabled;
            break;
        }
        case GLenum::GL_DEBUG_OUTPUT_SYNCHRONOUS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            checkNotNull(l_ctx).mDebug.mOutputSynchronous = enabled;
            break;
        }
        case GLenum::GL_ALPHA_TEST_QCOM: {
            subRequiresExtension(observer, call, ExtensionId::GL_QCOM_alpha_test);
            break;
        }
        case GLenum::GL_FRAMEBUFFER_SRGB_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_sRGB_write_control);
            checkNotNull(l_ctx).mFragmentOperations.mFramebufferSrgb = enabled;
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, capability);
        }
    }
    return;
}

GLboolean GlesSpy::subGetCapability(CallObserver* observer, const std::function<void()>& call, uint32_t capability, GLuint index) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    switch (capability) {
        case GLenum::GL_BLEND: {
            break;
        }
        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: {
            if ((index) > ((GLuint)(0UL))) {
                subGlErrorInvalidValue(observer, call);
            }
            break;
        }
        case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX: // fall-through...
        case GLenum::GL_RASTERIZER_DISCARD: {
            if ((index) > ((GLuint)(0UL))) {
                subGlErrorInvalidValue(observer, call);
            }
            break;
        }
        case GLenum::GL_SAMPLE_MASK: {
            if ((index) > ((GLuint)(0UL))) {
                subGlErrorInvalidValue(observer, call);
            }
            break;
        }
        case GLenum::GL_DEBUG_OUTPUT: // fall-through...
        case GLenum::GL_DEBUG_OUTPUT_SYNCHRONOUS: {
            if ((index) > ((GLuint)(0UL))) {
                subGlErrorInvalidValue(observer, call);
            }
            break;
        }
        default: {
        }
    }
    return /* switch(capability) */
        /* case GLenum::GL_BLEND: */(((capability) == (GLenum::GL_BLEND))) ? (findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, (DrawBufferIndex)(index)).mEnabled) :
        /* case GLenum::GL_CULL_FACE: */(((capability) == (GLenum::GL_CULL_FACE))) ? (checkNotNull(l_ctx).mRasterization.mCullFace) :
        /* case GLenum::GL_DEPTH_TEST: */(((capability) == (GLenum::GL_DEPTH_TEST))) ? (checkNotNull(l_ctx).mFragmentOperations.mDepth.mTest) :
        /* case GLenum::GL_DITHER: */(((capability) == (GLenum::GL_DITHER))) ? (checkNotNull(l_ctx).mFragmentOperations.mDither) :
        /* case GLenum::GL_POLYGON_OFFSET_FILL: */(((capability) == (GLenum::GL_POLYGON_OFFSET_FILL))) ? (checkNotNull(l_ctx).mRasterization.mPolygonOffsetFill) :
        /* case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE: */(((capability) == (GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE))) ? (checkNotNull(l_ctx).mRasterization.mSampleAlphaToCoverage) :
        /* case GLenum::GL_SAMPLE_COVERAGE: */(((capability) == (GLenum::GL_SAMPLE_COVERAGE))) ? (checkNotNull(l_ctx).mRasterization.mSampleCoverage) :
        /* case GLenum::GL_SCISSOR_TEST: */(((capability) == (GLenum::GL_SCISSOR_TEST))) ? (checkNotNull(l_ctx).mFragmentOperations.mScissor.mTest) :
        /* case GLenum::GL_STENCIL_TEST: */(((capability) == (GLenum::GL_STENCIL_TEST))) ? (checkNotNull(l_ctx).mFragmentOperations.mStencil.mTest) :
        /* case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX: */(((capability) == (GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX))) ? (checkNotNull(l_ctx).mMiscellaneous.mPrimitiveRestartFixedIndex) :
        /* case GLenum::GL_RASTERIZER_DISCARD: */(((capability) == (GLenum::GL_RASTERIZER_DISCARD))) ? (checkNotNull(l_ctx).mRasterization.mRasterizerDiscard) :
        /* case GLenum::GL_SAMPLE_MASK: */(((capability) == (GLenum::GL_SAMPLE_MASK))) ? (checkNotNull(l_ctx).mRasterization.mSampleMask) :
        /* case GLenum::GL_DEBUG_OUTPUT: */(((capability) == (GLenum::GL_DEBUG_OUTPUT))) ? (checkNotNull(l_ctx).mDebug.mOutput) :
        /* case GLenum::GL_DEBUG_OUTPUT_SYNCHRONOUS: */(((capability) == (GLenum::GL_DEBUG_OUTPUT_SYNCHRONOUS))) ? (checkNotNull(l_ctx).mDebug.mOutputSynchronous) :
        /* case GLenum::GL_ALPHA_TEST_QCOM: */(((capability) == (GLenum::GL_ALPHA_TEST_QCOM))) ? (GLbooleanLabels::GL_FALSE) :
        /* case GLenum::GL_FRAMEBUFFER_SRGB_EXT: */(((capability) == (GLenum::GL_FRAMEBUFFER_SRGB_EXT))) ? (checkNotNull(l_ctx).mFragmentOperations.mFramebufferSrgb) :
        /* default: */ GLbooleanLabels::GL_FALSE;
}

void GlesSpy::subEnablei(CallObserver* observer, const std::function<void()>& call, uint32_t capability, GLuint index) {
    subSetCapability(observer, call, capability, true, index, GLbooleanLabels::GL_TRUE);
    return;
}

void GlesSpy::subGetGraphicsResetStatus(CallObserver* observer, const std::function<void()>& call) {
    return;
}

void GlesSpy::subWriteString(CallObserver* observer, const std::function<void()>& call, GLsizei buffer_size, GLsizei* buffer_bytes_written, GLchar* buffer) {
    if (((buffer) != (nullptr)) && ((buffer_size) > ((GLsizei)(0L)))) {
        if ((buffer_bytes_written) != (nullptr)) {
            GLsizei l_length = (GLsizei)(slice(buffer_bytes_written, 0ULL, 1ULL)[0ULL]);
            observer->write<GLsizei>(slice(buffer_bytes_written, 0ULL, 1ULL), 0ULL, l_length);
            observer->write(slice(buffer, (uint64_t)((GLsizei)(0L)), (uint64_t)((l_length) + ((GLsizei)(1L)))));
        } else {
            observer->write(slice(buffer, (uint64_t)((GLsizei)(0L)), (uint64_t)(buffer_size)));
        }
    }
    return;
}

void GlesSpy::subCheckProgram(CallObserver* observer, const std::function<void()>& call, std::shared_ptr<Context> ctx, ProgramId program) {
    if (!(checkNotNull(ctx).mInstances.mPrograms.count(program) > 0)) {
        if (!(checkNotNull(ctx).mInstances.mShaders.count((ShaderId)(program)) > 0)) {
            subGlErrorInvalidValue(observer, call);
        } else {
            subGlErrorInvalidOperation(observer, call);
        }
    }
    return;
}

void GlesSpy::subReapProgram(CallObserver* observer, const std::function<void()>& call, std::shared_ptr<Context> ctx, ProgramId program) {
    if ((program) != ((ProgramId)(0UL))) {
        std::shared_ptr<Program> l_p = findOrZero(checkNotNull(ctx).mInstances.mPrograms, program);
        if (checkNotNull(l_p).mDeleteStatus) {
            {
                int32_t l__ = 0;
                for (GLenumToShaderId::iterator it = checkNotNull(l_p).mShaders.begin(); it != checkNotNull(l_p).mShaders.end(); ++it, ++l__) {
                    uint32_t l__ = it->first;
                    ShaderId l_v = it->second;
                    std::shared_ptr<Shader> l_s = findOrZero(checkNotNull(ctx).mInstances.mShaders, l_v);
                    checkNotNull(l_s).mRefCount -= (GLuint)(1UL);
                    subReapShader(observer, call, ctx, l_v, l_s);
                }
            }
            checkNotNull(ctx).mInstances.mPrograms.erase(program);
        }
    }
    return;
}

void GlesSpy::subSetProgramUniform(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, Slice<uint8_t> value, uint32_t type) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subCheckProgram(observer, call, l_ctx, program);
    std::shared_ptr<Program> l_p = findOrZero(checkNotNull(l_ctx).mInstances.mPrograms, program);
    if ((location) != ((UniformLocation)(-1L))) {
        if (!(checkNotNull(l_p).mUniforms.count(location) > 0)) {
            subGlErrorInvalidOperation(observer, call);
        }
        Uniform l_u = findOrZero(checkNotNull(l_p).mUniforms, location);
        if ((int32_t((l_u.mValue.count()))) == (int32_t((value.count())))) {
            observer->copy(l_u.mValue, value);
        } else {
            l_u.mValue = observer->clone(value);
        }
        l_u.mType = type;
        checkNotNull(l_p).mUniforms[location] = l_u;
    }
    return;
}

void GlesSpy::subGetnUniformuiv(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei bufSize, GLuint* values) {
    subGetnUniformfv_GLuint__P(observer, call, program, location, bufSize, values);
    return;
}

void GlesSpy::subProgramParameteri(CallObserver* observer, const std::function<void()>& call, ProgramId program, uint32_t pname, GLint value) {
    switch (pname) {
        case GLenum::GL_PROGRAM_BINARY_RETRIEVABLE_HINT: {
            break;
        }
        case GLenum::GL_PROGRAM_SEPARABLE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, pname);
        }
    }
    (void)program;
    (void)value;
    return;
}

void GlesSpy::subProgramUniform1i(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLint value0) {
    Slice<GLint> l_v = make<GLint>(1ULL);
    observer->write<GLint>(l_v, 0ULL, value0);
    subProgramUniformv_GLint__S(observer, call, program, location, l_v, GLenum::GL_INT);
    return;
}

void GlesSpy::subProgramUniform1iv(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei count, GLint* values) {
    Slice<GLint> l_v = slice(values, (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subProgramUniformv_GLint__S(observer, call, program, location, l_v, GLenum::GL_INT);
    return;
}

void GlesSpy::subProgramUniform2f(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLfloat value0, GLfloat value1) {
    Slice<Vec2f> l_v = make<Vec2f>(1ULL);
    observer->write<Vec2f>(l_v, 0ULL, {value0, value1});
    subProgramUniformv_Vec2f__S(observer, call, program, location, l_v, GLenum::GL_FLOAT_VEC2);
    return;
}

void GlesSpy::subProgramUniform2fv(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei count, GLfloat* values) {
    Slice<Vec2f> l_v = slice((Vec2f*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subProgramUniformv_Vec2f__S(observer, call, program, location, l_v, GLenum::GL_FLOAT_VEC2);
    return;
}

void GlesSpy::subProgramUniform2ui(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLuint value0, GLuint value1) {
    Slice<Vec2u> l_v = make<Vec2u>(1ULL);
    observer->write<Vec2u>(l_v, 0ULL, {value0, value1});
    subProgramUniformv_Vec2u__S(observer, call, program, location, l_v, GLenum::GL_UNSIGNED_INT_VEC2);
    return;
}

void GlesSpy::subProgramUniform2uiv(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei count, GLuint* values) {
    Slice<Vec2u> l_v = slice((Vec2u*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subProgramUniformv_Vec2u__S(observer, call, program, location, l_v, GLenum::GL_UNSIGNED_INT_VEC2);
    return;
}

void GlesSpy::subProgramUniform3i(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLint value0, GLint value1, GLint value2) {
    Slice<Vec3i> l_v = make<Vec3i>(1ULL);
    observer->write<Vec3i>(l_v, 0ULL, {value0, value1, value2});
    subProgramUniformv_Vec3i__S(observer, call, program, location, l_v, GLenum::GL_INT_VEC3);
    return;
}

void GlesSpy::subProgramUniform3iv(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei count, GLint* values) {
    Slice<Vec3i> l_v = slice((Vec3i*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subProgramUniformv_Vec3i__S(observer, call, program, location, l_v, GLenum::GL_INT_VEC3);
    return;
}

void GlesSpy::subProgramUniform4f(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLfloat value0, GLfloat value1, GLfloat value2, GLfloat value3) {
    Slice<Vec4f> l_v = make<Vec4f>(1ULL);
    observer->write<Vec4f>(l_v, 0ULL, {value0, value1, value2, value3});
    subProgramUniformv_Vec4f__S(observer, call, program, location, l_v, GLenum::GL_FLOAT_VEC4);
    return;
}

void GlesSpy::subProgramUniform4fv(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei count, GLfloat* values) {
    Slice<Vec4f> l_v = slice((Vec4f*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subProgramUniformv_Vec4f__S(observer, call, program, location, l_v, GLenum::GL_FLOAT_VEC4);
    return;
}

void GlesSpy::subProgramUniform4ui(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLuint value0, GLuint value1, GLuint value2, GLuint value3) {
    Slice<Vec4u> l_v = make<Vec4u>(1ULL);
    observer->write<Vec4u>(l_v, 0ULL, {value0, value1, value2, value3});
    subProgramUniformv_Vec4u__S(observer, call, program, location, l_v, GLenum::GL_UNSIGNED_INT_VEC4);
    return;
}

void GlesSpy::subProgramUniform4uiv(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei count, GLuint* values) {
    Slice<Vec4u> l_v = slice((Vec4u*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subProgramUniformv_Vec4u__S(observer, call, program, location, l_v, GLenum::GL_UNSIGNED_INT_VEC4);
    return;
}

void GlesSpy::subProgramUniformMatrix2x3fv(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei count, GLboolean transpose, GLfloat* values) {
    Slice<Mat2x3f> l_v = slice((Mat2x3f*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subProgramUniformMatrixv_Mat2x3f__S(observer, call, program, location, transpose, l_v, GLenum::GL_FLOAT_MAT2x3);
    return;
}

void GlesSpy::subProgramUniformMatrix3fv(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei count, GLboolean transpose, GLfloat* values) {
    Slice<Mat3f> l_v = slice((Mat3f*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subProgramUniformMatrixv_Mat3f__S(observer, call, program, location, transpose, l_v, GLenum::GL_FLOAT_MAT3);
    return;
}

void GlesSpy::subProgramUniformMatrix3x2fv(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei count, GLboolean transpose, GLfloat* values) {
    Slice<Mat3x2f> l_v = slice((Mat3x2f*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subProgramUniformMatrixv_Mat3x2f__S(observer, call, program, location, transpose, l_v, GLenum::GL_FLOAT_MAT3x2);
    return;
}

void GlesSpy::subProgramUniformMatrix3x4fv(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei count, GLboolean transpose, GLfloat* values) {
    Slice<Mat3x4f> l_v = slice((Mat3x4f*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subProgramUniformMatrixv_Mat3x4f__S(observer, call, program, location, transpose, l_v, GLenum::GL_FLOAT_MAT3x4);
    return;
}

void GlesSpy::subProgramUniformMatrix4x3fv(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei count, GLboolean transpose, GLfloat* values) {
    Slice<Mat4x3f> l_v = slice((Mat4x3f*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subProgramUniformMatrixv_Mat4x3f__S(observer, call, program, location, transpose, l_v, GLenum::GL_FLOAT_MAT4x3);
    return;
}

void GlesSpy::subUniformMatrix2x3fv(CallObserver* observer, const std::function<void()>& call, UniformLocation location, GLsizei count, GLboolean transpose, GLfloat* values) {
    Slice<Mat2x3f> l_v = slice((Mat2x3f*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subUniformMatrixv_Mat2x3f__S(observer, call, location, transpose, l_v, GLenum::GL_FLOAT_MAT2x3);
    return;
}

void GlesSpy::subUniformMatrix3x2fv(CallObserver* observer, const std::function<void()>& call, UniformLocation location, GLsizei count, GLboolean transpose, GLfloat* values) {
    Slice<Mat3x2f> l_v = slice((Mat3x2f*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subUniformMatrixv_Mat3x2f__S(observer, call, location, transpose, l_v, GLenum::GL_FLOAT_MAT3x2);
    return;
}

void GlesSpy::subUniformMatrix3x4fv(CallObserver* observer, const std::function<void()>& call, UniformLocation location, GLsizei count, GLboolean transpose, GLfloat* values) {
    Slice<Mat3x4f> l_v = slice((Mat3x4f*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subUniformMatrixv_Mat3x4f__S(observer, call, location, transpose, l_v, GLenum::GL_FLOAT_MAT3x4);
    return;
}

void GlesSpy::subUniformMatrix4x3fv(CallObserver* observer, const std::function<void()>& call, UniformLocation location, GLsizei count, GLboolean transpose, GLfloat* values) {
    Slice<Mat4x3f> l_v = slice((Mat4x3f*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    subUniformMatrixv_Mat4x3f__S(observer, call, location, transpose, l_v, GLenum::GL_FLOAT_MAT4x3);
    return;
}

void GlesSpy::subMinSampleShading(CallObserver* observer, const std::function<void()>& call, GLfloat value) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    checkNotNull(l_ctx).mRasterization.mMinSampleShadingValue = value;
    return;
}

void GlesSpy::subGetInteger64v(CallObserver* observer, const std::function<void()>& call, uint32_t param, GLint64* values) {
    subGetStateVariable_GLint64(observer, call, param, false, (GLuint)(0UL), values);
    return;
}

GLboolean GlesSpy::subIsEnabledi(CallObserver* observer, const std::function<void()>& call, uint32_t capability, GLuint index) {
    GLboolean l__res_0 = subGetCapability(observer, call, capability, index);
    return l__res_0;
}

void GlesSpy::subDeleteSync(CallObserver* observer, const std::function<void()>& call, GLsync sync) {
    if ((sync) != (nullptr)) {
        std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
        if (!(checkNotNull(l_ctx).mInstances.mSyncObjects.count(sync) > 0)) {
            subGlErrorInvalidValue(observer, call);
        }
        checkNotNull(l_ctx).mInstances.mSyncObjects.erase(sync);
    }
    return;
}

void GlesSpy::subFenceSync(CallObserver* observer, const std::function<void()>& call, uint32_t condition, uint32_t syncFlags, GLsync sync) {
    if ((condition) != (GLenum::GL_SYNC_GPU_COMMANDS_COMPLETE)) {
        subGlErrorInvalidEnum(observer, call, condition);
    }
    if ((syncFlags) != ((uint32_t)(0L))) {
        subGlErrorInvalidValue(observer, call);
    }
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    if ((sync) != (nullptr)) {
        checkNotNull(l_ctx).mInstances.mSyncObjects[sync] = std::shared_ptr<SyncObject>(new SyncObject());
    }
    return;
}

void GlesSpy::subGetSynciv(CallObserver* observer, const std::function<void()>& call, GLsync sync, uint32_t pname, GLsizei bufSize, GLsizei* length, GLint* values) {
    (void)sync;
    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: {
            if (((values) != (nullptr)) && ((bufSize) > ((GLsizei)(0L)))) {
                observer->write<GLint>(slice(values, 0ULL, 1ULL), 0ULL, slice(values, 0ULL, 1ULL)[0ULL]);
                if ((length) != (nullptr)) {
                    observer->write<GLsizei>(slice(length, 0ULL, 1ULL), 0ULL, (GLsizei)(1L));
                }
            }
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, pname);
        }
    }
    return;
}

void GlesSpy::subWaitSync(CallObserver* observer, const std::function<void()>& call, GLsync sync, uint32_t syncFlags, GLuint64 timeout) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    if (!(checkNotNull(l_ctx).mInstances.mSyncObjects.count(sync) > 0)) {
        subGlErrorInvalidOperation(observer, call);
    }
    if ((timeout) != ((GLuint64)(18446744073709551615ULL))) {
        subGlErrorInvalidValue(observer, call);
    }
    if ((syncFlags) != ((uint32_t)(0L))) {
        subGlErrorInvalidValue(observer, call);
    }
    return;
}

std::shared_ptr<Texture> GlesSpy::subGetBoundTextureOrErrorInvalidEnum(CallObserver* observer, const std::function<void()>& call, uint32_t target) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    std::shared_ptr<TextureUnit> l_tu = findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit);
    return /* switch(target) */
        /* case GLenum::GL_TEXTURE_2D: */(((target) == (GLenum::GL_TEXTURE_2D))) ? (/* switch((checkNotNull(l_tu).mBinding2d) != ((TextureId)(0UL))) */
            /* case true: */((((checkNotNull(l_tu).mBinding2d) != ((TextureId)(0UL))) == (true))) ? (findOrZero(checkNotNull(l_ctx).mInstances.mTextures, checkNotNull(l_tu).mBinding2d)) :
            /* case false: */((((checkNotNull(l_tu).mBinding2d) != ((TextureId)(0UL))) == (false))) ? (checkNotNull(l_ctx).mInstances.mDefaultTextures.mTexture2d) :
            /* default: */ std::shared_ptr<Texture>()) :
        /* case GLenum::GL_TEXTURE_EXTERNAL_OES: */(((target) == (GLenum::GL_TEXTURE_EXTERNAL_OES))) ? (/* switch((checkNotNull(l_tu).mBindingExternalOes) != ((TextureId)(0UL))) */
            /* case true: */((((checkNotNull(l_tu).mBindingExternalOes) != ((TextureId)(0UL))) == (true))) ? (findOrZero(checkNotNull(l_ctx).mInstances.mTextures, checkNotNull(l_tu).mBindingExternalOes)) :
            /* case false: */((((checkNotNull(l_tu).mBindingExternalOes) != ((TextureId)(0UL))) == (false))) ? (checkNotNull(l_ctx).mInstances.mDefaultTextures.mTextureExternalOes) :
            /* default: */ std::shared_ptr<Texture>()) :
        /* case GLenum::GL_TEXTURE_2D_ARRAY: */(((target) == (GLenum::GL_TEXTURE_2D_ARRAY))) ? (/* switch((checkNotNull(l_tu).mBinding2dArray) != ((TextureId)(0UL))) */
            /* case true: */((((checkNotNull(l_tu).mBinding2dArray) != ((TextureId)(0UL))) == (true))) ? (findOrZero(checkNotNull(l_ctx).mInstances.mTextures, checkNotNull(l_tu).mBinding2dArray)) :
            /* case false: */((((checkNotNull(l_tu).mBinding2dArray) != ((TextureId)(0UL))) == (false))) ? (checkNotNull(l_ctx).mInstances.mDefaultTextures.mTexture2dArray) :
            /* default: */ std::shared_ptr<Texture>()) :
        /* case GLenum::GL_TEXTURE_2D_MULTISAMPLE: */(((target) == (GLenum::GL_TEXTURE_2D_MULTISAMPLE))) ? (/* switch((checkNotNull(l_tu).mBinding2dMultisample) != ((TextureId)(0UL))) */
            /* case true: */((((checkNotNull(l_tu).mBinding2dMultisample) != ((TextureId)(0UL))) == (true))) ? (findOrZero(checkNotNull(l_ctx).mInstances.mTextures, checkNotNull(l_tu).mBinding2dMultisample)) :
            /* case false: */((((checkNotNull(l_tu).mBinding2dMultisample) != ((TextureId)(0UL))) == (false))) ? (checkNotNull(l_ctx).mInstances.mDefaultTextures.mTexture2dMultisample) :
            /* default: */ std::shared_ptr<Texture>()) :
        /* case GLenum::GL_TEXTURE_2D_MULTISAMPLE_ARRAY: */(((target) == (GLenum::GL_TEXTURE_2D_MULTISAMPLE_ARRAY))) ? (/* switch((checkNotNull(l_tu).mBinding2dMultisampleArray) != ((TextureId)(0UL))) */
            /* case true: */((((checkNotNull(l_tu).mBinding2dMultisampleArray) != ((TextureId)(0UL))) == (true))) ? (findOrZero(checkNotNull(l_ctx).mInstances.mTextures, checkNotNull(l_tu).mBinding2dMultisampleArray)) :
            /* case false: */((((checkNotNull(l_tu).mBinding2dMultisampleArray) != ((TextureId)(0UL))) == (false))) ? (checkNotNull(l_ctx).mInstances.mDefaultTextures.mTexture2dMultisampleArray) :
            /* default: */ std::shared_ptr<Texture>()) :
        /* case GLenum::GL_TEXTURE_3D: */(((target) == (GLenum::GL_TEXTURE_3D))) ? (/* switch((checkNotNull(l_tu).mBinding3d) != ((TextureId)(0UL))) */
            /* case true: */((((checkNotNull(l_tu).mBinding3d) != ((TextureId)(0UL))) == (true))) ? (findOrZero(checkNotNull(l_ctx).mInstances.mTextures, checkNotNull(l_tu).mBinding3d)) :
            /* case false: */((((checkNotNull(l_tu).mBinding3d) != ((TextureId)(0UL))) == (false))) ? (checkNotNull(l_ctx).mInstances.mDefaultTextures.mTexture3d) :
            /* default: */ std::shared_ptr<Texture>()) :
        /* case GLenum::GL_TEXTURE_BUFFER: */(((target) == (GLenum::GL_TEXTURE_BUFFER))) ? (/* switch((checkNotNull(l_tu).mBindingBuffer) != ((TextureId)(0UL))) */
            /* case true: */((((checkNotNull(l_tu).mBindingBuffer) != ((TextureId)(0UL))) == (true))) ? (findOrZero(checkNotNull(l_ctx).mInstances.mTextures, checkNotNull(l_tu).mBindingBuffer)) :
            /* case false: */((((checkNotNull(l_tu).mBindingBuffer) != ((TextureId)(0UL))) == (false))) ? (checkNotNull(l_ctx).mInstances.mDefaultTextures.mTextureBuffer) :
            /* default: */ std::shared_ptr<Texture>()) :
        /* case GLenum::GL_TEXTURE_CUBE_MAP: */(((target) == (GLenum::GL_TEXTURE_CUBE_MAP))) ? (/* switch((checkNotNull(l_tu).mBindingCubeMap) != ((TextureId)(0UL))) */
            /* case true: */((((checkNotNull(l_tu).mBindingCubeMap) != ((TextureId)(0UL))) == (true))) ? (findOrZero(checkNotNull(l_ctx).mInstances.mTextures, checkNotNull(l_tu).mBindingCubeMap)) :
            /* case false: */((((checkNotNull(l_tu).mBindingCubeMap) != ((TextureId)(0UL))) == (false))) ? (checkNotNull(l_ctx).mInstances.mDefaultTextures.mTextureCubeMap) :
            /* default: */ std::shared_ptr<Texture>()) :
        /* case GLenum::GL_TEXTURE_CUBE_MAP_ARRAY: */(((target) == (GLenum::GL_TEXTURE_CUBE_MAP_ARRAY))) ? (/* switch((checkNotNull(l_tu).mBindingCubeMapArray) != ((TextureId)(0UL))) */
            /* case true: */((((checkNotNull(l_tu).mBindingCubeMapArray) != ((TextureId)(0UL))) == (true))) ? (findOrZero(checkNotNull(l_ctx).mInstances.mTextures, checkNotNull(l_tu).mBindingCubeMapArray)) :
            /* case false: */((((checkNotNull(l_tu).mBindingCubeMapArray) != ((TextureId)(0UL))) == (false))) ? (checkNotNull(l_ctx).mInstances.mDefaultTextures.mTextureCubeMapArray) :
            /* default: */ std::shared_ptr<Texture>()) :
        /* default: */ checkNotNull(l_ctx).mInstances.mDefaultTextures.mTexture2d;
}

void GlesSpy::subCheckInternalFormat(CallObserver* observer, const std::function<void()>& call, uint32_t internalformat) {
    switch (internalformat) {
        case GLenum::GL_RGB: // fall-through...
        case GLenum::GL_RGBA: // fall-through...
        case GLenum::GL_LUMINANCE_ALPHA: // fall-through...
        case GLenum::GL_LUMINANCE: // fall-through...
        case GLenum::GL_ALPHA: // fall-through...
        case GLenum::GL_R8: // fall-through...
        case GLenum::GL_R8_SNORM: // fall-through...
        case GLenum::GL_R16F: // fall-through...
        case GLenum::GL_R32F: // fall-through...
        case GLenum::GL_R8UI: // fall-through...
        case GLenum::GL_R8I: // fall-through...
        case GLenum::GL_R16UI: // fall-through...
        case GLenum::GL_R16I: // fall-through...
        case GLenum::GL_R32UI: // fall-through...
        case GLenum::GL_R32I: // fall-through...
        case GLenum::GL_RG8: // fall-through...
        case GLenum::GL_RG8_SNORM: // fall-through...
        case GLenum::GL_RG16F: // fall-through...
        case GLenum::GL_RG32F: // fall-through...
        case GLenum::GL_RG8UI: // fall-through...
        case GLenum::GL_RG8I: // fall-through...
        case GLenum::GL_RG16UI: // fall-through...
        case GLenum::GL_RG16I: // fall-through...
        case GLenum::GL_RG32UI: // fall-through...
        case GLenum::GL_RG32I: // fall-through...
        case GLenum::GL_RGB8: // fall-through...
        case GLenum::GL_SRGB8: // fall-through...
        case GLenum::GL_RGB565: // fall-through...
        case GLenum::GL_RGB8_SNORM: // fall-through...
        case GLenum::GL_R11F_G11F_B10F: // fall-through...
        case GLenum::GL_RGB9_E5: // fall-through...
        case GLenum::GL_RGB16F: // fall-through...
        case GLenum::GL_RGB32F: // fall-through...
        case GLenum::GL_RGB8UI: // fall-through...
        case GLenum::GL_RGB8I: // fall-through...
        case GLenum::GL_RGB16UI: // fall-through...
        case GLenum::GL_RGB16I: // fall-through...
        case GLenum::GL_RGB32UI: // fall-through...
        case GLenum::GL_RGB32I: // fall-through...
        case GLenum::GL_RGBA8: // fall-through...
        case GLenum::GL_SRGB8_ALPHA8: // fall-through...
        case GLenum::GL_RGBA8_SNORM: // fall-through...
        case GLenum::GL_RGB5_A1: // fall-through...
        case GLenum::GL_RGBA4: // fall-through...
        case GLenum::GL_RGB10_A2: // fall-through...
        case GLenum::GL_RGBA16F: // fall-through...
        case GLenum::GL_RGBA32F: // fall-through...
        case GLenum::GL_RGBA8UI: // fall-through...
        case GLenum::GL_RGBA8I: // fall-through...
        case GLenum::GL_RGB10_A2UI: // fall-through...
        case GLenum::GL_RGBA16UI: // fall-through...
        case GLenum::GL_RGBA16I: // fall-through...
        case GLenum::GL_RGBA32I: // fall-through...
        case GLenum::GL_RGBA32UI: // 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_DEPTH24_STENCIL8: // fall-through...
        case GLenum::GL_DEPTH32F_STENCIL8: // fall-through...
        case GLenum::GL_STENCIL_INDEX8: {
            break;
        }
        case GLenum::GL_DEPTH_COMPONENT: {
            subRequiresExtension(observer, call, ExtensionId::GL_OES_depth_texture);
            break;
        }
        case GLenum::GL_DEPTH_STENCIL: {
            subRequiresExtension(observer, call, ExtensionId::GL_OES_packed_depth_stencil);
            break;
        }
        case GLenum::GL_RED_EXT: // fall-through...
        case GLenum::GL_RG_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_rg);
            break;
        }
        case GLenum::GL_BGRA_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_format_BGRA8888);
            break;
        }
        default: {
            subGlErrorInvalidValue(observer, call);
        }
    }
    return;
}

void GlesSpy::subCheckMaxTextureSize(CallObserver* observer, const std::function<void()>& call, std::shared_ptr<Context> ctx, uint32_t target, GLint level, GLsizei width, GLsizei height) {
    GLint l_maxSize = /* switch(target) */
        /* case GLenum::GL_TEXTURE_2D: */(((target) == (GLenum::GL_TEXTURE_2D))) ? (checkNotNull(ctx).mConstants.mMaxTextureSize) :
        /* case GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X, GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: */(((target) == (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X))|| ((target) == (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y))|| ((target) == (GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z))|| ((target) == (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X))|| ((target) == (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y))|| ((target) == (GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z))) ? (checkNotNull(ctx).mConstants.mMaxCubeMapTextureSize) :
        /* default: */ 0;
    if (((level) < ((GLint)(0L))) || (((width) < ((GLsizei)(0L))) || (((height) < ((GLsizei)(0L))) || (((width) > ((GLsizei)(l_maxSize))) || (((height) > ((GLsizei)(l_maxSize))) || ((((uint32_t)(level)) > (31UL)) || (((1UL) << ((uint32_t)(level))) > ((uint32_t)(l_maxSize))))))))) {
        subGlErrorInvalidValue(observer, call);
    }
    return;
}

void GlesSpy::subCompressedTexImage3D(CallObserver* observer, const std::function<void()>& call, uint32_t target, GLint level, uint32_t internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei image_size, TexturePointer data) {
    switch (target) {
        case GLenum::GL_TEXTURE_2D_ARRAY: // fall-through...
        case GLenum::GL_TEXTURE_3D: {
            break;
        }
        case GLenum::GL_TEXTURE_CUBE_MAP_ARRAY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, target);
        }
    }
    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;
        }
        case GLenum::GL_COMPRESSED_RGBA_ASTC_10x10: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_10x5: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_10x6: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_10x8: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_12x10: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_12x12: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_4x4: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_5x4: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_5x5: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_6x5: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_6x6: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_8x5: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_8x6: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_8x8: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        case GLenum::GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_compression_s3tc);
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, internalformat);
        }
    }
    (void)level;
    (void)width;
    (void)height;
    (void)depth;
    (void)border;
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    if (((checkNotNull(l_ctx).mBoundBuffers.mPixelUnpackBuffer) == ((BufferId)(0UL))) && ((data) != (nullptr))) {
        observer->read(slice((uint8_t*)(data), (uint64_t)((GLsizei)(0L)), (uint64_t)(image_size)));
    }
    return;
}

void GlesSpy::subCompressedTexSubImage3D(CallObserver* observer, const std::function<void()>& call, uint32_t target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, uint32_t format, GLsizei image_size, TexturePointer data) {
    switch (target) {
        case GLenum::GL_TEXTURE_2D_ARRAY: // fall-through...
        case GLenum::GL_TEXTURE_3D: {
            break;
        }
        case GLenum::GL_TEXTURE_CUBE_MAP_ARRAY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, target);
        }
    }
    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;
        }
        case GLenum::GL_COMPRESSED_RGBA_ASTC_10x10: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_10x5: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_10x6: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_10x8: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_12x10: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_12x12: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_4x4: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_5x4: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_5x5: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_6x5: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_6x6: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_8x5: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_8x6: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_8x8: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        case GLenum::GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_compression_s3tc);
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, format);
        }
    }
    (void)level;
    (void)xoffset;
    (void)yoffset;
    (void)zoffset;
    (void)width;
    (void)height;
    (void)depth;
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    if (((checkNotNull(l_ctx).mBoundBuffers.mPixelUnpackBuffer) == ((BufferId)(0UL))) && ((data) != (nullptr))) {
        observer->read(slice((uint8_t*)(data), (uint64_t)((GLsizei)(0L)), (uint64_t)(image_size)));
    }
    return;
}

void GlesSpy::subCopyImageSubData(CallObserver* observer, const std::function<void()>& call, GLuint srcName, uint32_t srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, uint32_t dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth) {
    switch (srcTarget) {
        case GLenum::GL_RENDERBUFFER: // fall-through...
        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_2D_MULTISAMPLE_ARRAY: // fall-through...
        case GLenum::GL_TEXTURE_3D: // fall-through...
        case GLenum::GL_TEXTURE_CUBE_MAP: // fall-through...
        case GLenum::GL_TEXTURE_CUBE_MAP_ARRAY: {
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, srcTarget);
        }
    }
    switch (dstTarget) {
        case GLenum::GL_RENDERBUFFER: // fall-through...
        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_2D_MULTISAMPLE_ARRAY: // fall-through...
        case GLenum::GL_TEXTURE_3D: // fall-through...
        case GLenum::GL_TEXTURE_CUBE_MAP: // fall-through...
        case GLenum::GL_TEXTURE_CUBE_MAP_ARRAY: {
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, dstTarget);
        }
    }
    (void)srcName;
    (void)srcLevel;
    (void)srcX;
    (void)srcY;
    (void)srcZ;
    (void)dstName;
    (void)dstLevel;
    (void)dstX;
    (void)dstY;
    (void)dstZ;
    (void)srcWidth;
    (void)srcHeight;
    (void)srcDepth;
    return;
}

void GlesSpy::subCopyTexSubImage3D(CallObserver* observer, const std::function<void()>& call, uint32_t target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) {
    switch (target) {
        case GLenum::GL_TEXTURE_2D_ARRAY: // fall-through...
        case GLenum::GL_TEXTURE_3D: {
            break;
        }
        case GLenum::GL_TEXTURE_CUBE_MAP_ARRAY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, target);
        }
    }
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subCheckMaxTextureSize(observer, call, l_ctx, target, level, width, height);
    std::shared_ptr<Texture> l_t = subGetBoundTextureOrErrorInvalidEnum(observer, call, target);
    if (!(checkNotNull(l_t).mTexture2D.count(level) > 0)) {
        subGlErrorInvalidValue(observer, call);
    }
    Image l_l = findOrZero(checkNotNull(l_t).mTexture2D, level);
    if (((xoffset) < ((GLint)(0L))) || (((yoffset) < ((GLint)(0L))) || ((zoffset) < ((GLint)(0L))))) {
        subGlErrorInvalidValue(observer, call);
    }
    if (((((GLsizei)(xoffset)) + (width)) > (l_l.mWidth)) || ((((GLsizei)(yoffset)) + (height)) > (l_l.mHeight))) {
        subGlErrorInvalidValue(observer, call);
    }
    (void)level;
    (void)xoffset;
    (void)yoffset;
    (void)zoffset;
    (void)x;
    (void)y;
    (void)width;
    (void)height;
    return;
}

void GlesSpy::subGetSamplerParameterIuiv(CallObserver* observer, const std::function<void()>& call, SamplerId sampler, uint32_t pname, GLuint* params) {
    subGetSamplerParameterv_GLuint(observer, call, sampler, pname, params);
    return;
}

void GlesSpy::subGetTexParameterIiv(CallObserver* observer, const std::function<void()>& call, uint32_t target, uint32_t pname, GLint* params) {
    subGetTexParameter_GLint(observer, call, target, pname, params);
    return;
}

void GlesSpy::subSamplerParameterIuiv(CallObserver* observer, const std::function<void()>& call, SamplerId sampler, uint32_t pname, GLuint* param) {
    subSamplerParameterv_GLuint__CP(observer, call, sampler, pname, param);
    return;
}

void GlesSpy::subTexBufferRange(CallObserver* observer, const std::function<void()>& call, uint32_t target, uint32_t internalformat, BufferId buffer, GLintptr offset, GLsizeiptr size) {
    switch (target) {
        case GLenum::GL_TEXTURE_BUFFER: {
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, target);
        }
    }
    switch (internalformat) {
        case GLenum::GL_R16: // 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_RG16: // 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_RGB32F: // fall-through...
        case GLenum::GL_RGB32I: // fall-through...
        case GLenum::GL_RGB32UI: // fall-through...
        case GLenum::GL_RGBA16: // 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: {
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, internalformat);
        }
    }
    (void)buffer;
    (void)offset;
    (void)size;
    return;
}

void GlesSpy::subTexParameterIiv(CallObserver* observer, const std::function<void()>& call, uint32_t target, uint32_t pname, GLint* params) {
    subTexParameterv_GLint__CP(observer, call, target, pname, params);
    return;
}

void GlesSpy::subTexStorage2D(CallObserver* observer, const std::function<void()>& call, uint32_t target, GLsizei levels, uint32_t internalformat, GLsizei width, GLsizei height) {
    switch (target) {
        case GLenum::GL_TEXTURE_2D: // fall-through...
        case GLenum::GL_TEXTURE_CUBE_MAP: {
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, target);
        }
    }
    if ((levels) < ((GLsizei)(1L))) {
        subGlErrorInvalidValue(observer, call);
    }
    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;
        }
        case GLenum::GL_R16: // fall-through...
        case GLenum::GL_R16_SNORM: // fall-through...
        case GLenum::GL_RG16: // fall-through...
        case GLenum::GL_RG16_SNORM: // fall-through...
        case GLenum::GL_RGB16: // fall-through...
        case GLenum::GL_RGB16_SNORM: // fall-through...
        case GLenum::GL_RGBA16: // fall-through...
        case GLenum::GL_RGBA16_SNORM: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_norm16);
            break;
        }
        case GLenum::GL_COMPRESSED_RGBA_ASTC_10x10: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_10x5: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_10x6: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_10x8: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_12x10: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_12x12: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_4x4: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_5x4: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_5x5: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_6x5: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_6x6: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_8x5: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_8x6: // fall-through...
        case GLenum::GL_COMPRESSED_RGBA_ASTC_8x8: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6: // fall-through...
        case GLenum::GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8: // fall-through...
        case GLenum::GL_STENCIL_INDEX8: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        case GLenum::GL_ALPHA8_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_storage);
            break;
        }
        case GLenum::GL_ETC1_RGB8_OES: {
            subRequiresExtension(observer, call, ExtensionId::GL_OES_compressed_ETC1_RGB8_texture);
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, internalformat);
        }
    }
    uint32_t l_fm = subImageFormat(observer, call, internalformat);
    uint32_t l_ty = subImageType(observer, call, internalformat);
    switch (target) {
        case GLenum::GL_TEXTURE_2D: {
            std::shared_ptr<Texture> l_t = subGetBoundTextureOrErrorInvalidEnum(observer, call, GLenum::GL_TEXTURE_2D);
            for (GLint l_i = (GLint)(0L); l_i < (GLint)(levels); ++l_i) {
                GLsizei l_w = subMax_GLsizei(observer, call, (width) >> ((uint32_t)(l_i)), (GLsizei)(1L));
                GLsizei l_h = subMax_GLsizei(observer, call, (height) >> ((uint32_t)(l_i)), (GLsizei)(1L));
                uint32_t l_s = subImageSize(observer, call, (uint32_t)(l_w), (uint32_t)(l_h), l_fm, l_ty);
                Image l_l = Image(l_w, l_h, make<uint8_t>((uint64_t)(l_s)), l_s, l_fm, l_ty);
                checkNotNull(l_t).mTexture2D[l_i] = l_l;
            }
            checkNotNull(l_t).mTexelFormat = l_fm;
            checkNotNull(l_t).mTexelType = l_ty;
            checkNotNull(l_t).mImmutableFormat = GLbooleanLabels::GL_TRUE;
            break;
        }
        case GLenum::GL_TEXTURE_CUBE_MAP: {
            std::shared_ptr<Texture> l_t = subGetBoundTextureOrErrorInvalidEnum(observer, call, GLenum::GL_TEXTURE_CUBE_MAP);
            for (GLint l_i = (GLint)(0L); l_i < (GLint)(levels); ++l_i) {
                GLsizei l_w = subMax_GLsizei(observer, call, (width) >> ((uint32_t)(l_i)), (GLsizei)(1L));
                GLsizei l_h = subMax_GLsizei(observer, call, (height) >> ((uint32_t)(l_i)), (GLsizei)(1L));
                uint32_t l_s = subImageSize(observer, call, (uint32_t)(l_w), (uint32_t)(l_h), l_fm, l_ty);
                CubemapLevel l_cube = findOrZero(checkNotNull(l_t).mCubemap, l_i);
                l_cube.mFaces[GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_X] = Image(l_w, l_h, make<uint8_t>((uint64_t)(l_s)), l_s, l_fm, l_ty);
                l_cube.mFaces[GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Y] = Image(l_w, l_h, make<uint8_t>((uint64_t)(l_s)), l_s, l_fm, l_ty);
                l_cube.mFaces[GLenum::GL_TEXTURE_CUBE_MAP_POSITIVE_Z] = Image(l_w, l_h, make<uint8_t>((uint64_t)(l_s)), l_s, l_fm, l_ty);
                l_cube.mFaces[GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_X] = Image(l_w, l_h, make<uint8_t>((uint64_t)(l_s)), l_s, l_fm, l_ty);
                l_cube.mFaces[GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y] = Image(l_w, l_h, make<uint8_t>((uint64_t)(l_s)), l_s, l_fm, l_ty);
                l_cube.mFaces[GLenum::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z] = Image(l_w, l_h, make<uint8_t>((uint64_t)(l_s)), l_s, l_fm, l_ty);
                checkNotNull(l_t).mCubemap[l_i] = l_cube;
            }
            checkNotNull(l_t).mTexelFormat = l_fm;
            checkNotNull(l_t).mTexelType = l_ty;
            checkNotNull(l_t).mImmutableFormat = GLbooleanLabels::GL_TRUE;
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, target);
        }
    }
    return;
}

void GlesSpy::subTexStorage3DMultisample(CallObserver* observer, const std::function<void()>& call, uint32_t target, GLsizei samples, uint32_t internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) {
    switch (target) {
        case GLenum::GL_TEXTURE_2D_MULTISAMPLE_ARRAY: {
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, target);
        }
    }
    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: // fall-through...
        case GLenum::GL_STENCIL_INDEX8: {
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, internalformat);
        }
    }
    (void)samples;
    (void)width;
    (void)height;
    (void)depth;
    (void)fixedsamplelocations;
    return;
}

uint64_t GlesSpy::subGetVertexAttrib(CallObserver* observer, const std::function<void()>& call, std::shared_ptr<Context> ctx, AttributeLocation index, uint32_t pname) {
    std::shared_ptr<VertexArray> l_vao = findOrZero(checkNotNull(ctx).mInstances.mVertexArrays, checkNotNull(ctx).mBoundVertexArray);
    std::shared_ptr<VertexAttributeArray> l_array = findOrZero(checkNotNull(l_vao).mVertexAttributeArrays, index);
    return /* switch(pname) */
        /* case GLenum::GL_VERTEX_ATTRIB_ARRAY_ENABLED: */(((pname) == (GLenum::GL_VERTEX_ATTRIB_ARRAY_ENABLED))) ? ((uint64_t)(checkNotNull(l_array).mEnabled)) :
        /* case GLenum::GL_VERTEX_ATTRIB_ARRAY_SIZE: */(((pname) == (GLenum::GL_VERTEX_ATTRIB_ARRAY_SIZE))) ? ((uint64_t)(checkNotNull(l_array).mSize)) :
        /* case GLenum::GL_VERTEX_ATTRIB_ARRAY_TYPE: */(((pname) == (GLenum::GL_VERTEX_ATTRIB_ARRAY_TYPE))) ? ((uint64_t)(checkNotNull(l_array).mType)) :
        /* case GLenum::GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: */(((pname) == (GLenum::GL_VERTEX_ATTRIB_ARRAY_NORMALIZED))) ? ((uint64_t)(checkNotNull(l_array).mNormalized)) :
        /* case GLenum::GL_VERTEX_ATTRIB_ARRAY_STRIDE: */(((pname) == (GLenum::GL_VERTEX_ATTRIB_ARRAY_STRIDE))) ? ((uint64_t)(checkNotNull(l_array).mStride)) :
        /* case GLenum::GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: */(((pname) == (GLenum::GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING))) ? ((uint64_t)(checkNotNull(findOrZero(checkNotNull(l_vao).mVertexBufferBindings, checkNotNull(l_array).mBinding)).mBuffer)) :
        /* case GLenum::GL_VERTEX_ATTRIB_ARRAY_DIVISOR: */(((pname) == (GLenum::GL_VERTEX_ATTRIB_ARRAY_DIVISOR))) ? ((uint64_t)(checkNotNull(findOrZero(checkNotNull(l_vao).mVertexBufferBindings, checkNotNull(l_array).mBinding)).mDivisor)) :
        /* case GLenum::GL_VERTEX_ATTRIB_ARRAY_INTEGER: */(((pname) == (GLenum::GL_VERTEX_ATTRIB_ARRAY_INTEGER))) ? ((uint64_t)(checkNotNull(l_array).mInteger)) :
        /* case GLenum::GL_VERTEX_ATTRIB_BINDING: */(((pname) == (GLenum::GL_VERTEX_ATTRIB_BINDING))) ? ((uint64_t)(checkNotNull(l_array).mBinding)) :
        /* case GLenum::GL_VERTEX_ATTRIB_RELATIVE_OFFSET: */(((pname) == (GLenum::GL_VERTEX_ATTRIB_RELATIVE_OFFSET))) ? ((uint64_t)(checkNotNull(l_array).mRelativeOffset)) :
        /* default: */ 0ULL;
}

void GlesSpy::subReadVertexArrays(CallObserver* observer, const std::function<void()>& call, std::shared_ptr<Context> ctx, uint32_t first_index, uint32_t index_count, uint32_t instance_count) {
    if (((index_count) > (0UL)) && ((instance_count) > (0UL))) {
        if ((checkNotNull(ctx).mBoundVertexArray) == ((VertexArrayId)(0UL))) {
            std::shared_ptr<VertexArray> l_vao = findOrZero(checkNotNull(ctx).mInstances.mVertexArrays, (VertexArrayId)(0UL));
            for (AttributeLocation l_i = (AttributeLocation)(0UL); l_i < (AttributeLocation)(checkNotNull(ctx).mConstants.mMaxVertexAttribs); ++l_i) {
                std::shared_ptr<VertexAttributeArray> l_arr = findOrZero(checkNotNull(l_vao).mVertexAttributeArrays, l_i);
                if ((checkNotNull(l_arr).mEnabled) == (GLbooleanLabels::GL_TRUE)) {
                    std::shared_ptr<VertexBufferBinding> l_binding = findOrZero(checkNotNull(l_vao).mVertexBufferBindings, checkNotNull(l_arr).mBinding);
                    if (((checkNotNull(l_binding).mBuffer) == ((BufferId)(0UL))) && ((checkNotNull(l_arr).mPointer) != (nullptr))) {
                        GLsizei l_stride = checkNotNull(l_binding).mStride;
                        GLint l__res_0 = subVertexAttribTypeSize(observer, call, checkNotNull(l_arr).mType);
                        GLint l_size = (l__res_0) * (checkNotNull(l_arr).mSize);
                        uint32_t l_divisor = (uint32_t)(checkNotNull(l_binding).mDivisor);
                        if ((l_divisor) == (0UL)) {
                            for (uint32_t l_v = first_index; l_v < (first_index) + (index_count); ++l_v) {
                                GLint l_offset = ((GLint)(l_stride)) * ((GLint)(l_v));
                                observer->read(slice(checkNotNull(l_arr).mPointer, (uint64_t)(l_offset), (uint64_t)((l_offset) + (l_size))));
                            }
                        } else {
                            uint32_t l_last_instance = (instance_count) - (1UL);
                            uint32_t l_last_index = (l_last_instance) / (l_divisor);
                            for (uint32_t l_v = 0UL; l_v < (l_last_index) + (1UL); ++l_v) {
                                GLint l_offset = ((GLint)(l_stride)) * ((GLint)(l_v));
                                observer->read(slice(checkNotNull(l_arr).mPointer, (uint64_t)(l_offset), (uint64_t)((l_offset) + (l_size))));
                            }
                        }
                    }
                }
            }
        }
    }
    return;
}

void GlesSpy::subBindVertexArray(CallObserver* observer, const std::function<void()>& call, VertexArrayId array) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    if (!(checkNotNull(l_ctx).mInstances.mVertexArrays.count(array) > 0)) {
        std::shared_ptr<VertexArray> l__res_0 = subNewVertexArray(observer, call, l_ctx);
        checkNotNull(l_ctx).mInstances.mVertexArrays[array] = l__res_0;
    }
    checkNotNull(l_ctx).mBoundVertexArray = array;
    return;
}

void GlesSpy::subGenVertexArrays(CallObserver* observer, const std::function<void()>& call, GLsizei count, VertexArrayId* arrays) {
    if ((count) < ((GLsizei)(0L))) {
        subGlErrorInvalidValue(observer, call);
    }
    Slice<VertexArrayId> l_a = slice(arrays, (uint64_t)((GLsizei)(0L)), (uint64_t)(count));
    for (GLsizei l_i = (GLsizei)(0L); l_i < count; ++l_i) {
        VertexArrayId l_id = (VertexArrayId)(slice(arrays, (uint64_t)((GLsizei)(0L)), (uint64_t)(count))[(uint64_t)(l_i)]);
        observer->write<VertexArrayId>(l_a, (uint64_t)(l_i), l_id);
    }
    return;
}

void GlesSpy::subVertexAttribF(CallObserver* observer, const std::function<void()>& call, AttributeLocation location, Vec4f value) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    if ((location) >= ((AttributeLocation)(checkNotNull(l_ctx).mConstants.mMaxVertexAttribs))) {
        subGlErrorInvalidValue(observer, call);
    }
    Slice<Vec4f> l_vals = make<Vec4f>(1ULL);
    observer->write<Vec4f>(l_vals, 0ULL, value);
    checkNotNull(l_ctx).mVertexAttributes[location] = VertexAttributeValue(l_vals.as<uint8_t>());
    return;
}

void GlesSpy::subVertexAttribDivisor(CallObserver* observer, const std::function<void()>& call, AttributeLocation index, GLuint divisor) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    VertexBufferBindingIndex l_binding_index = (VertexBufferBindingIndex)(index);
    subVertexAttribBinding(observer, call, l_ctx, index, l_binding_index);
    std::shared_ptr<VertexArray> l_vao = findOrZero(checkNotNull(l_ctx).mInstances.mVertexArrays, checkNotNull(l_ctx).mBoundVertexArray);
    checkNotNull(findOrZero(checkNotNull(l_vao).mVertexBufferBindings, l_binding_index)).mDivisor = divisor;
    return;
}

void GlesSpy::subSupportsBits(CallObserver* observer, const std::function<void()>& call, uint32_t seenBits, uint32_t validBits) {
    if (((seenBits) & (validBits)) != (seenBits)) {
        subGlErrorInvalidValue(observer, call);
    }
    return;
}

void GlesSpy::subRequiresExtension3(CallObserver* observer, const std::function<void()>& call, uint32_t ext, uint32_t ext2, uint32_t ext3) {
    return;
}

void GlesSpy::subGlErrorInvalidOperationMsg(CallObserver* observer, const std::function<void()>& call, const char* m) {
    onGlError(observer, GLenum::GL_INVALID_OPERATION);
    (void)newMsg(observer, Severity::SEVERITY_ERROR, m);
    abort();
    return;
}

void GlesSpy::subGlErrorInvalidValueMsg(CallObserver* observer, const std::function<void()>& call, const char* m) {
    onGlError(observer, GLenum::GL_INVALID_VALUE);
    (void)newMsg(observer, Severity::SEVERITY_ERROR, m);
    abort();
    return;
}

int32_t GlesSpy::subMin(CallObserver* observer, const std::function<void()>& call, int32_t a, int32_t b) {
    return /* switch((a) < (b)) */
        /* case true: */((((a) < (b)) == (true))) ? (a) :
        /* case false: */((((a) < (b)) == (false))) ? (b) :
        /* default: */ 0;
}

void GlesSpy::subApplyStaticContextState(CallObserver* observer, const std::function<void()>& call, std::shared_ptr<Context> ctx, std::shared_ptr<StaticContextState> staticState) {
    if ((staticState) != (std::shared_ptr<StaticContextState>())) {
        RenderbufferId l_color_id = (RenderbufferId)(4294967295UL);
        RenderbufferId l_depth_id = (RenderbufferId)(4294967294UL);
        RenderbufferId l_stencil_id = (RenderbufferId)(4294967293UL);
        checkNotNull(ctx).mConstants = checkNotNull(staticState).mConstants;
        checkNotNull(ctx).mInstances.mFramebuffers[(FramebufferId)(0UL)] = std::shared_ptr<Framebuffer>(new Framebuffer(GLenumToFramebufferAttachment(), GLintToGLenum(), GLenum::GL_BACK, (GLint)(0L), (GLint)(0L), (GLint)(0L), (GLint)(0L), GLbooleanLabels::GL_FALSE, ""));
        checkNotNull(ctx).mInstances.mBuffers[(BufferId)(0UL)] = std::shared_ptr<Buffer>(new Buffer(Slice<uint8_t>(), (GLsizeiptr)(0L), GLenum::GL_STATIC_DRAW, 0, GLbooleanLabels::GL_FALSE, nullptr, (GLintptr)(0L), (GLsizeiptr)(0L), ""));
        checkNotNull(ctx).mInstances.mRenderbuffers[(RenderbufferId)(0UL)] = std::shared_ptr<Renderbuffer>(new Renderbuffer(Slice<uint8_t>(), (GLsizei)(0L), (GLsizei)(0L), GLenum::GL_RGBA4, ""));
        checkNotNull(ctx).mInstances.mTransformFeedbacks[(TransformFeedbackId)(0UL)] = std::shared_ptr<TransformFeedback>(new TransformFeedback(GLuintToBufferBinding(), GLbooleanLabels::GL_FALSE, GLbooleanLabels::GL_FALSE, ""));
        std::shared_ptr<VertexArray> l__res_0 = subNewVertexArray(observer, call, ctx);
        checkNotNull(ctx).mInstances.mVertexArrays[(VertexArrayId)(0UL)] = l__res_0;
        checkNotNull(ctx).mTextureUnits[GLenum::GL_TEXTURE0] = std::shared_ptr<TextureUnit>(new TextureUnit((TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (SamplerId)(0UL)));
        checkNotNull(ctx).mInstances.mDefaultTextures.mTexture2d = std::shared_ptr<Texture>(new Texture(0, GLenum::GL_TEXTURE_2D, 0, 0, GLintToImage(), GLintToCubemapLevel(), GLenum::GL_RED, GLenum::GL_GREEN, GLenum::GL_BLUE, GLenum::GL_ALPHA, std::move(Vec4f{(GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f)}), GLenum::GL_NEAREST_MIPMAP_LINEAR, GLenum::GL_LINEAR, GLenum::GL_REPEAT, GLenum::GL_REPEAT, GLenum::GL_REPEAT, (GLfloat)(-1000.f), (GLfloat)(1000.f), (GLint)(0L), (GLint)(1000L), GLenum::GL_DEPTH_COMPONENT, GLenum::GL_NONE, GLenum::GL_LEQUAL, GLbooleanLabels::GL_FALSE, (GLuint)(0UL), "", (GLfloat)(1.f)));
        checkNotNull(ctx).mInstances.mDefaultTextures.mTexture2dArray = std::shared_ptr<Texture>(new Texture(0, GLenum::GL_TEXTURE_2D_ARRAY, 0, 0, GLintToImage(), GLintToCubemapLevel(), GLenum::GL_RED, GLenum::GL_GREEN, GLenum::GL_BLUE, GLenum::GL_ALPHA, std::move(Vec4f{(GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f)}), GLenum::GL_NEAREST_MIPMAP_LINEAR, GLenum::GL_LINEAR, GLenum::GL_REPEAT, GLenum::GL_REPEAT, GLenum::GL_REPEAT, (GLfloat)(-1000.f), (GLfloat)(1000.f), (GLint)(0L), (GLint)(1000L), GLenum::GL_DEPTH_COMPONENT, GLenum::GL_NONE, GLenum::GL_LEQUAL, GLbooleanLabels::GL_FALSE, (GLuint)(0UL), "", (GLfloat)(1.f)));
        checkNotNull(ctx).mInstances.mDefaultTextures.mTexture2dMultisample = std::shared_ptr<Texture>(new Texture(0, GLenum::GL_TEXTURE_2D_MULTISAMPLE, 0, 0, GLintToImage(), GLintToCubemapLevel(), GLenum::GL_RED, GLenum::GL_GREEN, GLenum::GL_BLUE, GLenum::GL_ALPHA, std::move(Vec4f{(GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f)}), GLenum::GL_NEAREST_MIPMAP_LINEAR, GLenum::GL_LINEAR, GLenum::GL_REPEAT, GLenum::GL_REPEAT, GLenum::GL_REPEAT, (GLfloat)(-1000.f), (GLfloat)(1000.f), (GLint)(0L), (GLint)(1000L), GLenum::GL_DEPTH_COMPONENT, GLenum::GL_NONE, GLenum::GL_LEQUAL, GLbooleanLabels::GL_FALSE, (GLuint)(0UL), "", (GLfloat)(1.f)));
        checkNotNull(ctx).mInstances.mDefaultTextures.mTexture2dMultisampleArray = std::shared_ptr<Texture>(new Texture(0, GLenum::GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 0, 0, GLintToImage(), GLintToCubemapLevel(), GLenum::GL_RED, GLenum::GL_GREEN, GLenum::GL_BLUE, GLenum::GL_ALPHA, std::move(Vec4f{(GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f)}), GLenum::GL_NEAREST_MIPMAP_LINEAR, GLenum::GL_LINEAR, GLenum::GL_REPEAT, GLenum::GL_REPEAT, GLenum::GL_REPEAT, (GLfloat)(-1000.f), (GLfloat)(1000.f), (GLint)(0L), (GLint)(1000L), GLenum::GL_DEPTH_COMPONENT, GLenum::GL_NONE, GLenum::GL_LEQUAL, GLbooleanLabels::GL_FALSE, (GLuint)(0UL), "", (GLfloat)(1.f)));
        checkNotNull(ctx).mInstances.mDefaultTextures.mTexture3d = std::shared_ptr<Texture>(new Texture(0, GLenum::GL_TEXTURE_3D, 0, 0, GLintToImage(), GLintToCubemapLevel(), GLenum::GL_RED, GLenum::GL_GREEN, GLenum::GL_BLUE, GLenum::GL_ALPHA, std::move(Vec4f{(GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f)}), GLenum::GL_NEAREST_MIPMAP_LINEAR, GLenum::GL_LINEAR, GLenum::GL_REPEAT, GLenum::GL_REPEAT, GLenum::GL_REPEAT, (GLfloat)(-1000.f), (GLfloat)(1000.f), (GLint)(0L), (GLint)(1000L), GLenum::GL_DEPTH_COMPONENT, GLenum::GL_NONE, GLenum::GL_LEQUAL, GLbooleanLabels::GL_FALSE, (GLuint)(0UL), "", (GLfloat)(1.f)));
        checkNotNull(ctx).mInstances.mDefaultTextures.mTextureBuffer = std::shared_ptr<Texture>(new Texture(0, GLenum::GL_TEXTURE_BUFFER, 0, 0, GLintToImage(), GLintToCubemapLevel(), GLenum::GL_RED, GLenum::GL_GREEN, GLenum::GL_BLUE, GLenum::GL_ALPHA, std::move(Vec4f{(GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f)}), GLenum::GL_NEAREST_MIPMAP_LINEAR, GLenum::GL_LINEAR, GLenum::GL_REPEAT, GLenum::GL_REPEAT, GLenum::GL_REPEAT, (GLfloat)(-1000.f), (GLfloat)(1000.f), (GLint)(0L), (GLint)(1000L), GLenum::GL_DEPTH_COMPONENT, GLenum::GL_NONE, GLenum::GL_LEQUAL, GLbooleanLabels::GL_FALSE, (GLuint)(0UL), "", (GLfloat)(1.f)));
        checkNotNull(ctx).mInstances.mDefaultTextures.mTextureCubeMap = std::shared_ptr<Texture>(new Texture(0, GLenum::GL_TEXTURE_CUBE_MAP, 0, 0, GLintToImage(), GLintToCubemapLevel(), GLenum::GL_RED, GLenum::GL_GREEN, GLenum::GL_BLUE, GLenum::GL_ALPHA, std::move(Vec4f{(GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f)}), GLenum::GL_NEAREST_MIPMAP_LINEAR, GLenum::GL_LINEAR, GLenum::GL_REPEAT, GLenum::GL_REPEAT, GLenum::GL_REPEAT, (GLfloat)(-1000.f), (GLfloat)(1000.f), (GLint)(0L), (GLint)(1000L), GLenum::GL_DEPTH_COMPONENT, GLenum::GL_NONE, GLenum::GL_LEQUAL, GLbooleanLabels::GL_FALSE, (GLuint)(0UL), "", (GLfloat)(1.f)));
        checkNotNull(ctx).mInstances.mDefaultTextures.mTextureCubeMapArray = std::shared_ptr<Texture>(new Texture(0, GLenum::GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, GLintToImage(), GLintToCubemapLevel(), GLenum::GL_RED, GLenum::GL_GREEN, GLenum::GL_BLUE, GLenum::GL_ALPHA, std::move(Vec4f{(GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f)}), GLenum::GL_NEAREST_MIPMAP_LINEAR, GLenum::GL_LINEAR, GLenum::GL_REPEAT, GLenum::GL_REPEAT, GLenum::GL_REPEAT, (GLfloat)(-1000.f), (GLfloat)(1000.f), (GLint)(0L), (GLint)(1000L), GLenum::GL_DEPTH_COMPONENT, GLenum::GL_NONE, GLenum::GL_LEQUAL, GLbooleanLabels::GL_FALSE, (GLuint)(0UL), "", (GLfloat)(1.f)));
        checkNotNull(ctx).mInstances.mDefaultTextures.mTextureExternalOes = std::shared_ptr<Texture>(new Texture(0, GLenum::GL_TEXTURE_EXTERNAL_OES, 0, 0, GLintToImage(), GLintToCubemapLevel(), GLenum::GL_RED, GLenum::GL_GREEN, GLenum::GL_BLUE, GLenum::GL_ALPHA, std::move(Vec4f{(GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f)}), GLenum::GL_NEAREST_MIPMAP_LINEAR, GLenum::GL_LINEAR, GLenum::GL_REPEAT, GLenum::GL_REPEAT, GLenum::GL_REPEAT, (GLfloat)(-1000.f), (GLfloat)(1000.f), (GLint)(0L), (GLint)(1000L), GLenum::GL_DEPTH_COMPONENT, GLenum::GL_NONE, GLenum::GL_LEQUAL, GLbooleanLabels::GL_FALSE, (GLuint)(0UL), "", (GLfloat)(1.f)));
        checkNotNull(ctx).mInstances.mRenderbuffers[l_color_id] = std::shared_ptr<Renderbuffer>(new Renderbuffer(Slice<uint8_t>(), (GLsizei)(0L), (GLsizei)(0L), GLenum::GL_RGBA4, ""));
        checkNotNull(ctx).mInstances.mRenderbuffers[l_depth_id] = std::shared_ptr<Renderbuffer>(new Renderbuffer(Slice<uint8_t>(), (GLsizei)(0L), (GLsizei)(0L), GLenum::GL_RGBA4, ""));
        checkNotNull(ctx).mInstances.mRenderbuffers[l_stencil_id] = std::shared_ptr<Renderbuffer>(new Renderbuffer(Slice<uint8_t>(), (GLsizei)(0L), (GLsizei)(0L), GLenum::GL_RGBA4, ""));
        std::shared_ptr<Framebuffer> l_backbuffer = findOrZero(checkNotNull(ctx).mInstances.mFramebuffers, (FramebufferId)(0UL));
        checkNotNull(l_backbuffer).mAttachments[GLenum::GL_COLOR_ATTACHMENT0] = FramebufferAttachment(GLenum::GL_RENDERBUFFER, (GLuint)(l_color_id), (GLint)(0L), GLenum::GL_NONE, (GLint)(0L), GLbooleanLabels::GL_FALSE);
        checkNotNull(l_backbuffer).mAttachments[GLenum::GL_DEPTH_ATTACHMENT] = FramebufferAttachment(GLenum::GL_RENDERBUFFER, (GLuint)(l_depth_id), (GLint)(0L), GLenum::GL_NONE, (GLint)(0L), GLbooleanLabels::GL_FALSE);
        checkNotNull(l_backbuffer).mAttachments[GLenum::GL_STENCIL_ATTACHMENT] = FramebufferAttachment(GLenum::GL_RENDERBUFFER, (GLuint)(l_stencil_id), (GLint)(0L), GLenum::GL_NONE, (GLint)(0L), GLbooleanLabels::GL_FALSE);
        checkNotNull(ctx).mBoundFramebuffers[GLenum::GL_DRAW_FRAMEBUFFER] = (FramebufferId)(0UL);
        checkNotNull(ctx).mBoundFramebuffers[GLenum::GL_READ_FRAMEBUFFER] = (FramebufferId)(0UL);
        for (AttributeLocation l_i = (AttributeLocation)(0UL); l_i < (AttributeLocation)(checkNotNull(staticState).mConstants.mMaxVertexAttribs); ++l_i) {
            Slice<Vec4f> l_v = make<Vec4f>(1ULL);
            observer->write<Vec4f>(l_v, 0ULL, {(GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(0.f), (GLfloat)(1.f)});
            checkNotNull(ctx).mVertexAttributes[l_i] = VertexAttributeValue(l_v.as<uint8_t>());
        }
        for (GLint l_i = (GLint)(0L); l_i < checkNotNull(staticState).mConstants.mMaxCombinedTextureImageUnits; ++l_i) {
            uint32_t l_name = (GLenum::GL_TEXTURE0) + ((uint32_t)(l_i));
            checkNotNull(ctx).mTextureUnits[l_name] = std::shared_ptr<TextureUnit>(new TextureUnit((TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (TextureId)(0UL), (SamplerId)(0UL)));
        }
        for (GLuint l_i = (GLuint)(0UL); l_i < (GLuint)(checkNotNull(staticState).mConstants.mMaxImageUnits); ++l_i) {
            checkNotNull(ctx).mImageUnits[l_i] = ImageUnit((TextureId)(0UL), (GLint)(0L), GLbooleanLabels::GL_FALSE, (GLint)(0L), GLenum::GL_READ_ONLY, GLenum::GL_R32UI);
        }
        for (DrawBufferIndex l_i = (DrawBufferIndex)(0UL); l_i < (DrawBufferIndex)(checkNotNull(ctx).mConstants.mMaxDrawBuffers); ++l_i) {
            checkNotNull(ctx).mFragmentOperations.mBlend[l_i] = BlendState(GLbooleanLabels::GL_FALSE, GLenum::GL_ONE, GLenum::GL_ONE, GLenum::GL_ZERO, GLenum::GL_ZERO, GLenum::GL_FUNC_ADD, GLenum::GL_FUNC_ADD);
            checkNotNull(ctx).mFramebuffer.mColorWritemask[l_i] = {GLbooleanLabels::GL_TRUE, GLbooleanLabels::GL_TRUE, GLbooleanLabels::GL_TRUE, GLbooleanLabels::GL_TRUE};
        }
        checkNotNull(ctx).mInfo.mInitialized = true;
    }
    return;
}

void GlesSpy::subGetnUniformfv_GLuint__P(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei bufSize, GLuint* values) {
    (void)program;
    (void)location;
    observer->write(slice((char*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(bufSize)));
    return;
}

void GlesSpy::subProgramUniformv_GLint__S(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, Slice<GLint> values, uint32_t type) {
    subSetProgramUniform(observer, call, program, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subProgramUniformv_Vec2f__S(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, Slice<Vec2f> values, uint32_t type) {
    subSetProgramUniform(observer, call, program, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subProgramUniformv_Vec3i__S(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, Slice<Vec3i> values, uint32_t type) {
    subSetProgramUniform(observer, call, program, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subProgramUniformv_Vec3u__S(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, Slice<Vec3u> values, uint32_t type) {
    subSetProgramUniform(observer, call, program, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subProgramUniformv_Vec4f__S(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, Slice<Vec4f> values, uint32_t type) {
    subSetProgramUniform(observer, call, program, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subProgramUniformMatrixv_Mat2x3f__S(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLboolean transpose, Slice<Mat2x3f> values, uint32_t type) {
    (void)transpose;
    subSetProgramUniform(observer, call, program, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subProgramUniformMatrixv_Mat3f__S(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLboolean transpose, Slice<Mat3f> values, uint32_t type) {
    (void)transpose;
    subSetProgramUniform(observer, call, program, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subProgramUniformMatrixv_Mat3x2f__S(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLboolean transpose, Slice<Mat3x2f> values, uint32_t type) {
    (void)transpose;
    subSetProgramUniform(observer, call, program, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subProgramUniformMatrixv_Mat3x4f__S(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLboolean transpose, Slice<Mat3x4f> values, uint32_t type) {
    (void)transpose;
    subSetProgramUniform(observer, call, program, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subProgramUniformMatrixv_Mat4x3f__S(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLboolean transpose, Slice<Mat4x3f> values, uint32_t type) {
    (void)transpose;
    subSetProgramUniform(observer, call, program, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subUniformMatrixv_Mat2x3f__S(CallObserver* observer, const std::function<void()>& call, UniformLocation location, GLboolean transpose, Slice<Mat2x3f> values, uint32_t type) {
    (void)transpose;
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subSetProgramUniform(observer, call, checkNotNull(l_ctx).mBoundProgram, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subUniformMatrixv_Mat3x2f__S(CallObserver* observer, const std::function<void()>& call, UniformLocation location, GLboolean transpose, Slice<Mat3x2f> values, uint32_t type) {
    (void)transpose;
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subSetProgramUniform(observer, call, checkNotNull(l_ctx).mBoundProgram, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subUniformMatrixv_Mat3x4f__S(CallObserver* observer, const std::function<void()>& call, UniformLocation location, GLboolean transpose, Slice<Mat3x4f> values, uint32_t type) {
    (void)transpose;
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subSetProgramUniform(observer, call, checkNotNull(l_ctx).mBoundProgram, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subUniformMatrixv_Mat4x3f__S(CallObserver* observer, const std::function<void()>& call, UniformLocation location, GLboolean transpose, Slice<Mat4x3f> values, uint32_t type) {
    (void)transpose;
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subSetProgramUniform(observer, call, checkNotNull(l_ctx).mBoundProgram, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subGetStateVariable_GLint64(CallObserver* observer, const std::function<void()>& call, uint32_t name, bool isIndexed, GLuint index, GLint64* v) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    switch (name) {
        case GLenum::GL_ACTIVE_TEXTURE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mActiveTextureUnit));
            break;
        }
        case GLenum::GL_ALIASED_LINE_WIDTH_RANGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint64> l_s = slice(v, 0ULL, 2ULL);
            observer->write<GLint64>(l_s, 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mAliasedLineWidthRange[0ULL]));
            observer->write<GLint64>(l_s, 1ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mAliasedLineWidthRange[1ULL]));
            break;
        }
        case GLenum::GL_ALIASED_POINT_SIZE_RANGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint64> l_s = slice(v, 0ULL, 2ULL);
            observer->write<GLint64>(l_s, 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mAliasedPointSizeRange[0ULL]));
            observer->write<GLint64>(l_s, 1ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mAliasedPointSizeRange[1ULL]));
            break;
        }
        case GLenum::GL_ALPHA_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_ARRAY_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundBuffers.mArrayBuffer));
            break;
        }
        case GLenum::GL_ATOMIC_COUNTER_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mAtomicCounterBuffers, index).mBinding));
            } else {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundBuffers.mAtomicCounterBuffer));
            }
            break;
        }
        case GLenum::GL_ATOMIC_COUNTER_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mAtomicCounterBuffers, index).mSize));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_ATOMIC_COUNTER_BUFFER_START: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mAtomicCounterBuffers, index).mStart));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_BLEND: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mEnabled));
            break;
        }
        case GLenum::GL_BLEND_COLOR: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint64> l_s = slice(v, 0ULL, 4ULL);
            observer->write<GLint64>(l_s, 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mBlendColor.mRed));
            observer->write<GLint64>(l_s, 1ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mBlendColor.mGreen));
            observer->write<GLint64>(l_s, 2ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mBlendColor.mBlue));
            observer->write<GLint64>(l_s, 3ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mBlendColor.mAlpha));
            break;
        }
        case GLenum::GL_BLEND_DST_ALPHA: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mDstAlpha));
            break;
        }
        case GLenum::GL_BLEND_DST_RGB: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mDstRgb));
            break;
        }
        case GLenum::GL_BLEND_EQUATION_ALPHA: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mEquationAlpha));
            break;
        }
        case GLenum::GL_BLEND_EQUATION_RGB: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mEquationRgb));
            break;
        }
        case GLenum::GL_BLEND_SRC_ALPHA: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mSrcAlpha));
            break;
        }
        case GLenum::GL_BLEND_SRC_RGB: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mSrcRgb));
            break;
        }
        case GLenum::GL_BLUE_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_COLOR_CLEAR_VALUE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint64> l_s = slice(v, 0ULL, 4ULL);
            observer->write<GLint64>(l_s, 0ULL, (GLint64)(checkNotNull(l_ctx).mFramebuffer.mColorClearValue[0ULL]));
            observer->write<GLint64>(l_s, 1ULL, (GLint64)(checkNotNull(l_ctx).mFramebuffer.mColorClearValue[1ULL]));
            observer->write<GLint64>(l_s, 2ULL, (GLint64)(checkNotNull(l_ctx).mFramebuffer.mColorClearValue[2ULL]));
            observer->write<GLint64>(l_s, 3ULL, (GLint64)(checkNotNull(l_ctx).mFramebuffer.mColorClearValue[3ULL]));
            break;
        }
        case GLenum::GL_COLOR_WRITEMASK: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint64> l_s = slice(v, 0ULL, 4ULL);
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint64>(l_s, 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mFramebuffer.mColorWritemask, l_i)[0ULL]));
            observer->write<GLint64>(l_s, 1ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mFramebuffer.mColorWritemask, l_i)[1ULL]));
            observer->write<GLint64>(l_s, 2ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mFramebuffer.mColorWritemask, l_i)[2ULL]));
            observer->write<GLint64>(l_s, 3ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mFramebuffer.mColorWritemask, l_i)[3ULL]));
            break;
        }
        case GLenum::GL_COMPRESSED_TEXTURE_FORMATS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint64> l_s = slice(v, 0ULL, uint64_t((checkNotNull(l_ctx).mConstants.mCompressedTextureFormats.size())));
            {
                int32_t l__ = 0;
                for (U32ToGLenum::iterator it = checkNotNull(l_ctx).mConstants.mCompressedTextureFormats.begin(); it != checkNotNull(l_ctx).mConstants.mCompressedTextureFormats.end(); ++it, ++l__) {
                    uint32_t l_i = it->first;
                    uint32_t l_f = it->second;
                    observer->write<GLint64>(l_s, (uint64_t)(l_i), (GLint64)(l_f));
                }
            }
            break;
        }
        case GLenum::GL_CONTEXT_FLAGS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mContextFlags));
            break;
        }
        case GLenum::GL_CONTEXT_ROBUST_ACCESS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_COPY_READ_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundBuffers.mCopyReadBuffer));
            break;
        }
        case GLenum::GL_COPY_WRITE_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundBuffers.mCopyWriteBuffer));
            break;
        }
        case GLenum::GL_CULL_FACE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mCullFace));
            break;
        }
        case GLenum::GL_CULL_FACE_MODE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mCullFaceMode));
            break;
        }
        case GLenum::GL_CURRENT_PROGRAM: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundProgram));
            break;
        }
        case GLenum::GL_DEBUG_GROUP_STACK_DEPTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_DEBUG_LOGGED_MESSAGES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_DEPTH_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_DEPTH_CLEAR_VALUE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFramebuffer.mDepthClearValue));
            break;
        }
        case GLenum::GL_DEPTH_FUNC: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mDepth.mFunc));
            break;
        }
        case GLenum::GL_DEPTH_RANGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint64> l_s = slice(v, 0ULL, 2ULL);
            observer->write<GLint64>(l_s, 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mDepthRange[0ULL]));
            observer->write<GLint64>(l_s, 1ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mDepthRange[1ULL]));
            break;
        }
        case GLenum::GL_DEPTH_TEST: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mDepth.mTest));
            break;
        }
        case GLenum::GL_DEPTH_WRITEMASK: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFramebuffer.mDepthWritemask));
            break;
        }
        case GLenum::GL_DISPATCH_INDIRECT_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundBuffers.mDispatchIndirectBuffer));
            break;
        }
        case GLenum::GL_DITHER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mDither));
            break;
        }
        case GLenum::GL_DRAW_BUFFER: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_DRAW_BUFFER0: // fall-through...
        case GLenum::GL_DRAW_BUFFER1: // fall-through...
        case GLenum::GL_DRAW_BUFFER2: // fall-through...
        case GLenum::GL_DRAW_BUFFER3: // fall-through...
        case GLenum::GL_DRAW_BUFFER4: // fall-through...
        case GLenum::GL_DRAW_BUFFER5: // fall-through...
        case GLenum::GL_DRAW_BUFFER6: // fall-through...
        case GLenum::GL_DRAW_BUFFER7: // fall-through...
        case GLenum::GL_DRAW_BUFFER8: // fall-through...
        case GLenum::GL_DRAW_BUFFER9: // fall-through...
        case GLenum::GL_DRAW_BUFFER10: // fall-through...
        case GLenum::GL_DRAW_BUFFER11: // fall-through...
        case GLenum::GL_DRAW_BUFFER12: // fall-through...
        case GLenum::GL_DRAW_BUFFER13: // fall-through...
        case GLenum::GL_DRAW_BUFFER14: // fall-through...
        case GLenum::GL_DRAW_BUFFER15: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            std::shared_ptr<Framebuffer> l_framebuffer = subGetBoundFramebufferOrErrorInvalidEnum(observer, call, GLenum::GL_DRAW_FRAMEBUFFER);
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_framebuffer).mDrawBuffer, (GLint)((name) - (GLenum::GL_DRAW_BUFFER0)))));
            break;
        }
        case GLenum::GL_DRAW_FRAMEBUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mBoundFramebuffers, GLenum::GL_FRAMEBUFFER)));
            break;
        }
        case GLenum::GL_ELEMENT_ARRAY_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(l_ctx).mInstances.mVertexArrays, checkNotNull(l_ctx).mBoundVertexArray)).mElementArrayBuffer));
            break;
        }
        case GLenum::GL_FRAGMENT_INTERPOLATION_OFFSET_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mFragmentInterpolationOffsetBits));
            break;
        }
        case GLenum::GL_FRAGMENT_SHADER_DERIVATIVE_HINT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_FRONT_FACE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mFrontFace));
            break;
        }
        case GLenum::GL_GENERATE_MIPMAP_HINT: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mMiscellaneous.mGenerateMipmapHint));
            break;
        }
        case GLenum::GL_GREEN_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_IMAGE_BINDING_NAME: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mImageUnits, index).mName));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_IMAGE_BINDING_LEVEL: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mImageUnits, index).mLevel));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_IMAGE_BINDING_LAYERED: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mImageUnits, index).mLayered));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_IMAGE_BINDING_LAYER: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mImageUnits, index).mLayer));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_IMAGE_BINDING_ACCESS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mImageUnits, index).mAccess));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_IMAGE_BINDING_FORMAT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mImageUnits, index).mFormat));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_IMPLEMENTATION_COLOR_READ_FORMAT: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_IMPLEMENTATION_COLOR_READ_TYPE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_LAYER_PROVOKING_VERTEX: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mLayerProvokingVertex));
            break;
        }
        case GLenum::GL_LINE_WIDTH: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mLineWidth));
            break;
        }
        case GLenum::GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mPrimitiveRestartForPatchesSupported));
            break;
        }
        case GLenum::GL_MAJOR_VERSION: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMajorVersion));
            break;
        }
        case GLenum::GL_MAX_3D_TEXTURE_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMax3dTextureSize));
            break;
        }
        case GLenum::GL_MAX_ARRAY_TEXTURE_LAYERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxArrayTextureLayers));
            break;
        }
        case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxAtomicCounterBufferBindings));
            break;
        }
        case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxAtomicCounterBufferSize));
            break;
        }
        case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxCombinedAtomicCounterBuffers));
            break;
        }
        case GLenum::GL_MAX_COLOR_ATTACHMENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxColorAttachments));
            break;
        }
        case GLenum::GL_MAX_COLOR_TEXTURE_SAMPLES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxColorTextureSamples));
            break;
        }
        case GLenum::GL_MAX_DEPTH_TEXTURE_SAMPLES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxDepthTextureSamples));
            break;
        }
        case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxCombinedAtomicCounters));
            break;
        }
        case GLenum::GL_MAX_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxImageUnits));
            break;
        }
        case GLenum::GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxCombinedComputeUniformComponents));
            break;
        }
        case GLenum::GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedFragmentUniformComponents);
            break;
        }
        case GLenum::GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxCombinedGeometryUniformComponents));
            break;
        }
        case GLenum::GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxCombinedShaderStorageBlocks));
            break;
        }
        case GLenum::GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxCombinedTessControlUniformComponents));
            break;
        }
        case GLenum::GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxCombinedTessEvaluationUniformComponents));
            break;
        }
        case GLenum::GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxCombinedTextureImageUnits));
            break;
        }
        case GLenum::GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxCombinedShaderOutputResources));
            break;
        }
        case GLenum::GL_MAX_COMBINED_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxCombinedUniformBlocks));
            break;
        }
        case GLenum::GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedVertexUniformComponents);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxComputeAtomicCounterBuffers));
            break;
        }
        case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxComputeAtomicCounters));
            break;
        }
        case GLenum::GL_MAX_COMPUTE_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxComputeImageUniforms));
            break;
        }
        case GLenum::GL_MAX_COMBINED_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxCombinedImageUniforms));
            break;
        }
        case GLenum::GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxComputeShaderStorageBlocks));
            break;
        }
        case GLenum::GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxComputeTextureImageUnits));
            break;
        }
        case GLenum::GL_MAX_COMPUTE_SHARED_MEMORY_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxComputeSharedMemorySize));
            break;
        }
        case GLenum::GL_MAX_COMPUTE_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxComputeUniformBlocks));
            break;
        }
        case GLenum::GL_MAX_COMPUTE_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxComputeUniformComponents));
            break;
        }
        case GLenum::GL_MAX_COMPUTE_WORK_GROUP_COUNT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxComputeWorkGroupCount[index]));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxComputeWorkGroupInvocations));
            break;
        }
        case GLenum::GL_MAX_COMPUTE_WORK_GROUP_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxComputeWorkGroupSize[index]));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_MAX_CUBE_MAP_TEXTURE_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxCubeMapTextureSize));
            break;
        }
        case GLenum::GL_MAX_DEBUG_GROUP_STACK_DEPTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxDebugGroupStackDepth));
            break;
        }
        case GLenum::GL_MAX_DEBUG_LOGGED_MESSAGES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxDebugLoggedMessages));
            break;
        }
        case GLenum::GL_MAX_DEBUG_MESSAGE_LENGTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxDebugMessageLength));
            break;
        }
        case GLenum::GL_MAX_DRAW_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxDrawBuffers));
            break;
        }
        case GLenum::GL_MAX_ELEMENT_INDEX: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxElementIndex);
            break;
        }
        case GLenum::GL_MAX_ELEMENTS_INDICES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxElementsIndices));
            break;
        }
        case GLenum::GL_MAX_ELEMENTS_VERTICES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxElementsVertices));
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFragmentAtomicCounterBuffers));
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFragmentAtomicCounters));
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFragmentImageUniforms));
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_INPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFragmentInputComponents));
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_INTERPOLATION_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFragmentInterpolationOffset));
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFragmentShaderStorageBlocks));
            break;
        }
        case GLenum::GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMinProgramTextureGatherOffset));
            break;
        }
        case GLenum::GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxProgramTextureGatherOffset));
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFragmentUniformBlocks));
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFragmentUniformComponents));
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_UNIFORM_VECTORS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFragmentUniformVectors));
            break;
        }
        case GLenum::GL_MAX_FRAMEBUFFER_HEIGHT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFramebufferHeight));
            break;
        }
        case GLenum::GL_MAX_FRAMEBUFFER_LAYERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFramebufferLayers));
            break;
        }
        case GLenum::GL_MAX_FRAMEBUFFER_SAMPLES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFramebufferSamples));
            break;
        }
        case GLenum::GL_MAX_FRAMEBUFFER_WIDTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxFramebufferWidth));
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxGeometryAtomicCounterBuffers));
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxGeometryAtomicCounters));
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxGeometryImageUniforms));
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_INPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxGeometryInputComponents));
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_OUTPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxGeometryOutputComponents));
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_OUTPUT_VERTICES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxGeometryOutputVertices));
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_SHADER_INVOCATIONS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxGeometryShaderInvocations));
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxGeometryShaderStorageBlocks));
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxGeometryTextureImageUnits));
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxGeometryTotalOutputComponents));
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxGeometryUniformBlocks));
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxGeometryUniformComponents));
            break;
        }
        case GLenum::GL_MAX_INTEGER_SAMPLES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxIntegerSamples));
            break;
        }
        case GLenum::GL_MAX_LABEL_LENGTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxLabelLength));
            break;
        }
        case GLenum::GL_MAX_PROGRAM_TEXEL_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxProgramTexelOffset));
            break;
        }
        case GLenum::GL_MAX_RENDERBUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxRenderbufferSize));
            break;
        }
        case GLenum::GL_MAX_SAMPLE_MASK_WORDS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxSampleMaskWords));
            break;
        }
        case GLenum::GL_MAX_SAMPLES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_MAX_SERVER_WAIT_TIMEOUT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxServerWaitTimeout);
            break;
        }
        case GLenum::GL_MAX_SHADER_STORAGE_BLOCK_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxShaderStorageBlockSize);
            break;
        }
        case GLenum::GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxShaderStorageBufferBindings));
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessControlAtomicCounterBuffers));
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessControlAtomicCounters));
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessControlImageUniforms));
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_INPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessControlInputComponents));
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessControlOutputComponents));
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessControlShaderStorageBlocks));
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessControlTextureImageUnits));
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessControlTotalOutputComponents));
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessControlUniformBlocks));
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessControlUniformComponents));
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessEvaluationAtomicCounterBuffers));
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessEvaluationAtomicCounters));
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessEvaluationImageUniforms));
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessEvaluationInputComponents));
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessEvaluationOutputComponents));
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessEvaluationShaderStorageBlocks));
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessEvaluationTextureImageUnits));
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessEvaluationUniformBlocks));
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessEvaluationUniformComponents));
            break;
        }
        case GLenum::GL_MAX_TESS_GEN_LEVEL: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessGenLevel));
            break;
        }
        case GLenum::GL_MAX_PATCH_VERTICES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxPatchVertices));
            break;
        }
        case GLenum::GL_MAX_TESS_PATCH_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTessPatchComponents));
            break;
        }
        case GLenum::GL_MAX_TEXTURE_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTextureBufferSize));
            break;
        }
        case GLenum::GL_MAX_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTextureImageUnits));
            break;
        }
        case GLenum::GL_MAX_TEXTURE_LOD_BIAS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTextureLodBias));
            break;
        }
        case GLenum::GL_MAX_TEXTURE_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTextureSize));
            break;
        }
        case GLenum::GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTransformFeedbackInterleavedComponents));
            break;
        }
        case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTransformFeedbackSeparateAttribs));
            break;
        }
        case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTransformFeedbackSeparateComponents));
            break;
        }
        case GLenum::GL_MAX_UNIFORM_BLOCK_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxUniformBlockSize);
            break;
        }
        case GLenum::GL_MAX_UNIFORM_BUFFER_BINDINGS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxUniformBufferBindings));
            break;
        }
        case GLenum::GL_MAX_UNIFORM_LOCATIONS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxUniformLocations));
            break;
        }
        case GLenum::GL_MAX_VARYING_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVaryingComponents));
            break;
        }
        case GLenum::GL_MAX_VARYING_VECTORS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVaryingVectors));
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexAtomicCounters));
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexAtomicCounterBuffers));
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATTRIB_BINDINGS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexAttribBindings));
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATTRIB_STRIDE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexAttribStride));
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexAttribRelativeOffset));
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATTRIBS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexAttribs));
            break;
        }
        case GLenum::GL_MAX_VERTEX_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexImageUniforms));
            break;
        }
        case GLenum::GL_MAX_VERTEX_OUTPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexOutputComponents));
            break;
        }
        case GLenum::GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexShaderStorageBlocks));
            break;
        }
        case GLenum::GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexTextureImageUnits));
            break;
        }
        case GLenum::GL_MAX_VERTEX_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexUniformBlocks));
            break;
        }
        case GLenum::GL_MAX_VERTEX_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexUniformComponents));
            break;
        }
        case GLenum::GL_MAX_VERTEX_UNIFORM_VECTORS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxVertexUniformVectors));
            break;
        }
        case GLenum::GL_MAX_VIEWPORT_DIMS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint64> l_s = slice(v, 0ULL, 2ULL);
            observer->write<GLint64>(l_s, 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxViewportDims[0ULL]));
            observer->write<GLint64>(l_s, 1ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxViewportDims[1ULL]));
            break;
        }
        case GLenum::GL_MIN_FRAGMENT_INTERPOLATION_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMinFragmentInterpolationOffset));
            break;
        }
        case GLenum::GL_MIN_PROGRAM_TEXEL_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMinProgramTexelOffset));
            break;
        }
        case GLenum::GL_MIN_SAMPLE_SHADING_VALUE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mMinSampleShadingValue));
            break;
        }
        case GLenum::GL_MINOR_VERSION: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMinorVersion));
            break;
        }
        case GLenum::GL_MULTISAMPLE_LINE_WIDTH_RANGE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            Slice<GLint64> l_s = slice(v, 0ULL, 2ULL);
            observer->write<GLint64>(l_s, 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMultisampleLineWidthRange[0ULL]));
            observer->write<GLint64>(l_s, 1ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMultisampleLineWidthRange[1ULL]));
            break;
        }
        case GLenum::GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMultisampleLineWidthGranularity));
            break;
        }
        case GLenum::GL_NUM_COMPRESSED_TEXTURE_FORMATS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(int64_t((checkNotNull(l_ctx).mConstants.mCompressedTextureFormats.size()))));
            break;
        }
        case GLenum::GL_NUM_EXTENSIONS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(int64_t((checkNotNull(l_ctx).mConstants.mExtensions.size()))));
            break;
        }
        case GLenum::GL_NUM_PROGRAM_BINARY_FORMATS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(int64_t((checkNotNull(l_ctx).mConstants.mProgramBinaryFormats.size()))));
            break;
        }
        case GLenum::GL_NUM_SHADER_BINARY_FORMATS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(int64_t((checkNotNull(l_ctx).mConstants.mShaderBinaryFormats.size()))));
            break;
        }
        case GLenum::GL_PACK_ALIGNMENT: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mPixelStorage.mPackAlignment));
            break;
        }
        case GLenum::GL_PACK_IMAGE_HEIGHT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mPixelStorage.mPackImageHeight));
            break;
        }
        case GLenum::GL_PACK_ROW_LENGTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mPixelStorage.mPackRowLength));
            break;
        }
        case GLenum::GL_PACK_SKIP_IMAGES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mPixelStorage.mPackSkipImages));
            break;
        }
        case GLenum::GL_PACK_SKIP_PIXELS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mPixelStorage.mPackSkipPixels));
            break;
        }
        case GLenum::GL_PACK_SKIP_ROWS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mPixelStorage.mPackSkipRows));
            break;
        }
        case GLenum::GL_PATCH_VERTICES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_PIXEL_PACK_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundBuffers.mPixelPackBuffer));
            break;
        }
        case GLenum::GL_PIXEL_UNPACK_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundBuffers.mPixelUnpackBuffer));
            break;
        }
        case GLenum::GL_POLYGON_OFFSET_FACTOR: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mPolygonOffsetFactor));
            break;
        }
        case GLenum::GL_POLYGON_OFFSET_FILL: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mPolygonOffsetFill));
            break;
        }
        case GLenum::GL_POLYGON_OFFSET_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mPolygonOffsetUnits));
            break;
        }
        case GLenum::GL_PRIMITIVE_BOUNDING_BOX: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 8ULL));
            break;
        }
        case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mMiscellaneous.mPrimitiveRestartFixedIndex));
            break;
        }
        case GLenum::GL_PROGRAM_BINARY_FORMATS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            Slice<GLint64> l_s = slice(v, 0ULL, uint64_t((checkNotNull(l_ctx).mConstants.mProgramBinaryFormats.size())));
            {
                int32_t l__ = 0;
                for (U32ToGLenum::iterator it = checkNotNull(l_ctx).mConstants.mProgramBinaryFormats.begin(); it != checkNotNull(l_ctx).mConstants.mProgramBinaryFormats.end(); ++it, ++l__) {
                    uint32_t l_i = it->first;
                    uint32_t l_f = it->second;
                    observer->write<GLint64>(l_s, (uint64_t)(l_i), (GLint64)(l_f));
                }
            }
            break;
        }
        case GLenum::GL_PROGRAM_PIPELINE_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_RASTERIZER_DISCARD: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mRasterizerDiscard));
            break;
        }
        case GLenum::GL_READ_BUFFER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_READ_FRAMEBUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mBoundFramebuffers, GLenum::GL_READ_FRAMEBUFFER)));
            break;
        }
        case GLenum::GL_RED_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_RENDERBUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mBoundRenderbuffers, GLenum::GL_RENDERBUFFER)));
            break;
        }
        case GLenum::GL_RESET_NOTIFICATION_STRATEGY: {
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mSampleAlphaToCoverage));
            break;
        }
        case GLenum::GL_SAMPLE_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_SAMPLE_COVERAGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mSampleCoverage));
            break;
        }
        case GLenum::GL_SAMPLE_COVERAGE_INVERT: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mSampleCoverageInvert));
            break;
        }
        case GLenum::GL_SAMPLE_COVERAGE_VALUE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mSampleCoverageValue));
            break;
        }
        case GLenum::GL_SAMPLE_SHADING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_SAMPLER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_SAMPLES: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_SCISSOR_BOX: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint64> l_s = slice(v, 0ULL, 4ULL);
            observer->write<GLint64>(l_s, 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mScissor.mBox.mX));
            observer->write<GLint64>(l_s, 1ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mScissor.mBox.mY));
            observer->write<GLint64>(l_s, 2ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mScissor.mBox.mWidth));
            observer->write<GLint64>(l_s, 3ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mScissor.mBox.mHeight));
            break;
        }
        case GLenum::GL_SCISSOR_TEST: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mScissor.mTest));
            break;
        }
        case GLenum::GL_SHADER_BINARY_FORMATS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint64> l_s = slice(v, 0ULL, uint64_t((checkNotNull(l_ctx).mConstants.mShaderBinaryFormats.size())));
            {
                int32_t l__ = 0;
                for (U32ToGLenum::iterator it = checkNotNull(l_ctx).mConstants.mShaderBinaryFormats.begin(); it != checkNotNull(l_ctx).mConstants.mShaderBinaryFormats.end(); ++it, ++l__) {
                    uint32_t l_i = it->first;
                    uint32_t l_f = it->second;
                    observer->write<GLint64>(l_s, (uint64_t)(l_i), (GLint64)(l_f));
                }
            }
            break;
        }
        case GLenum::GL_SHADER_COMPILER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mShaderCompiler));
            break;
        }
        case GLenum::GL_SHADER_STORAGE_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mShaderStorageBuffers, index).mBinding));
            } else {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundBuffers.mShaderStorageBuffer));
            }
            break;
        }
        case GLenum::GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mShaderStorageBufferOffsetAlignment));
            break;
        }
        case GLenum::GL_SHADER_STORAGE_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mShaderStorageBuffers, index).mSize));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_SHADER_STORAGE_BUFFER_START: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mShaderStorageBuffers, index).mStart));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_STENCIL_BACK_FAIL: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackFail));
            break;
        }
        case GLenum::GL_STENCIL_BACK_FUNC: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackFunc));
            break;
        }
        case GLenum::GL_STENCIL_BACK_PASS_DEPTH_FAIL: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackPassDepthFail));
            break;
        }
        case GLenum::GL_STENCIL_BACK_PASS_DEPTH_PASS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackPassDepthPass));
            break;
        }
        case GLenum::GL_STENCIL_BACK_REF: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackRef));
            break;
        }
        case GLenum::GL_STENCIL_BACK_VALUE_MASK: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackValueMask));
            break;
        }
        case GLenum::GL_STENCIL_BACK_WRITEMASK: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFramebuffer.mStencilBackWritemask));
            break;
        }
        case GLenum::GL_STENCIL_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_STENCIL_CLEAR_VALUE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFramebuffer.mStencilClearValue));
            break;
        }
        case GLenum::GL_STENCIL_FAIL: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mFail));
            break;
        }
        case GLenum::GL_STENCIL_FUNC: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mFunc));
            break;
        }
        case GLenum::GL_STENCIL_PASS_DEPTH_FAIL: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mPassDepthFail));
            break;
        }
        case GLenum::GL_STENCIL_PASS_DEPTH_PASS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mPassDepthPass));
            break;
        }
        case GLenum::GL_STENCIL_REF: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mRef));
            break;
        }
        case GLenum::GL_STENCIL_TEST: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mTest));
            break;
        }
        case GLenum::GL_STENCIL_VALUE_MASK: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mValueMask));
            break;
        }
        case GLenum::GL_STENCIL_WRITEMASK: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mFramebuffer.mStencilWritemask));
            break;
        }
        case GLenum::GL_SUBPIXEL_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mSubpixelBits));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_2D: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBinding2d));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_EXTERNAL_OES: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBindingExternalOes));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_2D_ARRAY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBinding2dArray));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_2D_MULTISAMPLE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBinding2dMultisample));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBinding2dMultisampleArray));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_3D: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBinding3d));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_BUFFER: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBindingBuffer));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_CUBE_MAP: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBindingCubeMap));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_CUBE_MAP_ARRAY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBindingCubeMapArray));
            break;
        }
        case GLenum::GL_TEXTURE_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mTextureBufferOffsetAlignment));
            break;
        }
        case GLenum::GL_TRANSFORM_FEEDBACK_ACTIVE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            std::shared_ptr<TransformFeedback> l__res_0 = subGetBoundTransformFeedback(observer, call);
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l__res_0).mActive));
            break;
        }
        case GLenum::GL_TRANSFORM_FEEDBACK_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundTransformFeedback));
            break;
        }
        case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            if (isIndexed) {
                std::shared_ptr<TransformFeedback> l__res_0 = subGetBoundTransformFeedback(observer, call);
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l__res_0).mBuffers, index).mBinding));
            } else {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundBuffers.mTransformFeedbackBuffer));
            }
            break;
        }
        case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            if (isIndexed) {
                std::shared_ptr<TransformFeedback> l__res_0 = subGetBoundTransformFeedback(observer, call);
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l__res_0).mBuffers, index).mSize));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_START: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            if (isIndexed) {
                std::shared_ptr<TransformFeedback> l__res_0 = subGetBoundTransformFeedback(observer, call);
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l__res_0).mBuffers, index).mStart));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_TRANSFORM_FEEDBACK_PAUSED: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            std::shared_ptr<TransformFeedback> l__res_0 = subGetBoundTransformFeedback(observer, call);
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l__res_0).mPaused));
            break;
        }
        case GLenum::GL_UNIFORM_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mUniformBuffers, index).mBinding));
            } else {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundBuffers.mUniformBuffer));
            }
            break;
        }
        case GLenum::GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mUniformBufferOffsetAlignment));
            break;
        }
        case GLenum::GL_UNIFORM_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mUniformBuffers, index).mSize));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_UNIFORM_BUFFER_START: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            if (isIndexed) {
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mUniformBuffers, index).mStart));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_UNPACK_ALIGNMENT: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mPixelStorage.mUnpackAlignment));
            break;
        }
        case GLenum::GL_UNPACK_IMAGE_HEIGHT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mPixelStorage.mUnpackImageHeight));
            break;
        }
        case GLenum::GL_UNPACK_ROW_LENGTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mPixelStorage.mUnpackRowLength));
            break;
        }
        case GLenum::GL_UNPACK_SKIP_IMAGES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mPixelStorage.mUnpackSkipImages));
            break;
        }
        case GLenum::GL_UNPACK_SKIP_PIXELS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mPixelStorage.mUnpackSkipPixels));
            break;
        }
        case GLenum::GL_UNPACK_SKIP_ROWS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mPixelStorage.mUnpackSkipRows));
            break;
        }
        case GLenum::GL_VERTEX_ARRAY_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mBoundVertexArray));
            break;
        }
        case GLenum::GL_VERTEX_BINDING_DIVISOR: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                VertexBufferBindingIndex l_i = (VertexBufferBindingIndex)(index);
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(findOrZero(checkNotNull(l_ctx).mInstances.mVertexArrays, checkNotNull(l_ctx).mBoundVertexArray)).mVertexBufferBindings, l_i)).mDivisor));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_VERTEX_BINDING_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                VertexBufferBindingIndex l_i = (VertexBufferBindingIndex)(index);
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(findOrZero(checkNotNull(l_ctx).mInstances.mVertexArrays, checkNotNull(l_ctx).mBoundVertexArray)).mVertexBufferBindings, l_i)).mOffset));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_VERTEX_BINDING_STRIDE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                VertexBufferBindingIndex l_i = (VertexBufferBindingIndex)(index);
                observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(findOrZero(checkNotNull(findOrZero(checkNotNull(l_ctx).mInstances.mVertexArrays, checkNotNull(l_ctx).mBoundVertexArray)).mVertexBufferBindings, l_i)).mStride));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_VIEWPORT: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint64> l_s = slice(v, 0ULL, 4ULL);
            observer->write<GLint64>(l_s, 0ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mViewport.mX));
            observer->write<GLint64>(l_s, 1ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mViewport.mY));
            observer->write<GLint64>(l_s, 2ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mViewport.mWidth));
            observer->write<GLint64>(l_s, 3ULL, (GLint64)(checkNotNull(l_ctx).mRasterization.mViewport.mHeight));
            break;
        }
        case GLenum::GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_filter_anisotropic);
            observer->write<GLint64>(slice(v, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_ctx).mConstants.mMaxTextureMaxAnisotropyExt));
            break;
        }
        case GLenum::GL_GPU_DISJOINT_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_disjoint_timer_query);
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, name);
        }
    }
    return;
}

void GlesSpy::subGetSamplerParameterv_GLint(CallObserver* observer, const std::function<void()>& call, SamplerId sampler, uint32_t pname, GLint* params) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    std::shared_ptr<Sampler> l_s = findOrZero(checkNotNull(l_ctx).mInstances.mSamplers, sampler);
    switch (pname) {
        case GLenum::GL_TEXTURE_COMPARE_FUNC: {
            observer->write<GLint>(slice(params, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_s).mCompareFunc));
            break;
        }
        case GLenum::GL_TEXTURE_COMPARE_MODE: {
            observer->write<GLint>(slice(params, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_s).mCompareMode));
            break;
        }
        case GLenum::GL_TEXTURE_MIN_FILTER: {
            observer->write<GLint>(slice(params, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_s).mMinFilter));
            break;
        }
        case GLenum::GL_TEXTURE_MAG_FILTER: {
            observer->write<GLint>(slice(params, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_s).mMagFilter));
            break;
        }
        case GLenum::GL_TEXTURE_MIN_LOD: {
            observer->write<GLint>(slice(params, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_s).mMinLod));
            break;
        }
        case GLenum::GL_TEXTURE_MAX_LOD: {
            observer->write<GLint>(slice(params, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_s).mMaxLod));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_R: {
            observer->write<GLint>(slice(params, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_s).mWrapR));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_S: {
            observer->write<GLint>(slice(params, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_s).mWrapS));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_T: {
            observer->write<GLint>(slice(params, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_s).mWrapT));
            break;
        }
        case GLenum::GL_TEXTURE_BORDER_COLOR: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            Slice<GLint> l_p = slice(params, 0ULL, 4ULL);
            observer->write<GLint>(l_p, 0ULL, (GLint)(checkNotNull(l_s).mBorderColor[0ULL]));
            observer->write<GLint>(l_p, 1ULL, (GLint)(checkNotNull(l_s).mBorderColor[1ULL]));
            observer->write<GLint>(l_p, 2ULL, (GLint)(checkNotNull(l_s).mBorderColor[2ULL]));
            observer->write<GLint>(l_p, 3ULL, (GLint)(checkNotNull(l_s).mBorderColor[3ULL]));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, pname);
        }
    }
    return;
}

void GlesSpy::subGetTexParameter_GLuint(CallObserver* observer, const std::function<void()>& call, uint32_t target, uint32_t parameter, GLuint* params) {
    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: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            break;
        }
        case GLenum::GL_TEXTURE_2D_MULTISAMPLE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            break;
        }
        case GLenum::GL_TEXTURE_2D_MULTISAMPLE_ARRAY: // fall-through...
        case GLenum::GL_TEXTURE_CUBE_MAP_ARRAY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, target);
        }
    }
    std::shared_ptr<Texture> l_t = subGetBoundTextureOrErrorInvalidEnum(observer, call, target);
    switch (parameter) {
        case GLenum::GL_TEXTURE_MAG_FILTER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mMagFilter));
            break;
        }
        case GLenum::GL_TEXTURE_MIN_FILTER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mMinFilter));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_S: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mWrapS));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_T: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mWrapT));
            break;
        }
        case GLenum::GL_TEXTURE_BASE_LEVEL: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mBaseLevel));
            break;
        }
        case GLenum::GL_TEXTURE_COMPARE_FUNC: {
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mCompareFunc));
            break;
        }
        case GLenum::GL_TEXTURE_COMPARE_MODE: {
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mCompareMode));
            break;
        }
        case GLenum::GL_TEXTURE_IMMUTABLE_FORMAT: {
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mImmutableFormat));
            break;
        }
        case GLenum::GL_TEXTURE_MAX_LEVEL: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mMaxLevel));
            break;
        }
        case GLenum::GL_TEXTURE_MAX_LOD: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mMaxLod));
            break;
        }
        case GLenum::GL_TEXTURE_MIN_LOD: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mMinLod));
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_A: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mSwizzleA));
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_B: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mSwizzleB));
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_G: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mSwizzleG));
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_R: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mSwizzleR));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_R: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mWrapR));
            break;
        }
        case GLenum::GL_DEPTH_STENCIL_TEXTURE_MODE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mDepthStencilTextureMode));
            break;
        }
        case GLenum::GL_IMAGE_FORMAT_COMPATIBILITY_TYPE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, slice(params, 0ULL, 1ULL)[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_IMMUTABLE_LEVELS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, checkNotNull(l_t).mImmutableLevels);
            break;
        }
        case GLenum::GL_TEXTURE_BORDER_COLOR: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            Slice<GLuint> l_p = slice(params, 0ULL, 4ULL);
            observer->write<GLuint>(l_p, 0ULL, (GLuint)(checkNotNull(l_t).mBorderColor[0ULL]));
            observer->write<GLuint>(l_p, 1ULL, (GLuint)(checkNotNull(l_t).mBorderColor[1ULL]));
            observer->write<GLuint>(l_p, 2ULL, (GLuint)(checkNotNull(l_t).mBorderColor[2ULL]));
            observer->write<GLuint>(l_p, 3ULL, (GLuint)(checkNotNull(l_t).mBorderColor[3ULL]));
            break;
        }
        case GLenum::GL_TEXTURE_MAX_ANISOTROPY_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_filter_anisotropic);
            observer->write<GLuint>(slice(params, 0ULL, 1ULL), 0ULL, (GLuint)(checkNotNull(l_t).mMaxAnisotropy));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, parameter);
        }
    }
    return;
}

void GlesSpy::subSamplerParameterv_GLuint__CP(CallObserver* observer, const std::function<void()>& call, SamplerId sampler, uint32_t pname, GLuint* params) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    std::shared_ptr<Sampler> l_s = findOrZero(checkNotNull(l_ctx).mInstances.mSamplers, sampler);
    switch (pname) {
        case GLenum::GL_TEXTURE_COMPARE_FUNC: {
            checkNotNull(l_s).mCompareFunc = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_COMPARE_MODE: {
            checkNotNull(l_s).mCompareMode = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_MIN_FILTER: {
            checkNotNull(l_s).mMinFilter = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_MAG_FILTER: {
            checkNotNull(l_s).mMagFilter = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_MIN_LOD: {
            checkNotNull(l_s).mMinLod = (GLfloat)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_MAX_LOD: {
            checkNotNull(l_s).mMaxLod = (GLfloat)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_R: {
            checkNotNull(l_s).mWrapR = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_S: {
            checkNotNull(l_s).mWrapS = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_T: {
            checkNotNull(l_s).mWrapT = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_BORDER_COLOR: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, pname);
        }
    }
    return;
}

void GlesSpy::subTexParameterv_GLint__CP(CallObserver* observer, const std::function<void()>& call, uint32_t target, uint32_t pname, GLint* params) {
    if ((target) == (GLenum::GL_TEXTURE_BUFFER)) {
        subGlErrorInvalidEnum(observer, call, target);
    }
    std::shared_ptr<Texture> l_t = subGetBoundTextureOrErrorInvalidEnum(observer, call, target);
    switch (pname) {
        case GLenum::GL_TEXTURE_MAG_FILTER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            uint32_t l_magFilter = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            switch (l_magFilter) {
                case GLenum::GL_NEAREST: // fall-through...
                case GLenum::GL_LINEAR: {
                    break;
                }
                default: {
                    subGlErrorInvalidEnum(observer, call, l_magFilter);
                }
            }
            checkNotNull(l_t).mMagFilter = l_magFilter;
            break;
        }
        case GLenum::GL_TEXTURE_MIN_FILTER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            uint32_t l_minFilter = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            switch (l_minFilter) {
                case GLenum::GL_NEAREST: // fall-through...
                case GLenum::GL_LINEAR: // fall-through...
                case GLenum::GL_NEAREST_MIPMAP_NEAREST: // fall-through...
                case GLenum::GL_LINEAR_MIPMAP_NEAREST: // fall-through...
                case GLenum::GL_NEAREST_MIPMAP_LINEAR: // fall-through...
                case GLenum::GL_LINEAR_MIPMAP_LINEAR: {
                    break;
                }
                default: {
                    subGlErrorInvalidEnum(observer, call, l_minFilter);
                }
            }
            checkNotNull(l_t).mMinFilter = l_minFilter;
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_S: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            uint32_t l__res_0 = subCheckWrapParam(observer, call, (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL)));
            checkNotNull(l_t).mWrapS = l__res_0;
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_T: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            uint32_t l__res_0 = subCheckWrapParam(observer, call, (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL)));
            checkNotNull(l_t).mWrapT = l__res_0;
            break;
        }
        case GLenum::GL_TEXTURE_BASE_LEVEL: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            GLint l_baseLevel = observer->read(slice(params, 0ULL, 1ULL), 0ULL);
            if ((l_baseLevel) < ((GLint)(0L))) {
                subGlErrorInvalidValue(observer, call);
            }
            checkNotNull(l_t).mBaseLevel = l_baseLevel;
            break;
        }
        case GLenum::GL_TEXTURE_COMPARE_FUNC: {
            checkNotNull(l_t).mCompareFunc = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_COMPARE_MODE: {
            checkNotNull(l_t).mCompareMode = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_MAX_LEVEL: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            GLint l_maxLevel = observer->read(slice(params, 0ULL, 1ULL), 0ULL);
            if ((l_maxLevel) < ((GLint)(0L))) {
                subGlErrorInvalidValue(observer, call);
            }
            checkNotNull(l_t).mMaxLevel = l_maxLevel;
            break;
        }
        case GLenum::GL_TEXTURE_MAX_LOD: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            checkNotNull(l_t).mMaxLod = (GLfloat)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_MIN_LOD: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            checkNotNull(l_t).mMinLod = (GLfloat)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_A: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            uint32_t l__res_0 = subCheckSwizzleParam(observer, call, (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL)));
            checkNotNull(l_t).mSwizzleA = l__res_0;
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_B: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            uint32_t l__res_0 = subCheckSwizzleParam(observer, call, (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL)));
            checkNotNull(l_t).mSwizzleB = l__res_0;
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_G: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            uint32_t l__res_0 = subCheckSwizzleParam(observer, call, (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL)));
            checkNotNull(l_t).mSwizzleG = l__res_0;
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_R: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            uint32_t l__res_0 = subCheckSwizzleParam(observer, call, (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL)));
            checkNotNull(l_t).mSwizzleR = l__res_0;
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_R: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            checkNotNull(l_t).mWrapR = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_DEPTH_STENCIL_TEXTURE_MODE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            checkNotNull(l_t).mDepthStencilTextureMode = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_BORDER_COLOR: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        case GLenum::GL_TEXTURE_MAX_ANISOTROPY_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_filter_anisotropic);
            checkNotNull(l_t).mMaxAnisotropy = (GLfloat)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_SRGB_DECODE_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_sRGB_decode);
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, pname);
        }
    }
    return;
}

GLsizei GlesSpy::subMax_GLsizei(CallObserver* observer, const std::function<void()>& call, GLsizei a, GLsizei b) {
    return /* switch((a) > (b)) */
        /* case true: */((((a) > (b)) == (true))) ? (a) :
        /* case false: */((((a) > (b)) == (false))) ? (b) :
        /* default: */ 0;
}

void GlesSpy::subGetBufferParameter_GLint64(CallObserver* observer, const std::function<void()>& call, uint32_t target, uint32_t parameter, GLint64* value) {
    std::shared_ptr<Buffer> l_b = subGetBoundBufferOrError(observer, call, target);
    switch (parameter) {
        case GLenum::GL_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(value, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_b).mSize));
            break;
        }
        case GLenum::GL_BUFFER_USAGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint64>(slice(value, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_b).mUsage));
            break;
        }
        case GLenum::GL_BUFFER_ACCESS_FLAGS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(value, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_b).mAccessFlags));
            break;
        }
        case GLenum::GL_BUFFER_MAPPED: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(value, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_b).mMapped));
            break;
        }
        case GLenum::GL_BUFFER_MAP_LENGTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(value, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_b).mMapLength));
            break;
        }
        case GLenum::GL_BUFFER_MAP_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint64>(slice(value, 0ULL, 1ULL), 0ULL, (GLint64)(checkNotNull(l_b).mMapOffset));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, parameter);
        }
    }
    return;
}

void GlesSpy::subGetBufferParameter_GLint(CallObserver* observer, const std::function<void()>& call, uint32_t target, uint32_t parameter, GLint* value) {
    std::shared_ptr<Buffer> l_b = subGetBoundBufferOrError(observer, call, target);
    switch (parameter) {
        case GLenum::GL_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(value, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_b).mSize));
            break;
        }
        case GLenum::GL_BUFFER_USAGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(value, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_b).mUsage));
            break;
        }
        case GLenum::GL_BUFFER_ACCESS_FLAGS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(value, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_b).mAccessFlags));
            break;
        }
        case GLenum::GL_BUFFER_MAPPED: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(value, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_b).mMapped));
            break;
        }
        case GLenum::GL_BUFFER_MAP_LENGTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(value, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_b).mMapLength));
            break;
        }
        case GLenum::GL_BUFFER_MAP_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(value, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_b).mMapOffset));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, parameter);
        }
    }
    return;
}

void GlesSpy::subGetnUniformfv_GLfloat__P(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLsizei bufSize, GLfloat* values) {
    (void)program;
    (void)location;
    observer->write(slice((char*)(values), (uint64_t)((GLsizei)(0L)), (uint64_t)(bufSize)));
    return;
}

void GlesSpy::subGetUniformv_GLfloat__P(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLfloat* values) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subCheckProgram(observer, call, l_ctx, program);
    (void)program;
    (void)location;
    observer->write(slice(values, 0ULL, 16ULL));
    return;
}

void GlesSpy::subGetUniformv_GLuint__P(CallObserver* observer, const std::function<void()>& call, ProgramId program, UniformLocation location, GLuint* values) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subCheckProgram(observer, call, l_ctx, program);
    (void)program;
    (void)location;
    observer->write(slice(values, 0ULL, 16ULL));
    return;
}

void GlesSpy::subUniformv_GLint__S(CallObserver* observer, const std::function<void()>& call, UniformLocation location, Slice<GLint> values, uint32_t type) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subSetProgramUniform(observer, call, checkNotNull(l_ctx).mBoundProgram, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subUniformv_Vec2f__S(CallObserver* observer, const std::function<void()>& call, UniformLocation location, Slice<Vec2f> values, uint32_t type) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subSetProgramUniform(observer, call, checkNotNull(l_ctx).mBoundProgram, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subUniformv_Vec3i__S(CallObserver* observer, const std::function<void()>& call, UniformLocation location, Slice<Vec3i> values, uint32_t type) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subSetProgramUniform(observer, call, checkNotNull(l_ctx).mBoundProgram, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subUniformv_Vec3u__S(CallObserver* observer, const std::function<void()>& call, UniformLocation location, Slice<Vec3u> values, uint32_t type) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subSetProgramUniform(observer, call, checkNotNull(l_ctx).mBoundProgram, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subUniformv_Vec4f__S(CallObserver* observer, const std::function<void()>& call, UniformLocation location, Slice<Vec4f> values, uint32_t type) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subSetProgramUniform(observer, call, checkNotNull(l_ctx).mBoundProgram, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subUniformMatrixv_Mat3f__S(CallObserver* observer, const std::function<void()>& call, UniformLocation location, GLboolean transpose, Slice<Mat3f> values, uint32_t type) {
    (void)transpose;
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    subSetProgramUniform(observer, call, checkNotNull(l_ctx).mBoundProgram, location, values.as<uint8_t>(), type);
    return;
}

void GlesSpy::subGetStateVariable_GLint(CallObserver* observer, const std::function<void()>& call, uint32_t name, bool isIndexed, GLuint index, GLint* v) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    switch (name) {
        case GLenum::GL_ACTIVE_TEXTURE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mActiveTextureUnit));
            break;
        }
        case GLenum::GL_ALIASED_LINE_WIDTH_RANGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint> l_s = slice(v, 0ULL, 2ULL);
            observer->write<GLint>(l_s, 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mAliasedLineWidthRange[0ULL]));
            observer->write<GLint>(l_s, 1ULL, (GLint)(checkNotNull(l_ctx).mConstants.mAliasedLineWidthRange[1ULL]));
            break;
        }
        case GLenum::GL_ALIASED_POINT_SIZE_RANGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint> l_s = slice(v, 0ULL, 2ULL);
            observer->write<GLint>(l_s, 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mAliasedPointSizeRange[0ULL]));
            observer->write<GLint>(l_s, 1ULL, (GLint)(checkNotNull(l_ctx).mConstants.mAliasedPointSizeRange[1ULL]));
            break;
        }
        case GLenum::GL_ALPHA_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_ARRAY_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundBuffers.mArrayBuffer));
            break;
        }
        case GLenum::GL_ATOMIC_COUNTER_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mAtomicCounterBuffers, index).mBinding));
            } else {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundBuffers.mAtomicCounterBuffer));
            }
            break;
        }
        case GLenum::GL_ATOMIC_COUNTER_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mAtomicCounterBuffers, index).mSize));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_ATOMIC_COUNTER_BUFFER_START: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mAtomicCounterBuffers, index).mStart));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_BLEND: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mEnabled));
            break;
        }
        case GLenum::GL_BLEND_COLOR: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint> l_s = slice(v, 0ULL, 4ULL);
            observer->write<GLint>(l_s, 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mBlendColor.mRed));
            observer->write<GLint>(l_s, 1ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mBlendColor.mGreen));
            observer->write<GLint>(l_s, 2ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mBlendColor.mBlue));
            observer->write<GLint>(l_s, 3ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mBlendColor.mAlpha));
            break;
        }
        case GLenum::GL_BLEND_DST_ALPHA: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mDstAlpha));
            break;
        }
        case GLenum::GL_BLEND_DST_RGB: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mDstRgb));
            break;
        }
        case GLenum::GL_BLEND_EQUATION_ALPHA: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mEquationAlpha));
            break;
        }
        case GLenum::GL_BLEND_EQUATION_RGB: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mEquationRgb));
            break;
        }
        case GLenum::GL_BLEND_SRC_ALPHA: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mSrcAlpha));
            break;
        }
        case GLenum::GL_BLEND_SRC_RGB: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mFragmentOperations.mBlend, l_i).mSrcRgb));
            break;
        }
        case GLenum::GL_BLUE_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_COLOR_CLEAR_VALUE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint> l_s = slice(v, 0ULL, 4ULL);
            observer->write<GLint>(l_s, 0ULL, (GLint)(checkNotNull(l_ctx).mFramebuffer.mColorClearValue[0ULL]));
            observer->write<GLint>(l_s, 1ULL, (GLint)(checkNotNull(l_ctx).mFramebuffer.mColorClearValue[1ULL]));
            observer->write<GLint>(l_s, 2ULL, (GLint)(checkNotNull(l_ctx).mFramebuffer.mColorClearValue[2ULL]));
            observer->write<GLint>(l_s, 3ULL, (GLint)(checkNotNull(l_ctx).mFramebuffer.mColorClearValue[3ULL]));
            break;
        }
        case GLenum::GL_COLOR_WRITEMASK: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint> l_s = slice(v, 0ULL, 4ULL);
            DrawBufferIndex l_i = (DrawBufferIndex)(index);
            observer->write<GLint>(l_s, 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mFramebuffer.mColorWritemask, l_i)[0ULL]));
            observer->write<GLint>(l_s, 1ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mFramebuffer.mColorWritemask, l_i)[1ULL]));
            observer->write<GLint>(l_s, 2ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mFramebuffer.mColorWritemask, l_i)[2ULL]));
            observer->write<GLint>(l_s, 3ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mFramebuffer.mColorWritemask, l_i)[3ULL]));
            break;
        }
        case GLenum::GL_COMPRESSED_TEXTURE_FORMATS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint> l_s = slice(v, 0ULL, uint64_t((checkNotNull(l_ctx).mConstants.mCompressedTextureFormats.size())));
            {
                int32_t l__ = 0;
                for (U32ToGLenum::iterator it = checkNotNull(l_ctx).mConstants.mCompressedTextureFormats.begin(); it != checkNotNull(l_ctx).mConstants.mCompressedTextureFormats.end(); ++it, ++l__) {
                    uint32_t l_i = it->first;
                    uint32_t l_f = it->second;
                    observer->write<GLint>(l_s, (uint64_t)(l_i), (GLint)(l_f));
                }
            }
            break;
        }
        case GLenum::GL_CONTEXT_FLAGS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mContextFlags);
            break;
        }
        case GLenum::GL_CONTEXT_ROBUST_ACCESS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_COPY_READ_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundBuffers.mCopyReadBuffer));
            break;
        }
        case GLenum::GL_COPY_WRITE_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundBuffers.mCopyWriteBuffer));
            break;
        }
        case GLenum::GL_CULL_FACE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mCullFace));
            break;
        }
        case GLenum::GL_CULL_FACE_MODE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mCullFaceMode));
            break;
        }
        case GLenum::GL_CURRENT_PROGRAM: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundProgram));
            break;
        }
        case GLenum::GL_DEBUG_GROUP_STACK_DEPTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_DEBUG_LOGGED_MESSAGES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_DEPTH_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_DEPTH_CLEAR_VALUE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFramebuffer.mDepthClearValue));
            break;
        }
        case GLenum::GL_DEPTH_FUNC: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mDepth.mFunc));
            break;
        }
        case GLenum::GL_DEPTH_RANGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint> l_s = slice(v, 0ULL, 2ULL);
            observer->write<GLint>(l_s, 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mDepthRange[0ULL]));
            observer->write<GLint>(l_s, 1ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mDepthRange[1ULL]));
            break;
        }
        case GLenum::GL_DEPTH_TEST: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mDepth.mTest));
            break;
        }
        case GLenum::GL_DEPTH_WRITEMASK: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFramebuffer.mDepthWritemask));
            break;
        }
        case GLenum::GL_DISPATCH_INDIRECT_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundBuffers.mDispatchIndirectBuffer));
            break;
        }
        case GLenum::GL_DITHER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mDither));
            break;
        }
        case GLenum::GL_DRAW_BUFFER: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_DRAW_BUFFER0: // fall-through...
        case GLenum::GL_DRAW_BUFFER1: // fall-through...
        case GLenum::GL_DRAW_BUFFER2: // fall-through...
        case GLenum::GL_DRAW_BUFFER3: // fall-through...
        case GLenum::GL_DRAW_BUFFER4: // fall-through...
        case GLenum::GL_DRAW_BUFFER5: // fall-through...
        case GLenum::GL_DRAW_BUFFER6: // fall-through...
        case GLenum::GL_DRAW_BUFFER7: // fall-through...
        case GLenum::GL_DRAW_BUFFER8: // fall-through...
        case GLenum::GL_DRAW_BUFFER9: // fall-through...
        case GLenum::GL_DRAW_BUFFER10: // fall-through...
        case GLenum::GL_DRAW_BUFFER11: // fall-through...
        case GLenum::GL_DRAW_BUFFER12: // fall-through...
        case GLenum::GL_DRAW_BUFFER13: // fall-through...
        case GLenum::GL_DRAW_BUFFER14: // fall-through...
        case GLenum::GL_DRAW_BUFFER15: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            std::shared_ptr<Framebuffer> l_framebuffer = subGetBoundFramebufferOrErrorInvalidEnum(observer, call, GLenum::GL_DRAW_FRAMEBUFFER);
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_framebuffer).mDrawBuffer, (GLint)((name) - (GLenum::GL_DRAW_BUFFER0)))));
            break;
        }
        case GLenum::GL_DRAW_FRAMEBUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mBoundFramebuffers, GLenum::GL_FRAMEBUFFER)));
            break;
        }
        case GLenum::GL_ELEMENT_ARRAY_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(l_ctx).mInstances.mVertexArrays, checkNotNull(l_ctx).mBoundVertexArray)).mElementArrayBuffer));
            break;
        }
        case GLenum::GL_FRAGMENT_INTERPOLATION_OFFSET_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mFragmentInterpolationOffsetBits);
            break;
        }
        case GLenum::GL_FRAGMENT_SHADER_DERIVATIVE_HINT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_FRONT_FACE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mFrontFace));
            break;
        }
        case GLenum::GL_GENERATE_MIPMAP_HINT: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mMiscellaneous.mGenerateMipmapHint));
            break;
        }
        case GLenum::GL_GREEN_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_IMAGE_BINDING_NAME: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mImageUnits, index).mName));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_IMAGE_BINDING_LEVEL: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, findOrZero(checkNotNull(l_ctx).mImageUnits, index).mLevel);
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_IMAGE_BINDING_LAYERED: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mImageUnits, index).mLayered));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_IMAGE_BINDING_LAYER: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, findOrZero(checkNotNull(l_ctx).mImageUnits, index).mLayer);
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_IMAGE_BINDING_ACCESS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mImageUnits, index).mAccess));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_IMAGE_BINDING_FORMAT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mImageUnits, index).mFormat));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_IMPLEMENTATION_COLOR_READ_FORMAT: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_IMPLEMENTATION_COLOR_READ_TYPE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_LAYER_PROVOKING_VERTEX: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mLayerProvokingVertex));
            break;
        }
        case GLenum::GL_LINE_WIDTH: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mLineWidth));
            break;
        }
        case GLenum::GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mPrimitiveRestartForPatchesSupported));
            break;
        }
        case GLenum::GL_MAJOR_VERSION: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMajorVersion);
            break;
        }
        case GLenum::GL_MAX_3D_TEXTURE_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMax3dTextureSize);
            break;
        }
        case GLenum::GL_MAX_ARRAY_TEXTURE_LAYERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxArrayTextureLayers);
            break;
        }
        case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxAtomicCounterBufferBindings);
            break;
        }
        case GLenum::GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxAtomicCounterBufferSize);
            break;
        }
        case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedAtomicCounterBuffers);
            break;
        }
        case GLenum::GL_MAX_COLOR_ATTACHMENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxColorAttachments);
            break;
        }
        case GLenum::GL_MAX_COLOR_TEXTURE_SAMPLES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxColorTextureSamples);
            break;
        }
        case GLenum::GL_MAX_DEPTH_TEXTURE_SAMPLES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxDepthTextureSamples);
            break;
        }
        case GLenum::GL_MAX_COMBINED_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedAtomicCounters);
            break;
        }
        case GLenum::GL_MAX_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxImageUnits);
            break;
        }
        case GLenum::GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedComputeUniformComponents);
            break;
        }
        case GLenum::GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMaxCombinedFragmentUniformComponents));
            break;
        }
        case GLenum::GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedGeometryUniformComponents);
            break;
        }
        case GLenum::GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedShaderStorageBlocks);
            break;
        }
        case GLenum::GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedTessControlUniformComponents);
            break;
        }
        case GLenum::GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedTessEvaluationUniformComponents);
            break;
        }
        case GLenum::GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedTextureImageUnits);
            break;
        }
        case GLenum::GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedShaderOutputResources);
            break;
        }
        case GLenum::GL_MAX_COMBINED_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedUniformBlocks);
            break;
        }
        case GLenum::GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMaxCombinedVertexUniformComponents));
            break;
        }
        case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxComputeAtomicCounterBuffers);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxComputeAtomicCounters);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxComputeImageUniforms);
            break;
        }
        case GLenum::GL_MAX_COMBINED_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCombinedImageUniforms);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxComputeShaderStorageBlocks);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxComputeTextureImageUnits);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_SHARED_MEMORY_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxComputeSharedMemorySize);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxComputeUniformBlocks);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxComputeUniformComponents);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_WORK_GROUP_COUNT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxComputeWorkGroupCount[index]);
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxComputeWorkGroupInvocations);
            break;
        }
        case GLenum::GL_MAX_COMPUTE_WORK_GROUP_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxComputeWorkGroupSize[index]);
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_MAX_CUBE_MAP_TEXTURE_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxCubeMapTextureSize);
            break;
        }
        case GLenum::GL_MAX_DEBUG_GROUP_STACK_DEPTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxDebugGroupStackDepth);
            break;
        }
        case GLenum::GL_MAX_DEBUG_LOGGED_MESSAGES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxDebugLoggedMessages);
            break;
        }
        case GLenum::GL_MAX_DEBUG_MESSAGE_LENGTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxDebugMessageLength);
            break;
        }
        case GLenum::GL_MAX_DRAW_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxDrawBuffers);
            break;
        }
        case GLenum::GL_MAX_ELEMENT_INDEX: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMaxElementIndex));
            break;
        }
        case GLenum::GL_MAX_ELEMENTS_INDICES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxElementsIndices);
            break;
        }
        case GLenum::GL_MAX_ELEMENTS_VERTICES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxElementsVertices);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxFragmentAtomicCounterBuffers);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxFragmentAtomicCounters);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxFragmentImageUniforms);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_INPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxFragmentInputComponents);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_INTERPOLATION_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMaxFragmentInterpolationOffset));
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxFragmentShaderStorageBlocks);
            break;
        }
        case GLenum::GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMinProgramTextureGatherOffset);
            break;
        }
        case GLenum::GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxProgramTextureGatherOffset);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxFragmentUniformBlocks);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxFragmentUniformComponents);
            break;
        }
        case GLenum::GL_MAX_FRAGMENT_UNIFORM_VECTORS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxFragmentUniformVectors);
            break;
        }
        case GLenum::GL_MAX_FRAMEBUFFER_HEIGHT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxFramebufferHeight);
            break;
        }
        case GLenum::GL_MAX_FRAMEBUFFER_LAYERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxFramebufferLayers);
            break;
        }
        case GLenum::GL_MAX_FRAMEBUFFER_SAMPLES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxFramebufferSamples);
            break;
        }
        case GLenum::GL_MAX_FRAMEBUFFER_WIDTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxFramebufferWidth);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxGeometryAtomicCounterBuffers);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxGeometryAtomicCounters);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxGeometryImageUniforms);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_INPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxGeometryInputComponents);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_OUTPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxGeometryOutputComponents);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_OUTPUT_VERTICES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxGeometryOutputVertices);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_SHADER_INVOCATIONS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxGeometryShaderInvocations);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxGeometryShaderStorageBlocks);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxGeometryTextureImageUnits);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxGeometryTotalOutputComponents);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxGeometryUniformBlocks);
            break;
        }
        case GLenum::GL_MAX_GEOMETRY_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxGeometryUniformComponents);
            break;
        }
        case GLenum::GL_MAX_INTEGER_SAMPLES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxIntegerSamples);
            break;
        }
        case GLenum::GL_MAX_LABEL_LENGTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxLabelLength);
            break;
        }
        case GLenum::GL_MAX_PROGRAM_TEXEL_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxProgramTexelOffset);
            break;
        }
        case GLenum::GL_MAX_RENDERBUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxRenderbufferSize);
            break;
        }
        case GLenum::GL_MAX_SAMPLE_MASK_WORDS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxSampleMaskWords);
            break;
        }
        case GLenum::GL_MAX_SAMPLES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_MAX_SERVER_WAIT_TIMEOUT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMaxServerWaitTimeout));
            break;
        }
        case GLenum::GL_MAX_SHADER_STORAGE_BLOCK_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMaxShaderStorageBlockSize));
            break;
        }
        case GLenum::GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxShaderStorageBufferBindings);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessControlAtomicCounterBuffers);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessControlAtomicCounters);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessControlImageUniforms);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_INPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessControlInputComponents);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessControlOutputComponents);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessControlShaderStorageBlocks);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessControlTextureImageUnits);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessControlTotalOutputComponents);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessControlUniformBlocks);
            break;
        }
        case GLenum::GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessControlUniformComponents);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessEvaluationAtomicCounterBuffers);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessEvaluationAtomicCounters);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessEvaluationImageUniforms);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessEvaluationInputComponents);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessEvaluationOutputComponents);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessEvaluationShaderStorageBlocks);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessEvaluationTextureImageUnits);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessEvaluationUniformBlocks);
            break;
        }
        case GLenum::GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessEvaluationUniformComponents);
            break;
        }
        case GLenum::GL_MAX_TESS_GEN_LEVEL: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessGenLevel);
            break;
        }
        case GLenum::GL_MAX_PATCH_VERTICES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxPatchVertices);
            break;
        }
        case GLenum::GL_MAX_TESS_PATCH_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTessPatchComponents);
            break;
        }
        case GLenum::GL_MAX_TEXTURE_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTextureBufferSize);
            break;
        }
        case GLenum::GL_MAX_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTextureImageUnits);
            break;
        }
        case GLenum::GL_MAX_TEXTURE_LOD_BIAS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMaxTextureLodBias));
            break;
        }
        case GLenum::GL_MAX_TEXTURE_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTextureSize);
            break;
        }
        case GLenum::GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTransformFeedbackInterleavedComponents);
            break;
        }
        case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTransformFeedbackSeparateAttribs);
            break;
        }
        case GLenum::GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxTransformFeedbackSeparateComponents);
            break;
        }
        case GLenum::GL_MAX_UNIFORM_BLOCK_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMaxUniformBlockSize));
            break;
        }
        case GLenum::GL_MAX_UNIFORM_BUFFER_BINDINGS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxUniformBufferBindings);
            break;
        }
        case GLenum::GL_MAX_UNIFORM_LOCATIONS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxUniformLocations);
            break;
        }
        case GLenum::GL_MAX_VARYING_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVaryingComponents);
            break;
        }
        case GLenum::GL_MAX_VARYING_VECTORS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVaryingVectors);
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexAtomicCounters);
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexAtomicCounterBuffers);
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATTRIB_BINDINGS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexAttribBindings);
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATTRIB_STRIDE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexAttribStride);
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexAttribRelativeOffset);
            break;
        }
        case GLenum::GL_MAX_VERTEX_ATTRIBS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexAttribs);
            break;
        }
        case GLenum::GL_MAX_VERTEX_IMAGE_UNIFORMS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexImageUniforms);
            break;
        }
        case GLenum::GL_MAX_VERTEX_OUTPUT_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexOutputComponents);
            break;
        }
        case GLenum::GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexShaderStorageBlocks);
            break;
        }
        case GLenum::GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexTextureImageUnits);
            break;
        }
        case GLenum::GL_MAX_VERTEX_UNIFORM_BLOCKS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexUniformBlocks);
            break;
        }
        case GLenum::GL_MAX_VERTEX_UNIFORM_COMPONENTS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexUniformComponents);
            break;
        }
        case GLenum::GL_MAX_VERTEX_UNIFORM_VECTORS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMaxVertexUniformVectors);
            break;
        }
        case GLenum::GL_MAX_VIEWPORT_DIMS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint> l_s = slice(v, 0ULL, 2ULL);
            observer->write<GLint>(l_s, 0ULL, checkNotNull(l_ctx).mConstants.mMaxViewportDims[0ULL]);
            observer->write<GLint>(l_s, 1ULL, checkNotNull(l_ctx).mConstants.mMaxViewportDims[1ULL]);
            break;
        }
        case GLenum::GL_MIN_FRAGMENT_INTERPOLATION_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMinFragmentInterpolationOffset));
            break;
        }
        case GLenum::GL_MIN_PROGRAM_TEXEL_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMinProgramTexelOffset);
            break;
        }
        case GLenum::GL_MIN_SAMPLE_SHADING_VALUE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mMinSampleShadingValue));
            break;
        }
        case GLenum::GL_MINOR_VERSION: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mMinorVersion);
            break;
        }
        case GLenum::GL_MULTISAMPLE_LINE_WIDTH_RANGE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            Slice<GLint> l_s = slice(v, 0ULL, 2ULL);
            observer->write<GLint>(l_s, 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMultisampleLineWidthRange[0ULL]));
            observer->write<GLint>(l_s, 1ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMultisampleLineWidthRange[1ULL]));
            break;
        }
        case GLenum::GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMultisampleLineWidthGranularity));
            break;
        }
        case GLenum::GL_NUM_COMPRESSED_TEXTURE_FORMATS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(int32_t((checkNotNull(l_ctx).mConstants.mCompressedTextureFormats.size()))));
            break;
        }
        case GLenum::GL_NUM_EXTENSIONS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(int32_t((checkNotNull(l_ctx).mConstants.mExtensions.size()))));
            break;
        }
        case GLenum::GL_NUM_PROGRAM_BINARY_FORMATS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(int32_t((checkNotNull(l_ctx).mConstants.mProgramBinaryFormats.size()))));
            break;
        }
        case GLenum::GL_NUM_SHADER_BINARY_FORMATS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(int32_t((checkNotNull(l_ctx).mConstants.mShaderBinaryFormats.size()))));
            break;
        }
        case GLenum::GL_PACK_ALIGNMENT: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mPixelStorage.mPackAlignment);
            break;
        }
        case GLenum::GL_PACK_IMAGE_HEIGHT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mPixelStorage.mPackImageHeight);
            break;
        }
        case GLenum::GL_PACK_ROW_LENGTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mPixelStorage.mPackRowLength);
            break;
        }
        case GLenum::GL_PACK_SKIP_IMAGES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mPixelStorage.mPackSkipImages);
            break;
        }
        case GLenum::GL_PACK_SKIP_PIXELS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mPixelStorage.mPackSkipPixels);
            break;
        }
        case GLenum::GL_PACK_SKIP_ROWS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mPixelStorage.mPackSkipRows);
            break;
        }
        case GLenum::GL_PATCH_VERTICES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_PIXEL_PACK_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundBuffers.mPixelPackBuffer));
            break;
        }
        case GLenum::GL_PIXEL_UNPACK_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundBuffers.mPixelUnpackBuffer));
            break;
        }
        case GLenum::GL_POLYGON_OFFSET_FACTOR: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mPolygonOffsetFactor));
            break;
        }
        case GLenum::GL_POLYGON_OFFSET_FILL: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mPolygonOffsetFill));
            break;
        }
        case GLenum::GL_POLYGON_OFFSET_UNITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mPolygonOffsetUnits));
            break;
        }
        case GLenum::GL_PRIMITIVE_BOUNDING_BOX: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 8ULL));
            break;
        }
        case GLenum::GL_PRIMITIVE_RESTART_FIXED_INDEX: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mMiscellaneous.mPrimitiveRestartFixedIndex));
            break;
        }
        case GLenum::GL_PROGRAM_BINARY_FORMATS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            Slice<GLint> l_s = slice(v, 0ULL, uint64_t((checkNotNull(l_ctx).mConstants.mProgramBinaryFormats.size())));
            {
                int32_t l__ = 0;
                for (U32ToGLenum::iterator it = checkNotNull(l_ctx).mConstants.mProgramBinaryFormats.begin(); it != checkNotNull(l_ctx).mConstants.mProgramBinaryFormats.end(); ++it, ++l__) {
                    uint32_t l_i = it->first;
                    uint32_t l_f = it->second;
                    observer->write<GLint>(l_s, (uint64_t)(l_i), (GLint)(l_f));
                }
            }
            break;
        }
        case GLenum::GL_PROGRAM_PIPELINE_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_RASTERIZER_DISCARD: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mRasterizerDiscard));
            break;
        }
        case GLenum::GL_READ_BUFFER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_READ_FRAMEBUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mBoundFramebuffers, GLenum::GL_READ_FRAMEBUFFER)));
            break;
        }
        case GLenum::GL_RED_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_RENDERBUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mBoundRenderbuffers, GLenum::GL_RENDERBUFFER)));
            break;
        }
        case GLenum::GL_RESET_NOTIFICATION_STRATEGY: {
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_SAMPLE_ALPHA_TO_COVERAGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mSampleAlphaToCoverage));
            break;
        }
        case GLenum::GL_SAMPLE_BUFFERS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_SAMPLE_COVERAGE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mSampleCoverage));
            break;
        }
        case GLenum::GL_SAMPLE_COVERAGE_INVERT: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mSampleCoverageInvert));
            break;
        }
        case GLenum::GL_SAMPLE_COVERAGE_VALUE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mSampleCoverageValue));
            break;
        }
        case GLenum::GL_SAMPLE_SHADING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_SAMPLER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_SAMPLES: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_SCISSOR_BOX: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint> l_s = slice(v, 0ULL, 4ULL);
            observer->write<GLint>(l_s, 0ULL, checkNotNull(l_ctx).mFragmentOperations.mScissor.mBox.mX);
            observer->write<GLint>(l_s, 1ULL, checkNotNull(l_ctx).mFragmentOperations.mScissor.mBox.mY);
            observer->write<GLint>(l_s, 2ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mScissor.mBox.mWidth));
            observer->write<GLint>(l_s, 3ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mScissor.mBox.mHeight));
            break;
        }
        case GLenum::GL_SCISSOR_TEST: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mScissor.mTest));
            break;
        }
        case GLenum::GL_SHADER_BINARY_FORMATS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint> l_s = slice(v, 0ULL, uint64_t((checkNotNull(l_ctx).mConstants.mShaderBinaryFormats.size())));
            {
                int32_t l__ = 0;
                for (U32ToGLenum::iterator it = checkNotNull(l_ctx).mConstants.mShaderBinaryFormats.begin(); it != checkNotNull(l_ctx).mConstants.mShaderBinaryFormats.end(); ++it, ++l__) {
                    uint32_t l_i = it->first;
                    uint32_t l_f = it->second;
                    observer->write<GLint>(l_s, (uint64_t)(l_i), (GLint)(l_f));
                }
            }
            break;
        }
        case GLenum::GL_SHADER_COMPILER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mShaderCompiler));
            break;
        }
        case GLenum::GL_SHADER_STORAGE_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mShaderStorageBuffers, index).mBinding));
            } else {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundBuffers.mShaderStorageBuffer));
            }
            break;
        }
        case GLenum::GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mShaderStorageBufferOffsetAlignment);
            break;
        }
        case GLenum::GL_SHADER_STORAGE_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mShaderStorageBuffers, index).mSize));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_SHADER_STORAGE_BUFFER_START: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mShaderStorageBuffers, index).mStart));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_STENCIL_BACK_FAIL: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackFail));
            break;
        }
        case GLenum::GL_STENCIL_BACK_FUNC: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackFunc));
            break;
        }
        case GLenum::GL_STENCIL_BACK_PASS_DEPTH_FAIL: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackPassDepthFail));
            break;
        }
        case GLenum::GL_STENCIL_BACK_PASS_DEPTH_PASS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackPassDepthPass));
            break;
        }
        case GLenum::GL_STENCIL_BACK_REF: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackRef);
            break;
        }
        case GLenum::GL_STENCIL_BACK_VALUE_MASK: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mBackValueMask));
            break;
        }
        case GLenum::GL_STENCIL_BACK_WRITEMASK: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFramebuffer.mStencilBackWritemask));
            break;
        }
        case GLenum::GL_STENCIL_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_STENCIL_CLEAR_VALUE: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mFramebuffer.mStencilClearValue);
            break;
        }
        case GLenum::GL_STENCIL_FAIL: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mFail));
            break;
        }
        case GLenum::GL_STENCIL_FUNC: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mFunc));
            break;
        }
        case GLenum::GL_STENCIL_PASS_DEPTH_FAIL: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mPassDepthFail));
            break;
        }
        case GLenum::GL_STENCIL_PASS_DEPTH_PASS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mPassDepthPass));
            break;
        }
        case GLenum::GL_STENCIL_REF: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mFragmentOperations.mStencil.mRef);
            break;
        }
        case GLenum::GL_STENCIL_TEST: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mTest));
            break;
        }
        case GLenum::GL_STENCIL_VALUE_MASK: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFragmentOperations.mStencil.mValueMask));
            break;
        }
        case GLenum::GL_STENCIL_WRITEMASK: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mFramebuffer.mStencilWritemask));
            break;
        }
        case GLenum::GL_SUBPIXEL_BITS: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mSubpixelBits);
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_2D: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBinding2d));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_EXTERNAL_OES: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBindingExternalOes));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_2D_ARRAY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBinding2dArray));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_2D_MULTISAMPLE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBinding2dMultisample));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBinding2dMultisampleArray));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_3D: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBinding3d));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_BUFFER: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBindingBuffer));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_CUBE_MAP: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBindingCubeMap));
            break;
        }
        case GLenum::GL_TEXTURE_BINDING_CUBE_MAP_ARRAY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(l_ctx).mTextureUnits, checkNotNull(l_ctx).mActiveTextureUnit)).mBindingCubeMapArray));
            break;
        }
        case GLenum::GL_TEXTURE_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        case GLenum::GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mTextureBufferOffsetAlignment);
            break;
        }
        case GLenum::GL_TRANSFORM_FEEDBACK_ACTIVE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            std::shared_ptr<TransformFeedback> l__res_0 = subGetBoundTransformFeedback(observer, call);
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l__res_0).mActive));
            break;
        }
        case GLenum::GL_TRANSFORM_FEEDBACK_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundTransformFeedback));
            break;
        }
        case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            if (isIndexed) {
                std::shared_ptr<TransformFeedback> l__res_0 = subGetBoundTransformFeedback(observer, call);
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l__res_0).mBuffers, index).mBinding));
            } else {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundBuffers.mTransformFeedbackBuffer));
            }
            break;
        }
        case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            if (isIndexed) {
                std::shared_ptr<TransformFeedback> l__res_0 = subGetBoundTransformFeedback(observer, call);
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l__res_0).mBuffers, index).mSize));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_TRANSFORM_FEEDBACK_BUFFER_START: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            if (isIndexed) {
                std::shared_ptr<TransformFeedback> l__res_0 = subGetBoundTransformFeedback(observer, call);
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l__res_0).mBuffers, index).mStart));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_TRANSFORM_FEEDBACK_PAUSED: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            std::shared_ptr<TransformFeedback> l__res_0 = subGetBoundTransformFeedback(observer, call);
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l__res_0).mPaused));
            break;
        }
        case GLenum::GL_UNIFORM_BUFFER_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mUniformBuffers, index).mBinding));
            } else {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundBuffers.mUniformBuffer));
            }
            break;
        }
        case GLenum::GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mConstants.mUniformBufferOffsetAlignment);
            break;
        }
        case GLenum::GL_UNIFORM_BUFFER_SIZE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mUniformBuffers, index).mSize));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_UNIFORM_BUFFER_START: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            if (isIndexed) {
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(findOrZero(checkNotNull(l_ctx).mBoundBuffers.mUniformBuffers, index).mStart));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_UNPACK_ALIGNMENT: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mPixelStorage.mUnpackAlignment);
            break;
        }
        case GLenum::GL_UNPACK_IMAGE_HEIGHT: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mPixelStorage.mUnpackImageHeight);
            break;
        }
        case GLenum::GL_UNPACK_ROW_LENGTH: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mPixelStorage.mUnpackRowLength);
            break;
        }
        case GLenum::GL_UNPACK_SKIP_IMAGES: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mPixelStorage.mUnpackSkipImages);
            break;
        }
        case GLenum::GL_UNPACK_SKIP_PIXELS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mPixelStorage.mUnpackSkipPixels);
            break;
        }
        case GLenum::GL_UNPACK_SKIP_ROWS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, checkNotNull(l_ctx).mPixelStorage.mUnpackSkipRows);
            break;
        }
        case GLenum::GL_VERTEX_ARRAY_BINDING: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mBoundVertexArray));
            break;
        }
        case GLenum::GL_VERTEX_BINDING_DIVISOR: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                VertexBufferBindingIndex l_i = (VertexBufferBindingIndex)(index);
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(findOrZero(checkNotNull(l_ctx).mInstances.mVertexArrays, checkNotNull(l_ctx).mBoundVertexArray)).mVertexBufferBindings, l_i)).mDivisor));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_VERTEX_BINDING_OFFSET: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                VertexBufferBindingIndex l_i = (VertexBufferBindingIndex)(index);
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(findOrZero(checkNotNull(l_ctx).mInstances.mVertexArrays, checkNotNull(l_ctx).mBoundVertexArray)).mVertexBufferBindings, l_i)).mOffset));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_VERTEX_BINDING_STRIDE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            if (isIndexed) {
                VertexBufferBindingIndex l_i = (VertexBufferBindingIndex)(index);
                observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(findOrZero(checkNotNull(findOrZero(checkNotNull(l_ctx).mInstances.mVertexArrays, checkNotNull(l_ctx).mBoundVertexArray)).mVertexBufferBindings, l_i)).mStride));
            } else {
                subGlErrorInvalidEnum(observer, call, name);
            }
            break;
        }
        case GLenum::GL_VIEWPORT: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            Slice<GLint> l_s = slice(v, 0ULL, 4ULL);
            observer->write<GLint>(l_s, 0ULL, checkNotNull(l_ctx).mRasterization.mViewport.mX);
            observer->write<GLint>(l_s, 1ULL, checkNotNull(l_ctx).mRasterization.mViewport.mY);
            observer->write<GLint>(l_s, 2ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mViewport.mWidth));
            observer->write<GLint>(l_s, 3ULL, (GLint)(checkNotNull(l_ctx).mRasterization.mViewport.mHeight));
            break;
        }
        case GLenum::GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_filter_anisotropic);
            observer->write<GLint>(slice(v, 0ULL, 1ULL), 0ULL, (GLint)(checkNotNull(l_ctx).mConstants.mMaxTextureMaxAnisotropyExt));
            break;
        }
        case GLenum::GL_GPU_DISJOINT_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_disjoint_timer_query);
            observer->write(slice(v, 0ULL, 1ULL));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, name);
        }
    }
    return;
}

void GlesSpy::subGetTexParameter_GLfloat(CallObserver* observer, const std::function<void()>& call, uint32_t target, uint32_t parameter, GLfloat* params) {
    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: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            break;
        }
        case GLenum::GL_TEXTURE_2D_MULTISAMPLE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            break;
        }
        case GLenum::GL_TEXTURE_2D_MULTISAMPLE_ARRAY: // fall-through...
        case GLenum::GL_TEXTURE_CUBE_MAP_ARRAY: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, target);
        }
    }
    std::shared_ptr<Texture> l_t = subGetBoundTextureOrErrorInvalidEnum(observer, call, target);
    switch (parameter) {
        case GLenum::GL_TEXTURE_MAG_FILTER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mMagFilter));
            break;
        }
        case GLenum::GL_TEXTURE_MIN_FILTER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mMinFilter));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_S: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mWrapS));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_T: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mWrapT));
            break;
        }
        case GLenum::GL_TEXTURE_BASE_LEVEL: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mBaseLevel));
            break;
        }
        case GLenum::GL_TEXTURE_COMPARE_FUNC: {
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mCompareFunc));
            break;
        }
        case GLenum::GL_TEXTURE_COMPARE_MODE: {
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mCompareMode));
            break;
        }
        case GLenum::GL_TEXTURE_IMMUTABLE_FORMAT: {
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mImmutableFormat));
            break;
        }
        case GLenum::GL_TEXTURE_MAX_LEVEL: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mMaxLevel));
            break;
        }
        case GLenum::GL_TEXTURE_MAX_LOD: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, checkNotNull(l_t).mMaxLod);
            break;
        }
        case GLenum::GL_TEXTURE_MIN_LOD: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, checkNotNull(l_t).mMinLod);
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_A: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mSwizzleA));
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_B: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mSwizzleB));
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_G: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mSwizzleG));
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_R: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mSwizzleR));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_R: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mWrapR));
            break;
        }
        case GLenum::GL_DEPTH_STENCIL_TEXTURE_MODE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mDepthStencilTextureMode));
            break;
        }
        case GLenum::GL_IMAGE_FORMAT_COMPATIBILITY_TYPE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, slice(params, 0ULL, 1ULL)[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_IMMUTABLE_LEVELS: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, (GLfloat)(checkNotNull(l_t).mImmutableLevels));
            break;
        }
        case GLenum::GL_TEXTURE_BORDER_COLOR: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            Slice<GLfloat> l_p = slice(params, 0ULL, 4ULL);
            observer->write<GLfloat>(l_p, 0ULL, checkNotNull(l_t).mBorderColor[0ULL]);
            observer->write<GLfloat>(l_p, 1ULL, checkNotNull(l_t).mBorderColor[1ULL]);
            observer->write<GLfloat>(l_p, 2ULL, checkNotNull(l_t).mBorderColor[2ULL]);
            observer->write<GLfloat>(l_p, 3ULL, checkNotNull(l_t).mBorderColor[3ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_MAX_ANISOTROPY_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_filter_anisotropic);
            observer->write<GLfloat>(slice(params, 0ULL, 1ULL), 0ULL, checkNotNull(l_t).mMaxAnisotropy);
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, parameter);
        }
    }
    return;
}

void GlesSpy::subSamplerParameterv_GLfloat__CP(CallObserver* observer, const std::function<void()>& call, SamplerId sampler, uint32_t pname, GLfloat* params) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    std::shared_ptr<Sampler> l_s = findOrZero(checkNotNull(l_ctx).mInstances.mSamplers, sampler);
    switch (pname) {
        case GLenum::GL_TEXTURE_COMPARE_FUNC: {
            checkNotNull(l_s).mCompareFunc = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_COMPARE_MODE: {
            checkNotNull(l_s).mCompareMode = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_MIN_FILTER: {
            checkNotNull(l_s).mMinFilter = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_MAG_FILTER: {
            checkNotNull(l_s).mMagFilter = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_MIN_LOD: {
            checkNotNull(l_s).mMinLod = observer->read(slice(params, 0ULL, 1ULL), 0ULL);
            break;
        }
        case GLenum::GL_TEXTURE_MAX_LOD: {
            checkNotNull(l_s).mMaxLod = observer->read(slice(params, 0ULL, 1ULL), 0ULL);
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_R: {
            checkNotNull(l_s).mWrapR = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_S: {
            checkNotNull(l_s).mWrapS = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_T: {
            checkNotNull(l_s).mWrapT = (uint32_t)(observer->read(slice(params, 0ULL, 1ULL), 0ULL));
            break;
        }
        case GLenum::GL_TEXTURE_BORDER_COLOR: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, pname);
        }
    }
    return;
}

void GlesSpy::subSamplerParameterv_Vec1i(CallObserver* observer, const std::function<void()>& call, SamplerId sampler, uint32_t pname, Vec1i params) {
    std::shared_ptr<Context> l_ctx = subGetContext(observer, call);
    std::shared_ptr<Sampler> l_s = findOrZero(checkNotNull(l_ctx).mInstances.mSamplers, sampler);
    switch (pname) {
        case GLenum::GL_TEXTURE_COMPARE_FUNC: {
            checkNotNull(l_s).mCompareFunc = (uint32_t)(params[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_COMPARE_MODE: {
            checkNotNull(l_s).mCompareMode = (uint32_t)(params[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_MIN_FILTER: {
            checkNotNull(l_s).mMinFilter = (uint32_t)(params[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_MAG_FILTER: {
            checkNotNull(l_s).mMagFilter = (uint32_t)(params[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_MIN_LOD: {
            checkNotNull(l_s).mMinLod = (GLfloat)(params[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_MAX_LOD: {
            checkNotNull(l_s).mMaxLod = (GLfloat)(params[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_R: {
            checkNotNull(l_s).mWrapR = (uint32_t)(params[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_S: {
            checkNotNull(l_s).mWrapS = (uint32_t)(params[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_T: {
            checkNotNull(l_s).mWrapT = (uint32_t)(params[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_BORDER_COLOR: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, pname);
        }
    }
    return;
}

void GlesSpy::subTexParameterv_Vec1f(CallObserver* observer, const std::function<void()>& call, uint32_t target, uint32_t pname, Vec1f params) {
    if ((target) == (GLenum::GL_TEXTURE_BUFFER)) {
        subGlErrorInvalidEnum(observer, call, target);
    }
    std::shared_ptr<Texture> l_t = subGetBoundTextureOrErrorInvalidEnum(observer, call, target);
    switch (pname) {
        case GLenum::GL_TEXTURE_MAG_FILTER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            uint32_t l_magFilter = (uint32_t)(params[0ULL]);
            switch (l_magFilter) {
                case GLenum::GL_NEAREST: // fall-through...
                case GLenum::GL_LINEAR: {
                    break;
                }
                default: {
                    subGlErrorInvalidEnum(observer, call, l_magFilter);
                }
            }
            checkNotNull(l_t).mMagFilter = l_magFilter;
            break;
        }
        case GLenum::GL_TEXTURE_MIN_FILTER: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            uint32_t l_minFilter = (uint32_t)(params[0ULL]);
            switch (l_minFilter) {
                case GLenum::GL_NEAREST: // fall-through...
                case GLenum::GL_LINEAR: // fall-through...
                case GLenum::GL_NEAREST_MIPMAP_NEAREST: // fall-through...
                case GLenum::GL_LINEAR_MIPMAP_NEAREST: // fall-through...
                case GLenum::GL_NEAREST_MIPMAP_LINEAR: // fall-through...
                case GLenum::GL_LINEAR_MIPMAP_LINEAR: {
                    break;
                }
                default: {
                    subGlErrorInvalidEnum(observer, call, l_minFilter);
                }
            }
            checkNotNull(l_t).mMinFilter = l_minFilter;
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_S: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            uint32_t l__res_0 = subCheckWrapParam(observer, call, (uint32_t)(params[0ULL]));
            checkNotNull(l_t).mWrapS = l__res_0;
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_T: {
            subMinRequiredVersion(observer, call, (GLint)(2L), (GLint)(0L));
            uint32_t l__res_0 = subCheckWrapParam(observer, call, (uint32_t)(params[0ULL]));
            checkNotNull(l_t).mWrapT = l__res_0;
            break;
        }
        case GLenum::GL_TEXTURE_BASE_LEVEL: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            GLint l_baseLevel = (GLint)(params[0ULL]);
            if ((l_baseLevel) < ((GLint)(0L))) {
                subGlErrorInvalidValue(observer, call);
            }
            checkNotNull(l_t).mBaseLevel = l_baseLevel;
            break;
        }
        case GLenum::GL_TEXTURE_COMPARE_FUNC: {
            checkNotNull(l_t).mCompareFunc = (uint32_t)(params[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_COMPARE_MODE: {
            checkNotNull(l_t).mCompareMode = (uint32_t)(params[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_MAX_LEVEL: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            GLint l_maxLevel = (GLint)(params[0ULL]);
            if ((l_maxLevel) < ((GLint)(0L))) {
                subGlErrorInvalidValue(observer, call);
            }
            checkNotNull(l_t).mMaxLevel = l_maxLevel;
            break;
        }
        case GLenum::GL_TEXTURE_MAX_LOD: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            checkNotNull(l_t).mMaxLod = params[0ULL];
            break;
        }
        case GLenum::GL_TEXTURE_MIN_LOD: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            checkNotNull(l_t).mMinLod = params[0ULL];
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_A: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            uint32_t l__res_0 = subCheckSwizzleParam(observer, call, (uint32_t)(params[0ULL]));
            checkNotNull(l_t).mSwizzleA = l__res_0;
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_B: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            uint32_t l__res_0 = subCheckSwizzleParam(observer, call, (uint32_t)(params[0ULL]));
            checkNotNull(l_t).mSwizzleB = l__res_0;
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_G: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            uint32_t l__res_0 = subCheckSwizzleParam(observer, call, (uint32_t)(params[0ULL]));
            checkNotNull(l_t).mSwizzleG = l__res_0;
            break;
        }
        case GLenum::GL_TEXTURE_SWIZZLE_R: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            uint32_t l__res_0 = subCheckSwizzleParam(observer, call, (uint32_t)(params[0ULL]));
            checkNotNull(l_t).mSwizzleR = l__res_0;
            break;
        }
        case GLenum::GL_TEXTURE_WRAP_R: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(0L));
            checkNotNull(l_t).mWrapR = (uint32_t)(params[0ULL]);
            break;
        }
        case GLenum::GL_DEPTH_STENCIL_TEXTURE_MODE: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(1L));
            checkNotNull(l_t).mDepthStencilTextureMode = (uint32_t)(params[0ULL]);
            break;
        }
        case GLenum::GL_TEXTURE_BORDER_COLOR: {
            subMinRequiredVersion(observer, call, (GLint)(3L), (GLint)(2L));
            break;
        }
        case GLenum::GL_TEXTURE_MAX_ANISOTROPY_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_filter_anisotropic);
            checkNotNull(l_t).mMaxAnisotropy = params[0ULL];
            break;
        }
        case GLenum::GL_TEXTURE_SRGB_DECODE_EXT: {
            subRequiresExtension(observer, call, ExtensionId::GL_EXT_texture_sRGB_decode);
            break;
        }
        default: {
            subGlErrorInvalidEnum(observer, call, pname);
        }
    }
    return;
}
} // namespace gapii