//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// capture_gles_3_0_params.cpp:
//   Pointer parameter capture functions for the OpenGL ES 3.0 entry points.
//

#include "common/unsafe_buffers.h"
#include "libANGLE/capture/capture_gles_2_0_autogen.h"
#include "libANGLE/capture/capture_gles_3_0_autogen.h"

using namespace angle;

namespace gl
{
void CaptureClearBufferfv_value(const State &glState,
                                GLenum buffer,
                                GLint drawbuffer,
                                const GLfloat *value,
                                ParamCapture *paramCapture)
{
    CaptureClearBufferValue<GLfloat>(buffer, value, paramCapture);
}

void CaptureClearBufferiv_value(const State &glState,
                                GLenum buffer,
                                GLint drawbuffer,
                                const GLint *value,
                                ParamCapture *paramCapture)
{
    CaptureClearBufferValue<GLint>(buffer, value, paramCapture);
}

void CaptureClearBufferuiv_value(const State &glState,
                                 GLenum buffer,
                                 GLint drawbuffer,
                                 const GLuint *value,
                                 ParamCapture *paramCapture)
{
    CaptureClearBufferValue<GLuint>(buffer, value, paramCapture);
}

void CaptureCompressedTexImage3D_data(const State &glState,
                                      TextureTarget targetPacked,
                                      GLint level,
                                      GLenum internalformat,
                                      GLsizei width,
                                      GLsizei height,
                                      GLsizei depth,
                                      GLint border,
                                      GLsizei imageSize,
                                      const void *data,
                                      ParamCapture *paramCapture)
{
    if (glState.getTargetBuffer(gl::BufferBinding::PixelUnpack))
    {
        return;
    }

    if (!data)
    {
        return;
    }

    CaptureMemory(data, imageSize, paramCapture);
}

void CaptureCompressedTexSubImage3D_data(const State &glState,
                                         TextureTarget targetPacked,
                                         GLint level,
                                         GLint xoffset,
                                         GLint yoffset,
                                         GLint zoffset,
                                         GLsizei width,
                                         GLsizei height,
                                         GLsizei depth,
                                         GLenum format,
                                         GLsizei imageSize,
                                         const void *data,
                                         ParamCapture *paramCapture)
{
    CaptureCompressedTexImage3D_data(glState, targetPacked, level, 0, width, height, depth, 0,
                                     imageSize, data, paramCapture);
}

void CaptureDeleteQueries_idsPacked(const State &glState,
                                    GLsizei n,
                                    const QueryID *ids,
                                    ParamCapture *paramCapture)
{
    CaptureArray(ids, n, paramCapture);
}

void CaptureDeleteSamplers_samplersPacked(const State &glState,
                                          GLsizei count,
                                          const SamplerID *samplers,
                                          ParamCapture *paramCapture)
{
    CaptureArray(samplers, count, paramCapture);
}

void CaptureDeleteTransformFeedbacks_idsPacked(const State &glState,
                                               GLsizei n,
                                               const TransformFeedbackID *ids,
                                               ParamCapture *paramCapture)
{
    CaptureArray(ids, n, paramCapture);
}

void CaptureDeleteVertexArrays_arraysPacked(const State &glState,
                                            GLsizei n,
                                            const VertexArrayID *arrays,
                                            ParamCapture *paramCapture)
{
    CaptureArray(arrays, n, paramCapture);
}

void CaptureDrawBuffers_bufs(const State &glState,
                             GLsizei n,
                             const GLenum *bufs,
                             ParamCapture *paramCapture)
{
    CaptureArray(bufs, n, paramCapture);
}

void CaptureDrawElementsInstanced_indices(const State &glState,
                                          PrimitiveMode modePacked,
                                          GLsizei count,
                                          DrawElementsType typePacked,
                                          const void *indices,
                                          GLsizei instancecount,
                                          ParamCapture *paramCapture)
{
    CaptureDrawElements_indices(glState, modePacked, count, typePacked, indices, paramCapture);
}

void CaptureDrawRangeElements_indices(const State &glState,
                                      PrimitiveMode modePacked,
                                      GLuint start,
                                      GLuint end,
                                      GLsizei count,
                                      DrawElementsType typePacked,
                                      const void *indices,
                                      ParamCapture *paramCapture)
{
    CaptureDrawElements_indices(glState, modePacked, count, typePacked, indices, paramCapture);
}

void CaptureGenQueries_idsPacked(const State &glState,
                                 GLsizei n,
                                 QueryID *ids,
                                 ParamCapture *paramCapture)
{
    CaptureGenHandles(n, ids, paramCapture);
}

void CaptureGenSamplers_samplersPacked(const State &glState,
                                       GLsizei count,
                                       SamplerID *samplers,
                                       ParamCapture *paramCapture)
{
    CaptureGenHandles(count, samplers, paramCapture);
}

void CaptureGenTransformFeedbacks_idsPacked(const State &glState,
                                            GLsizei n,
                                            TransformFeedbackID *ids,
                                            ParamCapture *paramCapture)
{
    CaptureGenHandles(n, ids, paramCapture);
}

void CaptureGenVertexArrays_arraysPacked(const State &glState,
                                         GLsizei n,
                                         VertexArrayID *arrays,
                                         ParamCapture *paramCapture)
{
    CaptureGenHandles(n, arrays, paramCapture);
}

void CaptureGetActiveUniformBlockName_length(const State &glState,
                                             ShaderProgramID program,
                                             UniformBlockIndex uniformBlockIndex,
                                             GLsizei bufSize,
                                             GLsizei *length,
                                             GLchar *uniformBlockName,
                                             ParamCapture *paramCapture)
{
    // From the OpenGL ES 3.0 spec:
    // The actual number of characters written into uniformBlockName, excluding the null terminator,
    // is returned in length. If length is NULL, no length is returned.
    if (length)
    {
        paramCapture->readBufferSizeBytes = sizeof(GLsizei);
    }
}

void CaptureGetActiveUniformBlockName_uniformBlockName(const State &glState,
                                                       ShaderProgramID program,
                                                       UniformBlockIndex uniformBlockIndex,
                                                       GLsizei bufSize,
                                                       GLsizei *length,
                                                       GLchar *uniformBlockName,
                                                       ParamCapture *paramCapture)
{
    // From the OpenGL ES 3.0 spec:
    // bufSize contains the maximum number of characters (including the null terminator) that will
    // be written back to uniformBlockName.
    CaptureStringLimit(uniformBlockName, bufSize, paramCapture);
}

void CaptureGetActiveUniformBlockiv_params(const State &glState,
                                           ShaderProgramID programPacked,
                                           UniformBlockIndex uniformBlockIndexPacked,
                                           UniformBlockParameter pnamePacked,
                                           GLint *params,
                                           ParamCapture *paramCapture)
{
    CaptureGetActiveUniformBlockivParameters(glState, programPacked, uniformBlockIndexPacked,
                                             pnamePacked, paramCapture);
}

void CaptureGetActiveUniformsiv_uniformIndices(const State &glState,
                                               ShaderProgramID program,
                                               GLsizei uniformCount,
                                               const GLuint *uniformIndices,
                                               GLenum pname,
                                               GLint *params,
                                               ParamCapture *paramCapture)
{
    // From the OpenGL ES 3.0 spec:
    // For GetActiveUniformsiv, uniformCountindicates both the number of
    // elements in the array of indices uniformIndices and the number of
    // parameters written to params upon successful return.
    CaptureArray(uniformIndices, uniformCount, paramCapture);
}

void CaptureGetActiveUniformsiv_params(const State &glState,
                                       ShaderProgramID program,
                                       GLsizei uniformCount,
                                       const GLuint *uniformIndices,
                                       GLenum pname,
                                       GLint *params,
                                       ParamCapture *paramCapture)
{
    // From the OpenGL ES 3.0 spec:
    // For GetActiveUniformsiv, uniformCountindicates both the number of
    // elements in the array of indices uniformIndices and the number of
    // parameters written to params upon successful return.
    paramCapture->readBufferSizeBytes = sizeof(GLint) * uniformCount;
}

void CaptureGetBufferParameteri64v_params(const State &glState,
                                          BufferBinding targetPacked,
                                          BufferParam pnamePacked,
                                          GLint64 *params,
                                          ParamCapture *paramCapture)
{
    // This only returns one value
    paramCapture->readBufferSizeBytes = sizeof(GLuint);
}

void CaptureGetBufferPointerv_params(const State &glState,
                                     BufferBinding targetPacked,
                                     GLenum pname,
                                     void **params,
                                     ParamCapture *paramCapture)
{
    UNIMPLEMENTED();
}

void CaptureGetFragDataLocation_name(const State &glState,
                                     ShaderProgramID program,
                                     const GLchar *name,
                                     ParamCapture *paramCapture)
{
    CaptureString(name, paramCapture);
}

void CaptureGetInteger64i_v_data(const State &glState,
                                 GLenum target,
                                 GLuint index,
                                 GLint64 *data,
                                 ParamCapture *paramCapture)
{
    CaptureGetParameter(glState, target, sizeof(GLint64), paramCapture);
}

void CaptureGetInteger64v_data(const State &glState,
                               GLenum pname,
                               GLint64 *data,
                               ParamCapture *paramCapture)
{
    CaptureGetParameter(glState, pname, sizeof(GLint64), paramCapture);
}

void CaptureGetIntegeri_v_data(const State &glState,
                               GLenum target,
                               GLuint index,
                               GLint *data,
                               ParamCapture *paramCapture)
{
    CaptureGetParameter(glState, target, sizeof(GLint), paramCapture);
}

void CaptureGetInternalformativ_params(const State &glState,
                                       GLenum target,
                                       GLenum internalformat,
                                       GLenum pname,
                                       GLsizei count,
                                       GLint *params,
                                       ParamCapture *paramCapture)
{
    if (params != nullptr)
    {
        // GL_NUM_SAMPLE_COUNTS and GL_NUM_SURFACE_COMPRESSION_FIXED_RATES_EXT
        size_t paramCount = 1;
        switch (pname)
        {
            case GL_SAMPLES:
                // Maximum case: 1, 2, 4, 8, 16, 32 (IMPLEMENTATION_MAX_SAMPLES)
                paramCount = gl::log2(static_cast<size_t>(gl::IMPLEMENTATION_MAX_SAMPLES)) + 1;
                break;
            case GL_SURFACE_COMPRESSION_EXT:
                // From SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT to
                // SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT
                paramCount = 12;
                break;
        }
        paramCapture->readBufferSizeBytes = sizeof(GLint) * paramCount;
    }
}

void CaptureGetProgramBinary_length(const State &glState,
                                    ShaderProgramID program,
                                    GLsizei bufSize,
                                    GLsizei *length,
                                    GLenum *binaryFormat,
                                    void *binary,
                                    ParamCapture *paramCapture)
{
    if (length)
    {
        paramCapture->readBufferSizeBytes = sizeof(GLsizei);
    }
}

void CaptureGetProgramBinary_binaryFormat(const State &glState,
                                          ShaderProgramID program,
                                          GLsizei bufSize,
                                          GLsizei *length,
                                          GLenum *binaryFormat,
                                          void *binary,
                                          ParamCapture *paramCapture)
{
    paramCapture->readBufferSizeBytes = sizeof(GLenum);
}

void CaptureGetProgramBinary_binary(const State &glState,
                                    ShaderProgramID program,
                                    GLsizei bufSize,
                                    GLsizei *length,
                                    GLenum *binaryFormat,
                                    void *binary,
                                    ParamCapture *paramCapture)
{
    // If we have length, then actual binarySize was written there
    // Otherwise, we don't know how many bytes were written
    if (!length)
    {
        UNIMPLEMENTED();
        return;
    }

    GLsizei binarySize = *length;
    if (binarySize > bufSize)
    {
        // This is a GL error, but clamp it anyway
        binarySize = bufSize;
    }

    paramCapture->readBufferSizeBytes = binarySize;
}

void CaptureGetQueryObjectuiv_params(const State &glState,
                                     QueryID idPacked,
                                     QueryObjectParameter pnamePacked,
                                     GLuint *params,
                                     ParamCapture *paramCapture)
{
    // This only returns one value
    paramCapture->readBufferSizeBytes = sizeof(GLuint);
}

void CaptureGetQueryiv_params(const State &glState,
                              QueryType targetPacked,
                              QueryParameter pnamePacked,
                              GLint *params,
                              ParamCapture *paramCapture)
{
    // This only returns one value
    paramCapture->readBufferSizeBytes = sizeof(GLint);
}

void CaptureGetSamplerParameterfv_params(const State &glState,
                                         SamplerID samplerPacked,
                                         SamplerParameter pnamePacked,
                                         GLfloat *params,
                                         ParamCapture *paramCapture)
{
    // page 458 https://www.khronos.org/registry/OpenGL/specs/es/3.2/es_spec_3.2.pdf
    paramCapture->readBufferSizeBytes = 4 * sizeof(GLfloat);
}

void CaptureGetSamplerParameteriv_params(const State &glState,
                                         SamplerID samplerPacked,
                                         SamplerParameter pnamePacked,
                                         GLint *params,
                                         ParamCapture *paramCapture)
{
    // page 458 https://www.khronos.org/registry/OpenGL/specs/es/3.2/es_spec_3.2.pdf
    paramCapture->readBufferSizeBytes = 4 * sizeof(GLint);
}

void CaptureGetSynciv_length(const State &glState,
                             SyncID syncPacked,
                             GLenum pname,
                             GLsizei count,
                             GLsizei *length,
                             GLint *values,
                             ParamCapture *paramCapture)
{
    if (length != nullptr)
    {
        paramCapture->readBufferSizeBytes = sizeof(GLsizei);
    }
}

void CaptureGetSynciv_values(const State &glState,
                             SyncID syncPacked,
                             GLenum pname,
                             GLsizei count,
                             GLsizei *length,
                             GLint *values,
                             ParamCapture *paramCapture)
{
    // All sync parameters return only one value.
    if (values != nullptr)
    {
        paramCapture->readBufferSizeBytes = sizeof(GLint);
    }
}

void CaptureGetTransformFeedbackVarying_length(const State &glState,
                                               ShaderProgramID program,
                                               GLuint index,
                                               GLsizei bufSize,
                                               GLsizei *length,
                                               GLsizei *size,
                                               GLenum *type,
                                               GLchar *name,
                                               ParamCapture *paramCapture)
{
    UNIMPLEMENTED();
}

void CaptureGetTransformFeedbackVarying_size(const State &glState,
                                             ShaderProgramID program,
                                             GLuint index,
                                             GLsizei bufSize,
                                             GLsizei *length,
                                             GLsizei *size,
                                             GLenum *type,
                                             GLchar *name,
                                             ParamCapture *paramCapture)
{
    UNIMPLEMENTED();
}

void CaptureGetTransformFeedbackVarying_type(const State &glState,
                                             ShaderProgramID program,
                                             GLuint index,
                                             GLsizei bufSize,
                                             GLsizei *length,
                                             GLsizei *size,
                                             GLenum *type,
                                             GLchar *name,
                                             ParamCapture *paramCapture)
{
    UNIMPLEMENTED();
}

void CaptureGetTransformFeedbackVarying_name(const State &glState,
                                             ShaderProgramID program,
                                             GLuint index,
                                             GLsizei bufSize,
                                             GLsizei *length,
                                             GLsizei *size,
                                             GLenum *type,
                                             GLchar *name,
                                             ParamCapture *paramCapture)
{
    UNIMPLEMENTED();
}

void CaptureGetUniformBlockIndex_uniformBlockName(const State &glState,
                                                  ShaderProgramID program,
                                                  const GLchar *uniformBlockName,
                                                  ParamCapture *paramCapture)
{
    CaptureString(uniformBlockName, paramCapture);
}

void CaptureGetUniformIndices_uniformNames(const State &glState,
                                           ShaderProgramID program,
                                           GLsizei uniformCount,
                                           const GLchar *const *uniformNames,
                                           GLuint *uniformIndices,
                                           ParamCapture *paramCapture)
{
    for (GLsizei index = 0; index < uniformCount; ++index)
    {
        CaptureString(ANGLE_UNSAFE_TODO(uniformNames[index]), paramCapture);
    }
}

void CaptureGetUniformIndices_uniformIndices(const State &glState,
                                             ShaderProgramID program,
                                             GLsizei uniformCount,
                                             const GLchar *const *uniformNames,
                                             GLuint *uniformIndices,
                                             ParamCapture *paramCapture)
{
    CaptureMemory(uniformIndices, sizeof(GLuint) * uniformCount, paramCapture);
}

void CaptureGetUniformuiv_params(const State &glState,
                                 ShaderProgramID program,
                                 UniformLocation location,
                                 GLuint *params,
                                 ParamCapture *paramCapture)
{
    /* At most a mat4 can be returned, so use this upper bound as count */
    CaptureArray(params, 16 * sizeof(GLuint), paramCapture);
}

void CaptureGetVertexAttribIiv_params(const State &glState,
                                      GLuint index,
                                      GLenum pname,
                                      GLint *params,
                                      ParamCapture *paramCapture)
{
    int nParams = pname == GL_CURRENT_VERTEX_ATTRIB ? 4 : 1;

    paramCapture->readBufferSizeBytes = nParams * sizeof(GLint);
}

void CaptureGetVertexAttribIuiv_params(const State &glState,
                                       GLuint index,
                                       GLenum pname,
                                       GLuint *params,
                                       ParamCapture *paramCapture)
{
    int nParams = pname == GL_CURRENT_VERTEX_ATTRIB ? 4 : 1;

    paramCapture->readBufferSizeBytes = nParams * sizeof(GLuint);
}

void CaptureInvalidateFramebuffer_attachments(const State &glState,
                                              GLenum target,
                                              GLsizei numAttachments,
                                              const GLenum *attachments,
                                              ParamCapture *paramCapture)
{
    CaptureMemory(attachments, sizeof(GLenum) * numAttachments, paramCapture);
    paramCapture->value.voidConstPointerVal = paramCapture->data[0].data();
}

void CaptureInvalidateSubFramebuffer_attachments(const State &glState,
                                                 GLenum target,
                                                 GLsizei numAttachments,
                                                 const GLenum *attachments,
                                                 GLint x,
                                                 GLint y,
                                                 GLsizei width,
                                                 GLsizei height,
                                                 ParamCapture *paramCapture)
{
    CaptureMemory(attachments, sizeof(GLenum) * numAttachments, paramCapture);
}

void CaptureProgramBinary_binary(const State &glState,
                                 ShaderProgramID program,
                                 GLenum binaryFormat,
                                 const void *binary,
                                 GLsizei length,
                                 ParamCapture *paramCapture)
{
    // Do nothing. glProgramBinary will be overridden in GenerateLinkedProgram.
}

void CaptureSamplerParameterfv_param(const State &glState,
                                     SamplerID samplerPacked,
                                     SamplerParameter pnamePacked,
                                     const GLfloat *param,
                                     ParamCapture *paramCapture)
{
    CaptureTextureAndSamplerParameter_params<GLfloat>(ToGLenum(pnamePacked), param, paramCapture);
}

void CaptureSamplerParameteriv_param(const State &glState,
                                     SamplerID samplerPacked,
                                     SamplerParameter pnamePacked,
                                     const GLint *param,
                                     ParamCapture *paramCapture)
{
    CaptureTextureAndSamplerParameter_params<GLint>(ToGLenum(pnamePacked), param, paramCapture);
}

void CaptureTexImage3D_pixels(const State &glState,
                              TextureTarget targetPacked,
                              GLint level,
                              GLint internalformat,
                              GLsizei width,
                              GLsizei height,
                              GLsizei depth,
                              GLint border,
                              GLenum format,
                              GLenum type,
                              const void *pixels,
                              ParamCapture *paramCapture)
{
    if (glState.getTargetBuffer(gl::BufferBinding::PixelUnpack))
    {
        return;
    }

    if (!pixels)
    {
        return;
    }

    const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(format, type);
    const gl::PixelUnpackState &unpack           = glState.getUnpackState();

    const Extents size(width, height, depth);

    GLuint endByte = 0;
    bool unpackSize =
        internalFormatInfo.computePackUnpackEndByte(type, size, unpack, true, &endByte);
    ASSERT(unpackSize);

    CaptureMemory(pixels, static_cast<size_t>(endByte), paramCapture);
}

void CaptureTexSubImage3D_pixels(const State &glState,
                                 TextureTarget targetPacked,
                                 GLint level,
                                 GLint xoffset,
                                 GLint yoffset,
                                 GLint zoffset,
                                 GLsizei width,
                                 GLsizei height,
                                 GLsizei depth,
                                 GLenum format,
                                 GLenum type,
                                 const void *pixels,
                                 ParamCapture *paramCapture)
{
    CaptureTexImage3D_pixels(glState, targetPacked, level, 0, width, height, depth, 0, format, type,
                             pixels, paramCapture);
}

void CaptureTransformFeedbackVaryings_varyings(const State &glState,
                                               ShaderProgramID program,
                                               GLsizei count,
                                               const GLchar *const *varyings,
                                               GLenum bufferMode,
                                               ParamCapture *paramCapture)
{
    for (GLsizei index = 0; index < count; ++index)
    {
        CaptureString(ANGLE_UNSAFE_TODO(varyings[index]), paramCapture);
    }
}

void CaptureUniform1uiv_value(const State &glState,
                              UniformLocation location,
                              GLsizei count,
                              const GLuint *value,
                              ParamCapture *paramCapture)
{
    CaptureMemory(value, count * sizeof(GLuint), paramCapture);
}

void CaptureUniform2uiv_value(const State &glState,
                              UniformLocation location,
                              GLsizei count,
                              const GLuint *value,
                              ParamCapture *paramCapture)
{
    CaptureMemory(value, count * sizeof(GLuint) * 2, paramCapture);
}

void CaptureUniform3uiv_value(const State &glState,
                              UniformLocation location,
                              GLsizei count,
                              const GLuint *value,
                              ParamCapture *paramCapture)
{
    CaptureMemory(value, count * sizeof(GLuint) * 3, paramCapture);
}

void CaptureUniform4uiv_value(const State &glState,
                              UniformLocation location,
                              GLsizei count,
                              const GLuint *value,
                              ParamCapture *paramCapture)
{
    CaptureMemory(value, count * sizeof(GLuint) * 4, paramCapture);
}

void CaptureUniformMatrix2x3fv_value(const State &glState,
                                     UniformLocation location,
                                     GLsizei count,
                                     GLboolean transpose,
                                     const GLfloat *value,
                                     ParamCapture *paramCapture)
{
    CaptureMemory(value, count * sizeof(GLfloat) * 6, paramCapture);
}

void CaptureUniformMatrix2x4fv_value(const State &glState,
                                     UniformLocation location,
                                     GLsizei count,
                                     GLboolean transpose,
                                     const GLfloat *value,
                                     ParamCapture *paramCapture)
{
    CaptureMemory(value, count * sizeof(GLfloat) * 8, paramCapture);
}

void CaptureUniformMatrix3x2fv_value(const State &glState,
                                     UniformLocation location,
                                     GLsizei count,
                                     GLboolean transpose,
                                     const GLfloat *value,
                                     ParamCapture *paramCapture)
{
    CaptureMemory(value, count * sizeof(GLfloat) * 6, paramCapture);
}

void CaptureUniformMatrix3x4fv_value(const State &glState,
                                     UniformLocation location,
                                     GLsizei count,
                                     GLboolean transpose,
                                     const GLfloat *value,
                                     ParamCapture *paramCapture)
{
    CaptureMemory(value, count * sizeof(GLfloat) * 12, paramCapture);
}

void CaptureUniformMatrix4x2fv_value(const State &glState,
                                     UniformLocation location,
                                     GLsizei count,
                                     GLboolean transpose,
                                     const GLfloat *value,
                                     ParamCapture *paramCapture)
{
    CaptureMemory(value, count * sizeof(GLfloat) * 8, paramCapture);
}

void CaptureUniformMatrix4x3fv_value(const State &glState,
                                     UniformLocation location,
                                     GLsizei count,
                                     GLboolean transpose,
                                     const GLfloat *value,
                                     ParamCapture *paramCapture)
{
    CaptureMemory(value, count * sizeof(GLfloat) * 12, paramCapture);
}

void CaptureVertexAttribI4iv_v(const State &glState,
                               GLuint index,
                               const GLint *v,
                               ParamCapture *paramCapture)
{
    UNIMPLEMENTED();
}

void CaptureVertexAttribI4uiv_v(const State &glState,
                                GLuint index,
                                const GLuint *v,
                                ParamCapture *paramCapture)
{
    UNIMPLEMENTED();
}

void CaptureVertexAttribIPointer_pointer(const State &glState,
                                         GLuint index,
                                         GLint size,
                                         VertexAttribType typePacked,
                                         GLsizei stride,
                                         const void *pointer,
                                         ParamCapture *paramCapture)
{
    CaptureVertexAttribPointer_pointer(glState, index, size, typePacked, false, stride, pointer,
                                       paramCapture);
}

}  // namespace gl
