// 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.
//
// validationGL33_autogen.h:
//   Validation functions for the OpenGL 3.3 entry points.

#ifndef LIBANGLE_VALIDATION_GL33_AUTOGEN_H_
#define LIBANGLE_VALIDATION_GL33_AUTOGEN_H_

#include "common/PackedEnums.h"

namespace gl
{
class Context;

bool ValidateBindFragDataLocationIndexed(const Context *context,
                                         ShaderProgramID programPacked,
                                         GLuint colorNumber,
                                         GLuint index,
                                         const GLchar *name);
bool ValidateColorP3ui(const Context *context, GLenum type, GLuint color);
bool ValidateColorP3uiv(const Context *context, GLenum type, const GLuint *color);
bool ValidateColorP4ui(const Context *context, GLenum type, GLuint color);
bool ValidateColorP4uiv(const Context *context, GLenum type, const GLuint *color);
bool ValidateGetFragDataIndex(const Context *context,
                              ShaderProgramID programPacked,
                              const GLchar *name);
bool ValidateGetQueryObjecti64v(const Context *context,
                                QueryID idPacked,
                                GLenum pname,
                                const GLint64 *params);
bool ValidateGetQueryObjectui64v(const Context *context,
                                 QueryID idPacked,
                                 GLenum pname,
                                 const GLuint64 *params);
bool ValidateMultiTexCoordP1ui(const Context *context, GLenum texture, GLenum type, GLuint coords);
bool ValidateMultiTexCoordP1uiv(const Context *context,
                                GLenum texture,
                                GLenum type,
                                const GLuint *coords);
bool ValidateMultiTexCoordP2ui(const Context *context, GLenum texture, GLenum type, GLuint coords);
bool ValidateMultiTexCoordP2uiv(const Context *context,
                                GLenum texture,
                                GLenum type,
                                const GLuint *coords);
bool ValidateMultiTexCoordP3ui(const Context *context, GLenum texture, GLenum type, GLuint coords);
bool ValidateMultiTexCoordP3uiv(const Context *context,
                                GLenum texture,
                                GLenum type,
                                const GLuint *coords);
bool ValidateMultiTexCoordP4ui(const Context *context, GLenum texture, GLenum type, GLuint coords);
bool ValidateMultiTexCoordP4uiv(const Context *context,
                                GLenum texture,
                                GLenum type,
                                const GLuint *coords);
bool ValidateNormalP3ui(const Context *context, GLenum type, GLuint coords);
bool ValidateNormalP3uiv(const Context *context, GLenum type, const GLuint *coords);
bool ValidateQueryCounter(const Context *context, QueryID idPacked, QueryType targetPacked);
bool ValidateSecondaryColorP3ui(const Context *context, GLenum type, GLuint color);
bool ValidateSecondaryColorP3uiv(const Context *context, GLenum type, const GLuint *color);
bool ValidateTexCoordP1ui(const Context *context, GLenum type, GLuint coords);
bool ValidateTexCoordP1uiv(const Context *context, GLenum type, const GLuint *coords);
bool ValidateTexCoordP2ui(const Context *context, GLenum type, GLuint coords);
bool ValidateTexCoordP2uiv(const Context *context, GLenum type, const GLuint *coords);
bool ValidateTexCoordP3ui(const Context *context, GLenum type, GLuint coords);
bool ValidateTexCoordP3uiv(const Context *context, GLenum type, const GLuint *coords);
bool ValidateTexCoordP4ui(const Context *context, GLenum type, GLuint coords);
bool ValidateTexCoordP4uiv(const Context *context, GLenum type, const GLuint *coords);
bool ValidateVertexAttribP1ui(const Context *context,
                              GLuint index,
                              GLenum type,
                              GLboolean normalized,
                              GLuint value);
bool ValidateVertexAttribP1uiv(const Context *context,
                               GLuint index,
                               GLenum type,
                               GLboolean normalized,
                               const GLuint *value);
bool ValidateVertexAttribP2ui(const Context *context,
                              GLuint index,
                              GLenum type,
                              GLboolean normalized,
                              GLuint value);
bool ValidateVertexAttribP2uiv(const Context *context,
                               GLuint index,
                               GLenum type,
                               GLboolean normalized,
                               const GLuint *value);
bool ValidateVertexAttribP3ui(const Context *context,
                              GLuint index,
                              GLenum type,
                              GLboolean normalized,
                              GLuint value);
bool ValidateVertexAttribP3uiv(const Context *context,
                               GLuint index,
                               GLenum type,
                               GLboolean normalized,
                               const GLuint *value);
bool ValidateVertexAttribP4ui(const Context *context,
                              GLuint index,
                              GLenum type,
                              GLboolean normalized,
                              GLuint value);
bool ValidateVertexAttribP4uiv(const Context *context,
                               GLuint index,
                               GLenum type,
                               GLboolean normalized,
                               const GLuint *value);
bool ValidateVertexP2ui(const Context *context, GLenum type, GLuint value);
bool ValidateVertexP2uiv(const Context *context, GLenum type, const GLuint *value);
bool ValidateVertexP3ui(const Context *context, GLenum type, GLuint value);
bool ValidateVertexP3uiv(const Context *context, GLenum type, const GLuint *value);
bool ValidateVertexP4ui(const Context *context, GLenum type, GLuint value);
bool ValidateVertexP4uiv(const Context *context, GLenum type, const GLuint *value);
}  // namespace gl

#endif  // LIBANGLE_VALIDATION_GL33_AUTOGEN_H_
