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

#ifndef LIBANGLE_VALIDATION_GL13_AUTOGEN_H_
#define LIBANGLE_VALIDATION_GL13_AUTOGEN_H_

#include "common/PackedEnums.h"

namespace gl
{
class Context;

bool ValidateCompressedTexImage1D(const Context *context,
                                  GLenum target,
                                  GLint level,
                                  GLenum internalformat,
                                  GLsizei width,
                                  GLint border,
                                  GLsizei imageSize,
                                  const void *data);
bool ValidateCompressedTexSubImage1D(const Context *context,
                                     GLenum target,
                                     GLint level,
                                     GLint xoffset,
                                     GLsizei width,
                                     GLenum format,
                                     GLsizei imageSize,
                                     const void *data);
bool ValidateGetCompressedTexImage(const Context *context,
                                   GLenum target,
                                   GLint level,
                                   const void *img);
bool ValidateLoadTransposeMatrixd(const Context *context, const GLdouble *m);
bool ValidateLoadTransposeMatrixf(const Context *context, const GLfloat *m);
bool ValidateMultTransposeMatrixd(const Context *context, const GLdouble *m);
bool ValidateMultTransposeMatrixf(const Context *context, const GLfloat *m);
bool ValidateMultiTexCoord1d(const Context *context, GLenum target, GLdouble s);
bool ValidateMultiTexCoord1dv(const Context *context, GLenum target, const GLdouble *v);
bool ValidateMultiTexCoord1f(const Context *context, GLenum target, GLfloat s);
bool ValidateMultiTexCoord1fv(const Context *context, GLenum target, const GLfloat *v);
bool ValidateMultiTexCoord1i(const Context *context, GLenum target, GLint s);
bool ValidateMultiTexCoord1iv(const Context *context, GLenum target, const GLint *v);
bool ValidateMultiTexCoord1s(const Context *context, GLenum target, GLshort s);
bool ValidateMultiTexCoord1sv(const Context *context, GLenum target, const GLshort *v);
bool ValidateMultiTexCoord2d(const Context *context, GLenum target, GLdouble s, GLdouble t);
bool ValidateMultiTexCoord2dv(const Context *context, GLenum target, const GLdouble *v);
bool ValidateMultiTexCoord2f(const Context *context, GLenum target, GLfloat s, GLfloat t);
bool ValidateMultiTexCoord2fv(const Context *context, GLenum target, const GLfloat *v);
bool ValidateMultiTexCoord2i(const Context *context, GLenum target, GLint s, GLint t);
bool ValidateMultiTexCoord2iv(const Context *context, GLenum target, const GLint *v);
bool ValidateMultiTexCoord2s(const Context *context, GLenum target, GLshort s, GLshort t);
bool ValidateMultiTexCoord2sv(const Context *context, GLenum target, const GLshort *v);
bool ValidateMultiTexCoord3d(const Context *context,
                             GLenum target,
                             GLdouble s,
                             GLdouble t,
                             GLdouble r);
bool ValidateMultiTexCoord3dv(const Context *context, GLenum target, const GLdouble *v);
bool ValidateMultiTexCoord3f(const Context *context,
                             GLenum target,
                             GLfloat s,
                             GLfloat t,
                             GLfloat r);
bool ValidateMultiTexCoord3fv(const Context *context, GLenum target, const GLfloat *v);
bool ValidateMultiTexCoord3i(const Context *context, GLenum target, GLint s, GLint t, GLint r);
bool ValidateMultiTexCoord3iv(const Context *context, GLenum target, const GLint *v);
bool ValidateMultiTexCoord3s(const Context *context,
                             GLenum target,
                             GLshort s,
                             GLshort t,
                             GLshort r);
bool ValidateMultiTexCoord3sv(const Context *context, GLenum target, const GLshort *v);
bool ValidateMultiTexCoord4d(const Context *context,
                             GLenum target,
                             GLdouble s,
                             GLdouble t,
                             GLdouble r,
                             GLdouble q);
bool ValidateMultiTexCoord4dv(const Context *context, GLenum target, const GLdouble *v);
bool ValidateMultiTexCoord4fv(const Context *context, GLenum target, const GLfloat *v);
bool ValidateMultiTexCoord4i(const Context *context,
                             GLenum target,
                             GLint s,
                             GLint t,
                             GLint r,
                             GLint q);
bool ValidateMultiTexCoord4iv(const Context *context, GLenum target, const GLint *v);
bool ValidateMultiTexCoord4s(const Context *context,
                             GLenum target,
                             GLshort s,
                             GLshort t,
                             GLshort r,
                             GLshort q);
bool ValidateMultiTexCoord4sv(const Context *context, GLenum target, const GLshort *v);
}  // namespace gl

#endif  // LIBANGLE_VALIDATION_GL13_AUTOGEN_H_
