Edit

kc3-lang/angle/src/libGLESv2/entry_points_gles_3_0_autogen.cpp

Branch :

  • Show log

    Commit

  • Author : Corentin Wallez
    Date : 2017-11-08 14:00:32
    Hash : f0e89be6
    Message : Use packed enums for the texture types and targets, part 1 In OpenGL there are two enum "sets" used by the API that are very similar: texture types (or bind point) and texture targets. They only differ in that texture types have GL_TEXTURE_CUBEMAP and target have GL_TEXTURE_CUBEMAP_[POSITIVE|NEGATIVE]_[X|Y|Z]. This is a problem because in ANGLE we use GLenum to pass around both types of data, making it difficult to know which of type and target a variable is. In addition these enums are placed somewhat randomly in the space of OpenGL enums, making it slow to have a mapping from texture types to some data. Such a mapping is in hot-code with gl::State::mTextures. This commit stack makes the texture types and target enums be translated to internal packed enums right at the OpenGL entry point and used throughout ANGLE to have type safety and performance gains. This is the first of two commit which does the refactor for all of the validation and stops inside gl::Context. This was the best place to split patches without having many conversions from packed enums to GL enums. BUG=angleproject:2169 Change-Id: Ib43da7e71c253bd9fe210fb0ec0de61bc286e6d3 Reviewed-on: https://chromium-review.googlesource.com/758835 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/libGLESv2/entry_points_gles_3_0_autogen.cpp
  • // GENERATED FILE - DO NOT EDIT.
    // Generated by generate_entry_points.py using data from gl.xml.
    //
    // Copyright 2018 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    // entry_points_gles_3_0_autogen.cpp:
    //   Defines the GLES 3.0 entry points.
    
    #include "libGLESv2/entry_points_gles_3_0_autogen.h"
    
    #include "libANGLE/Context.h"
    #include "libANGLE/validationES3.h"
    #include "libGLESv2/global_state.h"
    
    namespace gl
    {
    void GL_APIENTRY BeginQuery(GLenum target, GLuint id)
    {
        EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::BeginQuery>(target, id);
    
            if (context->skipValidation() || ValidateBeginQuery(context, target, id))
            {
                context->beginQuery(target, id);
            }
        }
    }
    
    void GL_APIENTRY BeginTransformFeedback(GLenum primitiveMode)
    {
        EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::BeginTransformFeedback>(primitiveMode);
    
            if (context->skipValidation() || ValidateBeginTransformFeedback(context, primitiveMode))
            {
                context->beginTransformFeedback(primitiveMode);
            }
        }
    }
    
    void GL_APIENTRY BindBufferBase(GLenum target, GLuint index, GLuint buffer)
    {
        EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)", target, index, buffer);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferBinding targetPacked = FromGLenum<BufferBinding>(target);
            context->gatherParams<EntryPoint::BindBufferBase>(targetPacked, index, buffer);
    
            if (context->skipValidation() ||
                ValidateBindBufferBase(context, targetPacked, index, buffer))
            {
                context->bindBufferBase(targetPacked, index, buffer);
            }
        }
    }
    
    void GL_APIENTRY
    BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
    {
        EVENT(
            "(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, "
            "GLsizeiptr size = %d)",
            target, index, buffer, offset, size);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferBinding targetPacked = FromGLenum<BufferBinding>(target);
            context->gatherParams<EntryPoint::BindBufferRange>(targetPacked, index, buffer, offset,
                                                               size);
    
            if (context->skipValidation() ||
                ValidateBindBufferRange(context, targetPacked, index, buffer, offset, size))
            {
                context->bindBufferRange(targetPacked, index, buffer, offset, size);
            }
        }
    }
    
    void GL_APIENTRY BindSampler(GLuint unit, GLuint sampler)
    {
        EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::BindSampler>(unit, sampler);
    
            if (context->skipValidation() || ValidateBindSampler(context, unit, sampler))
            {
                context->bindSampler(unit, sampler);
            }
        }
    }
    
    void GL_APIENTRY BindTransformFeedback(GLenum target, GLuint id)
    {
        EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::BindTransformFeedback>(target, id);
    
            if (context->skipValidation() || ValidateBindTransformFeedback(context, target, id))
            {
                context->bindTransformFeedback(target, id);
            }
        }
    }
    
    void GL_APIENTRY BindVertexArray(GLuint array)
    {
        EVENT("(GLuint array = %u)", array);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::BindVertexArray>(array);
    
            if (context->skipValidation() || ValidateBindVertexArray(context, array))
            {
                context->bindVertexArray(array);
            }
        }
    }
    
    void GL_APIENTRY BlitFramebuffer(GLint srcX0,
                                     GLint srcY0,
                                     GLint srcX1,
                                     GLint srcY1,
                                     GLint dstX0,
                                     GLint dstY0,
                                     GLint dstX1,
                                     GLint dstY1,
                                     GLbitfield mask,
                                     GLenum filter)
    {
        EVENT(
            "(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = "
            "%d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum "
            "filter = 0x%X)",
            srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::BlitFramebuffer>(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
                                                               dstX1, dstY1, mask, filter);
    
            if (context->skipValidation() ||
                ValidateBlitFramebuffer(context, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
                                        mask, filter))
            {
                context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask,
                                         filter);
            }
        }
    }
    
    void GL_APIENTRY ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
    {
        EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth = %f, GLint stencil = %d)",
              buffer, drawbuffer, depth, stencil);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::ClearBufferfi>(buffer, drawbuffer, depth, stencil);
    
            if (context->skipValidation() ||
                ValidateClearBufferfi(context, buffer, drawbuffer, depth, stencil))
            {
                context->clearBufferfi(buffer, drawbuffer, depth, stencil);
            }
        }
    }
    
    void GL_APIENTRY ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
    {
        EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat *value = 0x%0.8p)", buffer,
              drawbuffer, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::ClearBufferfv>(buffer, drawbuffer, value);
    
            if (context->skipValidation() || ValidateClearBufferfv(context, buffer, drawbuffer, value))
            {
                context->clearBufferfv(buffer, drawbuffer, value);
            }
        }
    }
    
    void GL_APIENTRY ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
    {
        EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint *value = 0x%0.8p)", buffer,
              drawbuffer, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::ClearBufferiv>(buffer, drawbuffer, value);
    
            if (context->skipValidation() || ValidateClearBufferiv(context, buffer, drawbuffer, value))
            {
                context->clearBufferiv(buffer, drawbuffer, value);
            }
        }
    }
    
    void GL_APIENTRY ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
    {
        EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint *value = 0x%0.8p)", buffer,
              drawbuffer, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::ClearBufferuiv>(buffer, drawbuffer, value);
    
            if (context->skipValidation() || ValidateClearBufferuiv(context, buffer, drawbuffer, value))
            {
                context->clearBufferuiv(buffer, drawbuffer, value);
            }
        }
    }
    
    GLenum GL_APIENTRY ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
    {
        EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)", sync, flags,
              timeout);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::ClientWaitSync>(sync, flags, timeout);
    
            if (context->skipValidation() || ValidateClientWaitSync(context, sync, flags, timeout))
            {
                return context->clientWaitSync(sync, flags, timeout);
            }
        }
    
        return GetDefaultReturnValue<EntryPoint::ClientWaitSync, GLenum>();
    }
    
    void GL_APIENTRY CompressedTexImage3D(GLenum target,
                                          GLint level,
                                          GLenum internalformat,
                                          GLsizei width,
                                          GLsizei height,
                                          GLsizei depth,
                                          GLint border,
                                          GLsizei imageSize,
                                          const void *data)
    {
        EVENT(
            "(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = "
            "%d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
            "const void *data = 0x%0.8p)",
            target, level, internalformat, width, height, depth, border, imageSize, data);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked = FromGLenum<TextureType>(target);
            context->gatherParams<EntryPoint::CompressedTexImage3D>(
                targetPacked, level, internalformat, width, height, depth, border, imageSize, data);
    
            if (context->skipValidation() ||
                ValidateCompressedTexImage3D(context, targetPacked, level, internalformat, width,
                                             height, depth, border, imageSize, data))
            {
                context->compressedTexImage3D(targetPacked, level, internalformat, width, height, depth,
                                              border, imageSize, data);
            }
        }
    }
    
    void GL_APIENTRY CompressedTexSubImage3D(GLenum target,
                                             GLint level,
                                             GLint xoffset,
                                             GLint yoffset,
                                             GLint zoffset,
                                             GLsizei width,
                                             GLsizei height,
                                             GLsizei depth,
                                             GLenum format,
                                             GLsizei imageSize,
                                             const void *data)
    {
        EVENT(
            "(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, GLint "
            "zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLenum format "
            "= 0x%X, GLsizei imageSize = %d, const void *data = 0x%0.8p)",
            target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked = FromGLenum<TextureType>(target);
            context->gatherParams<EntryPoint::CompressedTexSubImage3D>(targetPacked, level, xoffset,
                                                                       yoffset, zoffset, width, height,
                                                                       depth, format, imageSize, data);
    
            if (context->skipValidation() ||
                ValidateCompressedTexSubImage3D(context, targetPacked, level, xoffset, yoffset, zoffset,
                                                width, height, depth, format, imageSize, data))
            {
                context->compressedTexSubImage3D(targetPacked, level, xoffset, yoffset, zoffset, width,
                                                 height, depth, format, imageSize, data);
            }
        }
    }
    
    void GL_APIENTRY CopyBufferSubData(GLenum readTarget,
                                       GLenum writeTarget,
                                       GLintptr readOffset,
                                       GLintptr writeOffset,
                                       GLsizeiptr size)
    {
        EVENT(
            "(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr "
            "writeOffset = %d, GLsizeiptr size = %d)",
            readTarget, writeTarget, readOffset, writeOffset, size);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferBinding readTargetPacked  = FromGLenum<BufferBinding>(readTarget);
            BufferBinding writeTargetPacked = FromGLenum<BufferBinding>(writeTarget);
            context->gatherParams<EntryPoint::CopyBufferSubData>(readTargetPacked, writeTargetPacked,
                                                                 readOffset, writeOffset, size);
    
            if (context->skipValidation() ||
                ValidateCopyBufferSubData(context, readTargetPacked, writeTargetPacked, readOffset,
                                          writeOffset, size))
            {
                context->copyBufferSubData(readTargetPacked, writeTargetPacked, readOffset, writeOffset,
                                           size);
            }
        }
    }
    
    void GL_APIENTRY CopyTexSubImage3D(GLenum target,
                                       GLint level,
                                       GLint xoffset,
                                       GLint yoffset,
                                       GLint zoffset,
                                       GLint x,
                                       GLint y,
                                       GLsizei width,
                                       GLsizei height)
    {
        EVENT(
            "(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, GLint "
            "zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
            target, level, xoffset, yoffset, zoffset, x, y, width, height);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked = FromGLenum<TextureType>(target);
            context->gatherParams<EntryPoint::CopyTexSubImage3D>(targetPacked, level, xoffset, yoffset,
                                                                 zoffset, x, y, width, height);
    
            if (context->skipValidation() ||
                ValidateCopyTexSubImage3D(context, targetPacked, level, xoffset, yoffset, zoffset, x, y,
                                          width, height))
            {
                context->copyTexSubImage3D(targetPacked, level, xoffset, yoffset, zoffset, x, y, width,
                                           height);
            }
        }
    }
    
    void GL_APIENTRY DeleteQueries(GLsizei n, const GLuint *ids)
    {
        EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::DeleteQueries>(n, ids);
    
            if (context->skipValidation() || ValidateDeleteQueries(context, n, ids))
            {
                context->deleteQueries(n, ids);
            }
        }
    }
    
    void GL_APIENTRY DeleteSamplers(GLsizei count, const GLuint *samplers)
    {
        EVENT("(GLsizei count = %d, const GLuint *samplers = 0x%0.8p)", count, samplers);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::DeleteSamplers>(count, samplers);
    
            if (context->skipValidation() || ValidateDeleteSamplers(context, count, samplers))
            {
                context->deleteSamplers(count, samplers);
            }
        }
    }
    
    void GL_APIENTRY DeleteSync(GLsync sync)
    {
        EVENT("(GLsync sync = 0x%0.8p)", sync);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::DeleteSync>(sync);
    
            if (context->skipValidation() || ValidateDeleteSync(context, sync))
            {
                context->deleteSync(sync);
            }
        }
    }
    
    void GL_APIENTRY DeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
    {
        EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::DeleteTransformFeedbacks>(n, ids);
    
            if (context->skipValidation() || ValidateDeleteTransformFeedbacks(context, n, ids))
            {
                context->deleteTransformFeedbacks(n, ids);
            }
        }
    }
    
    void GL_APIENTRY DeleteVertexArrays(GLsizei n, const GLuint *arrays)
    {
        EVENT("(GLsizei n = %d, const GLuint *arrays = 0x%0.8p)", n, arrays);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::DeleteVertexArrays>(n, arrays);
    
            if (context->skipValidation() || ValidateDeleteVertexArrays(context, n, arrays))
            {
                context->deleteVertexArrays(n, arrays);
            }
        }
    }
    
    void GL_APIENTRY DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
    {
        EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instancecount = %d)",
              mode, first, count, instancecount);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::DrawArraysInstanced>(mode, first, count, instancecount);
    
            if (context->skipValidation() ||
                ValidateDrawArraysInstanced(context, mode, first, count, instancecount))
            {
                context->drawArraysInstanced(mode, first, count, instancecount);
            }
        }
    }
    
    void GL_APIENTRY DrawBuffers(GLsizei n, const GLenum *bufs)
    {
        EVENT("(GLsizei n = %d, const GLenum *bufs = 0x%0.8p)", n, bufs);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::DrawBuffers>(n, bufs);
    
            if (context->skipValidation() || ValidateDrawBuffers(context, n, bufs))
            {
                context->drawBuffers(n, bufs);
            }
        }
    }
    
    void GL_APIENTRY DrawElementsInstanced(GLenum mode,
                                           GLsizei count,
                                           GLenum type,
                                           const void *indices,
                                           GLsizei instancecount)
    {
        EVENT(
            "(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const void *indices = "
            "0x%0.8p, GLsizei instancecount = %d)",
            mode, count, type, indices, instancecount);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::DrawElementsInstanced>(mode, count, type, indices,
                                                                     instancecount);
    
            if (context->skipValidation() ||
                ValidateDrawElementsInstanced(context, mode, count, type, indices, instancecount))
            {
                context->drawElementsInstanced(mode, count, type, indices, instancecount);
            }
        }
    }
    
    void GL_APIENTRY DrawRangeElements(GLenum mode,
                                       GLuint start,
                                       GLuint end,
                                       GLsizei count,
                                       GLenum type,
                                       const void *indices)
    {
        EVENT(
            "(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type "
            "= 0x%X, const void *indices = 0x%0.8p)",
            mode, start, end, count, type, indices);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::DrawRangeElements>(mode, start, end, count, type,
                                                                 indices);
    
            if (context->skipValidation() ||
                ValidateDrawRangeElements(context, mode, start, end, count, type, indices))
            {
                context->drawRangeElements(mode, start, end, count, type, indices);
            }
        }
    }
    
    void GL_APIENTRY EndQuery(GLenum target)
    {
        EVENT("(GLenum target = 0x%X)", target);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::EndQuery>(target);
    
            if (context->skipValidation() || ValidateEndQuery(context, target))
            {
                context->endQuery(target);
            }
        }
    }
    
    void GL_APIENTRY EndTransformFeedback()
    {
        EVENT("()");
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::EndTransformFeedback>();
    
            if (context->skipValidation() || ValidateEndTransformFeedback(context))
            {
                context->endTransformFeedback();
            }
        }
    }
    
    GLsync GL_APIENTRY FenceSync(GLenum condition, GLbitfield flags)
    {
        EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::FenceSync>(condition, flags);
    
            if (context->skipValidation() || ValidateFenceSync(context, condition, flags))
            {
                return context->fenceSync(condition, flags);
            }
        }
    
        return GetDefaultReturnValue<EntryPoint::FenceSync, GLsync>();
    }
    
    void GL_APIENTRY FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
    {
        EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset,
              length);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferBinding targetPacked = FromGLenum<BufferBinding>(target);
            context->gatherParams<EntryPoint::FlushMappedBufferRange>(targetPacked, offset, length);
    
            if (context->skipValidation() ||
                ValidateFlushMappedBufferRange(context, targetPacked, offset, length))
            {
                context->flushMappedBufferRange(targetPacked, offset, length);
            }
        }
    }
    
    void GL_APIENTRY
    FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
    {
        EVENT(
            "(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, "
            "GLint layer = %d)",
            target, attachment, texture, level, layer);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::FramebufferTextureLayer>(target, attachment, texture,
                                                                       level, layer);
    
            if (context->skipValidation() ||
                ValidateFramebufferTextureLayer(context, target, attachment, texture, level, layer))
            {
                context->framebufferTextureLayer(target, attachment, texture, level, layer);
            }
        }
    }
    
    void GL_APIENTRY GenQueries(GLsizei n, GLuint *ids)
    {
        EVENT("(GLsizei n = %d, GLuint *ids = 0x%0.8p)", n, ids);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GenQueries>(n, ids);
    
            if (context->skipValidation() || ValidateGenQueries(context, n, ids))
            {
                context->genQueries(n, ids);
            }
        }
    }
    
    void GL_APIENTRY GenSamplers(GLsizei count, GLuint *samplers)
    {
        EVENT("(GLsizei count = %d, GLuint *samplers = 0x%0.8p)", count, samplers);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GenSamplers>(count, samplers);
    
            if (context->skipValidation() || ValidateGenSamplers(context, count, samplers))
            {
                context->genSamplers(count, samplers);
            }
        }
    }
    
    void GL_APIENTRY GenTransformFeedbacks(GLsizei n, GLuint *ids)
    {
        EVENT("(GLsizei n = %d, GLuint *ids = 0x%0.8p)", n, ids);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GenTransformFeedbacks>(n, ids);
    
            if (context->skipValidation() || ValidateGenTransformFeedbacks(context, n, ids))
            {
                context->genTransformFeedbacks(n, ids);
            }
        }
    }
    
    void GL_APIENTRY GenVertexArrays(GLsizei n, GLuint *arrays)
    {
        EVENT("(GLsizei n = %d, GLuint *arrays = 0x%0.8p)", n, arrays);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GenVertexArrays>(n, arrays);
    
            if (context->skipValidation() || ValidateGenVertexArrays(context, n, arrays))
            {
                context->genVertexArrays(n, arrays);
            }
        }
    }
    
    void GL_APIENTRY GetActiveUniformBlockName(GLuint program,
                                               GLuint uniformBlockIndex,
                                               GLsizei bufSize,
                                               GLsizei *length,
                                               GLchar *uniformBlockName)
    {
        EVENT(
            "(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei "
            "*length = 0x%0.8p, GLchar *uniformBlockName = 0x%0.8p)",
            program, uniformBlockIndex, bufSize, length, uniformBlockName);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetActiveUniformBlockName>(
                program, uniformBlockIndex, bufSize, length, uniformBlockName);
    
            if (context->skipValidation() ||
                ValidateGetActiveUniformBlockName(context, program, uniformBlockIndex, bufSize, length,
                                                  uniformBlockName))
            {
                context->getActiveUniformBlockName(program, uniformBlockIndex, bufSize, length,
                                                   uniformBlockName);
            }
        }
    }
    
    void GL_APIENTRY GetActiveUniformBlockiv(GLuint program,
                                             GLuint uniformBlockIndex,
                                             GLenum pname,
                                             GLint *params)
    {
        EVENT(
            "(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint *params = "
            "0x%0.8p)",
            program, uniformBlockIndex, pname, params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetActiveUniformBlockiv>(program, uniformBlockIndex,
                                                                       pname, params);
    
            if (context->skipValidation() ||
                ValidateGetActiveUniformBlockiv(context, program, uniformBlockIndex, pname, params))
            {
                context->getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
            }
        }
    }
    
    void GL_APIENTRY GetActiveUniformsiv(GLuint program,
                                         GLsizei uniformCount,
                                         const GLuint *uniformIndices,
                                         GLenum pname,
                                         GLint *params)
    {
        EVENT(
            "(GLuint program = %u, GLsizei uniformCount = %d, const GLuint *uniformIndices = 0x%0.8p, "
            "GLenum pname = 0x%X, GLint *params = 0x%0.8p)",
            program, uniformCount, uniformIndices, pname, params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetActiveUniformsiv>(program, uniformCount,
                                                                   uniformIndices, pname, params);
    
            if (context->skipValidation() || ValidateGetActiveUniformsiv(context, program, uniformCount,
                                                                         uniformIndices, pname, params))
            {
                context->getActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
            }
        }
    }
    
    void GL_APIENTRY GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
    {
        EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64 *params = 0x%0.8p)", target, pname,
              params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferBinding targetPacked = FromGLenum<BufferBinding>(target);
            context->gatherParams<EntryPoint::GetBufferParameteri64v>(targetPacked, pname, params);
    
            if (context->skipValidation() ||
                ValidateGetBufferParameteri64v(context, targetPacked, pname, params))
            {
                context->getBufferParameteri64v(targetPacked, pname, params);
            }
        }
    }
    
    void GL_APIENTRY GetBufferPointerv(GLenum target, GLenum pname, void **params)
    {
        EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, void **params = 0x%0.8p)", target, pname,
              params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferBinding targetPacked = FromGLenum<BufferBinding>(target);
            context->gatherParams<EntryPoint::GetBufferPointerv>(targetPacked, pname, params);
    
            if (context->skipValidation() ||
                ValidateGetBufferPointerv(context, targetPacked, pname, params))
            {
                context->getBufferPointerv(targetPacked, pname, params);
            }
        }
    }
    
    GLint GL_APIENTRY GetFragDataLocation(GLuint program, const GLchar *name)
    {
        EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)", program, name);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetFragDataLocation>(program, name);
    
            if (context->skipValidation() || ValidateGetFragDataLocation(context, program, name))
            {
                return context->getFragDataLocation(program, name);
            }
        }
    
        return GetDefaultReturnValue<EntryPoint::GetFragDataLocation, GLint>();
    }
    
    void GL_APIENTRY GetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
    {
        EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64 *data = 0x%0.8p)", target, index,
              data);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetInteger64i_v>(target, index, data);
    
            if (context->skipValidation() || ValidateGetInteger64i_v(context, target, index, data))
            {
                context->getInteger64i_v(target, index, data);
            }
        }
    }
    
    void GL_APIENTRY GetInteger64v(GLenum pname, GLint64 *data)
    {
        EVENT("(GLenum pname = 0x%X, GLint64 *data = 0x%0.8p)", pname, data);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetInteger64v>(pname, data);
    
            if (context->skipValidation() || ValidateGetInteger64v(context, pname, data))
            {
                context->getInteger64v(pname, data);
            }
        }
    }
    
    void GL_APIENTRY GetIntegeri_v(GLenum target, GLuint index, GLint *data)
    {
        EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint *data = 0x%0.8p)", target, index, data);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetIntegeri_v>(target, index, data);
    
            if (context->skipValidation() || ValidateGetIntegeri_v(context, target, index, data))
            {
                context->getIntegeri_v(target, index, data);
            }
        }
    }
    
    void GL_APIENTRY GetInternalformativ(GLenum target,
                                         GLenum internalformat,
                                         GLenum pname,
                                         GLsizei bufSize,
                                         GLint *params)
    {
        EVENT(
            "(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize "
            "= %d, GLint *params = 0x%0.8p)",
            target, internalformat, pname, bufSize, params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetInternalformativ>(target, internalformat, pname,
                                                                   bufSize, params);
    
            if (context->skipValidation() ||
                ValidateGetInternalformativ(context, target, internalformat, pname, bufSize, params))
            {
                context->getInternalformativ(target, internalformat, pname, bufSize, params);
            }
        }
    }
    
    void GL_APIENTRY GetProgramBinary(GLuint program,
                                      GLsizei bufSize,
                                      GLsizei *length,
                                      GLenum *binaryFormat,
                                      void *binary)
    {
        EVENT(
            "(GLuint program = %u, GLsizei bufSize = %d, GLsizei *length = 0x%0.8p, GLenum "
            "*binaryFormat = 0x%0.8p, void *binary = 0x%0.8p)",
            program, bufSize, length, binaryFormat, binary);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetProgramBinary>(program, bufSize, length, binaryFormat,
                                                                binary);
    
            if (context->skipValidation() ||
                ValidateGetProgramBinary(context, program, bufSize, length, binaryFormat, binary))
            {
                context->getProgramBinary(program, bufSize, length, binaryFormat, binary);
            }
        }
    }
    
    void GL_APIENTRY GetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
    {
        EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetQueryObjectuiv>(id, pname, params);
    
            if (context->skipValidation() || ValidateGetQueryObjectuiv(context, id, pname, params))
            {
                context->getQueryObjectuiv(id, pname, params);
            }
        }
    }
    
    void GL_APIENTRY GetQueryiv(GLenum target, GLenum pname, GLint *params)
    {
        EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname,
              params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetQueryiv>(target, pname, params);
    
            if (context->skipValidation() || ValidateGetQueryiv(context, target, pname, params))
            {
                context->getQueryiv(target, pname, params);
            }
        }
    }
    
    void GL_APIENTRY GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
    {
        EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat *params = 0x%0.8p)", sampler, pname,
              params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetSamplerParameterfv>(sampler, pname, params);
    
            if (context->skipValidation() ||
                ValidateGetSamplerParameterfv(context, sampler, pname, params))
            {
                context->getSamplerParameterfv(sampler, pname, params);
            }
        }
    }
    
    void GL_APIENTRY GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
    {
        EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", sampler, pname,
              params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetSamplerParameteriv>(sampler, pname, params);
    
            if (context->skipValidation() ||
                ValidateGetSamplerParameteriv(context, sampler, pname, params))
            {
                context->getSamplerParameteriv(sampler, pname, params);
            }
        }
    }
    
    const GLubyte *GL_APIENTRY GetStringi(GLenum name, GLuint index)
    {
        EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetStringi>(name, index);
    
            if (context->skipValidation() || ValidateGetStringi(context, name, index))
            {
                return context->getStringi(name, index);
            }
        }
    
        return GetDefaultReturnValue<EntryPoint::GetStringi, const GLubyte *>();
    }
    
    void GL_APIENTRY
    GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
    {
        EVENT(
            "(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei *length = "
            "0x%0.8p, GLint *values = 0x%0.8p)",
            sync, pname, bufSize, length, values);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetSynciv>(sync, pname, bufSize, length, values);
    
            if (context->skipValidation() ||
                ValidateGetSynciv(context, sync, pname, bufSize, length, values))
            {
                context->getSynciv(sync, pname, bufSize, length, values);
            }
        }
    }
    
    void GL_APIENTRY GetTransformFeedbackVarying(GLuint program,
                                                 GLuint index,
                                                 GLsizei bufSize,
                                                 GLsizei *length,
                                                 GLsizei *size,
                                                 GLenum *type,
                                                 GLchar *name)
    {
        EVENT(
            "(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei *length = 0x%0.8p, "
            "GLsizei *size = 0x%0.8p, GLenum *type = 0x%0.8p, GLchar *name = 0x%0.8p)",
            program, index, bufSize, length, size, type, name);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetTransformFeedbackVarying>(program, index, bufSize,
                                                                           length, size, type, name);
    
            if (context->skipValidation() ||
                ValidateGetTransformFeedbackVarying(context, program, index, bufSize, length, size,
                                                    type, name))
            {
                context->getTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
            }
        }
    }
    
    GLuint GL_APIENTRY GetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
    {
        EVENT("(GLuint program = %u, const GLchar *uniformBlockName = 0x%0.8p)", program,
              uniformBlockName);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetUniformBlockIndex>(program, uniformBlockName);
    
            if (context->skipValidation() ||
                ValidateGetUniformBlockIndex(context, program, uniformBlockName))
            {
                return context->getUniformBlockIndex(program, uniformBlockName);
            }
        }
    
        return GetDefaultReturnValue<EntryPoint::GetUniformBlockIndex, GLuint>();
    }
    
    void GL_APIENTRY GetUniformIndices(GLuint program,
                                       GLsizei uniformCount,
                                       const GLchar *const *uniformNames,
                                       GLuint *uniformIndices)
    {
        EVENT(
            "(GLuint program = %u, GLsizei uniformCount = %d, const GLchar *const*uniformNames = "
            "0x%0.8p, GLuint *uniformIndices = 0x%0.8p)",
            program, uniformCount, uniformNames, uniformIndices);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetUniformIndices>(program, uniformCount, uniformNames,
                                                                 uniformIndices);
    
            if (context->skipValidation() ||
                ValidateGetUniformIndices(context, program, uniformCount, uniformNames, uniformIndices))
            {
                context->getUniformIndices(program, uniformCount, uniformNames, uniformIndices);
            }
        }
    }
    
    void GL_APIENTRY GetUniformuiv(GLuint program, GLint location, GLuint *params)
    {
        EVENT("(GLuint program = %u, GLint location = %d, GLuint *params = 0x%0.8p)", program, location,
              params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetUniformuiv>(program, location, params);
    
            if (context->skipValidation() || ValidateGetUniformuiv(context, program, location, params))
            {
                context->getUniformuiv(program, location, params);
            }
        }
    }
    
    void GL_APIENTRY GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
    {
        EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", index, pname,
              params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetVertexAttribIiv>(index, pname, params);
    
            if (context->skipValidation() || ValidateGetVertexAttribIiv(context, index, pname, params))
            {
                context->getVertexAttribIiv(index, pname, params);
            }
        }
    }
    
    void GL_APIENTRY GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
    {
        EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", index, pname,
              params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::GetVertexAttribIuiv>(index, pname, params);
    
            if (context->skipValidation() || ValidateGetVertexAttribIuiv(context, index, pname, params))
            {
                context->getVertexAttribIuiv(index, pname, params);
            }
        }
    }
    
    void GL_APIENTRY InvalidateFramebuffer(GLenum target,
                                           GLsizei numAttachments,
                                           const GLenum *attachments)
    {
        EVENT(
            "(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum *attachments = 0x%0.8p)",
            target, numAttachments, attachments);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::InvalidateFramebuffer>(target, numAttachments,
                                                                     attachments);
    
            if (context->skipValidation() ||
                ValidateInvalidateFramebuffer(context, target, numAttachments, attachments))
            {
                context->invalidateFramebuffer(target, numAttachments, attachments);
            }
        }
    }
    
    void GL_APIENTRY InvalidateSubFramebuffer(GLenum target,
                                              GLsizei numAttachments,
                                              const GLenum *attachments,
                                              GLint x,
                                              GLint y,
                                              GLsizei width,
                                              GLsizei height)
    {
        EVENT(
            "(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum *attachments = 0x%0.8p, "
            "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
            target, numAttachments, attachments, x, y, width, height);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::InvalidateSubFramebuffer>(
                target, numAttachments, attachments, x, y, width, height);
    
            if (context->skipValidation() ||
                ValidateInvalidateSubFramebuffer(context, target, numAttachments, attachments, x, y,
                                                 width, height))
            {
                context->invalidateSubFramebuffer(target, numAttachments, attachments, x, y, width,
                                                  height);
            }
        }
    }
    
    GLboolean GL_APIENTRY IsQuery(GLuint id)
    {
        EVENT("(GLuint id = %u)", id);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::IsQuery>(id);
    
            if (context->skipValidation() || ValidateIsQuery(context, id))
            {
                return context->isQuery(id);
            }
        }
    
        return GetDefaultReturnValue<EntryPoint::IsQuery, GLboolean>();
    }
    
    GLboolean GL_APIENTRY IsSampler(GLuint sampler)
    {
        EVENT("(GLuint sampler = %u)", sampler);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::IsSampler>(sampler);
    
            if (context->skipValidation() || ValidateIsSampler(context, sampler))
            {
                return context->isSampler(sampler);
            }
        }
    
        return GetDefaultReturnValue<EntryPoint::IsSampler, GLboolean>();
    }
    
    GLboolean GL_APIENTRY IsSync(GLsync sync)
    {
        EVENT("(GLsync sync = 0x%0.8p)", sync);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::IsSync>(sync);
    
            if (context->skipValidation() || ValidateIsSync(context, sync))
            {
                return context->isSync(sync);
            }
        }
    
        return GetDefaultReturnValue<EntryPoint::IsSync, GLboolean>();
    }
    
    GLboolean GL_APIENTRY IsTransformFeedback(GLuint id)
    {
        EVENT("(GLuint id = %u)", id);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::IsTransformFeedback>(id);
    
            if (context->skipValidation() || ValidateIsTransformFeedback(context, id))
            {
                return context->isTransformFeedback(id);
            }
        }
    
        return GetDefaultReturnValue<EntryPoint::IsTransformFeedback, GLboolean>();
    }
    
    GLboolean GL_APIENTRY IsVertexArray(GLuint array)
    {
        EVENT("(GLuint array = %u)", array);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::IsVertexArray>(array);
    
            if (context->skipValidation() || ValidateIsVertexArray(context, array))
            {
                return context->isVertexArray(array);
            }
        }
    
        return GetDefaultReturnValue<EntryPoint::IsVertexArray, GLboolean>();
    }
    
    void *GL_APIENTRY MapBufferRange(GLenum target,
                                     GLintptr offset,
                                     GLsizeiptr length,
                                     GLbitfield access)
    {
        EVENT(
            "(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = "
            "0x%X)",
            target, offset, length, access);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferBinding targetPacked = FromGLenum<BufferBinding>(target);
            context->gatherParams<EntryPoint::MapBufferRange>(targetPacked, offset, length, access);
    
            if (context->skipValidation() ||
                ValidateMapBufferRange(context, targetPacked, offset, length, access))
            {
                return context->mapBufferRange(targetPacked, offset, length, access);
            }
        }
    
        return GetDefaultReturnValue<EntryPoint::MapBufferRange, void *>();
    }
    
    void GL_APIENTRY PauseTransformFeedback()
    {
        EVENT("()");
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::PauseTransformFeedback>();
    
            if (context->skipValidation() || ValidatePauseTransformFeedback(context))
            {
                context->pauseTransformFeedback();
            }
        }
    }
    
    void GL_APIENTRY ProgramBinary(GLuint program,
                                   GLenum binaryFormat,
                                   const void *binary,
                                   GLsizei length)
    {
        EVENT(
            "(GLuint program = %u, GLenum binaryFormat = 0x%X, const void *binary = 0x%0.8p, GLsizei "
            "length = %d)",
            program, binaryFormat, binary, length);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::ProgramBinary>(program, binaryFormat, binary, length);
    
            if (context->skipValidation() ||
                ValidateProgramBinary(context, program, binaryFormat, binary, length))
            {
                context->programBinary(program, binaryFormat, binary, length);
            }
        }
    }
    
    void GL_APIENTRY ProgramParameteri(GLuint program, GLenum pname, GLint value)
    {
        EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)", program, pname, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::ProgramParameteri>(program, pname, value);
    
            if (context->skipValidation() || ValidateProgramParameteri(context, program, pname, value))
            {
                context->programParameteri(program, pname, value);
            }
        }
    }
    
    void GL_APIENTRY ReadBuffer(GLenum src)
    {
        EVENT("(GLenum src = 0x%X)", src);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::ReadBuffer>(src);
    
            if (context->skipValidation() || ValidateReadBuffer(context, src))
            {
                context->readBuffer(src);
            }
        }
    }
    
    void GL_APIENTRY RenderbufferStorageMultisample(GLenum target,
                                                    GLsizei samples,
                                                    GLenum internalformat,
                                                    GLsizei width,
                                                    GLsizei height)
    {
        EVENT(
            "(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width "
            "= %d, GLsizei height = %d)",
            target, samples, internalformat, width, height);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::RenderbufferStorageMultisample>(
                target, samples, internalformat, width, height);
    
            if (context->skipValidation() ||
                ValidateRenderbufferStorageMultisample(context, target, samples, internalformat, width,
                                                       height))
            {
                context->renderbufferStorageMultisample(target, samples, internalformat, width, height);
            }
        }
    }
    
    void GL_APIENTRY ResumeTransformFeedback()
    {
        EVENT("()");
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::ResumeTransformFeedback>();
    
            if (context->skipValidation() || ValidateResumeTransformFeedback(context))
            {
                context->resumeTransformFeedback();
            }
        }
    }
    
    void GL_APIENTRY SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
    {
        EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %f)", sampler, pname, param);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::SamplerParameterf>(sampler, pname, param);
    
            if (context->skipValidation() || ValidateSamplerParameterf(context, sampler, pname, param))
            {
                context->samplerParameterf(sampler, pname, param);
            }
        }
    }
    
    void GL_APIENTRY SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
    {
        EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat *param = 0x%0.8p)", sampler,
              pname, param);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::SamplerParameterfv>(sampler, pname, param);
    
            if (context->skipValidation() || ValidateSamplerParameterfv(context, sampler, pname, param))
            {
                context->samplerParameterfv(sampler, pname, param);
            }
        }
    }
    
    void GL_APIENTRY SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
    {
        EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::SamplerParameteri>(sampler, pname, param);
    
            if (context->skipValidation() || ValidateSamplerParameteri(context, sampler, pname, param))
            {
                context->samplerParameteri(sampler, pname, param);
            }
        }
    }
    
    void GL_APIENTRY SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
    {
        EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint *param = 0x%0.8p)", sampler,
              pname, param);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::SamplerParameteriv>(sampler, pname, param);
    
            if (context->skipValidation() || ValidateSamplerParameteriv(context, sampler, pname, param))
            {
                context->samplerParameteriv(sampler, pname, param);
            }
        }
    }
    
    void GL_APIENTRY TexImage3D(GLenum target,
                                GLint level,
                                GLint internalformat,
                                GLsizei width,
                                GLsizei height,
                                GLsizei depth,
                                GLint border,
                                GLenum format,
                                GLenum type,
                                const void *pixels)
    {
        EVENT(
            "(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
            "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, GLenum "
            "type = 0x%X, const void *pixels = 0x%0.8p)",
            target, level, internalformat, width, height, depth, border, format, type, pixels);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked = FromGLenum<TextureType>(target);
            context->gatherParams<EntryPoint::TexImage3D>(targetPacked, level, internalformat, width,
                                                          height, depth, border, format, type, pixels);
    
            if (context->skipValidation() ||
                ValidateTexImage3D(context, targetPacked, level, internalformat, width, height, depth,
                                   border, format, type, pixels))
            {
                context->texImage3D(targetPacked, level, internalformat, width, height, depth, border,
                                    format, type, pixels);
            }
        }
    }
    
    void GL_APIENTRY
    TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
    {
        EVENT(
            "(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = "
            "%d, GLsizei height = %d)",
            target, levels, internalformat, width, height);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked = FromGLenum<TextureType>(target);
            context->gatherParams<EntryPoint::TexStorage2D>(targetPacked, levels, internalformat, width,
                                                            height);
    
            if (context->skipValidation() ||
                ValidateTexStorage2D(context, targetPacked, levels, internalformat, width, height))
            {
                context->texStorage2D(targetPacked, levels, internalformat, width, height);
            }
        }
    }
    
    void GL_APIENTRY TexStorage3D(GLenum target,
                                  GLsizei levels,
                                  GLenum internalformat,
                                  GLsizei width,
                                  GLsizei height,
                                  GLsizei depth)
    {
        EVENT(
            "(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = "
            "%d, GLsizei height = %d, GLsizei depth = %d)",
            target, levels, internalformat, width, height, depth);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked = FromGLenum<TextureType>(target);
            context->gatherParams<EntryPoint::TexStorage3D>(targetPacked, levels, internalformat, width,
                                                            height, depth);
    
            if (context->skipValidation() || ValidateTexStorage3D(context, targetPacked, levels,
                                                                  internalformat, width, height, depth))
            {
                context->texStorage3D(targetPacked, levels, internalformat, width, height, depth);
            }
        }
    }
    
    void GL_APIENTRY TexSubImage3D(GLenum target,
                                   GLint level,
                                   GLint xoffset,
                                   GLint yoffset,
                                   GLint zoffset,
                                   GLsizei width,
                                   GLsizei height,
                                   GLsizei depth,
                                   GLenum format,
                                   GLenum type,
                                   const void *pixels)
    {
        EVENT(
            "(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, GLint "
            "zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLenum format "
            "= 0x%X, GLenum type = 0x%X, const void *pixels = 0x%0.8p)",
            target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked = FromGLenum<TextureType>(target);
            context->gatherParams<EntryPoint::TexSubImage3D>(targetPacked, level, xoffset, yoffset,
                                                             zoffset, width, height, depth, format,
                                                             type, pixels);
    
            if (context->skipValidation() ||
                ValidateTexSubImage3D(context, targetPacked, level, xoffset, yoffset, zoffset, width,
                                      height, depth, format, type, pixels))
            {
                context->texSubImage3D(targetPacked, level, xoffset, yoffset, zoffset, width, height,
                                       depth, format, type, pixels);
            }
        }
    }
    
    void GL_APIENTRY TransformFeedbackVaryings(GLuint program,
                                               GLsizei count,
                                               const GLchar *const *varyings,
                                               GLenum bufferMode)
    {
        EVENT(
            "(GLuint program = %u, GLsizei count = %d, const GLchar *const*varyings = 0x%0.8p, GLenum "
            "bufferMode = 0x%X)",
            program, count, varyings, bufferMode);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::TransformFeedbackVaryings>(program, count, varyings,
                                                                         bufferMode);
    
            if (context->skipValidation() ||
                ValidateTransformFeedbackVaryings(context, program, count, varyings, bufferMode))
            {
                context->transformFeedbackVaryings(program, count, varyings, bufferMode);
            }
        }
    }
    
    void GL_APIENTRY Uniform1ui(GLint location, GLuint v0)
    {
        EVENT("(GLint location = %d, GLuint v0 = %u)", location, v0);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::Uniform1ui>(location, v0);
    
            if (context->skipValidation() || ValidateUniform1ui(context, location, v0))
            {
                context->uniform1ui(location, v0);
            }
        }
    }
    
    void GL_APIENTRY Uniform1uiv(GLint location, GLsizei count, const GLuint *value)
    {
        EVENT("(GLint location = %d, GLsizei count = %d, const GLuint *value = 0x%0.8p)", location,
              count, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::Uniform1uiv>(location, count, value);
    
            if (context->skipValidation() || ValidateUniform1uiv(context, location, count, value))
            {
                context->uniform1uiv(location, count, value);
            }
        }
    }
    
    void GL_APIENTRY Uniform2ui(GLint location, GLuint v0, GLuint v1)
    {
        EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u)", location, v0, v1);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::Uniform2ui>(location, v0, v1);
    
            if (context->skipValidation() || ValidateUniform2ui(context, location, v0, v1))
            {
                context->uniform2ui(location, v0, v1);
            }
        }
    }
    
    void GL_APIENTRY Uniform2uiv(GLint location, GLsizei count, const GLuint *value)
    {
        EVENT("(GLint location = %d, GLsizei count = %d, const GLuint *value = 0x%0.8p)", location,
              count, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::Uniform2uiv>(location, count, value);
    
            if (context->skipValidation() || ValidateUniform2uiv(context, location, count, value))
            {
                context->uniform2uiv(location, count, value);
            }
        }
    }
    
    void GL_APIENTRY Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
    {
        EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u)", location, v0, v1,
              v2);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::Uniform3ui>(location, v0, v1, v2);
    
            if (context->skipValidation() || ValidateUniform3ui(context, location, v0, v1, v2))
            {
                context->uniform3ui(location, v0, v1, v2);
            }
        }
    }
    
    void GL_APIENTRY Uniform3uiv(GLint location, GLsizei count, const GLuint *value)
    {
        EVENT("(GLint location = %d, GLsizei count = %d, const GLuint *value = 0x%0.8p)", location,
              count, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::Uniform3uiv>(location, count, value);
    
            if (context->skipValidation() || ValidateUniform3uiv(context, location, count, value))
            {
                context->uniform3uiv(location, count, value);
            }
        }
    }
    
    void GL_APIENTRY Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
    {
        EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u, GLuint v3 = %u)",
              location, v0, v1, v2, v3);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::Uniform4ui>(location, v0, v1, v2, v3);
    
            if (context->skipValidation() || ValidateUniform4ui(context, location, v0, v1, v2, v3))
            {
                context->uniform4ui(location, v0, v1, v2, v3);
            }
        }
    }
    
    void GL_APIENTRY Uniform4uiv(GLint location, GLsizei count, const GLuint *value)
    {
        EVENT("(GLint location = %d, GLsizei count = %d, const GLuint *value = 0x%0.8p)", location,
              count, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::Uniform4uiv>(location, count, value);
    
            if (context->skipValidation() || ValidateUniform4uiv(context, location, count, value))
            {
                context->uniform4uiv(location, count, value);
            }
        }
    }
    
    void GL_APIENTRY UniformBlockBinding(GLuint program,
                                         GLuint uniformBlockIndex,
                                         GLuint uniformBlockBinding)
    {
        EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
              program, uniformBlockIndex, uniformBlockBinding);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::UniformBlockBinding>(program, uniformBlockIndex,
                                                                   uniformBlockBinding);
    
            if (context->skipValidation() ||
                ValidateUniformBlockBinding(context, program, uniformBlockIndex, uniformBlockBinding))
            {
                context->uniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
            }
        }
    }
    
    void GL_APIENTRY UniformMatrix2x3fv(GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLfloat *value)
    {
        EVENT(
            "(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat *value "
            "= 0x%0.8p)",
            location, count, transpose, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::UniformMatrix2x3fv>(location, count, transpose, value);
    
            if (context->skipValidation() ||
                ValidateUniformMatrix2x3fv(context, location, count, transpose, value))
            {
                context->uniformMatrix2x3fv(location, count, transpose, value);
            }
        }
    }
    
    void GL_APIENTRY UniformMatrix2x4fv(GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLfloat *value)
    {
        EVENT(
            "(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat *value "
            "= 0x%0.8p)",
            location, count, transpose, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::UniformMatrix2x4fv>(location, count, transpose, value);
    
            if (context->skipValidation() ||
                ValidateUniformMatrix2x4fv(context, location, count, transpose, value))
            {
                context->uniformMatrix2x4fv(location, count, transpose, value);
            }
        }
    }
    
    void GL_APIENTRY UniformMatrix3x2fv(GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLfloat *value)
    {
        EVENT(
            "(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat *value "
            "= 0x%0.8p)",
            location, count, transpose, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::UniformMatrix3x2fv>(location, count, transpose, value);
    
            if (context->skipValidation() ||
                ValidateUniformMatrix3x2fv(context, location, count, transpose, value))
            {
                context->uniformMatrix3x2fv(location, count, transpose, value);
            }
        }
    }
    
    void GL_APIENTRY UniformMatrix3x4fv(GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLfloat *value)
    {
        EVENT(
            "(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat *value "
            "= 0x%0.8p)",
            location, count, transpose, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::UniformMatrix3x4fv>(location, count, transpose, value);
    
            if (context->skipValidation() ||
                ValidateUniformMatrix3x4fv(context, location, count, transpose, value))
            {
                context->uniformMatrix3x4fv(location, count, transpose, value);
            }
        }
    }
    
    void GL_APIENTRY UniformMatrix4x2fv(GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLfloat *value)
    {
        EVENT(
            "(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat *value "
            "= 0x%0.8p)",
            location, count, transpose, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::UniformMatrix4x2fv>(location, count, transpose, value);
    
            if (context->skipValidation() ||
                ValidateUniformMatrix4x2fv(context, location, count, transpose, value))
            {
                context->uniformMatrix4x2fv(location, count, transpose, value);
            }
        }
    }
    
    void GL_APIENTRY UniformMatrix4x3fv(GLint location,
                                        GLsizei count,
                                        GLboolean transpose,
                                        const GLfloat *value)
    {
        EVENT(
            "(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat *value "
            "= 0x%0.8p)",
            location, count, transpose, value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::UniformMatrix4x3fv>(location, count, transpose, value);
    
            if (context->skipValidation() ||
                ValidateUniformMatrix4x3fv(context, location, count, transpose, value))
            {
                context->uniformMatrix4x3fv(location, count, transpose, value);
            }
        }
    }
    
    GLboolean GL_APIENTRY UnmapBuffer(GLenum target)
    {
        EVENT("(GLenum target = 0x%X)", target);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferBinding targetPacked = FromGLenum<BufferBinding>(target);
            context->gatherParams<EntryPoint::UnmapBuffer>(targetPacked);
    
            if (context->skipValidation() || ValidateUnmapBuffer(context, targetPacked))
            {
                return context->unmapBuffer(targetPacked);
            }
        }
    
        return GetDefaultReturnValue<EntryPoint::UnmapBuffer, GLboolean>();
    }
    
    void GL_APIENTRY VertexAttribDivisor(GLuint index, GLuint divisor)
    {
        EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::VertexAttribDivisor>(index, divisor);
    
            if (context->skipValidation() || ValidateVertexAttribDivisor(context, index, divisor))
            {
                context->vertexAttribDivisor(index, divisor);
            }
        }
    }
    
    void GL_APIENTRY VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
    {
        EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)", index, x,
              y, z, w);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::VertexAttribI4i>(index, x, y, z, w);
    
            if (context->skipValidation() || ValidateVertexAttribI4i(context, index, x, y, z, w))
            {
                context->vertexAttribI4i(index, x, y, z, w);
            }
        }
    }
    
    void GL_APIENTRY VertexAttribI4iv(GLuint index, const GLint *v)
    {
        EVENT("(GLuint index = %u, const GLint *v = 0x%0.8p)", index, v);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::VertexAttribI4iv>(index, v);
    
            if (context->skipValidation() || ValidateVertexAttribI4iv(context, index, v))
            {
                context->vertexAttribI4iv(index, v);
            }
        }
    }
    
    void GL_APIENTRY VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
    {
        EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)", index,
              x, y, z, w);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::VertexAttribI4ui>(index, x, y, z, w);
    
            if (context->skipValidation() || ValidateVertexAttribI4ui(context, index, x, y, z, w))
            {
                context->vertexAttribI4ui(index, x, y, z, w);
            }
        }
    }
    
    void GL_APIENTRY VertexAttribI4uiv(GLuint index, const GLuint *v)
    {
        EVENT("(GLuint index = %u, const GLuint *v = 0x%0.8p)", index, v);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::VertexAttribI4uiv>(index, v);
    
            if (context->skipValidation() || ValidateVertexAttribI4uiv(context, index, v))
            {
                context->vertexAttribI4uiv(index, v);
            }
        }
    }
    
    void GL_APIENTRY
    VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
    {
        EVENT(
            "(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const void "
            "*pointer = 0x%0.8p)",
            index, size, type, stride, pointer);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::VertexAttribIPointer>(index, size, type, stride, pointer);
    
            if (context->skipValidation() ||
                ValidateVertexAttribIPointer(context, index, size, type, stride, pointer))
            {
                context->vertexAttribIPointer(index, size, type, stride, pointer);
            }
        }
    }
    
    void GL_APIENTRY WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
    {
        EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)", sync, flags,
              timeout);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            context->gatherParams<EntryPoint::WaitSync>(sync, flags, timeout);
    
            if (context->skipValidation() || ValidateWaitSync(context, sync, flags, timeout))
            {
                context->waitSync(sync, flags, timeout);
            }
        }
    }
    }  // namespace gl