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

// validationGL33.cpp: Validation functions for OpenGL 3.3 entry point parameters

#include "libANGLE/validationGL33_autogen.h"

namespace gl
{

bool ValidateBindFragDataLocationIndexed(Context *context,
                                         ShaderProgramID program,
                                         GLuint colorNumber,
                                         GLuint index,
                                         const GLchar *name)
{
    return true;
}

bool ValidateColorP3ui(Context *context, GLenum type, GLuint color)
{
    return true;
}

bool ValidateColorP3uiv(Context *context, GLenum type, const GLuint *color)
{
    return true;
}

bool ValidateColorP4ui(Context *context, GLenum type, GLuint color)
{
    return true;
}

bool ValidateColorP4uiv(Context *context, GLenum type, const GLuint *color)
{
    return true;
}

bool ValidateGetFragDataIndex(Context *context, ShaderProgramID program, const GLchar *name)
{
    return true;
}

bool ValidateGetQueryObjecti64v(Context *context, QueryID id, GLenum pname, GLint64 *params)
{
    return true;
}

bool ValidateGetQueryObjectui64v(Context *context, QueryID id, GLenum pname, GLuint64 *params)
{
    return true;
}

bool ValidateMultiTexCoordP1ui(Context *context, GLenum texture, GLenum type, GLuint coords)
{
    return true;
}

bool ValidateMultiTexCoordP1uiv(Context *context, GLenum texture, GLenum type, const GLuint *coords)
{
    return true;
}

bool ValidateMultiTexCoordP2ui(Context *context, GLenum texture, GLenum type, GLuint coords)
{
    return true;
}

bool ValidateMultiTexCoordP2uiv(Context *context, GLenum texture, GLenum type, const GLuint *coords)
{
    return true;
}

bool ValidateMultiTexCoordP3ui(Context *context, GLenum texture, GLenum type, GLuint coords)
{
    return true;
}

bool ValidateMultiTexCoordP3uiv(Context *context, GLenum texture, GLenum type, const GLuint *coords)
{
    return true;
}

bool ValidateMultiTexCoordP4ui(Context *context, GLenum texture, GLenum type, GLuint coords)
{
    return true;
}

bool ValidateMultiTexCoordP4uiv(Context *context, GLenum texture, GLenum type, const GLuint *coords)
{
    return true;
}

bool ValidateNormalP3ui(Context *context, GLenum type, GLuint coords)
{
    return true;
}

bool ValidateNormalP3uiv(Context *context, GLenum type, const GLuint *coords)
{
    return true;
}

bool ValidateQueryCounter(Context *context, QueryID id, QueryType targetPacked)
{
    return true;
}

bool ValidateSecondaryColorP3ui(Context *context, GLenum type, GLuint color)
{
    return true;
}

bool ValidateSecondaryColorP3uiv(Context *context, GLenum type, const GLuint *color)
{
    return true;
}

bool ValidateTexCoordP1ui(Context *context, GLenum type, GLuint coords)
{
    return true;
}

bool ValidateTexCoordP1uiv(Context *context, GLenum type, const GLuint *coords)
{
    return true;
}

bool ValidateTexCoordP2ui(Context *context, GLenum type, GLuint coords)
{
    return true;
}

bool ValidateTexCoordP2uiv(Context *context, GLenum type, const GLuint *coords)
{
    return true;
}

bool ValidateTexCoordP3ui(Context *context, GLenum type, GLuint coords)
{
    return true;
}

bool ValidateTexCoordP3uiv(Context *context, GLenum type, const GLuint *coords)
{
    return true;
}

bool ValidateTexCoordP4ui(Context *context, GLenum type, GLuint coords)
{
    return true;
}

bool ValidateTexCoordP4uiv(Context *context, GLenum type, const GLuint *coords)
{
    return true;
}

bool ValidateVertexAttribP1ui(Context *context,
                              GLuint index,
                              GLenum type,
                              GLboolean normalized,
                              GLuint value)
{
    return true;
}

bool ValidateVertexAttribP1uiv(Context *context,
                               GLuint index,
                               GLenum type,
                               GLboolean normalized,
                               const GLuint *value)
{
    return true;
}

bool ValidateVertexAttribP2ui(Context *context,
                              GLuint index,
                              GLenum type,
                              GLboolean normalized,
                              GLuint value)
{
    return true;
}

bool ValidateVertexAttribP2uiv(Context *context,
                               GLuint index,
                               GLenum type,
                               GLboolean normalized,
                               const GLuint *value)
{
    return true;
}

bool ValidateVertexAttribP3ui(Context *context,
                              GLuint index,
                              GLenum type,
                              GLboolean normalized,
                              GLuint value)
{
    return true;
}

bool ValidateVertexAttribP3uiv(Context *context,
                               GLuint index,
                               GLenum type,
                               GLboolean normalized,
                               const GLuint *value)
{
    return true;
}

bool ValidateVertexAttribP4ui(Context *context,
                              GLuint index,
                              GLenum type,
                              GLboolean normalized,
                              GLuint value)
{
    return true;
}

bool ValidateVertexAttribP4uiv(Context *context,
                               GLuint index,
                               GLenum type,
                               GLboolean normalized,
                               const GLuint *value)
{
    return true;
}

bool ValidateVertexP2ui(Context *context, GLenum type, GLuint value)
{
    return true;
}

bool ValidateVertexP2uiv(Context *context, GLenum type, const GLuint *value)
{
    return true;
}

bool ValidateVertexP3ui(Context *context, GLenum type, GLuint value)
{
    return true;
}

bool ValidateVertexP3uiv(Context *context, GLenum type, const GLuint *value)
{
    return true;
}

bool ValidateVertexP4ui(Context *context, GLenum type, GLuint value)
{
    return true;
}

bool ValidateVertexP4uiv(Context *context, GLenum type, const GLuint *value)
{
    return true;
}

}  // namespace gl
