Edit

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

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2022-08-25 11:16:23
    Hash : 64f41972
    Message : Use canonical gl.xml and update enum to string function. This replaces our copy of gl.xml with the upstream canonical copy. Note that one patch is required before we can remove ANGLE's copy: https://github.com/KhronosGroup/OpenGL-Registry/pull/538 Because the upstream version uses a new method of enum groups, we also update our enum-to-string generator to use the new groups. This new code includes many more enums and groups in the mapping. Bug: angleproject:6461 Change-Id: I1c0ab44c36afce8db04c9661b377bbe5762c913e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3856649 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>

  • src/libGLESv2/entry_points_gles_3_0_autogen.cpp
  • // GENERATED FILE - DO NOT EDIT.
    // Generated by generate_entry_points.py using data from gl.xml.
    //
    // Copyright 2020 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    // entry_points_gles_3_0_autogen.cpp:
    //   Defines the GLES 3.0 entry points.
    
    #include "libGLESv2/entry_points_gles_3_0_autogen.h"
    
    #include "common/entry_points_enum_autogen.h"
    #include "libANGLE/Context.h"
    #include "libANGLE/Context.inl.h"
    #include "libANGLE/capture/capture_gles_3_0_autogen.h"
    #include "libANGLE/capture/gl_enum_utils.h"
    #include "libANGLE/entry_points_utils.h"
    #include "libANGLE/validationES3.h"
    #include "libGLESv2/global_state.h"
    
    using namespace gl;
    
    extern "C" {
    void GL_APIENTRY GL_BeginQuery(GLenum target, GLuint id)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLBeginQuery, "context = %d, target = %s, id = %u", CID(context),
              GLenumToString(GLESEnum::QueryTarget, target), id);
    
        if (context)
        {
            QueryType targetPacked = PackParam<QueryType>(target);
            QueryID idPacked       = PackParam<QueryID>(id);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateBeginQuery(context, angle::EntryPoint::GLBeginQuery, targetPacked, idPacked));
            if (isCallValid)
            {
                context->beginQuery(targetPacked, idPacked);
            }
            ANGLE_CAPTURE_GL(BeginQuery, isCallValid, context, targetPacked, idPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_BeginTransformFeedback(GLenum primitiveMode)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLBeginTransformFeedback, "context = %d, primitiveMode = %s", CID(context),
              GLenumToString(GLESEnum::PrimitiveType, primitiveMode));
    
        if (context)
        {
            PrimitiveMode primitiveModePacked = PackParam<PrimitiveMode>(primitiveMode);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateBeginTransformFeedback(context, angle::EntryPoint::GLBeginTransformFeedback,
                                                primitiveModePacked));
            if (isCallValid)
            {
                context->beginTransformFeedback(primitiveModePacked);
            }
            ANGLE_CAPTURE_GL(BeginTransformFeedback, isCallValid, context, primitiveModePacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_BindBufferBase(GLenum target, GLuint index, GLuint buffer)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLBindBufferBase, "context = %d, target = %s, index = %u, buffer = %u",
              CID(context), GLenumToString(GLESEnum::BufferTargetARB, target), index, buffer);
    
        if (context)
        {
            BufferBinding targetPacked = PackParam<BufferBinding>(target);
            BufferID bufferPacked      = PackParam<BufferID>(buffer);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateBindBufferBase(context, angle::EntryPoint::GLBindBufferBase,
                                                       targetPacked, index, bufferPacked));
            if (isCallValid)
            {
                context->bindBufferBase(targetPacked, index, bufferPacked);
            }
            ANGLE_CAPTURE_GL(BindBufferBase, isCallValid, context, targetPacked, index, bufferPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY
    GL_BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLBindBufferRange,
              "context = %d, target = %s, index = %u, buffer = %u, offset = %llu, size = %llu",
              CID(context), GLenumToString(GLESEnum::BufferTargetARB, target), index, buffer,
              static_cast<unsigned long long>(offset), static_cast<unsigned long long>(size));
    
        if (context)
        {
            BufferBinding targetPacked = PackParam<BufferBinding>(target);
            BufferID bufferPacked      = PackParam<BufferID>(buffer);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateBindBufferRange(context, angle::EntryPoint::GLBindBufferRange, targetPacked,
                                         index, bufferPacked, offset, size));
            if (isCallValid)
            {
                context->bindBufferRange(targetPacked, index, bufferPacked, offset, size);
            }
            ANGLE_CAPTURE_GL(BindBufferRange, isCallValid, context, targetPacked, index, bufferPacked,
                             offset, size);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_BindSampler(GLuint unit, GLuint sampler)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLBindSampler, "context = %d, unit = %u, sampler = %u", CID(context), unit,
              sampler);
    
        if (context)
        {
            SamplerID samplerPacked = PackParam<SamplerID>(sampler);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateBindSampler(context, angle::EntryPoint::GLBindSampler, unit, samplerPacked));
            if (isCallValid)
            {
                context->bindSampler(unit, samplerPacked);
            }
            ANGLE_CAPTURE_GL(BindSampler, isCallValid, context, unit, samplerPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_BindTransformFeedback(GLenum target, GLuint id)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLBindTransformFeedback, "context = %d, target = %s, id = %u", CID(context),
              GLenumToString(GLESEnum::BindTransformFeedbackTarget, target), id);
    
        if (context)
        {
            TransformFeedbackID idPacked = PackParam<TransformFeedbackID>(id);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateBindTransformFeedback(context, angle::EntryPoint::GLBindTransformFeedback,
                                               target, idPacked));
            if (isCallValid)
            {
                context->bindTransformFeedback(target, idPacked);
            }
            ANGLE_CAPTURE_GL(BindTransformFeedback, isCallValid, context, target, idPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_BindVertexArray(GLuint array)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLBindVertexArray, "context = %d, array = %u", CID(context), array);
    
        if (context)
        {
            VertexArrayID arrayPacked = PackParam<VertexArrayID>(array);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateBindVertexArray(context, angle::EntryPoint::GLBindVertexArray, arrayPacked));
            if (isCallValid)
            {
                context->bindVertexArray(arrayPacked);
            }
            ANGLE_CAPTURE_GL(BindVertexArray, isCallValid, context, arrayPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_BlitFramebuffer(GLint srcX0,
                                        GLint srcY0,
                                        GLint srcX1,
                                        GLint srcY1,
                                        GLint dstX0,
                                        GLint dstY0,
                                        GLint dstX1,
                                        GLint dstY1,
                                        GLbitfield mask,
                                        GLenum filter)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLBlitFramebuffer,
              "context = %d, srcX0 = %d, srcY0 = %d, srcX1 = %d, srcY1 = %d, dstX0 = %d, dstY0 = %d, "
              "dstX1 = %d, dstY1 = %d, mask = %s, filter = %s",
              CID(context), srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
              GLbitfieldToString(GLESEnum::ClearBufferMask, mask).c_str(),
              GLenumToString(GLESEnum::BlitFramebufferFilter, filter));
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateBlitFramebuffer(context, angle::EntryPoint::GLBlitFramebuffer, srcX0, srcY0,
                                         srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter));
            if (isCallValid)
            {
                context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask,
                                         filter);
            }
            ANGLE_CAPTURE_GL(BlitFramebuffer, isCallValid, context, srcX0, srcY0, srcX1, srcY1, dstX0,
                             dstY0, dstX1, dstY1, mask, filter);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLClearBufferfi,
              "context = %d, buffer = %s, drawbuffer = %d, depth = %f, stencil = %d", CID(context),
              GLenumToString(GLESEnum::Buffer, buffer), drawbuffer, depth, stencil);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateClearBufferfi(context, angle::EntryPoint::GLClearBufferfi,
                                                      buffer, drawbuffer, depth, stencil));
            if (isCallValid)
            {
                context->clearBufferfi(buffer, drawbuffer, depth, stencil);
            }
            ANGLE_CAPTURE_GL(ClearBufferfi, isCallValid, context, buffer, drawbuffer, depth, stencil);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLClearBufferfv,
              "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
              GLenumToString(GLESEnum::Buffer, buffer), drawbuffer, (uintptr_t)value);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateClearBufferfv(context, angle::EntryPoint::GLClearBufferfv,
                                                      buffer, drawbuffer, value));
            if (isCallValid)
            {
                context->clearBufferfv(buffer, drawbuffer, value);
            }
            ANGLE_CAPTURE_GL(ClearBufferfv, isCallValid, context, buffer, drawbuffer, value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLClearBufferiv,
              "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
              GLenumToString(GLESEnum::Buffer, buffer), drawbuffer, (uintptr_t)value);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateClearBufferiv(context, angle::EntryPoint::GLClearBufferiv,
                                                      buffer, drawbuffer, value));
            if (isCallValid)
            {
                context->clearBufferiv(buffer, drawbuffer, value);
            }
            ANGLE_CAPTURE_GL(ClearBufferiv, isCallValid, context, buffer, drawbuffer, value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLClearBufferuiv,
              "context = %d, buffer = %s, drawbuffer = %d, value = 0x%016" PRIxPTR "", CID(context),
              GLenumToString(GLESEnum::Buffer, buffer), drawbuffer, (uintptr_t)value);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateClearBufferuiv(context, angle::EntryPoint::GLClearBufferuiv,
                                                       buffer, drawbuffer, value));
            if (isCallValid)
            {
                context->clearBufferuiv(buffer, drawbuffer, value);
            }
            ANGLE_CAPTURE_GL(ClearBufferuiv, isCallValid, context, buffer, drawbuffer, value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    GLenum GL_APIENTRY GL_ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLClientWaitSync,
              "context = %d, sync = 0x%016" PRIxPTR ", flags = %s, timeout = %llu", CID(context),
              (uintptr_t)sync, GLbitfieldToString(GLESEnum::SyncObjectMask, flags).c_str(),
              static_cast<unsigned long long>(timeout));
    
        GLenum returnValue;
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateClientWaitSync(context, angle::EntryPoint::GLClientWaitSync,
                                                       sync, flags, timeout));
            if (isCallValid)
            {
                returnValue = context->clientWaitSync(sync, flags, timeout);
            }
            else
            {
                returnValue = GetDefaultReturnValue<angle::EntryPoint::GLClientWaitSync, GLenum>();
            }
            ANGLE_CAPTURE_GL(ClientWaitSync, isCallValid, context, sync, flags, timeout, returnValue);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLClientWaitSync, GLenum>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY GL_CompressedTexImage3D(GLenum target,
                                             GLint level,
                                             GLenum internalformat,
                                             GLsizei width,
                                             GLsizei height,
                                             GLsizei depth,
                                             GLint border,
                                             GLsizei imageSize,
                                             const void *data)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLCompressedTexImage3D,
              "context = %d, target = %s, level = %d, internalformat = %s, width = %d, height = %d, "
              "depth = %d, border = %d, imageSize = %d, data = 0x%016" PRIxPTR "",
              CID(context), GLenumToString(GLESEnum::TextureTarget, target), level,
              GLenumToString(GLESEnum::InternalFormat, internalformat), width, height, depth, border,
              imageSize, (uintptr_t)data);
    
        if (context)
        {
            TextureTarget targetPacked = PackParam<TextureTarget>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateCompressedTexImage3D(context, angle::EntryPoint::GLCompressedTexImage3D,
                                              targetPacked, level, internalformat, width, height, depth,
                                              border, imageSize, data));
            if (isCallValid)
            {
                context->compressedTexImage3D(targetPacked, level, internalformat, width, height, depth,
                                              border, imageSize, data);
            }
            ANGLE_CAPTURE_GL(CompressedTexImage3D, isCallValid, context, targetPacked, level,
                             internalformat, width, height, depth, border, imageSize, data);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_CompressedTexSubImage3D(GLenum target,
                                                GLint level,
                                                GLint xoffset,
                                                GLint yoffset,
                                                GLint zoffset,
                                                GLsizei width,
                                                GLsizei height,
                                                GLsizei depth,
                                                GLenum format,
                                                GLsizei imageSize,
                                                const void *data)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLCompressedTexSubImage3D,
              "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
              "= %d, height = %d, depth = %d, format = %s, imageSize = %d, data = 0x%016" PRIxPTR "",
              CID(context), GLenumToString(GLESEnum::TextureTarget, target), level, xoffset, yoffset,
              zoffset, width, height, depth, GLenumToString(GLESEnum::InternalFormat, format),
              imageSize, (uintptr_t)data);
    
        if (context)
        {
            TextureTarget targetPacked = PackParam<TextureTarget>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateCompressedTexSubImage3D(context, angle::EntryPoint::GLCompressedTexSubImage3D,
                                                 targetPacked, level, xoffset, yoffset, zoffset, width,
                                                 height, depth, format, imageSize, data));
            if (isCallValid)
            {
                context->compressedTexSubImage3D(targetPacked, level, xoffset, yoffset, zoffset, width,
                                                 height, depth, format, imageSize, data);
            }
            ANGLE_CAPTURE_GL(CompressedTexSubImage3D, isCallValid, context, targetPacked, level,
                             xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_CopyBufferSubData(GLenum readTarget,
                                          GLenum writeTarget,
                                          GLintptr readOffset,
                                          GLintptr writeOffset,
                                          GLsizeiptr size)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLCopyBufferSubData,
              "context = %d, readTarget = %s, writeTarget = %s, readOffset = %llu, writeOffset = %llu, "
              "size = %llu",
              CID(context), GLenumToString(GLESEnum::CopyBufferSubDataTarget, readTarget),
              GLenumToString(GLESEnum::CopyBufferSubDataTarget, writeTarget),
              static_cast<unsigned long long>(readOffset), static_cast<unsigned long long>(writeOffset),
              static_cast<unsigned long long>(size));
    
        if (context)
        {
            BufferBinding readTargetPacked  = PackParam<BufferBinding>(readTarget);
            BufferBinding writeTargetPacked = PackParam<BufferBinding>(writeTarget);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateCopyBufferSubData(
                                    context, angle::EntryPoint::GLCopyBufferSubData, readTargetPacked,
                                    writeTargetPacked, readOffset, writeOffset, size));
            if (isCallValid)
            {
                context->copyBufferSubData(readTargetPacked, writeTargetPacked, readOffset, writeOffset,
                                           size);
            }
            ANGLE_CAPTURE_GL(CopyBufferSubData, isCallValid, context, readTargetPacked,
                             writeTargetPacked, readOffset, writeOffset, size);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_CopyTexSubImage3D(GLenum target,
                                          GLint level,
                                          GLint xoffset,
                                          GLint yoffset,
                                          GLint zoffset,
                                          GLint x,
                                          GLint y,
                                          GLsizei width,
                                          GLsizei height)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLCopyTexSubImage3D,
              "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, x = "
              "%d, y = %d, width = %d, height = %d",
              CID(context), GLenumToString(GLESEnum::TextureTarget, target), level, xoffset, yoffset,
              zoffset, x, y, width, height);
    
        if (context)
        {
            TextureTarget targetPacked = PackParam<TextureTarget>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateCopyTexSubImage3D(
                                    context, angle::EntryPoint::GLCopyTexSubImage3D, targetPacked,
                                    level, xoffset, yoffset, zoffset, x, y, width, height));
            if (isCallValid)
            {
                context->copyTexSubImage3D(targetPacked, level, xoffset, yoffset, zoffset, x, y, width,
                                           height);
            }
            ANGLE_CAPTURE_GL(CopyTexSubImage3D, isCallValid, context, targetPacked, level, xoffset,
                             yoffset, zoffset, x, y, width, height);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_DeleteQueries(GLsizei n, const GLuint *ids)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLDeleteQueries, "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context),
              n, (uintptr_t)ids);
    
        if (context)
        {
            const QueryID *idsPacked = PackParam<const QueryID *>(ids);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateDeleteQueries(context, angle::EntryPoint::GLDeleteQueries, n, idsPacked));
            if (isCallValid)
            {
                context->deleteQueries(n, idsPacked);
            }
            ANGLE_CAPTURE_GL(DeleteQueries, isCallValid, context, n, idsPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_DeleteSamplers(GLsizei count, const GLuint *samplers)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLDeleteSamplers, "context = %d, count = %d, samplers = 0x%016" PRIxPTR "",
              CID(context), count, (uintptr_t)samplers);
    
        if (context)
        {
            const SamplerID *samplersPacked = PackParam<const SamplerID *>(samplers);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateDeleteSamplers(context, angle::EntryPoint::GLDeleteSamplers,
                                                       count, samplersPacked));
            if (isCallValid)
            {
                context->deleteSamplers(count, samplersPacked);
            }
            ANGLE_CAPTURE_GL(DeleteSamplers, isCallValid, context, count, samplersPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_DeleteSync(GLsync sync)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLDeleteSync, "context = %d, sync = 0x%016" PRIxPTR "", CID(context),
              (uintptr_t)sync);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateDeleteSync(context, angle::EntryPoint::GLDeleteSync, sync));
            if (isCallValid)
            {
                context->deleteSync(sync);
            }
            ANGLE_CAPTURE_GL(DeleteSync, isCallValid, context, sync);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_DeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLDeleteTransformFeedbacks, "context = %d, n = %d, ids = 0x%016" PRIxPTR "",
              CID(context), n, (uintptr_t)ids);
    
        if (context)
        {
            const TransformFeedbackID *idsPacked = PackParam<const TransformFeedbackID *>(ids);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateDeleteTransformFeedbacks(
                     context, angle::EntryPoint::GLDeleteTransformFeedbacks, n, idsPacked));
            if (isCallValid)
            {
                context->deleteTransformFeedbacks(n, idsPacked);
            }
            ANGLE_CAPTURE_GL(DeleteTransformFeedbacks, isCallValid, context, n, idsPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_DeleteVertexArrays(GLsizei n, const GLuint *arrays)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLDeleteVertexArrays, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
              CID(context), n, (uintptr_t)arrays);
    
        if (context)
        {
            const VertexArrayID *arraysPacked = PackParam<const VertexArrayID *>(arrays);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateDeleteVertexArrays(
                                    context, angle::EntryPoint::GLDeleteVertexArrays, n, arraysPacked));
            if (isCallValid)
            {
                context->deleteVertexArrays(n, arraysPacked);
            }
            ANGLE_CAPTURE_GL(DeleteVertexArrays, isCallValid, context, n, arraysPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_DrawArraysInstanced(GLenum mode,
                                            GLint first,
                                            GLsizei count,
                                            GLsizei instancecount)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLDrawArraysInstanced,
              "context = %d, mode = %s, first = %d, count = %d, instancecount = %d", CID(context),
              GLenumToString(GLESEnum::PrimitiveType, mode), first, count, instancecount);
    
        if (context)
        {
            PrimitiveMode modePacked = PackParam<PrimitiveMode>(mode);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateDrawArraysInstanced(context, angle::EntryPoint::GLDrawArraysInstanced,
                                             modePacked, first, count, instancecount));
            if (isCallValid)
            {
                context->drawArraysInstanced(modePacked, first, count, instancecount);
            }
            ANGLE_CAPTURE_GL(DrawArraysInstanced, isCallValid, context, modePacked, first, count,
                             instancecount);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_DrawBuffers(GLsizei n, const GLenum *bufs)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLDrawBuffers, "context = %d, n = %d, bufs = 0x%016" PRIxPTR "", CID(context), n,
              (uintptr_t)bufs);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateDrawBuffers(context, angle::EntryPoint::GLDrawBuffers, n, bufs));
            if (isCallValid)
            {
                context->drawBuffers(n, bufs);
            }
            ANGLE_CAPTURE_GL(DrawBuffers, isCallValid, context, n, bufs);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_DrawElementsInstanced(GLenum mode,
                                              GLsizei count,
                                              GLenum type,
                                              const void *indices,
                                              GLsizei instancecount)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLDrawElementsInstanced,
              "context = %d, mode = %s, count = %d, type = %s, indices = 0x%016" PRIxPTR
              ", instancecount = %d",
              CID(context), GLenumToString(GLESEnum::PrimitiveType, mode), count,
              GLenumToString(GLESEnum::DrawElementsType, type), (uintptr_t)indices, instancecount);
    
        if (context)
        {
            PrimitiveMode modePacked    = PackParam<PrimitiveMode>(mode);
            DrawElementsType typePacked = PackParam<DrawElementsType>(type);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateDrawElementsInstanced(context, angle::EntryPoint::GLDrawElementsInstanced,
                                               modePacked, count, typePacked, indices, instancecount));
            if (isCallValid)
            {
                context->drawElementsInstanced(modePacked, count, typePacked, indices, instancecount);
            }
            ANGLE_CAPTURE_GL(DrawElementsInstanced, isCallValid, context, modePacked, count, typePacked,
                             indices, instancecount);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_DrawRangeElements(GLenum mode,
                                          GLuint start,
                                          GLuint end,
                                          GLsizei count,
                                          GLenum type,
                                          const void *indices)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLDrawRangeElements,
              "context = %d, mode = %s, start = %u, end = %u, count = %d, type = %s, indices = "
              "0x%016" PRIxPTR "",
              CID(context), GLenumToString(GLESEnum::PrimitiveType, mode), start, end, count,
              GLenumToString(GLESEnum::DrawElementsType, type), (uintptr_t)indices);
    
        if (context)
        {
            PrimitiveMode modePacked    = PackParam<PrimitiveMode>(mode);
            DrawElementsType typePacked = PackParam<DrawElementsType>(type);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateDrawRangeElements(context, angle::EntryPoint::GLDrawRangeElements, modePacked,
                                           start, end, count, typePacked, indices));
            if (isCallValid)
            {
                context->drawRangeElements(modePacked, start, end, count, typePacked, indices);
            }
            ANGLE_CAPTURE_GL(DrawRangeElements, isCallValid, context, modePacked, start, end, count,
                             typePacked, indices);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_EndQuery(GLenum target)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLEndQuery, "context = %d, target = %s", CID(context),
              GLenumToString(GLESEnum::QueryTarget, target));
    
        if (context)
        {
            QueryType targetPacked = PackParam<QueryType>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateEndQuery(context, angle::EntryPoint::GLEndQuery, targetPacked));
            if (isCallValid)
            {
                context->endQuery(targetPacked);
            }
            ANGLE_CAPTURE_GL(EndQuery, isCallValid, context, targetPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_EndTransformFeedback()
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLEndTransformFeedback, "context = %d", CID(context));
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateEndTransformFeedback(context, angle::EntryPoint::GLEndTransformFeedback));
            if (isCallValid)
            {
                context->endTransformFeedback();
            }
            ANGLE_CAPTURE_GL(EndTransformFeedback, isCallValid, context);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    GLsync GL_APIENTRY GL_FenceSync(GLenum condition, GLbitfield flags)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLFenceSync, "context = %d, condition = %s, flags = %s", CID(context),
              GLenumToString(GLESEnum::SyncCondition, condition),
              GLbitfieldToString(GLESEnum::SyncBehaviorFlags, flags).c_str());
    
        GLsync returnValue;
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateFenceSync(context, angle::EntryPoint::GLFenceSync, condition, flags));
            if (isCallValid)
            {
                returnValue = context->fenceSync(condition, flags);
            }
            else
            {
                returnValue = GetDefaultReturnValue<angle::EntryPoint::GLFenceSync, GLsync>();
            }
            ANGLE_CAPTURE_GL(FenceSync, isCallValid, context, condition, flags, returnValue);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLFenceSync, GLsync>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY GL_FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLFlushMappedBufferRange,
              "context = %d, target = %s, offset = %llu, length = %llu", CID(context),
              GLenumToString(GLESEnum::BufferTargetARB, target),
              static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length));
    
        if (context)
        {
            BufferBinding targetPacked = PackParam<BufferBinding>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateFlushMappedBufferRange(context, angle::EntryPoint::GLFlushMappedBufferRange,
                                                targetPacked, offset, length));
            if (isCallValid)
            {
                context->flushMappedBufferRange(targetPacked, offset, length);
            }
            ANGLE_CAPTURE_GL(FlushMappedBufferRange, isCallValid, context, targetPacked, offset,
                             length);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_FramebufferTextureLayer(GLenum target,
                                                GLenum attachment,
                                                GLuint texture,
                                                GLint level,
                                                GLint layer)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLFramebufferTextureLayer,
              "context = %d, target = %s, attachment = %s, texture = %u, level = %d, layer = %d",
              CID(context), GLenumToString(GLESEnum::FramebufferTarget, target),
              GLenumToString(GLESEnum::FramebufferAttachment, attachment), texture, level, layer);
    
        if (context)
        {
            TextureID texturePacked = PackParam<TextureID>(texture);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateFramebufferTextureLayer(context, angle::EntryPoint::GLFramebufferTextureLayer,
                                                 target, attachment, texturePacked, level, layer));
            if (isCallValid)
            {
                context->framebufferTextureLayer(target, attachment, texturePacked, level, layer);
            }
            ANGLE_CAPTURE_GL(FramebufferTextureLayer, isCallValid, context, target, attachment,
                             texturePacked, level, layer);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GenQueries(GLsizei n, GLuint *ids)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGenQueries, "context = %d, n = %d, ids = 0x%016" PRIxPTR "", CID(context), n,
              (uintptr_t)ids);
    
        if (context)
        {
            QueryID *idsPacked = PackParam<QueryID *>(ids);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGenQueries(context, angle::EntryPoint::GLGenQueries, n, idsPacked));
            if (isCallValid)
            {
                context->genQueries(n, idsPacked);
            }
            ANGLE_CAPTURE_GL(GenQueries, isCallValid, context, n, idsPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GenSamplers(GLsizei count, GLuint *samplers)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGenSamplers, "context = %d, count = %d, samplers = 0x%016" PRIxPTR "",
              CID(context), count, (uintptr_t)samplers);
    
        if (context)
        {
            SamplerID *samplersPacked = PackParam<SamplerID *>(samplers);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGenSamplers(context, angle::EntryPoint::GLGenSamplers, count, samplersPacked));
            if (isCallValid)
            {
                context->genSamplers(count, samplersPacked);
            }
            ANGLE_CAPTURE_GL(GenSamplers, isCallValid, context, count, samplersPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GenTransformFeedbacks(GLsizei n, GLuint *ids)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGenTransformFeedbacks, "context = %d, n = %d, ids = 0x%016" PRIxPTR "",
              CID(context), n, (uintptr_t)ids);
    
        if (context)
        {
            TransformFeedbackID *idsPacked = PackParam<TransformFeedbackID *>(ids);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateGenTransformFeedbacks(
                                    context, angle::EntryPoint::GLGenTransformFeedbacks, n, idsPacked));
            if (isCallValid)
            {
                context->genTransformFeedbacks(n, idsPacked);
            }
            ANGLE_CAPTURE_GL(GenTransformFeedbacks, isCallValid, context, n, idsPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GenVertexArrays(GLsizei n, GLuint *arrays)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGenVertexArrays, "context = %d, n = %d, arrays = 0x%016" PRIxPTR "",
              CID(context), n, (uintptr_t)arrays);
    
        if (context)
        {
            VertexArrayID *arraysPacked = PackParam<VertexArrayID *>(arrays);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateGenVertexArrays(context, angle::EntryPoint::GLGenVertexArrays,
                                                        n, arraysPacked));
            if (isCallValid)
            {
                context->genVertexArrays(n, arraysPacked);
            }
            ANGLE_CAPTURE_GL(GenVertexArrays, isCallValid, context, n, arraysPacked);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetActiveUniformBlockName(GLuint program,
                                                  GLuint uniformBlockIndex,
                                                  GLsizei bufSize,
                                                  GLsizei *length,
                                                  GLchar *uniformBlockName)
    {
        Context *context = GetValidGlobalContext();
        EVENT(
            context, GLGetActiveUniformBlockName,
            "context = %d, program = %u, uniformBlockIndex = %u, bufSize = %d, length = 0x%016" PRIxPTR
            ", uniformBlockName = 0x%016" PRIxPTR "",
            CID(context), program, uniformBlockIndex, bufSize, (uintptr_t)length,
            (uintptr_t)uniformBlockName);
    
        if (context)
        {
            ShaderProgramID programPacked             = PackParam<ShaderProgramID>(program);
            UniformBlockIndex uniformBlockIndexPacked = PackParam<UniformBlockIndex>(uniformBlockIndex);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetActiveUniformBlockName(
                     context, angle::EntryPoint::GLGetActiveUniformBlockName, programPacked,
                     uniformBlockIndexPacked, bufSize, length, uniformBlockName));
            if (isCallValid)
            {
                context->getActiveUniformBlockName(programPacked, uniformBlockIndexPacked, bufSize,
                                                   length, uniformBlockName);
            }
            ANGLE_CAPTURE_GL(GetActiveUniformBlockName, isCallValid, context, programPacked,
                             uniformBlockIndexPacked, bufSize, length, uniformBlockName);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetActiveUniformBlockiv(GLuint program,
                                                GLuint uniformBlockIndex,
                                                GLenum pname,
                                                GLint *params)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetActiveUniformBlockiv,
              "context = %d, program = %u, uniformBlockIndex = %u, pname = %s, params = 0x%016" PRIxPTR
              "",
              CID(context), program, uniformBlockIndex,
              GLenumToString(GLESEnum::UniformBlockPName, pname), (uintptr_t)params);
    
        if (context)
        {
            ShaderProgramID programPacked             = PackParam<ShaderProgramID>(program);
            UniformBlockIndex uniformBlockIndexPacked = PackParam<UniformBlockIndex>(uniformBlockIndex);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateGetActiveUniformBlockiv(
                                    context, angle::EntryPoint::GLGetActiveUniformBlockiv,
                                    programPacked, uniformBlockIndexPacked, pname, params));
            if (isCallValid)
            {
                context->getActiveUniformBlockiv(programPacked, uniformBlockIndexPacked, pname, params);
            }
            ANGLE_CAPTURE_GL(GetActiveUniformBlockiv, isCallValid, context, programPacked,
                             uniformBlockIndexPacked, pname, params);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetActiveUniformsiv(GLuint program,
                                            GLsizei uniformCount,
                                            const GLuint *uniformIndices,
                                            GLenum pname,
                                            GLint *params)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetActiveUniformsiv,
              "context = %d, program = %u, uniformCount = %d, uniformIndices = 0x%016" PRIxPTR
              ", pname = %s, params = 0x%016" PRIxPTR "",
              CID(context), program, uniformCount, (uintptr_t)uniformIndices,
              GLenumToString(GLESEnum::UniformPName, pname), (uintptr_t)params);
    
        if (context)
        {
            ShaderProgramID programPacked = PackParam<ShaderProgramID>(program);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateGetActiveUniformsiv(
                                    context, angle::EntryPoint::GLGetActiveUniformsiv, programPacked,
                                    uniformCount, uniformIndices, pname, params));
            if (isCallValid)
            {
                context->getActiveUniformsiv(programPacked, uniformCount, uniformIndices, pname,
                                             params);
            }
            ANGLE_CAPTURE_GL(GetActiveUniformsiv, isCallValid, context, programPacked, uniformCount,
                             uniformIndices, pname, params);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetBufferParameteri64v,
              "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
              GLenumToString(GLESEnum::BufferTargetARB, target),
              GLenumToString(GLESEnum::AllEnums, pname), (uintptr_t)params);
    
        if (context)
        {
            BufferBinding targetPacked = PackParam<BufferBinding>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetBufferParameteri64v(context, angle::EntryPoint::GLGetBufferParameteri64v,
                                                targetPacked, pname, params));
            if (isCallValid)
            {
                context->getBufferParameteri64v(targetPacked, pname, params);
            }
            ANGLE_CAPTURE_GL(GetBufferParameteri64v, isCallValid, context, targetPacked, pname, params);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetBufferPointerv(GLenum target, GLenum pname, void **params)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetBufferPointerv,
              "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
              GLenumToString(GLESEnum::BufferTargetARB, target),
              GLenumToString(GLESEnum::AllEnums, pname), (uintptr_t)params);
    
        if (context)
        {
            BufferBinding targetPacked = PackParam<BufferBinding>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetBufferPointerv(context, angle::EntryPoint::GLGetBufferPointerv,
                                           targetPacked, pname, params));
            if (isCallValid)
            {
                context->getBufferPointerv(targetPacked, pname, params);
            }
            ANGLE_CAPTURE_GL(GetBufferPointerv, isCallValid, context, targetPacked, pname, params);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    GLint GL_APIENTRY GL_GetFragDataLocation(GLuint program, const GLchar *name)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetFragDataLocation, "context = %d, program = %u, name = 0x%016" PRIxPTR "",
              CID(context), program, (uintptr_t)name);
    
        GLint returnValue;
        if (context)
        {
            ShaderProgramID programPacked = PackParam<ShaderProgramID>(program);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetFragDataLocation(context, angle::EntryPoint::GLGetFragDataLocation,
                                             programPacked, name));
            if (isCallValid)
            {
                returnValue = context->getFragDataLocation(programPacked, name);
            }
            else
            {
                returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataLocation, GLint>();
            }
            ANGLE_CAPTURE_GL(GetFragDataLocation, isCallValid, context, programPacked, name,
                             returnValue);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetFragDataLocation, GLint>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY GL_GetInteger64i_v(GLenum target, GLuint index, GLint64 *data)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetInteger64i_v,
              "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
              GLenumToString(GLESEnum::GetPName, target), index, (uintptr_t)data);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateGetInteger64i_v(context, angle::EntryPoint::GLGetInteger64i_v,
                                                        target, index, data));
            if (isCallValid)
            {
                context->getInteger64i_v(target, index, data);
            }
            ANGLE_CAPTURE_GL(GetInteger64i_v, isCallValid, context, target, index, data);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetInteger64v(GLenum pname, GLint64 *data)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetInteger64v, "context = %d, pname = %s, data = 0x%016" PRIxPTR "",
              CID(context), GLenumToString(GLESEnum::GetPName, pname), (uintptr_t)data);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetInteger64v(context, angle::EntryPoint::GLGetInteger64v, pname, data));
            if (isCallValid)
            {
                context->getInteger64v(pname, data);
            }
            ANGLE_CAPTURE_GL(GetInteger64v, isCallValid, context, pname, data);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetIntegeri_v(GLenum target, GLuint index, GLint *data)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetIntegeri_v,
              "context = %d, target = %s, index = %u, data = 0x%016" PRIxPTR "", CID(context),
              GLenumToString(GLESEnum::GetPName, target), index, (uintptr_t)data);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateGetIntegeri_v(context, angle::EntryPoint::GLGetIntegeri_v,
                                                      target, index, data));
            if (isCallValid)
            {
                context->getIntegeri_v(target, index, data);
            }
            ANGLE_CAPTURE_GL(GetIntegeri_v, isCallValid, context, target, index, data);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetInternalformativ(GLenum target,
                                            GLenum internalformat,
                                            GLenum pname,
                                            GLsizei count,
                                            GLint *params)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetInternalformativ,
              "context = %d, target = %s, internalformat = %s, pname = %s, count = %d, params = "
              "0x%016" PRIxPTR "",
              CID(context), GLenumToString(GLESEnum::TextureTarget, target),
              GLenumToString(GLESEnum::InternalFormat, internalformat),
              GLenumToString(GLESEnum::InternalFormatPName, pname), count, (uintptr_t)params);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetInternalformativ(context, angle::EntryPoint::GLGetInternalformativ, target,
                                             internalformat, pname, count, params));
            if (isCallValid)
            {
                context->getInternalformativ(target, internalformat, pname, count, params);
            }
            ANGLE_CAPTURE_GL(GetInternalformativ, isCallValid, context, target, internalformat, pname,
                             count, params);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetProgramBinary(GLuint program,
                                         GLsizei bufSize,
                                         GLsizei *length,
                                         GLenum *binaryFormat,
                                         void *binary)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetProgramBinary,
              "context = %d, program = %u, bufSize = %d, length = 0x%016" PRIxPTR
              ", binaryFormat = 0x%016" PRIxPTR ", binary = 0x%016" PRIxPTR "",
              CID(context), program, bufSize, (uintptr_t)length, (uintptr_t)binaryFormat,
              (uintptr_t)binary);
    
        if (context)
        {
            ShaderProgramID programPacked = PackParam<ShaderProgramID>(program);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetProgramBinary(context, angle::EntryPoint::GLGetProgramBinary, programPacked,
                                          bufSize, length, binaryFormat, binary));
            if (isCallValid)
            {
                context->getProgramBinary(programPacked, bufSize, length, binaryFormat, binary);
            }
            ANGLE_CAPTURE_GL(GetProgramBinary, isCallValid, context, programPacked, bufSize, length,
                             binaryFormat, binary);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetQueryObjectuiv,
              "context = %d, id = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), id,
              GLenumToString(GLESEnum::QueryObjectParameterName, pname), (uintptr_t)params);
    
        if (context)
        {
            QueryID idPacked = PackParam<QueryID>(id);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetQueryObjectuiv(context, angle::EntryPoint::GLGetQueryObjectuiv, idPacked,
                                           pname, params));
            if (isCallValid)
            {
                context->getQueryObjectuiv(idPacked, pname, params);
            }
            ANGLE_CAPTURE_GL(GetQueryObjectuiv, isCallValid, context, idPacked, pname, params);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetQueryiv(GLenum target, GLenum pname, GLint *params)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetQueryiv,
              "context = %d, target = %s, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
              GLenumToString(GLESEnum::QueryTarget, target),
              GLenumToString(GLESEnum::QueryParameterName, pname), (uintptr_t)params);
    
        if (context)
        {
            QueryType targetPacked = PackParam<QueryType>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateGetQueryiv(context, angle::EntryPoint::GLGetQueryiv,
                                                   targetPacked, pname, params));
            if (isCallValid)
            {
                context->getQueryiv(targetPacked, pname, params);
            }
            ANGLE_CAPTURE_GL(GetQueryiv, isCallValid, context, targetPacked, pname, params);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetSamplerParameterfv,
              "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
              sampler, GLenumToString(GLESEnum::SamplerParameterF, pname), (uintptr_t)params);
    
        if (context)
        {
            SamplerID samplerPacked = PackParam<SamplerID>(sampler);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetSamplerParameterfv(context, angle::EntryPoint::GLGetSamplerParameterfv,
                                               samplerPacked, pname, params));
            if (isCallValid)
            {
                context->getSamplerParameterfv(samplerPacked, pname, params);
            }
            ANGLE_CAPTURE_GL(GetSamplerParameterfv, isCallValid, context, samplerPacked, pname, params);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetSamplerParameteriv,
              "context = %d, sampler = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context),
              sampler, GLenumToString(GLESEnum::SamplerParameterI, pname), (uintptr_t)params);
    
        if (context)
        {
            SamplerID samplerPacked = PackParam<SamplerID>(sampler);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetSamplerParameteriv(context, angle::EntryPoint::GLGetSamplerParameteriv,
                                               samplerPacked, pname, params));
            if (isCallValid)
            {
                context->getSamplerParameteriv(samplerPacked, pname, params);
            }
            ANGLE_CAPTURE_GL(GetSamplerParameteriv, isCallValid, context, samplerPacked, pname, params);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    const GLubyte *GL_APIENTRY GL_GetStringi(GLenum name, GLuint index)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetStringi, "context = %d, name = %s, index = %u", CID(context),
              GLenumToString(GLESEnum::StringName, name), index);
    
        const GLubyte *returnValue;
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetStringi(context, angle::EntryPoint::GLGetStringi, name, index));
            if (isCallValid)
            {
                returnValue = context->getStringi(name, index);
            }
            else
            {
                returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetStringi, const GLubyte *>();
            }
            ANGLE_CAPTURE_GL(GetStringi, isCallValid, context, name, index, returnValue);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetStringi, const GLubyte *>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY
    GL_GetSynciv(GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values)
    {
        Context *context = GetGlobalContext();
        EVENT(context, GLGetSynciv,
              "context = %d, sync = 0x%016" PRIxPTR ", pname = %s, count = %d, length = 0x%016" PRIxPTR
              ", values = 0x%016" PRIxPTR "",
              CID(context), (uintptr_t)sync, GLenumToString(GLESEnum::SyncParameterName, pname), count,
              (uintptr_t)length, (uintptr_t)values);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() || ValidateGetSynciv(context, angle::EntryPoint::GLGetSynciv,
                                                                sync, pname, count, length, values));
            if (isCallValid)
            {
                context->getSynciv(sync, pname, count, length, values);
            }
            ANGLE_CAPTURE_GL(GetSynciv, isCallValid, context, sync, pname, count, length, values);
        }
        else
        {}
    }
    
    void GL_APIENTRY GL_GetTransformFeedbackVarying(GLuint program,
                                                    GLuint index,
                                                    GLsizei bufSize,
                                                    GLsizei *length,
                                                    GLsizei *size,
                                                    GLenum *type,
                                                    GLchar *name)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetTransformFeedbackVarying,
              "context = %d, program = %u, index = %u, bufSize = %d, length = 0x%016" PRIxPTR
              ", size = 0x%016" PRIxPTR ", type = 0x%016" PRIxPTR ", name = 0x%016" PRIxPTR "",
              CID(context), program, index, bufSize, (uintptr_t)length, (uintptr_t)size,
              (uintptr_t)type, (uintptr_t)name);
    
        if (context)
        {
            ShaderProgramID programPacked = PackParam<ShaderProgramID>(program);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateGetTransformFeedbackVarying(
                                    context, angle::EntryPoint::GLGetTransformFeedbackVarying,
                                    programPacked, index, bufSize, length, size, type, name));
            if (isCallValid)
            {
                context->getTransformFeedbackVarying(programPacked, index, bufSize, length, size, type,
                                                     name);
            }
            ANGLE_CAPTURE_GL(GetTransformFeedbackVarying, isCallValid, context, programPacked, index,
                             bufSize, length, size, type, name);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    GLuint GL_APIENTRY GL_GetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetUniformBlockIndex,
              "context = %d, program = %u, uniformBlockName = 0x%016" PRIxPTR "", CID(context), program,
              (uintptr_t)uniformBlockName);
    
        GLuint returnValue;
        if (context)
        {
            ShaderProgramID programPacked = PackParam<ShaderProgramID>(program);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetUniformBlockIndex(context, angle::EntryPoint::GLGetUniformBlockIndex,
                                              programPacked, uniformBlockName));
            if (isCallValid)
            {
                returnValue = context->getUniformBlockIndex(programPacked, uniformBlockName);
            }
            else
            {
                returnValue =
                    GetDefaultReturnValue<angle::EntryPoint::GLGetUniformBlockIndex, GLuint>();
            }
            ANGLE_CAPTURE_GL(GetUniformBlockIndex, isCallValid, context, programPacked,
                             uniformBlockName, returnValue);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLGetUniformBlockIndex, GLuint>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY GL_GetUniformIndices(GLuint program,
                                          GLsizei uniformCount,
                                          const GLchar *const *uniformNames,
                                          GLuint *uniformIndices)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetUniformIndices,
              "context = %d, program = %u, uniformCount = %d, uniformNames = 0x%016" PRIxPTR
              ", uniformIndices = 0x%016" PRIxPTR "",
              CID(context), program, uniformCount, (uintptr_t)uniformNames, (uintptr_t)uniformIndices);
    
        if (context)
        {
            ShaderProgramID programPacked = PackParam<ShaderProgramID>(program);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetUniformIndices(context, angle::EntryPoint::GLGetUniformIndices,
                                           programPacked, uniformCount, uniformNames, uniformIndices));
            if (isCallValid)
            {
                context->getUniformIndices(programPacked, uniformCount, uniformNames, uniformIndices);
            }
            ANGLE_CAPTURE_GL(GetUniformIndices, isCallValid, context, programPacked, uniformCount,
                             uniformNames, uniformIndices);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetUniformuiv(GLuint program, GLint location, GLuint *params)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetUniformuiv,
              "context = %d, program = %u, location = %d, params = 0x%016" PRIxPTR "", CID(context),
              program, location, (uintptr_t)params);
    
        if (context)
        {
            ShaderProgramID programPacked  = PackParam<ShaderProgramID>(program);
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateGetUniformuiv(context, angle::EntryPoint::GLGetUniformuiv,
                                                      programPacked, locationPacked, params));
            if (isCallValid)
            {
                context->getUniformuiv(programPacked, locationPacked, params);
            }
            ANGLE_CAPTURE_GL(GetUniformuiv, isCallValid, context, programPacked, locationPacked,
                             params);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetVertexAttribIiv,
              "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
              GLenumToString(GLESEnum::VertexAttribEnum, pname), (uintptr_t)params);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetVertexAttribIiv(context, angle::EntryPoint::GLGetVertexAttribIiv, index,
                                            pname, params));
            if (isCallValid)
            {
                context->getVertexAttribIiv(index, pname, params);
            }
            ANGLE_CAPTURE_GL(GetVertexAttribIiv, isCallValid, context, index, pname, params);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLGetVertexAttribIuiv,
              "context = %d, index = %u, pname = %s, params = 0x%016" PRIxPTR "", CID(context), index,
              GLenumToString(GLESEnum::VertexAttribEnum, pname), (uintptr_t)params);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateGetVertexAttribIuiv(context, angle::EntryPoint::GLGetVertexAttribIuiv, index,
                                             pname, params));
            if (isCallValid)
            {
                context->getVertexAttribIuiv(index, pname, params);
            }
            ANGLE_CAPTURE_GL(GetVertexAttribIuiv, isCallValid, context, index, pname, params);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_InvalidateFramebuffer(GLenum target,
                                              GLsizei numAttachments,
                                              const GLenum *attachments)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLInvalidateFramebuffer,
              "context = %d, target = %s, numAttachments = %d, attachments = 0x%016" PRIxPTR "",
              CID(context), GLenumToString(GLESEnum::FramebufferTarget, target), numAttachments,
              (uintptr_t)attachments);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateInvalidateFramebuffer(context, angle::EntryPoint::GLInvalidateFramebuffer,
                                               target, numAttachments, attachments));
            if (isCallValid)
            {
                context->invalidateFramebuffer(target, numAttachments, attachments);
            }
            ANGLE_CAPTURE_GL(InvalidateFramebuffer, isCallValid, context, target, numAttachments,
                             attachments);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_InvalidateSubFramebuffer(GLenum target,
                                                 GLsizei numAttachments,
                                                 const GLenum *attachments,
                                                 GLint x,
                                                 GLint y,
                                                 GLsizei width,
                                                 GLsizei height)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLInvalidateSubFramebuffer,
              "context = %d, target = %s, numAttachments = %d, attachments = 0x%016" PRIxPTR
              ", x = %d, y = %d, width = %d, height = %d",
              CID(context), GLenumToString(GLESEnum::FramebufferTarget, target), numAttachments,
              (uintptr_t)attachments, x, y, width, height);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateInvalidateSubFramebuffer(
                                    context, angle::EntryPoint::GLInvalidateSubFramebuffer, target,
                                    numAttachments, attachments, x, y, width, height));
            if (isCallValid)
            {
                context->invalidateSubFramebuffer(target, numAttachments, attachments, x, y, width,
                                                  height);
            }
            ANGLE_CAPTURE_GL(InvalidateSubFramebuffer, isCallValid, context, target, numAttachments,
                             attachments, x, y, width, height);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    GLboolean GL_APIENTRY GL_IsQuery(GLuint id)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLIsQuery, "context = %d, id = %u", CID(context), id);
    
        GLboolean returnValue;
        if (context)
        {
            QueryID idPacked = PackParam<QueryID>(id);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateIsQuery(context, angle::EntryPoint::GLIsQuery, idPacked));
            if (isCallValid)
            {
                returnValue = context->isQuery(idPacked);
            }
            else
            {
                returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsQuery, GLboolean>();
            }
            ANGLE_CAPTURE_GL(IsQuery, isCallValid, context, idPacked, returnValue);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsQuery, GLboolean>();
        }
        return returnValue;
    }
    
    GLboolean GL_APIENTRY GL_IsSampler(GLuint sampler)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLIsSampler, "context = %d, sampler = %u", CID(context), sampler);
    
        GLboolean returnValue;
        if (context)
        {
            SamplerID samplerPacked = PackParam<SamplerID>(sampler);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateIsSampler(context, angle::EntryPoint::GLIsSampler, samplerPacked));
            if (isCallValid)
            {
                returnValue = context->isSampler(samplerPacked);
            }
            else
            {
                returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSampler, GLboolean>();
            }
            ANGLE_CAPTURE_GL(IsSampler, isCallValid, context, samplerPacked, returnValue);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSampler, GLboolean>();
        }
        return returnValue;
    }
    
    GLboolean GL_APIENTRY GL_IsSync(GLsync sync)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLIsSync, "context = %d, sync = 0x%016" PRIxPTR "", CID(context),
              (uintptr_t)sync);
    
        GLboolean returnValue;
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateIsSync(context, angle::EntryPoint::GLIsSync, sync));
            if (isCallValid)
            {
                returnValue = context->isSync(sync);
            }
            else
            {
                returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSync, GLboolean>();
            }
            ANGLE_CAPTURE_GL(IsSync, isCallValid, context, sync, returnValue);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsSync, GLboolean>();
        }
        return returnValue;
    }
    
    GLboolean GL_APIENTRY GL_IsTransformFeedback(GLuint id)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLIsTransformFeedback, "context = %d, id = %u", CID(context), id);
    
        GLboolean returnValue;
        if (context)
        {
            TransformFeedbackID idPacked = PackParam<TransformFeedbackID>(id);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateIsTransformFeedback(
                                    context, angle::EntryPoint::GLIsTransformFeedback, idPacked));
            if (isCallValid)
            {
                returnValue = context->isTransformFeedback(idPacked);
            }
            else
            {
                returnValue =
                    GetDefaultReturnValue<angle::EntryPoint::GLIsTransformFeedback, GLboolean>();
            }
            ANGLE_CAPTURE_GL(IsTransformFeedback, isCallValid, context, idPacked, returnValue);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsTransformFeedback, GLboolean>();
        }
        return returnValue;
    }
    
    GLboolean GL_APIENTRY GL_IsVertexArray(GLuint array)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLIsVertexArray, "context = %d, array = %u", CID(context), array);
    
        GLboolean returnValue;
        if (context)
        {
            VertexArrayID arrayPacked = PackParam<VertexArrayID>(array);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateIsVertexArray(context, angle::EntryPoint::GLIsVertexArray, arrayPacked));
            if (isCallValid)
            {
                returnValue = context->isVertexArray(arrayPacked);
            }
            else
            {
                returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsVertexArray, GLboolean>();
            }
            ANGLE_CAPTURE_GL(IsVertexArray, isCallValid, context, arrayPacked, returnValue);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLIsVertexArray, GLboolean>();
        }
        return returnValue;
    }
    
    void *GL_APIENTRY GL_MapBufferRange(GLenum target,
                                        GLintptr offset,
                                        GLsizeiptr length,
                                        GLbitfield access)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLMapBufferRange,
              "context = %d, target = %s, offset = %llu, length = %llu, access = %s", CID(context),
              GLenumToString(GLESEnum::BufferTargetARB, target),
              static_cast<unsigned long long>(offset), static_cast<unsigned long long>(length),
              GLbitfieldToString(GLESEnum::MapBufferAccessMask, access).c_str());
    
        void *returnValue;
        if (context)
        {
            BufferBinding targetPacked = PackParam<BufferBinding>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateMapBufferRange(context, angle::EntryPoint::GLMapBufferRange,
                                                       targetPacked, offset, length, access));
            if (isCallValid)
            {
                returnValue = context->mapBufferRange(targetPacked, offset, length, access);
            }
            else
            {
                returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferRange, void *>();
            }
            ANGLE_CAPTURE_GL(MapBufferRange, isCallValid, context, targetPacked, offset, length, access,
                             returnValue);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLMapBufferRange, void *>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY GL_PauseTransformFeedback()
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLPauseTransformFeedback, "context = %d", CID(context));
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidatePauseTransformFeedback(context, angle::EntryPoint::GLPauseTransformFeedback));
            if (isCallValid)
            {
                context->pauseTransformFeedback();
            }
            ANGLE_CAPTURE_GL(PauseTransformFeedback, isCallValid, context);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_ProgramBinary(GLuint program,
                                      GLenum binaryFormat,
                                      const void *binary,
                                      GLsizei length)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLProgramBinary,
              "context = %d, program = %u, binaryFormat = %s, binary = 0x%016" PRIxPTR ", length = %d",
              CID(context), program, GLenumToString(GLESEnum::AllEnums, binaryFormat),
              (uintptr_t)binary, length);
    
        if (context)
        {
            ShaderProgramID programPacked = PackParam<ShaderProgramID>(program);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateProgramBinary(context, angle::EntryPoint::GLProgramBinary,
                                                      programPacked, binaryFormat, binary, length));
            if (isCallValid)
            {
                context->programBinary(programPacked, binaryFormat, binary, length);
            }
            ANGLE_CAPTURE_GL(ProgramBinary, isCallValid, context, programPacked, binaryFormat, binary,
                             length);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_ProgramParameteri(GLuint program, GLenum pname, GLint value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLProgramParameteri, "context = %d, program = %u, pname = %s, value = %d",
              CID(context), program, GLenumToString(GLESEnum::ProgramParameterPName, pname), value);
    
        if (context)
        {
            ShaderProgramID programPacked = PackParam<ShaderProgramID>(program);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateProgramParameteri(context, angle::EntryPoint::GLProgramParameteri,
                                           programPacked, pname, value));
            if (isCallValid)
            {
                context->programParameteri(programPacked, pname, value);
            }
            ANGLE_CAPTURE_GL(ProgramParameteri, isCallValid, context, programPacked, pname, value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_ReadBuffer(GLenum src)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLReadBuffer, "context = %d, src = %s", CID(context),
              GLenumToString(GLESEnum::ReadBufferMode, src));
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateReadBuffer(context, angle::EntryPoint::GLReadBuffer, src));
            if (isCallValid)
            {
                context->readBuffer(src);
            }
            ANGLE_CAPTURE_GL(ReadBuffer, isCallValid, context, src);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_RenderbufferStorageMultisample(GLenum target,
                                                       GLsizei samples,
                                                       GLenum internalformat,
                                                       GLsizei width,
                                                       GLsizei height)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLRenderbufferStorageMultisample,
              "context = %d, target = %s, samples = %d, internalformat = %s, width = %d, height = %d",
              CID(context), GLenumToString(GLESEnum::RenderbufferTarget, target), samples,
              GLenumToString(GLESEnum::InternalFormat, internalformat), width, height);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateRenderbufferStorageMultisample(
                                    context, angle::EntryPoint::GLRenderbufferStorageMultisample,
                                    target, samples, internalformat, width, height));
            if (isCallValid)
            {
                context->renderbufferStorageMultisample(target, samples, internalformat, width, height);
            }
            ANGLE_CAPTURE_GL(RenderbufferStorageMultisample, isCallValid, context, target, samples,
                             internalformat, width, height);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_ResumeTransformFeedback()
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLResumeTransformFeedback, "context = %d", CID(context));
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateResumeTransformFeedback(
                                    context, angle::EntryPoint::GLResumeTransformFeedback));
            if (isCallValid)
            {
                context->resumeTransformFeedback();
            }
            ANGLE_CAPTURE_GL(ResumeTransformFeedback, isCallValid, context);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLSamplerParameterf, "context = %d, sampler = %u, pname = %s, param = %f",
              CID(context), sampler, GLenumToString(GLESEnum::SamplerParameterF, pname), param);
    
        if (context)
        {
            SamplerID samplerPacked = PackParam<SamplerID>(sampler);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateSamplerParameterf(context, angle::EntryPoint::GLSamplerParameterf,
                                           samplerPacked, pname, param));
            if (isCallValid)
            {
                context->samplerParameterf(samplerPacked, pname, param);
            }
            ANGLE_CAPTURE_GL(SamplerParameterf, isCallValid, context, samplerPacked, pname, param);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLSamplerParameterfv,
              "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
              sampler, GLenumToString(GLESEnum::SamplerParameterF, pname), (uintptr_t)param);
    
        if (context)
        {
            SamplerID samplerPacked = PackParam<SamplerID>(sampler);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateSamplerParameterfv(context, angle::EntryPoint::GLSamplerParameterfv,
                                            samplerPacked, pname, param));
            if (isCallValid)
            {
                context->samplerParameterfv(samplerPacked, pname, param);
            }
            ANGLE_CAPTURE_GL(SamplerParameterfv, isCallValid, context, samplerPacked, pname, param);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLSamplerParameteri, "context = %d, sampler = %u, pname = %s, param = %d",
              CID(context), sampler, GLenumToString(GLESEnum::SamplerParameterI, pname), param);
    
        if (context)
        {
            SamplerID samplerPacked = PackParam<SamplerID>(sampler);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateSamplerParameteri(context, angle::EntryPoint::GLSamplerParameteri,
                                           samplerPacked, pname, param));
            if (isCallValid)
            {
                context->samplerParameteri(samplerPacked, pname, param);
            }
            ANGLE_CAPTURE_GL(SamplerParameteri, isCallValid, context, samplerPacked, pname, param);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLSamplerParameteriv,
              "context = %d, sampler = %u, pname = %s, param = 0x%016" PRIxPTR "", CID(context),
              sampler, GLenumToString(GLESEnum::SamplerParameterI, pname), (uintptr_t)param);
    
        if (context)
        {
            SamplerID samplerPacked = PackParam<SamplerID>(sampler);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateSamplerParameteriv(context, angle::EntryPoint::GLSamplerParameteriv,
                                            samplerPacked, pname, param));
            if (isCallValid)
            {
                context->samplerParameteriv(samplerPacked, pname, param);
            }
            ANGLE_CAPTURE_GL(SamplerParameteriv, isCallValid, context, samplerPacked, pname, param);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_TexImage3D(GLenum target,
                                   GLint level,
                                   GLint internalformat,
                                   GLsizei width,
                                   GLsizei height,
                                   GLsizei depth,
                                   GLint border,
                                   GLenum format,
                                   GLenum type,
                                   const void *pixels)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLTexImage3D,
              "context = %d, target = %s, level = %d, internalformat = %d, width = %d, height = %d, "
              "depth = %d, border = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
              CID(context), GLenumToString(GLESEnum::TextureTarget, target), level, internalformat,
              width, height, depth, border, GLenumToString(GLESEnum::PixelFormat, format),
              GLenumToString(GLESEnum::PixelType, type), (uintptr_t)pixels);
    
        if (context)
        {
            TextureTarget targetPacked = PackParam<TextureTarget>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateTexImage3D(context, angle::EntryPoint::GLTexImage3D,
                                                   targetPacked, level, internalformat, width, height,
                                                   depth, border, format, type, pixels));
            if (isCallValid)
            {
                context->texImage3D(targetPacked, level, internalformat, width, height, depth, border,
                                    format, type, pixels);
            }
            ANGLE_CAPTURE_GL(TexImage3D, isCallValid, context, targetPacked, level, internalformat,
                             width, height, depth, border, format, type, pixels);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY
    GL_TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLTexStorage2D,
              "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d",
              CID(context), GLenumToString(GLESEnum::TextureTarget, target), levels,
              GLenumToString(GLESEnum::SizedInternalFormat, internalformat), width, height);
    
        if (context)
        {
            TextureType targetPacked = PackParam<TextureType>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateTexStorage2D(context, angle::EntryPoint::GLTexStorage2D, targetPacked, levels,
                                      internalformat, width, height));
            if (isCallValid)
            {
                context->texStorage2D(targetPacked, levels, internalformat, width, height);
            }
            ANGLE_CAPTURE_GL(TexStorage2D, isCallValid, context, targetPacked, levels, internalformat,
                             width, height);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_TexStorage3D(GLenum target,
                                     GLsizei levels,
                                     GLenum internalformat,
                                     GLsizei width,
                                     GLsizei height,
                                     GLsizei depth)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLTexStorage3D,
              "context = %d, target = %s, levels = %d, internalformat = %s, width = %d, height = %d, "
              "depth = %d",
              CID(context), GLenumToString(GLESEnum::TextureTarget, target), levels,
              GLenumToString(GLESEnum::SizedInternalFormat, internalformat), width, height, depth);
    
        if (context)
        {
            TextureType targetPacked = PackParam<TextureType>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateTexStorage3D(context, angle::EntryPoint::GLTexStorage3D, targetPacked, levels,
                                      internalformat, width, height, depth));
            if (isCallValid)
            {
                context->texStorage3D(targetPacked, levels, internalformat, width, height, depth);
            }
            ANGLE_CAPTURE_GL(TexStorage3D, isCallValid, context, targetPacked, levels, internalformat,
                             width, height, depth);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_TexSubImage3D(GLenum target,
                                      GLint level,
                                      GLint xoffset,
                                      GLint yoffset,
                                      GLint zoffset,
                                      GLsizei width,
                                      GLsizei height,
                                      GLsizei depth,
                                      GLenum format,
                                      GLenum type,
                                      const void *pixels)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLTexSubImage3D,
              "context = %d, target = %s, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width "
              "= %d, height = %d, depth = %d, format = %s, type = %s, pixels = 0x%016" PRIxPTR "",
              CID(context), GLenumToString(GLESEnum::TextureTarget, target), level, xoffset, yoffset,
              zoffset, width, height, depth, GLenumToString(GLESEnum::PixelFormat, format),
              GLenumToString(GLESEnum::PixelType, type), (uintptr_t)pixels);
    
        if (context)
        {
            TextureTarget targetPacked = PackParam<TextureTarget>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateTexSubImage3D(context, angle::EntryPoint::GLTexSubImage3D,
                                                      targetPacked, level, xoffset, yoffset, zoffset,
                                                      width, height, depth, format, type, pixels));
            if (isCallValid)
            {
                context->texSubImage3D(targetPacked, level, xoffset, yoffset, zoffset, width, height,
                                       depth, format, type, pixels);
            }
            ANGLE_CAPTURE_GL(TexSubImage3D, isCallValid, context, targetPacked, level, xoffset, yoffset,
                             zoffset, width, height, depth, format, type, pixels);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_TransformFeedbackVaryings(GLuint program,
                                                  GLsizei count,
                                                  const GLchar *const *varyings,
                                                  GLenum bufferMode)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLTransformFeedbackVaryings,
              "context = %d, program = %u, count = %d, varyings = 0x%016" PRIxPTR ", bufferMode = %s",
              CID(context), program, count, (uintptr_t)varyings,
              GLenumToString(GLESEnum::TransformFeedbackBufferMode, bufferMode));
    
        if (context)
        {
            ShaderProgramID programPacked = PackParam<ShaderProgramID>(program);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateTransformFeedbackVaryings(
                                    context, angle::EntryPoint::GLTransformFeedbackVaryings,
                                    programPacked, count, varyings, bufferMode));
            if (isCallValid)
            {
                context->transformFeedbackVaryings(programPacked, count, varyings, bufferMode);
            }
            ANGLE_CAPTURE_GL(TransformFeedbackVaryings, isCallValid, context, programPacked, count,
                             varyings, bufferMode);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_Uniform1ui(GLint location, GLuint v0)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniform1ui, "context = %d, location = %d, v0 = %u", CID(context), location,
              v0);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateUniform1ui(context, angle::EntryPoint::GLUniform1ui, locationPacked, v0));
            if (isCallValid)
            {
                context->uniform1ui(locationPacked, v0);
            }
            ANGLE_CAPTURE_GL(Uniform1ui, isCallValid, context, locationPacked, v0);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_Uniform1uiv(GLint location, GLsizei count, const GLuint *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniform1uiv,
              "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
              location, count, (uintptr_t)value);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateUniform1uiv(context, angle::EntryPoint::GLUniform1uiv,
                                                    locationPacked, count, value));
            if (isCallValid)
            {
                context->uniform1uiv(locationPacked, count, value);
            }
            ANGLE_CAPTURE_GL(Uniform1uiv, isCallValid, context, locationPacked, count, value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_Uniform2ui(GLint location, GLuint v0, GLuint v1)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniform2ui, "context = %d, location = %d, v0 = %u, v1 = %u", CID(context),
              location, v0, v1);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateUniform2ui(context, angle::EntryPoint::GLUniform2ui, locationPacked, v0, v1));
            if (isCallValid)
            {
                context->uniform2ui(locationPacked, v0, v1);
            }
            ANGLE_CAPTURE_GL(Uniform2ui, isCallValid, context, locationPacked, v0, v1);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_Uniform2uiv(GLint location, GLsizei count, const GLuint *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniform2uiv,
              "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
              location, count, (uintptr_t)value);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateUniform2uiv(context, angle::EntryPoint::GLUniform2uiv,
                                                    locationPacked, count, value));
            if (isCallValid)
            {
                context->uniform2uiv(locationPacked, count, value);
            }
            ANGLE_CAPTURE_GL(Uniform2uiv, isCallValid, context, locationPacked, count, value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniform3ui, "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u",
              CID(context), location, v0, v1, v2);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateUniform3ui(context, angle::EntryPoint::GLUniform3ui,
                                                   locationPacked, v0, v1, v2));
            if (isCallValid)
            {
                context->uniform3ui(locationPacked, v0, v1, v2);
            }
            ANGLE_CAPTURE_GL(Uniform3ui, isCallValid, context, locationPacked, v0, v1, v2);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_Uniform3uiv(GLint location, GLsizei count, const GLuint *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniform3uiv,
              "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
              location, count, (uintptr_t)value);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateUniform3uiv(context, angle::EntryPoint::GLUniform3uiv,
                                                    locationPacked, count, value));
            if (isCallValid)
            {
                context->uniform3uiv(locationPacked, count, value);
            }
            ANGLE_CAPTURE_GL(Uniform3uiv, isCallValid, context, locationPacked, count, value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniform4ui, "context = %d, location = %d, v0 = %u, v1 = %u, v2 = %u, v3 = %u",
              CID(context), location, v0, v1, v2, v3);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateUniform4ui(context, angle::EntryPoint::GLUniform4ui,
                                                   locationPacked, v0, v1, v2, v3));
            if (isCallValid)
            {
                context->uniform4ui(locationPacked, v0, v1, v2, v3);
            }
            ANGLE_CAPTURE_GL(Uniform4ui, isCallValid, context, locationPacked, v0, v1, v2, v3);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_Uniform4uiv(GLint location, GLsizei count, const GLuint *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniform4uiv,
              "context = %d, location = %d, count = %d, value = 0x%016" PRIxPTR "", CID(context),
              location, count, (uintptr_t)value);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateUniform4uiv(context, angle::EntryPoint::GLUniform4uiv,
                                                    locationPacked, count, value));
            if (isCallValid)
            {
                context->uniform4uiv(locationPacked, count, value);
            }
            ANGLE_CAPTURE_GL(Uniform4uiv, isCallValid, context, locationPacked, count, value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_UniformBlockBinding(GLuint program,
                                            GLuint uniformBlockIndex,
                                            GLuint uniformBlockBinding)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniformBlockBinding,
              "context = %d, program = %u, uniformBlockIndex = %u, uniformBlockBinding = %u",
              CID(context), program, uniformBlockIndex, uniformBlockBinding);
    
        if (context)
        {
            ShaderProgramID programPacked             = PackParam<ShaderProgramID>(program);
            UniformBlockIndex uniformBlockIndexPacked = PackParam<UniformBlockIndex>(uniformBlockIndex);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateUniformBlockBinding(
                                    context, angle::EntryPoint::GLUniformBlockBinding, programPacked,
                                    uniformBlockIndexPacked, uniformBlockBinding));
            if (isCallValid)
            {
                context->uniformBlockBinding(programPacked, uniformBlockIndexPacked,
                                             uniformBlockBinding);
            }
            ANGLE_CAPTURE_GL(UniformBlockBinding, isCallValid, context, programPacked,
                             uniformBlockIndexPacked, uniformBlockBinding);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_UniformMatrix2x3fv(GLint location,
                                           GLsizei count,
                                           GLboolean transpose,
                                           const GLfloat *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniformMatrix2x3fv,
              "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
              CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateUniformMatrix2x3fv(context, angle::EntryPoint::GLUniformMatrix2x3fv,
                                            locationPacked, count, transpose, value));
            if (isCallValid)
            {
                context->uniformMatrix2x3fv(locationPacked, count, transpose, value);
            }
            ANGLE_CAPTURE_GL(UniformMatrix2x3fv, isCallValid, context, locationPacked, count, transpose,
                             value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_UniformMatrix2x4fv(GLint location,
                                           GLsizei count,
                                           GLboolean transpose,
                                           const GLfloat *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniformMatrix2x4fv,
              "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
              CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateUniformMatrix2x4fv(context, angle::EntryPoint::GLUniformMatrix2x4fv,
                                            locationPacked, count, transpose, value));
            if (isCallValid)
            {
                context->uniformMatrix2x4fv(locationPacked, count, transpose, value);
            }
            ANGLE_CAPTURE_GL(UniformMatrix2x4fv, isCallValid, context, locationPacked, count, transpose,
                             value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_UniformMatrix3x2fv(GLint location,
                                           GLsizei count,
                                           GLboolean transpose,
                                           const GLfloat *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniformMatrix3x2fv,
              "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
              CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateUniformMatrix3x2fv(context, angle::EntryPoint::GLUniformMatrix3x2fv,
                                            locationPacked, count, transpose, value));
            if (isCallValid)
            {
                context->uniformMatrix3x2fv(locationPacked, count, transpose, value);
            }
            ANGLE_CAPTURE_GL(UniformMatrix3x2fv, isCallValid, context, locationPacked, count, transpose,
                             value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_UniformMatrix3x4fv(GLint location,
                                           GLsizei count,
                                           GLboolean transpose,
                                           const GLfloat *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniformMatrix3x4fv,
              "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
              CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateUniformMatrix3x4fv(context, angle::EntryPoint::GLUniformMatrix3x4fv,
                                            locationPacked, count, transpose, value));
            if (isCallValid)
            {
                context->uniformMatrix3x4fv(locationPacked, count, transpose, value);
            }
            ANGLE_CAPTURE_GL(UniformMatrix3x4fv, isCallValid, context, locationPacked, count, transpose,
                             value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_UniformMatrix4x2fv(GLint location,
                                           GLsizei count,
                                           GLboolean transpose,
                                           const GLfloat *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniformMatrix4x2fv,
              "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
              CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateUniformMatrix4x2fv(context, angle::EntryPoint::GLUniformMatrix4x2fv,
                                            locationPacked, count, transpose, value));
            if (isCallValid)
            {
                context->uniformMatrix4x2fv(locationPacked, count, transpose, value);
            }
            ANGLE_CAPTURE_GL(UniformMatrix4x2fv, isCallValid, context, locationPacked, count, transpose,
                             value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_UniformMatrix4x3fv(GLint location,
                                           GLsizei count,
                                           GLboolean transpose,
                                           const GLfloat *value)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUniformMatrix4x3fv,
              "context = %d, location = %d, count = %d, transpose = %s, value = 0x%016" PRIxPTR "",
              CID(context), location, count, GLbooleanToString(transpose), (uintptr_t)value);
    
        if (context)
        {
            UniformLocation locationPacked = PackParam<UniformLocation>(location);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateUniformMatrix4x3fv(context, angle::EntryPoint::GLUniformMatrix4x3fv,
                                            locationPacked, count, transpose, value));
            if (isCallValid)
            {
                context->uniformMatrix4x3fv(locationPacked, count, transpose, value);
            }
            ANGLE_CAPTURE_GL(UniformMatrix4x3fv, isCallValid, context, locationPacked, count, transpose,
                             value);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    GLboolean GL_APIENTRY GL_UnmapBuffer(GLenum target)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLUnmapBuffer, "context = %d, target = %s", CID(context),
              GLenumToString(GLESEnum::BufferTargetARB, target));
    
        GLboolean returnValue;
        if (context)
        {
            BufferBinding targetPacked = PackParam<BufferBinding>(target);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateUnmapBuffer(context, angle::EntryPoint::GLUnmapBuffer, targetPacked));
            if (isCallValid)
            {
                returnValue = context->unmapBuffer(targetPacked);
            }
            else
            {
                returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapBuffer, GLboolean>();
            }
            ANGLE_CAPTURE_GL(UnmapBuffer, isCallValid, context, targetPacked, returnValue);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
            returnValue = GetDefaultReturnValue<angle::EntryPoint::GLUnmapBuffer, GLboolean>();
        }
        return returnValue;
    }
    
    void GL_APIENTRY GL_VertexAttribDivisor(GLuint index, GLuint divisor)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLVertexAttribDivisor, "context = %d, index = %u, divisor = %u", CID(context),
              index, divisor);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateVertexAttribDivisor(
                                    context, angle::EntryPoint::GLVertexAttribDivisor, index, divisor));
            if (isCallValid)
            {
                context->vertexAttribDivisor(index, divisor);
            }
            ANGLE_CAPTURE_GL(VertexAttribDivisor, isCallValid, context, index, divisor);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLVertexAttribI4i, "context = %d, index = %u, x = %d, y = %d, z = %d, w = %d",
              CID(context), index, x, y, z, w);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateVertexAttribI4i(context, angle::EntryPoint::GLVertexAttribI4i,
                                                        index, x, y, z, w));
            if (isCallValid)
            {
                context->vertexAttribI4i(index, x, y, z, w);
            }
            ANGLE_CAPTURE_GL(VertexAttribI4i, isCallValid, context, index, x, y, z, w);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_VertexAttribI4iv(GLuint index, const GLint *v)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLVertexAttribI4iv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
              CID(context), index, (uintptr_t)v);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateVertexAttribI4iv(context, angle::EntryPoint::GLVertexAttribI4iv, index, v));
            if (isCallValid)
            {
                context->vertexAttribI4iv(index, v);
            }
            ANGLE_CAPTURE_GL(VertexAttribI4iv, isCallValid, context, index, v);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLVertexAttribI4ui, "context = %d, index = %u, x = %u, y = %u, z = %u, w = %u",
              CID(context), index, x, y, z, w);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid = (context->skipValidation() ||
                                ValidateVertexAttribI4ui(context, angle::EntryPoint::GLVertexAttribI4ui,
                                                         index, x, y, z, w));
            if (isCallValid)
            {
                context->vertexAttribI4ui(index, x, y, z, w);
            }
            ANGLE_CAPTURE_GL(VertexAttribI4ui, isCallValid, context, index, x, y, z, w);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_VertexAttribI4uiv(GLuint index, const GLuint *v)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLVertexAttribI4uiv, "context = %d, index = %u, v = 0x%016" PRIxPTR "",
              CID(context), index, (uintptr_t)v);
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateVertexAttribI4uiv(context, angle::EntryPoint::GLVertexAttribI4uiv, index, v));
            if (isCallValid)
            {
                context->vertexAttribI4uiv(index, v);
            }
            ANGLE_CAPTURE_GL(VertexAttribI4uiv, isCallValid, context, index, v);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY
    GL_VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLVertexAttribIPointer,
              "context = %d, index = %u, size = %d, type = %s, stride = %d, pointer = 0x%016" PRIxPTR
              "",
              CID(context), index, size, GLenumToString(GLESEnum::VertexAttribIType, type), stride,
              (uintptr_t)pointer);
    
        if (context)
        {
            VertexAttribType typePacked = PackParam<VertexAttribType>(type);
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateVertexAttribIPointer(context, angle::EntryPoint::GLVertexAttribIPointer, index,
                                              size, typePacked, stride, pointer));
            if (isCallValid)
            {
                context->vertexAttribIPointer(index, size, typePacked, stride, pointer);
            }
            ANGLE_CAPTURE_GL(VertexAttribIPointer, isCallValid, context, index, size, typePacked,
                             stride, pointer);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    void GL_APIENTRY GL_WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
    {
        Context *context = GetValidGlobalContext();
        EVENT(context, GLWaitSync, "context = %d, sync = 0x%016" PRIxPTR ", flags = %s, timeout = %llu",
              CID(context), (uintptr_t)sync,
              GLbitfieldToString(GLESEnum::SyncBehaviorFlags, flags).c_str(),
              static_cast<unsigned long long>(timeout));
    
        if (context)
        {
            SCOPED_SHARE_CONTEXT_LOCK(context);
            bool isCallValid =
                (context->skipValidation() ||
                 ValidateWaitSync(context, angle::EntryPoint::GLWaitSync, sync, flags, timeout));
            if (isCallValid)
            {
                context->waitSync(sync, flags, timeout);
            }
            ANGLE_CAPTURE_GL(WaitSync, isCallValid, context, sync, flags, timeout);
        }
        else
        {
            GenerateContextLostErrorOnCurrentGlobalContext();
        }
    }
    
    }  // extern "C"