Edit

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

Branch :

  • Show log

    Commit

  • Author : Tobin Ehlis
    Date : 2019-08-13 14:13:35
    Hash : a2ec1344
    Message : Add shared mutex to frontend Add shared mutex to frontend API entrypoints that is only enabled when ANGLE is being used with a shared context. Bug: angleproject:2464 Change-Id: I0d918e37d9579dccd013dc88f563bed7de7ee55f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1685712 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Courtney Goeltzenleuchter <courtneygo@google.com> Commit-Queue: Courtney Goeltzenleuchter <courtneygo@google.com>

  • src/libGLESv2/entry_points_gles_2_0_autogen.cpp
  • // GENERATED FILE - DO NOT EDIT.
    // Generated by generate_entry_points.py using data from gl.xml.
    //
    // Copyright 2019 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_2_0_autogen.cpp:
    //   Defines the GLES 2.0 entry points.
    
    #include "libGLESv2/entry_points_gles_2_0_autogen.h"
    
    #include "libANGLE/Context.h"
    #include "libANGLE/Context.inl.h"
    #include "libANGLE/capture_gles_2_0_autogen.h"
    #include "libANGLE/entry_points_utils.h"
    #include "libANGLE/gl_enum_utils_autogen.h"
    #include "libANGLE/validationES2.h"
    #include "libGLESv2/global_state.h"
    
    namespace gl
    {
    void GL_APIENTRY ActiveTexture(GLenum texture)
    {
        EVENT("(GLenum texture = %s)", GLenumToString(GLenumGroup::TextureUnit, texture));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateActiveTexture(context, texture));
            if (isCallValid)
            {
                context->activeTexture(texture);
            }
            ANGLE_CAPTURE(ActiveTexture, isCallValid, context, texture);
        }
    }
    
    void GL_APIENTRY AttachShader(GLuint program, GLuint shader)
    {
        EVENT("(GLuint program = %u, GLuint shader = %u)", program, shader);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateAttachShader(context, program, shader));
            if (isCallValid)
            {
                context->attachShader(program, shader);
            }
            ANGLE_CAPTURE(AttachShader, isCallValid, context, program, shader);
        }
    }
    
    void GL_APIENTRY BindAttribLocation(GLuint program, GLuint index, const GLchar *name)
    {
        EVENT("(GLuint program = %u, GLuint index = %u, const GLchar *name = 0x%016" PRIxPTR ")",
              program, index, (uintptr_t)name);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateBindAttribLocation(context, program, index, name));
            if (isCallValid)
            {
                context->bindAttribLocation(program, index, name);
            }
            ANGLE_CAPTURE(BindAttribLocation, isCallValid, context, program, index, name);
        }
    }
    
    void GL_APIENTRY BindBuffer(GLenum target, GLuint buffer)
    {
        EVENT("(GLenum target = %s, GLuint buffer = %u)",
              GLenumToString(GLenumGroup::BufferTargetARB, target), buffer);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferBinding targetPacked                    = FromGL<BufferBinding>(target);
            BufferID bufferPacked                         = FromGL<BufferID>(buffer);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateBindBuffer(context, targetPacked, bufferPacked));
            if (isCallValid)
            {
                context->bindBuffer(targetPacked, bufferPacked);
            }
            ANGLE_CAPTURE(BindBuffer, isCallValid, context, targetPacked, bufferPacked);
        }
    }
    
    void GL_APIENTRY BindFramebuffer(GLenum target, GLuint framebuffer)
    {
        EVENT("(GLenum target = %s, GLuint framebuffer = %u)",
              GLenumToString(GLenumGroup::FramebufferTarget, target), framebuffer);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateBindFramebuffer(context, target, framebuffer));
            if (isCallValid)
            {
                context->bindFramebuffer(target, framebuffer);
            }
            ANGLE_CAPTURE(BindFramebuffer, isCallValid, context, target, framebuffer);
        }
    }
    
    void GL_APIENTRY BindRenderbuffer(GLenum target, GLuint renderbuffer)
    {
        EVENT("(GLenum target = %s, GLuint renderbuffer = %u)",
              GLenumToString(GLenumGroup::RenderbufferTarget, target), renderbuffer);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            RenderbufferID renderbufferPacked             = FromGL<RenderbufferID>(renderbuffer);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateBindRenderbuffer(context, target, renderbufferPacked));
            if (isCallValid)
            {
                context->bindRenderbuffer(target, renderbufferPacked);
            }
            ANGLE_CAPTURE(BindRenderbuffer, isCallValid, context, target, renderbufferPacked);
        }
    }
    
    void GL_APIENTRY BindTexture(GLenum target, GLuint texture)
    {
        EVENT("(GLenum target = %s, GLuint texture = %u)",
              GLenumToString(GLenumGroup::TextureTarget, target), texture);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked                      = FromGL<TextureType>(target);
            TextureID texturePacked                       = FromGL<TextureID>(texture);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateBindTexture(context, targetPacked, texturePacked));
            if (isCallValid)
            {
                context->bindTexture(targetPacked, texturePacked);
            }
            ANGLE_CAPTURE(BindTexture, isCallValid, context, targetPacked, texturePacked);
        }
    }
    
    void GL_APIENTRY BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
    {
        EVENT("(GLfloat red = %f, GLfloat green = %f, GLfloat blue = %f, GLfloat alpha = %f)", red,
              green, blue, alpha);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateBlendColor(context, red, green, blue, alpha));
            if (isCallValid)
            {
                context->blendColor(red, green, blue, alpha);
            }
            ANGLE_CAPTURE(BlendColor, isCallValid, context, red, green, blue, alpha);
        }
    }
    
    void GL_APIENTRY BlendEquation(GLenum mode)
    {
        EVENT("(GLenum mode = %s)", GLenumToString(GLenumGroup::BlendEquationModeEXT, mode));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateBlendEquation(context, mode));
            if (isCallValid)
            {
                context->blendEquation(mode);
            }
            ANGLE_CAPTURE(BlendEquation, isCallValid, context, mode);
        }
    }
    
    void GL_APIENTRY BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
    {
        EVENT("(GLenum modeRGB = %s, GLenum modeAlpha = %s)",
              GLenumToString(GLenumGroup::BlendEquationModeEXT, modeRGB),
              GLenumToString(GLenumGroup::BlendEquationModeEXT, modeAlpha));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateBlendEquationSeparate(context, modeRGB, modeAlpha));
            if (isCallValid)
            {
                context->blendEquationSeparate(modeRGB, modeAlpha);
            }
            ANGLE_CAPTURE(BlendEquationSeparate, isCallValid, context, modeRGB, modeAlpha);
        }
    }
    
    void GL_APIENTRY BlendFunc(GLenum sfactor, GLenum dfactor)
    {
        EVENT("(GLenum sfactor = %s, GLenum dfactor = %s)",
              GLenumToString(GLenumGroup::BlendingFactor, sfactor),
              GLenumToString(GLenumGroup::BlendingFactor, dfactor));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateBlendFunc(context, sfactor, dfactor));
            if (isCallValid)
            {
                context->blendFunc(sfactor, dfactor);
            }
            ANGLE_CAPTURE(BlendFunc, isCallValid, context, sfactor, dfactor);
        }
    }
    
    void GL_APIENTRY BlendFuncSeparate(GLenum sfactorRGB,
                                       GLenum dfactorRGB,
                                       GLenum sfactorAlpha,
                                       GLenum dfactorAlpha)
    {
        EVENT(
            "(GLenum sfactorRGB = %s, GLenum dfactorRGB = %s, GLenum sfactorAlpha = %s, GLenum "
            "dfactorAlpha = %s)",
            GLenumToString(GLenumGroup::BlendingFactor, sfactorRGB),
            GLenumToString(GLenumGroup::BlendingFactor, dfactorRGB),
            GLenumToString(GLenumGroup::BlendingFactor, sfactorAlpha),
            GLenumToString(GLenumGroup::BlendingFactor, dfactorAlpha));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateBlendFuncSeparate(context, sfactorRGB, dfactorRGB,
                                                                        sfactorAlpha, dfactorAlpha));
            if (isCallValid)
            {
                context->blendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
            }
            ANGLE_CAPTURE(BlendFuncSeparate, isCallValid, context, sfactorRGB, dfactorRGB, sfactorAlpha,
                          dfactorAlpha);
        }
    }
    
    void GL_APIENTRY BufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)
    {
        EVENT("(GLenum target = %s, GLsizeiptr size = %llu, const void *data = 0x%016" PRIxPTR
              ", GLenum usage = %s)",
              GLenumToString(GLenumGroup::BufferTargetARB, target),
              static_cast<unsigned long long>(size), (uintptr_t)data,
              GLenumToString(GLenumGroup::BufferUsageARB, usage));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferBinding targetPacked                    = FromGL<BufferBinding>(target);
            BufferUsage usagePacked                       = FromGL<BufferUsage>(usage);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateBufferData(context, targetPacked, size, data, usagePacked));
            if (isCallValid)
            {
                context->bufferData(targetPacked, size, data, usagePacked);
            }
            ANGLE_CAPTURE(BufferData, isCallValid, context, targetPacked, size, data, usagePacked);
        }
    }
    
    void GL_APIENTRY BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
    {
        EVENT(
            "(GLenum target = %s, GLintptr offset = %llu, GLsizeiptr size = %llu, const void *data = "
            "0x%016" PRIxPTR ")",
            GLenumToString(GLenumGroup::BufferTargetARB, target),
            static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size),
            (uintptr_t)data);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferBinding targetPacked                    = FromGL<BufferBinding>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateBufferSubData(context, targetPacked, offset, size, data));
            if (isCallValid)
            {
                context->bufferSubData(targetPacked, offset, size, data);
            }
            ANGLE_CAPTURE(BufferSubData, isCallValid, context, targetPacked, offset, size, data);
        }
    }
    
    GLenum GL_APIENTRY CheckFramebufferStatus(GLenum target)
    {
        EVENT("(GLenum target = %s)", GLenumToString(GLenumGroup::FramebufferTarget, target));
    
        Context *context = GetValidGlobalContext();
        GLenum returnValue;
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateCheckFramebufferStatus(context, target));
            if (isCallValid)
            {
                returnValue = context->checkFramebufferStatus(target);
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::CheckFramebufferStatus, GLenum>();
            }
            ANGLE_CAPTURE(CheckFramebufferStatus, isCallValid, context, target, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::CheckFramebufferStatus, GLenum>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY Clear(GLbitfield mask)
    {
        EVENT("(GLbitfield mask = %s)", GLbitfieldToString(GLenumGroup::ClearBufferMask, mask).c_str());
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateClear(context, mask));
            if (isCallValid)
            {
                context->clear(mask);
            }
            ANGLE_CAPTURE(Clear, isCallValid, context, mask);
        }
    }
    
    void GL_APIENTRY ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
    {
        EVENT("(GLfloat red = %f, GLfloat green = %f, GLfloat blue = %f, GLfloat alpha = %f)", red,
              green, blue, alpha);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateClearColor(context, red, green, blue, alpha));
            if (isCallValid)
            {
                context->clearColor(red, green, blue, alpha);
            }
            ANGLE_CAPTURE(ClearColor, isCallValid, context, red, green, blue, alpha);
        }
    }
    
    void GL_APIENTRY ClearDepthf(GLfloat d)
    {
        EVENT("(GLfloat d = %f)", d);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateClearDepthf(context, d));
            if (isCallValid)
            {
                context->clearDepthf(d);
            }
            ANGLE_CAPTURE(ClearDepthf, isCallValid, context, d);
        }
    }
    
    void GL_APIENTRY ClearStencil(GLint s)
    {
        EVENT("(GLint s = %d)", s);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateClearStencil(context, s));
            if (isCallValid)
            {
                context->clearStencil(s);
            }
            ANGLE_CAPTURE(ClearStencil, isCallValid, context, s);
        }
    }
    
    void GL_APIENTRY ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
    {
        EVENT("(GLboolean red = %s, GLboolean green = %s, GLboolean blue = %s, GLboolean alpha = %s)",
              GLbooleanToString(red), GLbooleanToString(green), GLbooleanToString(blue),
              GLbooleanToString(alpha));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateColorMask(context, red, green, blue, alpha));
            if (isCallValid)
            {
                context->colorMask(red, green, blue, alpha);
            }
            ANGLE_CAPTURE(ColorMask, isCallValid, context, red, green, blue, alpha);
        }
    }
    
    void GL_APIENTRY CompileShader(GLuint shader)
    {
        EVENT("(GLuint shader = %u)", shader);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateCompileShader(context, shader));
            if (isCallValid)
            {
                context->compileShader(shader);
            }
            ANGLE_CAPTURE(CompileShader, isCallValid, context, shader);
        }
    }
    
    void GL_APIENTRY CompressedTexImage2D(GLenum target,
                                          GLint level,
                                          GLenum internalformat,
                                          GLsizei width,
                                          GLsizei height,
                                          GLint border,
                                          GLsizei imageSize,
                                          const void *data)
    {
        EVENT(
            "(GLenum target = %s, GLint level = %d, GLenum internalformat = %s, GLsizei width = %d, "
            "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const void *data = "
            "0x%016" PRIxPTR ")",
            GLenumToString(GLenumGroup::TextureTarget, target), level,
            GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height, border,
            imageSize, (uintptr_t)data);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureTarget targetPacked                    = FromGL<TextureTarget>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateCompressedTexImage2D(context, targetPacked, level, internalformat, width,
                                              height, border, imageSize, data));
            if (isCallValid)
            {
                context->compressedTexImage2D(targetPacked, level, internalformat, width, height,
                                              border, imageSize, data);
            }
            ANGLE_CAPTURE(CompressedTexImage2D, isCallValid, context, targetPacked, level,
                          internalformat, width, height, border, imageSize, data);
        }
    }
    
    void GL_APIENTRY CompressedTexSubImage2D(GLenum target,
                                             GLint level,
                                             GLint xoffset,
                                             GLint yoffset,
                                             GLsizei width,
                                             GLsizei height,
                                             GLenum format,
                                             GLsizei imageSize,
                                             const void *data)
    {
        EVENT(
            "(GLenum target = %s, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, GLsizei "
            "width = %d, GLsizei height = %d, GLenum format = %s, GLsizei imageSize = %d, const void "
            "*data = 0x%016" PRIxPTR ")",
            GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset, width, height,
            GLenumToString(GLenumGroup::PixelFormat, format), imageSize, (uintptr_t)data);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureTarget targetPacked                    = FromGL<TextureTarget>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateCompressedTexSubImage2D(context, targetPacked, level, xoffset, yoffset, width,
                                                 height, format, imageSize, data));
            if (isCallValid)
            {
                context->compressedTexSubImage2D(targetPacked, level, xoffset, yoffset, width, height,
                                                 format, imageSize, data);
            }
            ANGLE_CAPTURE(CompressedTexSubImage2D, isCallValid, context, targetPacked, level, xoffset,
                          yoffset, width, height, format, imageSize, data);
        }
    }
    
    void GL_APIENTRY CopyTexImage2D(GLenum target,
                                    GLint level,
                                    GLenum internalformat,
                                    GLint x,
                                    GLint y,
                                    GLsizei width,
                                    GLsizei height,
                                    GLint border)
    {
        EVENT(
            "(GLenum target = %s, GLint level = %d, GLenum internalformat = %s, GLint x = %d, GLint y "
            "= %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
            GLenumToString(GLenumGroup::TextureTarget, target), level,
            GLenumToString(GLenumGroup::InternalFormat, internalformat), x, y, width, height, border);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureTarget targetPacked                    = FromGL<TextureTarget>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateCopyTexImage2D(context, targetPacked, level, internalformat, x,
                                                       y, width, height, border));
            if (isCallValid)
            {
                context->copyTexImage2D(targetPacked, level, internalformat, x, y, width, height,
                                        border);
            }
            ANGLE_CAPTURE(CopyTexImage2D, isCallValid, context, targetPacked, level, internalformat, x,
                          y, width, height, border);
        }
    }
    
    void GL_APIENTRY CopyTexSubImage2D(GLenum target,
                                       GLint level,
                                       GLint xoffset,
                                       GLint yoffset,
                                       GLint x,
                                       GLint y,
                                       GLsizei width,
                                       GLsizei height)
    {
        EVENT(
            "(GLenum target = %s, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, GLint x = "
            "%d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
            GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset, x, y, width,
            height);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureTarget targetPacked                    = FromGL<TextureTarget>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateCopyTexSubImage2D(context, targetPacked, level, xoffset,
                                                          yoffset, x, y, width, height));
            if (isCallValid)
            {
                context->copyTexSubImage2D(targetPacked, level, xoffset, yoffset, x, y, width, height);
            }
            ANGLE_CAPTURE(CopyTexSubImage2D, isCallValid, context, targetPacked, level, xoffset,
                          yoffset, x, y, width, height);
        }
    }
    
    GLuint GL_APIENTRY CreateProgram()
    {
        EVENT("()");
    
        Context *context = GetValidGlobalContext();
        GLuint returnValue;
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateCreateProgram(context));
            if (isCallValid)
            {
                returnValue = context->createProgram();
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::CreateProgram, GLuint>();
            }
            ANGLE_CAPTURE(CreateProgram, isCallValid, context, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::CreateProgram, GLuint>();
        }
        return returnValue;
    }
    
    GLuint GL_APIENTRY CreateShader(GLenum type)
    {
        EVENT("(GLenum type = %s)", GLenumToString(GLenumGroup::ShaderType, type));
    
        Context *context = GetValidGlobalContext();
        GLuint returnValue;
        if (context)
        {
            ShaderType typePacked                         = FromGL<ShaderType>(type);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateCreateShader(context, typePacked));
            if (isCallValid)
            {
                returnValue = context->createShader(typePacked);
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::CreateShader, GLuint>();
            }
            ANGLE_CAPTURE(CreateShader, isCallValid, context, typePacked, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::CreateShader, GLuint>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY CullFace(GLenum mode)
    {
        EVENT("(GLenum mode = %s)", GLenumToString(GLenumGroup::CullFaceMode, mode));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            CullFaceMode modePacked                       = FromGL<CullFaceMode>(mode);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateCullFace(context, modePacked));
            if (isCallValid)
            {
                context->cullFace(modePacked);
            }
            ANGLE_CAPTURE(CullFace, isCallValid, context, modePacked);
        }
    }
    
    void GL_APIENTRY DeleteBuffers(GLsizei n, const GLuint *buffers)
    {
        EVENT("(GLsizei n = %d, const GLuint *buffers = 0x%016" PRIxPTR ")", n, (uintptr_t)buffers);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            const BufferID *buffersPacked                 = FromGL<const BufferID *>(buffers);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateDeleteBuffers(context, n, buffersPacked));
            if (isCallValid)
            {
                context->deleteBuffers(n, buffersPacked);
            }
            ANGLE_CAPTURE(DeleteBuffers, isCallValid, context, n, buffersPacked);
        }
    }
    
    void GL_APIENTRY DeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
    {
        EVENT("(GLsizei n = %d, const GLuint *framebuffers = 0x%016" PRIxPTR ")", n,
              (uintptr_t)framebuffers);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateDeleteFramebuffers(context, n, framebuffers));
            if (isCallValid)
            {
                context->deleteFramebuffers(n, framebuffers);
            }
            ANGLE_CAPTURE(DeleteFramebuffers, isCallValid, context, n, framebuffers);
        }
    }
    
    void GL_APIENTRY DeleteProgram(GLuint program)
    {
        EVENT("(GLuint program = %u)", program);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateDeleteProgram(context, program));
            if (isCallValid)
            {
                context->deleteProgram(program);
            }
            ANGLE_CAPTURE(DeleteProgram, isCallValid, context, program);
        }
    }
    
    void GL_APIENTRY DeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
    {
        EVENT("(GLsizei n = %d, const GLuint *renderbuffers = 0x%016" PRIxPTR ")", n,
              (uintptr_t)renderbuffers);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            const RenderbufferID *renderbuffersPacked = FromGL<const RenderbufferID *>(renderbuffers);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateDeleteRenderbuffers(context, n, renderbuffersPacked));
            if (isCallValid)
            {
                context->deleteRenderbuffers(n, renderbuffersPacked);
            }
            ANGLE_CAPTURE(DeleteRenderbuffers, isCallValid, context, n, renderbuffersPacked);
        }
    }
    
    void GL_APIENTRY DeleteShader(GLuint shader)
    {
        EVENT("(GLuint shader = %u)", shader);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateDeleteShader(context, shader));
            if (isCallValid)
            {
                context->deleteShader(shader);
            }
            ANGLE_CAPTURE(DeleteShader, isCallValid, context, shader);
        }
    }
    
    void GL_APIENTRY DeleteTextures(GLsizei n, const GLuint *textures)
    {
        EVENT("(GLsizei n = %d, const GLuint *textures = 0x%016" PRIxPTR ")", n, (uintptr_t)textures);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            const TextureID *texturesPacked               = FromGL<const TextureID *>(textures);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateDeleteTextures(context, n, texturesPacked));
            if (isCallValid)
            {
                context->deleteTextures(n, texturesPacked);
            }
            ANGLE_CAPTURE(DeleteTextures, isCallValid, context, n, texturesPacked);
        }
    }
    
    void GL_APIENTRY DepthFunc(GLenum func)
    {
        EVENT("(GLenum func = %s)", GLenumToString(GLenumGroup::DepthFunction, func));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateDepthFunc(context, func));
            if (isCallValid)
            {
                context->depthFunc(func);
            }
            ANGLE_CAPTURE(DepthFunc, isCallValid, context, func);
        }
    }
    
    void GL_APIENTRY DepthMask(GLboolean flag)
    {
        EVENT("(GLboolean flag = %s)", GLbooleanToString(flag));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateDepthMask(context, flag));
            if (isCallValid)
            {
                context->depthMask(flag);
            }
            ANGLE_CAPTURE(DepthMask, isCallValid, context, flag);
        }
    }
    
    void GL_APIENTRY DepthRangef(GLfloat n, GLfloat f)
    {
        EVENT("(GLfloat n = %f, GLfloat f = %f)", n, f);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateDepthRangef(context, n, f));
            if (isCallValid)
            {
                context->depthRangef(n, f);
            }
            ANGLE_CAPTURE(DepthRangef, isCallValid, context, n, f);
        }
    }
    
    void GL_APIENTRY DetachShader(GLuint program, GLuint shader)
    {
        EVENT("(GLuint program = %u, GLuint shader = %u)", program, shader);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateDetachShader(context, program, shader));
            if (isCallValid)
            {
                context->detachShader(program, shader);
            }
            ANGLE_CAPTURE(DetachShader, isCallValid, context, program, shader);
        }
    }
    
    void GL_APIENTRY Disable(GLenum cap)
    {
        EVENT("(GLenum cap = %s)", GLenumToString(GLenumGroup::EnableCap, cap));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateDisable(context, cap));
            if (isCallValid)
            {
                context->disable(cap);
            }
            ANGLE_CAPTURE(Disable, isCallValid, context, cap);
        }
    }
    
    void GL_APIENTRY DisableVertexAttribArray(GLuint index)
    {
        EVENT("(GLuint index = %u)", index);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateDisableVertexAttribArray(context, index));
            if (isCallValid)
            {
                context->disableVertexAttribArray(index);
            }
            ANGLE_CAPTURE(DisableVertexAttribArray, isCallValid, context, index);
        }
    }
    
    void GL_APIENTRY DrawArrays(GLenum mode, GLint first, GLsizei count)
    {
        EVENT("(GLenum mode = %s, GLint first = %d, GLsizei count = %d)",
              GLenumToString(GLenumGroup::PrimitiveType, mode), first, count);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            PrimitiveMode modePacked                      = FromGL<PrimitiveMode>(mode);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateDrawArrays(context, modePacked, first, count));
            if (isCallValid)
            {
                context->drawArrays(modePacked, first, count);
            }
            ANGLE_CAPTURE(DrawArrays, isCallValid, context, modePacked, first, count);
        }
    }
    
    void GL_APIENTRY DrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
    {
        EVENT(
            "(GLenum mode = %s, GLsizei count = %d, GLenum type = %s, const void *indices = "
            "0x%016" PRIxPTR ")",
            GLenumToString(GLenumGroup::PrimitiveType, mode), count,
            GLenumToString(GLenumGroup::DrawElementsType, type), (uintptr_t)indices);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            PrimitiveMode modePacked                      = FromGL<PrimitiveMode>(mode);
            DrawElementsType typePacked                   = FromGL<DrawElementsType>(type);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateDrawElements(context, modePacked, count, typePacked, indices));
            if (isCallValid)
            {
                context->drawElements(modePacked, count, typePacked, indices);
            }
            ANGLE_CAPTURE(DrawElements, isCallValid, context, modePacked, count, typePacked, indices);
        }
    }
    
    void GL_APIENTRY Enable(GLenum cap)
    {
        EVENT("(GLenum cap = %s)", GLenumToString(GLenumGroup::EnableCap, cap));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateEnable(context, cap));
            if (isCallValid)
            {
                context->enable(cap);
            }
            ANGLE_CAPTURE(Enable, isCallValid, context, cap);
        }
    }
    
    void GL_APIENTRY EnableVertexAttribArray(GLuint index)
    {
        EVENT("(GLuint index = %u)", index);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateEnableVertexAttribArray(context, index));
            if (isCallValid)
            {
                context->enableVertexAttribArray(index);
            }
            ANGLE_CAPTURE(EnableVertexAttribArray, isCallValid, context, index);
        }
    }
    
    void GL_APIENTRY Finish()
    {
        EVENT("()");
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateFinish(context));
            if (isCallValid)
            {
                context->finish();
            }
            ANGLE_CAPTURE(Finish, isCallValid, context);
        }
    }
    
    void GL_APIENTRY Flush()
    {
        EVENT("()");
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateFlush(context));
            if (isCallValid)
            {
                context->flush();
            }
            ANGLE_CAPTURE(Flush, isCallValid, context);
        }
    }
    
    void GL_APIENTRY FramebufferRenderbuffer(GLenum target,
                                             GLenum attachment,
                                             GLenum renderbuffertarget,
                                             GLuint renderbuffer)
    {
        EVENT(
            "(GLenum target = %s, GLenum attachment = %s, GLenum renderbuffertarget = %s, GLuint "
            "renderbuffer = %u)",
            GLenumToString(GLenumGroup::FramebufferTarget, target),
            GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
            GLenumToString(GLenumGroup::RenderbufferTarget, renderbuffertarget), renderbuffer);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            RenderbufferID renderbufferPacked             = FromGL<RenderbufferID>(renderbuffer);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateFramebufferRenderbuffer(context, target, attachment, renderbuffertarget,
                                                 renderbufferPacked));
            if (isCallValid)
            {
                context->framebufferRenderbuffer(target, attachment, renderbuffertarget,
                                                 renderbufferPacked);
            }
            ANGLE_CAPTURE(FramebufferRenderbuffer, isCallValid, context, target, attachment,
                          renderbuffertarget, renderbufferPacked);
        }
    }
    
    void GL_APIENTRY FramebufferTexture2D(GLenum target,
                                          GLenum attachment,
                                          GLenum textarget,
                                          GLuint texture,
                                          GLint level)
    {
        EVENT(
            "(GLenum target = %s, GLenum attachment = %s, GLenum textarget = %s, GLuint texture = %u, "
            "GLint level = %d)",
            GLenumToString(GLenumGroup::FramebufferTarget, target),
            GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
            GLenumToString(GLenumGroup::TextureTarget, textarget), texture, level);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureTarget textargetPacked                 = FromGL<TextureTarget>(textarget);
            TextureID texturePacked                       = FromGL<TextureID>(texture);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateFramebufferTexture2D(context, target, attachment,
                                                             textargetPacked, texturePacked, level));
            if (isCallValid)
            {
                context->framebufferTexture2D(target, attachment, textargetPacked, texturePacked,
                                              level);
            }
            ANGLE_CAPTURE(FramebufferTexture2D, isCallValid, context, target, attachment,
                          textargetPacked, texturePacked, level);
        }
    }
    
    void GL_APIENTRY FrontFace(GLenum mode)
    {
        EVENT("(GLenum mode = %s)", GLenumToString(GLenumGroup::FrontFaceDirection, mode));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateFrontFace(context, mode));
            if (isCallValid)
            {
                context->frontFace(mode);
            }
            ANGLE_CAPTURE(FrontFace, isCallValid, context, mode);
        }
    }
    
    void GL_APIENTRY GenBuffers(GLsizei n, GLuint *buffers)
    {
        EVENT("(GLsizei n = %d, GLuint *buffers = 0x%016" PRIxPTR ")", n, (uintptr_t)buffers);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferID *buffersPacked                       = FromGL<BufferID *>(buffers);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGenBuffers(context, n, buffersPacked));
            if (isCallValid)
            {
                context->genBuffers(n, buffersPacked);
            }
            ANGLE_CAPTURE(GenBuffers, isCallValid, context, n, buffersPacked);
        }
    }
    
    void GL_APIENTRY GenFramebuffers(GLsizei n, GLuint *framebuffers)
    {
        EVENT("(GLsizei n = %d, GLuint *framebuffers = 0x%016" PRIxPTR ")", n, (uintptr_t)framebuffers);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGenFramebuffers(context, n, framebuffers));
            if (isCallValid)
            {
                context->genFramebuffers(n, framebuffers);
            }
            ANGLE_CAPTURE(GenFramebuffers, isCallValid, context, n, framebuffers);
        }
    }
    
    void GL_APIENTRY GenRenderbuffers(GLsizei n, GLuint *renderbuffers)
    {
        EVENT("(GLsizei n = %d, GLuint *renderbuffers = 0x%016" PRIxPTR ")", n,
              (uintptr_t)renderbuffers);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            RenderbufferID *renderbuffersPacked           = FromGL<RenderbufferID *>(renderbuffers);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateGenRenderbuffers(context, n, renderbuffersPacked));
            if (isCallValid)
            {
                context->genRenderbuffers(n, renderbuffersPacked);
            }
            ANGLE_CAPTURE(GenRenderbuffers, isCallValid, context, n, renderbuffersPacked);
        }
    }
    
    void GL_APIENTRY GenTextures(GLsizei n, GLuint *textures)
    {
        EVENT("(GLsizei n = %d, GLuint *textures = 0x%016" PRIxPTR ")", n, (uintptr_t)textures);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureID *texturesPacked                     = FromGL<TextureID *>(textures);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGenTextures(context, n, texturesPacked));
            if (isCallValid)
            {
                context->genTextures(n, texturesPacked);
            }
            ANGLE_CAPTURE(GenTextures, isCallValid, context, n, texturesPacked);
        }
    }
    
    void GL_APIENTRY GenerateMipmap(GLenum target)
    {
        EVENT("(GLenum target = %s)", GLenumToString(GLenumGroup::TextureTarget, target));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked                      = FromGL<TextureType>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGenerateMipmap(context, targetPacked));
            if (isCallValid)
            {
                context->generateMipmap(targetPacked);
            }
            ANGLE_CAPTURE(GenerateMipmap, isCallValid, context, targetPacked);
        }
    }
    
    void GL_APIENTRY GetActiveAttrib(GLuint program,
                                     GLuint index,
                                     GLsizei bufSize,
                                     GLsizei *length,
                                     GLint *size,
                                     GLenum *type,
                                     GLchar *name)
    {
        EVENT(
            "(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei *length = "
            "0x%016" PRIxPTR ", GLint *size = 0x%016" PRIxPTR ", GLenum *type = 0x%016" PRIxPTR
            ", GLchar *name = 0x%016" PRIxPTR ")",
            program, index, bufSize, (uintptr_t)length, (uintptr_t)size, (uintptr_t)type,
            (uintptr_t)name);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetActiveAttrib(context, program, index, bufSize, length, size, type, name));
            if (isCallValid)
            {
                context->getActiveAttrib(program, index, bufSize, length, size, type, name);
            }
            ANGLE_CAPTURE(GetActiveAttrib, isCallValid, context, program, index, bufSize, length, size,
                          type, name);
        }
    }
    
    void GL_APIENTRY GetActiveUniform(GLuint program,
                                      GLuint index,
                                      GLsizei bufSize,
                                      GLsizei *length,
                                      GLint *size,
                                      GLenum *type,
                                      GLchar *name)
    {
        EVENT(
            "(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei *length = "
            "0x%016" PRIxPTR ", GLint *size = 0x%016" PRIxPTR ", GLenum *type = 0x%016" PRIxPTR
            ", GLchar *name = 0x%016" PRIxPTR ")",
            program, index, bufSize, (uintptr_t)length, (uintptr_t)size, (uintptr_t)type,
            (uintptr_t)name);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetActiveUniform(context, program, index, bufSize, length, size, type, name));
            if (isCallValid)
            {
                context->getActiveUniform(program, index, bufSize, length, size, type, name);
            }
            ANGLE_CAPTURE(GetActiveUniform, isCallValid, context, program, index, bufSize, length, size,
                          type, name);
        }
    }
    
    void GL_APIENTRY GetAttachedShaders(GLuint program,
                                        GLsizei maxCount,
                                        GLsizei *count,
                                        GLuint *shaders)
    {
        EVENT("(GLuint program = %u, GLsizei maxCount = %d, GLsizei *count = 0x%016" PRIxPTR
              ", GLuint *shaders = 0x%016" PRIxPTR ")",
              program, maxCount, (uintptr_t)count, (uintptr_t)shaders);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateGetAttachedShaders(context, program, maxCount, count, shaders));
            if (isCallValid)
            {
                context->getAttachedShaders(program, maxCount, count, shaders);
            }
            ANGLE_CAPTURE(GetAttachedShaders, isCallValid, context, program, maxCount, count, shaders);
        }
    }
    
    GLint GL_APIENTRY GetAttribLocation(GLuint program, const GLchar *name)
    {
        EVENT("(GLuint program = %u, const GLchar *name = 0x%016" PRIxPTR ")", program,
              (uintptr_t)name);
    
        Context *context = GetValidGlobalContext();
        GLint returnValue;
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGetAttribLocation(context, program, name));
            if (isCallValid)
            {
                returnValue = context->getAttribLocation(program, name);
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::GetAttribLocation, GLint>();
            }
            ANGLE_CAPTURE(GetAttribLocation, isCallValid, context, program, name, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::GetAttribLocation, GLint>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY GetBooleanv(GLenum pname, GLboolean *data)
    {
        EVENT("(GLenum pname = %s, GLboolean *data = 0x%016" PRIxPTR ")",
              GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateGetBooleanv(context, pname, data));
            if (isCallValid)
            {
                context->getBooleanv(pname, data);
            }
            ANGLE_CAPTURE(GetBooleanv, isCallValid, context, pname, data);
        }
    }
    
    void GL_APIENTRY GetBufferParameteriv(GLenum target, GLenum pname, GLint *params)
    {
        EVENT("(GLenum target = %s, GLenum pname = %s, GLint *params = 0x%016" PRIxPTR ")",
              GLenumToString(GLenumGroup::BufferTargetARB, target),
              GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            BufferBinding targetPacked                    = FromGL<BufferBinding>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateGetBufferParameteriv(context, targetPacked, pname, params));
            if (isCallValid)
            {
                context->getBufferParameteriv(targetPacked, pname, params);
            }
            ANGLE_CAPTURE(GetBufferParameteriv, isCallValid, context, targetPacked, pname, params);
        }
    }
    
    GLenum GL_APIENTRY GetError()
    {
        EVENT("()");
    
        Context *context = GetGlobalContext();
        GLenum returnValue;
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateGetError(context));
            if (isCallValid)
            {
                returnValue = context->getError();
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::GetError, GLenum>();
            }
            ANGLE_CAPTURE(GetError, isCallValid, context, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::GetError, GLenum>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY GetFloatv(GLenum pname, GLfloat *data)
    {
        EVENT("(GLenum pname = %s, GLfloat *data = 0x%016" PRIxPTR ")",
              GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateGetFloatv(context, pname, data));
            if (isCallValid)
            {
                context->getFloatv(pname, data);
            }
            ANGLE_CAPTURE(GetFloatv, isCallValid, context, pname, data);
        }
    }
    
    void GL_APIENTRY GetFramebufferAttachmentParameteriv(GLenum target,
                                                         GLenum attachment,
                                                         GLenum pname,
                                                         GLint *params)
    {
        EVENT(
            "(GLenum target = %s, GLenum attachment = %s, GLenum pname = %s, GLint *params = "
            "0x%016" PRIxPTR ")",
            GLenumToString(GLenumGroup::FramebufferTarget, target),
            GLenumToString(GLenumGroup::FramebufferAttachment, attachment),
            GLenumToString(GLenumGroup::FramebufferAttachmentParameterName, pname), (uintptr_t)params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGetFramebufferAttachmentParameteriv(
                                                  context, target, attachment, pname, params));
            if (isCallValid)
            {
                context->getFramebufferAttachmentParameteriv(target, attachment, pname, params);
            }
            ANGLE_CAPTURE(GetFramebufferAttachmentParameteriv, isCallValid, context, target, attachment,
                          pname, params);
        }
    }
    
    void GL_APIENTRY GetIntegerv(GLenum pname, GLint *data)
    {
        EVENT("(GLenum pname = %s, GLint *data = 0x%016" PRIxPTR ")",
              GLenumToString(GLenumGroup::GetPName, pname), (uintptr_t)data);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateGetIntegerv(context, pname, data));
            if (isCallValid)
            {
                context->getIntegerv(pname, data);
            }
            ANGLE_CAPTURE(GetIntegerv, isCallValid, context, pname, data);
        }
    }
    
    void GL_APIENTRY GetProgramInfoLog(GLuint program,
                                       GLsizei bufSize,
                                       GLsizei *length,
                                       GLchar *infoLog)
    {
        EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei *length = 0x%016" PRIxPTR
              ", GLchar *infoLog = 0x%016" PRIxPTR ")",
              program, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateGetProgramInfoLog(context, program, bufSize, length, infoLog));
            if (isCallValid)
            {
                context->getProgramInfoLog(program, bufSize, length, infoLog);
            }
            ANGLE_CAPTURE(GetProgramInfoLog, isCallValid, context, program, bufSize, length, infoLog);
        }
    }
    
    void GL_APIENTRY GetProgramiv(GLuint program, GLenum pname, GLint *params)
    {
        EVENT("(GLuint program = %u, GLenum pname = %s, GLint *params = 0x%016" PRIxPTR ")", program,
              GLenumToString(GLenumGroup::ProgramPropertyARB, pname), (uintptr_t)params);
    
        Context *context = GetGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGetProgramiv(context, program, pname, params));
            if (isCallValid)
            {
                context->getProgramiv(program, pname, params);
            }
            ANGLE_CAPTURE(GetProgramiv, isCallValid, context, program, pname, params);
        }
    }
    
    void GL_APIENTRY GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
    {
        EVENT("(GLenum target = %s, GLenum pname = %s, GLint *params = 0x%016" PRIxPTR ")",
              GLenumToString(GLenumGroup::RenderbufferTarget, target),
              GLenumToString(GLenumGroup::RenderbufferParameterName, pname), (uintptr_t)params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateGetRenderbufferParameteriv(context, target, pname, params));
            if (isCallValid)
            {
                context->getRenderbufferParameteriv(target, pname, params);
            }
            ANGLE_CAPTURE(GetRenderbufferParameteriv, isCallValid, context, target, pname, params);
        }
    }
    
    void GL_APIENTRY GetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
    {
        EVENT("(GLuint shader = %u, GLsizei bufSize = %d, GLsizei *length = 0x%016" PRIxPTR
              ", GLchar *infoLog = 0x%016" PRIxPTR ")",
              shader, bufSize, (uintptr_t)length, (uintptr_t)infoLog);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateGetShaderInfoLog(context, shader, bufSize, length, infoLog));
            if (isCallValid)
            {
                context->getShaderInfoLog(shader, bufSize, length, infoLog);
            }
            ANGLE_CAPTURE(GetShaderInfoLog, isCallValid, context, shader, bufSize, length, infoLog);
        }
    }
    
    void GL_APIENTRY GetShaderPrecisionFormat(GLenum shadertype,
                                              GLenum precisiontype,
                                              GLint *range,
                                              GLint *precision)
    {
        EVENT("(GLenum shadertype = %s, GLenum precisiontype = %s, GLint *range = 0x%016" PRIxPTR
              ", GLint *precision = 0x%016" PRIxPTR ")",
              GLenumToString(GLenumGroup::ShaderType, shadertype),
              GLenumToString(GLenumGroup::PrecisionType, precisiontype), (uintptr_t)range,
              (uintptr_t)precision);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateGetShaderPrecisionFormat(context, shadertype, precisiontype,
                                                                 range, precision));
            if (isCallValid)
            {
                context->getShaderPrecisionFormat(shadertype, precisiontype, range, precision);
            }
            ANGLE_CAPTURE(GetShaderPrecisionFormat, isCallValid, context, shadertype, precisiontype,
                          range, precision);
        }
    }
    
    void GL_APIENTRY GetShaderSource(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)
    {
        EVENT("(GLuint shader = %u, GLsizei bufSize = %d, GLsizei *length = 0x%016" PRIxPTR
              ", GLchar *source = 0x%016" PRIxPTR ")",
              shader, bufSize, (uintptr_t)length, (uintptr_t)source);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateGetShaderSource(context, shader, bufSize, length, source));
            if (isCallValid)
            {
                context->getShaderSource(shader, bufSize, length, source);
            }
            ANGLE_CAPTURE(GetShaderSource, isCallValid, context, shader, bufSize, length, source);
        }
    }
    
    void GL_APIENTRY GetShaderiv(GLuint shader, GLenum pname, GLint *params)
    {
        EVENT("(GLuint shader = %u, GLenum pname = %s, GLint *params = 0x%016" PRIxPTR ")", shader,
              GLenumToString(GLenumGroup::ShaderParameterName, pname), (uintptr_t)params);
    
        Context *context = GetGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGetShaderiv(context, shader, pname, params));
            if (isCallValid)
            {
                context->getShaderiv(shader, pname, params);
            }
            ANGLE_CAPTURE(GetShaderiv, isCallValid, context, shader, pname, params);
        }
    }
    
    const GLubyte *GL_APIENTRY GetString(GLenum name)
    {
        EVENT("(GLenum name = %s)", GLenumToString(GLenumGroup::StringName, name));
    
        Context *context = GetValidGlobalContext();
        const GLubyte *returnValue;
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateGetString(context, name));
            if (isCallValid)
            {
                returnValue = context->getString(name);
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::GetString, const GLubyte *>();
            }
            ANGLE_CAPTURE(GetString, isCallValid, context, name, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::GetString, const GLubyte *>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY GetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
    {
        EVENT("(GLenum target = %s, GLenum pname = %s, GLfloat *params = 0x%016" PRIxPTR ")",
              GLenumToString(GLenumGroup::TextureTarget, target),
              GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked                      = FromGL<TextureType>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateGetTexParameterfv(context, targetPacked, pname, params));
            if (isCallValid)
            {
                context->getTexParameterfv(targetPacked, pname, params);
            }
            ANGLE_CAPTURE(GetTexParameterfv, isCallValid, context, targetPacked, pname, params);
        }
    }
    
    void GL_APIENTRY GetTexParameteriv(GLenum target, GLenum pname, GLint *params)
    {
        EVENT("(GLenum target = %s, GLenum pname = %s, GLint *params = 0x%016" PRIxPTR ")",
              GLenumToString(GLenumGroup::TextureTarget, target),
              GLenumToString(GLenumGroup::GetTextureParameter, pname), (uintptr_t)params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked                      = FromGL<TextureType>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateGetTexParameteriv(context, targetPacked, pname, params));
            if (isCallValid)
            {
                context->getTexParameteriv(targetPacked, pname, params);
            }
            ANGLE_CAPTURE(GetTexParameteriv, isCallValid, context, targetPacked, pname, params);
        }
    }
    
    GLint GL_APIENTRY GetUniformLocation(GLuint program, const GLchar *name)
    {
        EVENT("(GLuint program = %u, const GLchar *name = 0x%016" PRIxPTR ")", program,
              (uintptr_t)name);
    
        Context *context = GetValidGlobalContext();
        GLint returnValue;
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGetUniformLocation(context, program, name));
            if (isCallValid)
            {
                returnValue = context->getUniformLocation(program, name);
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::GetUniformLocation, GLint>();
            }
            ANGLE_CAPTURE(GetUniformLocation, isCallValid, context, program, name, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::GetUniformLocation, GLint>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY GetUniformfv(GLuint program, GLint location, GLfloat *params)
    {
        EVENT("(GLuint program = %u, GLint location = %d, GLfloat *params = 0x%016" PRIxPTR ")",
              program, location, (uintptr_t)params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGetUniformfv(context, program, location, params));
            if (isCallValid)
            {
                context->getUniformfv(program, location, params);
            }
            ANGLE_CAPTURE(GetUniformfv, isCallValid, context, program, location, params);
        }
    }
    
    void GL_APIENTRY GetUniformiv(GLuint program, GLint location, GLint *params)
    {
        EVENT("(GLuint program = %u, GLint location = %d, GLint *params = 0x%016" PRIxPTR ")", program,
              location, (uintptr_t)params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGetUniformiv(context, program, location, params));
            if (isCallValid)
            {
                context->getUniformiv(program, location, params);
            }
            ANGLE_CAPTURE(GetUniformiv, isCallValid, context, program, location, params);
        }
    }
    
    void GL_APIENTRY GetVertexAttribPointerv(GLuint index, GLenum pname, void **pointer)
    {
        EVENT("(GLuint index = %u, GLenum pname = %s, void **pointer = 0x%016" PRIxPTR ")", index,
              GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)pointer);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateGetVertexAttribPointerv(context, index, pname, pointer));
            if (isCallValid)
            {
                context->getVertexAttribPointerv(index, pname, pointer);
            }
            ANGLE_CAPTURE(GetVertexAttribPointerv, isCallValid, context, index, pname, pointer);
        }
    }
    
    void GL_APIENTRY GetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
    {
        EVENT("(GLuint index = %u, GLenum pname = %s, GLfloat *params = 0x%016" PRIxPTR ")", index,
              GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGetVertexAttribfv(context, index, pname, params));
            if (isCallValid)
            {
                context->getVertexAttribfv(index, pname, params);
            }
            ANGLE_CAPTURE(GetVertexAttribfv, isCallValid, context, index, pname, params);
        }
    }
    
    void GL_APIENTRY GetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
    {
        EVENT("(GLuint index = %u, GLenum pname = %s, GLint *params = 0x%016" PRIxPTR ")", index,
              GLenumToString(GLenumGroup::DefaultGroup, pname), (uintptr_t)params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGetVertexAttribiv(context, index, pname, params));
            if (isCallValid)
            {
                context->getVertexAttribiv(index, pname, params);
            }
            ANGLE_CAPTURE(GetVertexAttribiv, isCallValid, context, index, pname, params);
        }
    }
    
    void GL_APIENTRY Hint(GLenum target, GLenum mode)
    {
        EVENT("(GLenum target = %s, GLenum mode = %s)", GLenumToString(GLenumGroup::HintTarget, target),
              GLenumToString(GLenumGroup::HintMode, mode));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateHint(context, target, mode));
            if (isCallValid)
            {
                context->hint(target, mode);
            }
            ANGLE_CAPTURE(Hint, isCallValid, context, target, mode);
        }
    }
    
    GLboolean GL_APIENTRY IsBuffer(GLuint buffer)
    {
        EVENT("(GLuint buffer = %u)", buffer);
    
        Context *context = GetValidGlobalContext();
        GLboolean returnValue;
        if (context)
        {
            BufferID bufferPacked                         = FromGL<BufferID>(buffer);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateIsBuffer(context, bufferPacked));
            if (isCallValid)
            {
                returnValue = context->isBuffer(bufferPacked);
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::IsBuffer, GLboolean>();
            }
            ANGLE_CAPTURE(IsBuffer, isCallValid, context, bufferPacked, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::IsBuffer, GLboolean>();
        }
        return returnValue;
    }
    
    GLboolean GL_APIENTRY IsEnabled(GLenum cap)
    {
        EVENT("(GLenum cap = %s)", GLenumToString(GLenumGroup::EnableCap, cap));
    
        Context *context = GetValidGlobalContext();
        GLboolean returnValue;
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateIsEnabled(context, cap));
            if (isCallValid)
            {
                returnValue = context->isEnabled(cap);
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::IsEnabled, GLboolean>();
            }
            ANGLE_CAPTURE(IsEnabled, isCallValid, context, cap, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::IsEnabled, GLboolean>();
        }
        return returnValue;
    }
    
    GLboolean GL_APIENTRY IsFramebuffer(GLuint framebuffer)
    {
        EVENT("(GLuint framebuffer = %u)", framebuffer);
    
        Context *context = GetValidGlobalContext();
        GLboolean returnValue;
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateIsFramebuffer(context, framebuffer));
            if (isCallValid)
            {
                returnValue = context->isFramebuffer(framebuffer);
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::IsFramebuffer, GLboolean>();
            }
            ANGLE_CAPTURE(IsFramebuffer, isCallValid, context, framebuffer, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::IsFramebuffer, GLboolean>();
        }
        return returnValue;
    }
    
    GLboolean GL_APIENTRY IsProgram(GLuint program)
    {
        EVENT("(GLuint program = %u)", program);
    
        Context *context = GetValidGlobalContext();
        GLboolean returnValue;
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateIsProgram(context, program));
            if (isCallValid)
            {
                returnValue = context->isProgram(program);
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::IsProgram, GLboolean>();
            }
            ANGLE_CAPTURE(IsProgram, isCallValid, context, program, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::IsProgram, GLboolean>();
        }
        return returnValue;
    }
    
    GLboolean GL_APIENTRY IsRenderbuffer(GLuint renderbuffer)
    {
        EVENT("(GLuint renderbuffer = %u)", renderbuffer);
    
        Context *context = GetValidGlobalContext();
        GLboolean returnValue;
        if (context)
        {
            RenderbufferID renderbufferPacked             = FromGL<RenderbufferID>(renderbuffer);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateIsRenderbuffer(context, renderbufferPacked));
            if (isCallValid)
            {
                returnValue = context->isRenderbuffer(renderbufferPacked);
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::IsRenderbuffer, GLboolean>();
            }
            ANGLE_CAPTURE(IsRenderbuffer, isCallValid, context, renderbufferPacked, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::IsRenderbuffer, GLboolean>();
        }
        return returnValue;
    }
    
    GLboolean GL_APIENTRY IsShader(GLuint shader)
    {
        EVENT("(GLuint shader = %u)", shader);
    
        Context *context = GetValidGlobalContext();
        GLboolean returnValue;
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateIsShader(context, shader));
            if (isCallValid)
            {
                returnValue = context->isShader(shader);
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::IsShader, GLboolean>();
            }
            ANGLE_CAPTURE(IsShader, isCallValid, context, shader, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::IsShader, GLboolean>();
        }
        return returnValue;
    }
    
    GLboolean GL_APIENTRY IsTexture(GLuint texture)
    {
        EVENT("(GLuint texture = %u)", texture);
    
        Context *context = GetValidGlobalContext();
        GLboolean returnValue;
        if (context)
        {
            TextureID texturePacked                       = FromGL<TextureID>(texture);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateIsTexture(context, texturePacked));
            if (isCallValid)
            {
                returnValue = context->isTexture(texturePacked);
            }
            else
            {
                returnValue = GetDefaultReturnValue<EntryPoint::IsTexture, GLboolean>();
            }
            ANGLE_CAPTURE(IsTexture, isCallValid, context, texturePacked, returnValue);
        }
        else
        {
            returnValue = GetDefaultReturnValue<EntryPoint::IsTexture, GLboolean>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY LineWidth(GLfloat width)
    {
        EVENT("(GLfloat width = %f)", width);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateLineWidth(context, width));
            if (isCallValid)
            {
                context->lineWidth(width);
            }
            ANGLE_CAPTURE(LineWidth, isCallValid, context, width);
        }
    }
    
    void GL_APIENTRY LinkProgram(GLuint program)
    {
        EVENT("(GLuint program = %u)", program);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateLinkProgram(context, program));
            if (isCallValid)
            {
                context->linkProgram(program);
            }
            ANGLE_CAPTURE(LinkProgram, isCallValid, context, program);
        }
    }
    
    void GL_APIENTRY PixelStorei(GLenum pname, GLint param)
    {
        EVENT("(GLenum pname = %s, GLint param = %d)",
              GLenumToString(GLenumGroup::PixelStoreParameter, pname), param);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidatePixelStorei(context, pname, param));
            if (isCallValid)
            {
                context->pixelStorei(pname, param);
            }
            ANGLE_CAPTURE(PixelStorei, isCallValid, context, pname, param);
        }
    }
    
    void GL_APIENTRY PolygonOffset(GLfloat factor, GLfloat units)
    {
        EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidatePolygonOffset(context, factor, units));
            if (isCallValid)
            {
                context->polygonOffset(factor, units);
            }
            ANGLE_CAPTURE(PolygonOffset, isCallValid, context, factor, units);
        }
    }
    
    void GL_APIENTRY ReadPixels(GLint x,
                                GLint y,
                                GLsizei width,
                                GLsizei height,
                                GLenum format,
                                GLenum type,
                                void *pixels)
    {
        EVENT(
            "(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLenum format = %s, "
            "GLenum type = %s, void *pixels = 0x%016" PRIxPTR ")",
            x, y, width, height, GLenumToString(GLenumGroup::PixelFormat, format),
            GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateReadPixels(context, x, y, width, height, format, type, pixels));
            if (isCallValid)
            {
                context->readPixels(x, y, width, height, format, type, pixels);
            }
            ANGLE_CAPTURE(ReadPixels, isCallValid, context, x, y, width, height, format, type, pixels);
        }
    }
    
    void GL_APIENTRY ReleaseShaderCompiler()
    {
        EVENT("()");
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateReleaseShaderCompiler(context));
            if (isCallValid)
            {
                context->releaseShaderCompiler();
            }
            ANGLE_CAPTURE(ReleaseShaderCompiler, isCallValid, context);
        }
    }
    
    void GL_APIENTRY RenderbufferStorage(GLenum target,
                                         GLenum internalformat,
                                         GLsizei width,
                                         GLsizei height)
    {
        EVENT(
            "(GLenum target = %s, GLenum internalformat = %s, GLsizei width = %d, GLsizei height = %d)",
            GLenumToString(GLenumGroup::RenderbufferTarget, target),
            GLenumToString(GLenumGroup::InternalFormat, internalformat), width, height);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateRenderbufferStorage(context, target, internalformat, width, height));
            if (isCallValid)
            {
                context->renderbufferStorage(target, internalformat, width, height);
            }
            ANGLE_CAPTURE(RenderbufferStorage, isCallValid, context, target, internalformat, width,
                          height);
        }
    }
    
    void GL_APIENTRY SampleCoverage(GLfloat value, GLboolean invert)
    {
        EVENT("(GLfloat value = %f, GLboolean invert = %s)", value, GLbooleanToString(invert));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateSampleCoverage(context, value, invert));
            if (isCallValid)
            {
                context->sampleCoverage(value, invert);
            }
            ANGLE_CAPTURE(SampleCoverage, isCallValid, context, value, invert);
        }
    }
    
    void GL_APIENTRY Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
    {
        EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width,
              height);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateScissor(context, x, y, width, height));
            if (isCallValid)
            {
                context->scissor(x, y, width, height);
            }
            ANGLE_CAPTURE(Scissor, isCallValid, context, x, y, width, height);
        }
    }
    
    void GL_APIENTRY ShaderBinary(GLsizei count,
                                  const GLuint *shaders,
                                  GLenum binaryformat,
                                  const void *binary,
                                  GLsizei length)
    {
        EVENT("(GLsizei count = %d, const GLuint *shaders = 0x%016" PRIxPTR
              ", GLenum binaryformat = %s, const void *binary = 0x%016" PRIxPTR
              ", GLsizei length = %d)",
              count, (uintptr_t)shaders, GLenumToString(GLenumGroup::DefaultGroup, binaryformat),
              (uintptr_t)binary, length);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateShaderBinary(context, count, shaders, binaryformat, binary, length));
            if (isCallValid)
            {
                context->shaderBinary(count, shaders, binaryformat, binary, length);
            }
            ANGLE_CAPTURE(ShaderBinary, isCallValid, context, count, shaders, binaryformat, binary,
                          length);
        }
    }
    
    void GL_APIENTRY ShaderSource(GLuint shader,
                                  GLsizei count,
                                  const GLchar *const *string,
                                  const GLint *length)
    {
        EVENT("(GLuint shader = %u, GLsizei count = %d, const GLchar *const*string = 0x%016" PRIxPTR
              ", const GLint *length = 0x%016" PRIxPTR ")",
              shader, count, (uintptr_t)string, (uintptr_t)length);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateShaderSource(context, shader, count, string, length));
            if (isCallValid)
            {
                context->shaderSource(shader, count, string, length);
            }
            ANGLE_CAPTURE(ShaderSource, isCallValid, context, shader, count, string, length);
        }
    }
    
    void GL_APIENTRY StencilFunc(GLenum func, GLint ref, GLuint mask)
    {
        EVENT("(GLenum func = %s, GLint ref = %d, GLuint mask = %u)",
              GLenumToString(GLenumGroup::StencilFunction, func), ref, mask);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateStencilFunc(context, func, ref, mask));
            if (isCallValid)
            {
                context->stencilFunc(func, ref, mask);
            }
            ANGLE_CAPTURE(StencilFunc, isCallValid, context, func, ref, mask);
        }
    }
    
    void GL_APIENTRY StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
    {
        EVENT("(GLenum face = %s, GLenum func = %s, GLint ref = %d, GLuint mask = %u)",
              GLenumToString(GLenumGroup::StencilFaceDirection, face),
              GLenumToString(GLenumGroup::StencilFunction, func), ref, mask);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateStencilFuncSeparate(context, face, func, ref, mask));
            if (isCallValid)
            {
                context->stencilFuncSeparate(face, func, ref, mask);
            }
            ANGLE_CAPTURE(StencilFuncSeparate, isCallValid, context, face, func, ref, mask);
        }
    }
    
    void GL_APIENTRY StencilMask(GLuint mask)
    {
        EVENT("(GLuint mask = %u)", mask);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateStencilMask(context, mask));
            if (isCallValid)
            {
                context->stencilMask(mask);
            }
            ANGLE_CAPTURE(StencilMask, isCallValid, context, mask);
        }
    }
    
    void GL_APIENTRY StencilMaskSeparate(GLenum face, GLuint mask)
    {
        EVENT("(GLenum face = %s, GLuint mask = %u)",
              GLenumToString(GLenumGroup::StencilFaceDirection, face), mask);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateStencilMaskSeparate(context, face, mask));
            if (isCallValid)
            {
                context->stencilMaskSeparate(face, mask);
            }
            ANGLE_CAPTURE(StencilMaskSeparate, isCallValid, context, face, mask);
        }
    }
    
    void GL_APIENTRY StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
    {
        EVENT("(GLenum fail = %s, GLenum zfail = %s, GLenum zpass = %s)",
              GLenumToString(GLenumGroup::StencilOp, fail),
              GLenumToString(GLenumGroup::StencilOp, zfail),
              GLenumToString(GLenumGroup::StencilOp, zpass));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateStencilOp(context, fail, zfail, zpass));
            if (isCallValid)
            {
                context->stencilOp(fail, zfail, zpass);
            }
            ANGLE_CAPTURE(StencilOp, isCallValid, context, fail, zfail, zpass);
        }
    }
    
    void GL_APIENTRY StencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)
    {
        EVENT("(GLenum face = %s, GLenum sfail = %s, GLenum dpfail = %s, GLenum dppass = %s)",
              GLenumToString(GLenumGroup::StencilFaceDirection, face),
              GLenumToString(GLenumGroup::StencilOp, sfail),
              GLenumToString(GLenumGroup::StencilOp, dpfail),
              GLenumToString(GLenumGroup::StencilOp, dppass));
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateStencilOpSeparate(context, face, sfail, dpfail, dppass));
            if (isCallValid)
            {
                context->stencilOpSeparate(face, sfail, dpfail, dppass);
            }
            ANGLE_CAPTURE(StencilOpSeparate, isCallValid, context, face, sfail, dpfail, dppass);
        }
    }
    
    void GL_APIENTRY TexImage2D(GLenum target,
                                GLint level,
                                GLint internalformat,
                                GLsizei width,
                                GLsizei height,
                                GLint border,
                                GLenum format,
                                GLenum type,
                                const void *pixels)
    {
        EVENT(
            "(GLenum target = %s, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
            "GLsizei height = %d, GLint border = %d, GLenum format = %s, GLenum type = %s, const void "
            "*pixels = 0x%016" PRIxPTR ")",
            GLenumToString(GLenumGroup::TextureTarget, target), level, internalformat, width, height,
            border, GLenumToString(GLenumGroup::PixelFormat, format),
            GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureTarget targetPacked                    = FromGL<TextureTarget>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateTexImage2D(context, targetPacked, level, internalformat, width,
                                                   height, border, format, type, pixels));
            if (isCallValid)
            {
                context->texImage2D(targetPacked, level, internalformat, width, height, border, format,
                                    type, pixels);
            }
            ANGLE_CAPTURE(TexImage2D, isCallValid, context, targetPacked, level, internalformat, width,
                          height, border, format, type, pixels);
        }
    }
    
    void GL_APIENTRY TexParameterf(GLenum target, GLenum pname, GLfloat param)
    {
        EVENT("(GLenum target = %s, GLenum pname = %s, GLfloat param = %f)",
              GLenumToString(GLenumGroup::TextureTarget, target),
              GLenumToString(GLenumGroup::TextureParameterName, pname), param);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked                      = FromGL<TextureType>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateTexParameterf(context, targetPacked, pname, param));
            if (isCallValid)
            {
                context->texParameterf(targetPacked, pname, param);
            }
            ANGLE_CAPTURE(TexParameterf, isCallValid, context, targetPacked, pname, param);
        }
    }
    
    void GL_APIENTRY TexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
    {
        EVENT("(GLenum target = %s, GLenum pname = %s, const GLfloat *params = 0x%016" PRIxPTR ")",
              GLenumToString(GLenumGroup::TextureTarget, target),
              GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked                      = FromGL<TextureType>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateTexParameterfv(context, targetPacked, pname, params));
            if (isCallValid)
            {
                context->texParameterfv(targetPacked, pname, params);
            }
            ANGLE_CAPTURE(TexParameterfv, isCallValid, context, targetPacked, pname, params);
        }
    }
    
    void GL_APIENTRY TexParameteri(GLenum target, GLenum pname, GLint param)
    {
        EVENT("(GLenum target = %s, GLenum pname = %s, GLint param = %d)",
              GLenumToString(GLenumGroup::TextureTarget, target),
              GLenumToString(GLenumGroup::TextureParameterName, pname), param);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked                      = FromGL<TextureType>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateTexParameteri(context, targetPacked, pname, param));
            if (isCallValid)
            {
                context->texParameteri(targetPacked, pname, param);
            }
            ANGLE_CAPTURE(TexParameteri, isCallValid, context, targetPacked, pname, param);
        }
    }
    
    void GL_APIENTRY TexParameteriv(GLenum target, GLenum pname, const GLint *params)
    {
        EVENT("(GLenum target = %s, GLenum pname = %s, const GLint *params = 0x%016" PRIxPTR ")",
              GLenumToString(GLenumGroup::TextureTarget, target),
              GLenumToString(GLenumGroup::TextureParameterName, pname), (uintptr_t)params);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureType targetPacked                      = FromGL<TextureType>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateTexParameteriv(context, targetPacked, pname, params));
            if (isCallValid)
            {
                context->texParameteriv(targetPacked, pname, params);
            }
            ANGLE_CAPTURE(TexParameteriv, isCallValid, context, targetPacked, pname, params);
        }
    }
    
    void GL_APIENTRY TexSubImage2D(GLenum target,
                                   GLint level,
                                   GLint xoffset,
                                   GLint yoffset,
                                   GLsizei width,
                                   GLsizei height,
                                   GLenum format,
                                   GLenum type,
                                   const void *pixels)
    {
        EVENT(
            "(GLenum target = %s, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, GLsizei "
            "width = %d, GLsizei height = %d, GLenum format = %s, GLenum type = %s, const void *pixels "
            "= 0x%016" PRIxPTR ")",
            GLenumToString(GLenumGroup::TextureTarget, target), level, xoffset, yoffset, width, height,
            GLenumToString(GLenumGroup::PixelFormat, format),
            GLenumToString(GLenumGroup::PixelType, type), (uintptr_t)pixels);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            TextureTarget targetPacked                    = FromGL<TextureTarget>(target);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateTexSubImage2D(context, targetPacked, level, xoffset, yoffset,
                                                      width, height, format, type, pixels));
            if (isCallValid)
            {
                context->texSubImage2D(targetPacked, level, xoffset, yoffset, width, height, format,
                                       type, pixels);
            }
            ANGLE_CAPTURE(TexSubImage2D, isCallValid, context, targetPacked, level, xoffset, yoffset,
                          width, height, format, type, pixels);
        }
    }
    
    void GL_APIENTRY Uniform1f(GLint location, GLfloat v0)
    {
        EVENT("(GLint location = %d, GLfloat v0 = %f)", location, v0);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateUniform1f(context, location, v0));
            if (isCallValid)
            {
                context->uniform1f(location, v0);
            }
            ANGLE_CAPTURE(Uniform1f, isCallValid, context, location, v0);
        }
    }
    
    void GL_APIENTRY Uniform1fv(GLint location, GLsizei count, const GLfloat *value)
    {
        EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat *value = 0x%016" PRIxPTR ")",
              location, count, (uintptr_t)value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform1fv(context, location, count, value));
            if (isCallValid)
            {
                context->uniform1fv(location, count, value);
            }
            ANGLE_CAPTURE(Uniform1fv, isCallValid, context, location, count, value);
        }
    }
    
    void GL_APIENTRY Uniform1i(GLint location, GLint v0)
    {
        EVENT("(GLint location = %d, GLint v0 = %d)", location, v0);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateUniform1i(context, location, v0));
            if (isCallValid)
            {
                context->uniform1i(location, v0);
            }
            ANGLE_CAPTURE(Uniform1i, isCallValid, context, location, v0);
        }
    }
    
    void GL_APIENTRY Uniform1iv(GLint location, GLsizei count, const GLint *value)
    {
        EVENT("(GLint location = %d, GLsizei count = %d, const GLint *value = 0x%016" PRIxPTR ")",
              location, count, (uintptr_t)value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform1iv(context, location, count, value));
            if (isCallValid)
            {
                context->uniform1iv(location, count, value);
            }
            ANGLE_CAPTURE(Uniform1iv, isCallValid, context, location, count, value);
        }
    }
    
    void GL_APIENTRY Uniform2f(GLint location, GLfloat v0, GLfloat v1)
    {
        EVENT("(GLint location = %d, GLfloat v0 = %f, GLfloat v1 = %f)", location, v0, v1);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform2f(context, location, v0, v1));
            if (isCallValid)
            {
                context->uniform2f(location, v0, v1);
            }
            ANGLE_CAPTURE(Uniform2f, isCallValid, context, location, v0, v1);
        }
    }
    
    void GL_APIENTRY Uniform2fv(GLint location, GLsizei count, const GLfloat *value)
    {
        EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat *value = 0x%016" PRIxPTR ")",
              location, count, (uintptr_t)value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform2fv(context, location, count, value));
            if (isCallValid)
            {
                context->uniform2fv(location, count, value);
            }
            ANGLE_CAPTURE(Uniform2fv, isCallValid, context, location, count, value);
        }
    }
    
    void GL_APIENTRY Uniform2i(GLint location, GLint v0, GLint v1)
    {
        EVENT("(GLint location = %d, GLint v0 = %d, GLint v1 = %d)", location, v0, v1);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform2i(context, location, v0, v1));
            if (isCallValid)
            {
                context->uniform2i(location, v0, v1);
            }
            ANGLE_CAPTURE(Uniform2i, isCallValid, context, location, v0, v1);
        }
    }
    
    void GL_APIENTRY Uniform2iv(GLint location, GLsizei count, const GLint *value)
    {
        EVENT("(GLint location = %d, GLsizei count = %d, const GLint *value = 0x%016" PRIxPTR ")",
              location, count, (uintptr_t)value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform2iv(context, location, count, value));
            if (isCallValid)
            {
                context->uniform2iv(location, count, value);
            }
            ANGLE_CAPTURE(Uniform2iv, isCallValid, context, location, count, value);
        }
    }
    
    void GL_APIENTRY Uniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
    {
        EVENT("(GLint location = %d, GLfloat v0 = %f, GLfloat v1 = %f, GLfloat v2 = %f)", location, v0,
              v1, v2);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform3f(context, location, v0, v1, v2));
            if (isCallValid)
            {
                context->uniform3f(location, v0, v1, v2);
            }
            ANGLE_CAPTURE(Uniform3f, isCallValid, context, location, v0, v1, v2);
        }
    }
    
    void GL_APIENTRY Uniform3fv(GLint location, GLsizei count, const GLfloat *value)
    {
        EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat *value = 0x%016" PRIxPTR ")",
              location, count, (uintptr_t)value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform3fv(context, location, count, value));
            if (isCallValid)
            {
                context->uniform3fv(location, count, value);
            }
            ANGLE_CAPTURE(Uniform3fv, isCallValid, context, location, count, value);
        }
    }
    
    void GL_APIENTRY Uniform3i(GLint location, GLint v0, GLint v1, GLint v2)
    {
        EVENT("(GLint location = %d, GLint v0 = %d, GLint v1 = %d, GLint v2 = %d)", location, v0, v1,
              v2);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform3i(context, location, v0, v1, v2));
            if (isCallValid)
            {
                context->uniform3i(location, v0, v1, v2);
            }
            ANGLE_CAPTURE(Uniform3i, isCallValid, context, location, v0, v1, v2);
        }
    }
    
    void GL_APIENTRY Uniform3iv(GLint location, GLsizei count, const GLint *value)
    {
        EVENT("(GLint location = %d, GLsizei count = %d, const GLint *value = 0x%016" PRIxPTR ")",
              location, count, (uintptr_t)value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform3iv(context, location, count, value));
            if (isCallValid)
            {
                context->uniform3iv(location, count, value);
            }
            ANGLE_CAPTURE(Uniform3iv, isCallValid, context, location, count, value);
        }
    }
    
    void GL_APIENTRY Uniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
    {
        EVENT(
            "(GLint location = %d, GLfloat v0 = %f, GLfloat v1 = %f, GLfloat v2 = %f, GLfloat v3 = %f)",
            location, v0, v1, v2, v3);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform4f(context, location, v0, v1, v2, v3));
            if (isCallValid)
            {
                context->uniform4f(location, v0, v1, v2, v3);
            }
            ANGLE_CAPTURE(Uniform4f, isCallValid, context, location, v0, v1, v2, v3);
        }
    }
    
    void GL_APIENTRY Uniform4fv(GLint location, GLsizei count, const GLfloat *value)
    {
        EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat *value = 0x%016" PRIxPTR ")",
              location, count, (uintptr_t)value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform4fv(context, location, count, value));
            if (isCallValid)
            {
                context->uniform4fv(location, count, value);
            }
            ANGLE_CAPTURE(Uniform4fv, isCallValid, context, location, count, value);
        }
    }
    
    void GL_APIENTRY Uniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
    {
        EVENT("(GLint location = %d, GLint v0 = %d, GLint v1 = %d, GLint v2 = %d, GLint v3 = %d)",
              location, v0, v1, v2, v3);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform4i(context, location, v0, v1, v2, v3));
            if (isCallValid)
            {
                context->uniform4i(location, v0, v1, v2, v3);
            }
            ANGLE_CAPTURE(Uniform4i, isCallValid, context, location, v0, v1, v2, v3);
        }
    }
    
    void GL_APIENTRY Uniform4iv(GLint location, GLsizei count, const GLint *value)
    {
        EVENT("(GLint location = %d, GLsizei count = %d, const GLint *value = 0x%016" PRIxPTR ")",
              location, count, (uintptr_t)value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateUniform4iv(context, location, count, value));
            if (isCallValid)
            {
                context->uniform4iv(location, count, value);
            }
            ANGLE_CAPTURE(Uniform4iv, isCallValid, context, location, count, value);
        }
    }
    
    void GL_APIENTRY UniformMatrix2fv(GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
                                      const GLfloat *value)
    {
        EVENT(
            "(GLint location = %d, GLsizei count = %d, GLboolean transpose = %s, const GLfloat *value "
            "= 0x%016" PRIxPTR ")",
            location, count, GLbooleanToString(transpose), (uintptr_t)value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateUniformMatrix2fv(context, location, count, transpose, value));
            if (isCallValid)
            {
                context->uniformMatrix2fv(location, count, transpose, value);
            }
            ANGLE_CAPTURE(UniformMatrix2fv, isCallValid, context, location, count, transpose, value);
        }
    }
    
    void GL_APIENTRY UniformMatrix3fv(GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
                                      const GLfloat *value)
    {
        EVENT(
            "(GLint location = %d, GLsizei count = %d, GLboolean transpose = %s, const GLfloat *value "
            "= 0x%016" PRIxPTR ")",
            location, count, GLbooleanToString(transpose), (uintptr_t)value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateUniformMatrix3fv(context, location, count, transpose, value));
            if (isCallValid)
            {
                context->uniformMatrix3fv(location, count, transpose, value);
            }
            ANGLE_CAPTURE(UniformMatrix3fv, isCallValid, context, location, count, transpose, value);
        }
    }
    
    void GL_APIENTRY UniformMatrix4fv(GLint location,
                                      GLsizei count,
                                      GLboolean transpose,
                                      const GLfloat *value)
    {
        EVENT(
            "(GLint location = %d, GLsizei count = %d, GLboolean transpose = %s, const GLfloat *value "
            "= 0x%016" PRIxPTR ")",
            location, count, GLbooleanToString(transpose), (uintptr_t)value);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateUniformMatrix4fv(context, location, count, transpose, value));
            if (isCallValid)
            {
                context->uniformMatrix4fv(location, count, transpose, value);
            }
            ANGLE_CAPTURE(UniformMatrix4fv, isCallValid, context, location, count, transpose, value);
        }
    }
    
    void GL_APIENTRY UseProgram(GLuint program)
    {
        EVENT("(GLuint program = %u)", program);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateUseProgram(context, program));
            if (isCallValid)
            {
                context->useProgram(program);
            }
            ANGLE_CAPTURE(UseProgram, isCallValid, context, program);
        }
    }
    
    void GL_APIENTRY ValidateProgram(GLuint program)
    {
        EVENT("(GLuint program = %u)", program);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateValidateProgram(context, program));
            if (isCallValid)
            {
                context->validateProgram(program);
            }
            ANGLE_CAPTURE(ValidateProgram, isCallValid, context, program);
        }
    }
    
    void GL_APIENTRY VertexAttrib1f(GLuint index, GLfloat x)
    {
        EVENT("(GLuint index = %u, GLfloat x = %f)", index, x);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid = (context->skipValidation() || ValidateVertexAttrib1f(context, index, x));
            if (isCallValid)
            {
                context->vertexAttrib1f(index, x);
            }
            ANGLE_CAPTURE(VertexAttrib1f, isCallValid, context, index, x);
        }
    }
    
    void GL_APIENTRY VertexAttrib1fv(GLuint index, const GLfloat *v)
    {
        EVENT("(GLuint index = %u, const GLfloat *v = 0x%016" PRIxPTR ")", index, (uintptr_t)v);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateVertexAttrib1fv(context, index, v));
            if (isCallValid)
            {
                context->vertexAttrib1fv(index, v);
            }
            ANGLE_CAPTURE(VertexAttrib1fv, isCallValid, context, index, v);
        }
    }
    
    void GL_APIENTRY VertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
    {
        EVENT("(GLuint index = %u, GLfloat x = %f, GLfloat y = %f)", index, x, y);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateVertexAttrib2f(context, index, x, y));
            if (isCallValid)
            {
                context->vertexAttrib2f(index, x, y);
            }
            ANGLE_CAPTURE(VertexAttrib2f, isCallValid, context, index, x, y);
        }
    }
    
    void GL_APIENTRY VertexAttrib2fv(GLuint index, const GLfloat *v)
    {
        EVENT("(GLuint index = %u, const GLfloat *v = 0x%016" PRIxPTR ")", index, (uintptr_t)v);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateVertexAttrib2fv(context, index, v));
            if (isCallValid)
            {
                context->vertexAttrib2fv(index, v);
            }
            ANGLE_CAPTURE(VertexAttrib2fv, isCallValid, context, index, v);
        }
    }
    
    void GL_APIENTRY VertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
    {
        EVENT("(GLuint index = %u, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateVertexAttrib3f(context, index, x, y, z));
            if (isCallValid)
            {
                context->vertexAttrib3f(index, x, y, z);
            }
            ANGLE_CAPTURE(VertexAttrib3f, isCallValid, context, index, x, y, z);
        }
    }
    
    void GL_APIENTRY VertexAttrib3fv(GLuint index, const GLfloat *v)
    {
        EVENT("(GLuint index = %u, const GLfloat *v = 0x%016" PRIxPTR ")", index, (uintptr_t)v);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateVertexAttrib3fv(context, index, v));
            if (isCallValid)
            {
                context->vertexAttrib3fv(index, v);
            }
            ANGLE_CAPTURE(VertexAttrib3fv, isCallValid, context, index, v);
        }
    }
    
    void GL_APIENTRY VertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
    {
        EVENT("(GLuint index = %u, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)",
              index, x, y, z, w);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateVertexAttrib4f(context, index, x, y, z, w));
            if (isCallValid)
            {
                context->vertexAttrib4f(index, x, y, z, w);
            }
            ANGLE_CAPTURE(VertexAttrib4f, isCallValid, context, index, x, y, z, w);
        }
    }
    
    void GL_APIENTRY VertexAttrib4fv(GLuint index, const GLfloat *v)
    {
        EVENT("(GLuint index = %u, const GLfloat *v = 0x%016" PRIxPTR ")", index, (uintptr_t)v);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateVertexAttrib4fv(context, index, v));
            if (isCallValid)
            {
                context->vertexAttrib4fv(index, v);
            }
            ANGLE_CAPTURE(VertexAttrib4fv, isCallValid, context, index, v);
        }
    }
    
    void GL_APIENTRY VertexAttribPointer(GLuint index,
                                         GLint size,
                                         GLenum type,
                                         GLboolean normalized,
                                         GLsizei stride,
                                         const void *pointer)
    {
        EVENT(
            "(GLuint index = %u, GLint size = %d, GLenum type = %s, GLboolean normalized = %s, GLsizei "
            "stride = %d, const void *pointer = 0x%016" PRIxPTR ")",
            index, size, GLenumToString(GLenumGroup::VertexAttribPointerType, type),
            GLbooleanToString(normalized), stride, (uintptr_t)pointer);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            VertexAttribType typePacked                   = FromGL<VertexAttribType>(type);
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid                              = (context->skipValidation() ||
                                ValidateVertexAttribPointer(context, index, size, typePacked,
                                                            normalized, stride, pointer));
            if (isCallValid)
            {
                context->vertexAttribPointer(index, size, typePacked, normalized, stride, pointer);
            }
            ANGLE_CAPTURE(VertexAttribPointer, isCallValid, context, index, size, typePacked,
                          normalized, stride, pointer);
        }
    }
    
    void GL_APIENTRY Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
    {
        EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width,
              height);
    
        Context *context = GetValidGlobalContext();
        if (context)
        {
            std::unique_lock<std::mutex> shareContextLock = GetShareGroupLock(context);
            bool isCallValid =
                (context->skipValidation() || ValidateViewport(context, x, y, width, height));
            if (isCallValid)
            {
                context->viewport(x, y, width, height);
            }
            ANGLE_CAPTURE(Viewport, isCallValid, context, x, y, width, height);
        }
    }
    }  // namespace gl