// GENERATED FILE - DO NOT EDIT.
// Generated by generate_entry_points.py using data from gl.xml.
//
// 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.
//
// entry_points_gl_4_0_autogen.h:
//   Defines the GL 4.0 entry points.

#ifndef LIBGL_ENTRY_POINTS_GL_4_0_AUTOGEN_H_
#define LIBGL_ENTRY_POINTS_GL_4_0_AUTOGEN_H_

#include <export.h>
#include "angle_gl.h"

namespace gl
{
ANGLE_EXPORT void GL_APIENTRY BeginQueryIndexed(GLenum target, GLuint index, GLuint id);
ANGLE_EXPORT void GL_APIENTRY BindTransformFeedback(GLenum target, GLuint id);
ANGLE_EXPORT void GL_APIENTRY BlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
ANGLE_EXPORT void GL_APIENTRY BlendEquationi(GLuint buf, GLenum mode);
ANGLE_EXPORT void GL_APIENTRY
BlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
ANGLE_EXPORT void GL_APIENTRY BlendFunci(GLuint buf, GLenum src, GLenum dst);
ANGLE_EXPORT void GL_APIENTRY DeleteTransformFeedbacks(GLsizei n, const GLuint *ids);
ANGLE_EXPORT void GL_APIENTRY DrawArraysIndirect(GLenum mode, const void *indirect);
ANGLE_EXPORT void GL_APIENTRY DrawElementsIndirect(GLenum mode, GLenum type, const void *indirect);
ANGLE_EXPORT void GL_APIENTRY DrawTransformFeedback(GLenum mode, GLuint id);
ANGLE_EXPORT void GL_APIENTRY DrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream);
ANGLE_EXPORT void GL_APIENTRY EndQueryIndexed(GLenum target, GLuint index);
ANGLE_EXPORT void GL_APIENTRY GenTransformFeedbacks(GLsizei n, GLuint *ids);
ANGLE_EXPORT void GL_APIENTRY GetActiveSubroutineName(GLuint program,
                                                      GLenum shadertype,
                                                      GLuint index,
                                                      GLsizei bufsize,
                                                      GLsizei *length,
                                                      GLchar *name);
ANGLE_EXPORT void GL_APIENTRY GetActiveSubroutineUniformName(GLuint program,
                                                             GLenum shadertype,
                                                             GLuint index,
                                                             GLsizei bufsize,
                                                             GLsizei *length,
                                                             GLchar *name);
ANGLE_EXPORT void GL_APIENTRY GetActiveSubroutineUniformiv(GLuint program,
                                                           GLenum shadertype,
                                                           GLuint index,
                                                           GLenum pname,
                                                           GLint *values);
ANGLE_EXPORT void GL_APIENTRY GetProgramStageiv(GLuint program,
                                                GLenum shadertype,
                                                GLenum pname,
                                                GLint *values);
ANGLE_EXPORT void GL_APIENTRY GetQueryIndexediv(GLenum target,
                                                GLuint index,
                                                GLenum pname,
                                                GLint *params);
ANGLE_EXPORT GLuint GL_APIENTRY GetSubroutineIndex(GLuint program,
                                                   GLenum shadertype,
                                                   const GLchar *name);
ANGLE_EXPORT GLint GL_APIENTRY GetSubroutineUniformLocation(GLuint program,
                                                            GLenum shadertype,
                                                            const GLchar *name);
ANGLE_EXPORT void GL_APIENTRY GetUniformSubroutineuiv(GLenum shadertype,
                                                      GLint location,
                                                      GLuint *params);
ANGLE_EXPORT void GL_APIENTRY GetUniformdv(GLuint program, GLint location, GLdouble *params);
ANGLE_EXPORT GLboolean GL_APIENTRY IsTransformFeedback(GLuint id);
ANGLE_EXPORT void GL_APIENTRY MinSampleShading(GLfloat value);
ANGLE_EXPORT void GL_APIENTRY PatchParameterfv(GLenum pname, const GLfloat *values);
ANGLE_EXPORT void GL_APIENTRY PatchParameteri(GLenum pname, GLint value);
ANGLE_EXPORT void GL_APIENTRY PauseTransformFeedback();
ANGLE_EXPORT void GL_APIENTRY ResumeTransformFeedback();
ANGLE_EXPORT void GL_APIENTRY Uniform1d(GLint location, GLdouble x);
ANGLE_EXPORT void GL_APIENTRY Uniform1dv(GLint location, GLsizei count, const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY Uniform2d(GLint location, GLdouble x, GLdouble y);
ANGLE_EXPORT void GL_APIENTRY Uniform2dv(GLint location, GLsizei count, const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY Uniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z);
ANGLE_EXPORT void GL_APIENTRY Uniform3dv(GLint location, GLsizei count, const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY
Uniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
ANGLE_EXPORT void GL_APIENTRY Uniform4dv(GLint location, GLsizei count, const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY UniformMatrix2dv(GLint location,
                                               GLsizei count,
                                               GLboolean transpose,
                                               const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY UniformMatrix2x3dv(GLint location,
                                                 GLsizei count,
                                                 GLboolean transpose,
                                                 const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY UniformMatrix2x4dv(GLint location,
                                                 GLsizei count,
                                                 GLboolean transpose,
                                                 const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY UniformMatrix3dv(GLint location,
                                               GLsizei count,
                                               GLboolean transpose,
                                               const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY UniformMatrix3x2dv(GLint location,
                                                 GLsizei count,
                                                 GLboolean transpose,
                                                 const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY UniformMatrix3x4dv(GLint location,
                                                 GLsizei count,
                                                 GLboolean transpose,
                                                 const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY UniformMatrix4dv(GLint location,
                                               GLsizei count,
                                               GLboolean transpose,
                                               const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY UniformMatrix4x2dv(GLint location,
                                                 GLsizei count,
                                                 GLboolean transpose,
                                                 const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY UniformMatrix4x3dv(GLint location,
                                                 GLsizei count,
                                                 GLboolean transpose,
                                                 const GLdouble *value);
ANGLE_EXPORT void GL_APIENTRY UniformSubroutinesuiv(GLenum shadertype,
                                                    GLsizei count,
                                                    const GLuint *indices);
}  // namespace gl

#endif  // LIBGL_ENTRY_POINTS_GL_4_0_AUTOGEN_H_
