// 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_3_2_autogen.h:
//   Defines the GL 3.2 entry points.

#ifndef LIBGL_ENTRY_POINTS_GL_3_2_AUTOGEN_H_
#define LIBGL_ENTRY_POINTS_GL_3_2_AUTOGEN_H_

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

namespace gl
{
ANGLE_EXPORT GLenum GL_APIENTRY ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
ANGLE_EXPORT void GL_APIENTRY DeleteSync(GLsync sync);
ANGLE_EXPORT void GL_APIENTRY DrawElementsBaseVertex(GLenum mode,
                                                     GLsizei count,
                                                     GLenum type,
                                                     const void *indices,
                                                     GLint basevertex);
ANGLE_EXPORT void GL_APIENTRY DrawElementsInstancedBaseVertex(GLenum mode,
                                                              GLsizei count,
                                                              GLenum type,
                                                              const void *indices,
                                                              GLsizei instancecount,
                                                              GLint basevertex);
ANGLE_EXPORT void GL_APIENTRY DrawRangeElementsBaseVertex(GLenum mode,
                                                          GLuint start,
                                                          GLuint end,
                                                          GLsizei count,
                                                          GLenum type,
                                                          const void *indices,
                                                          GLint basevertex);
ANGLE_EXPORT GLsync GL_APIENTRY FenceSync(GLenum condition, GLbitfield flags);
ANGLE_EXPORT void GL_APIENTRY FramebufferTexture(GLenum target,
                                                 GLenum attachment,
                                                 GLuint texture,
                                                 GLint level);
ANGLE_EXPORT void GL_APIENTRY GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params);
ANGLE_EXPORT void GL_APIENTRY GetInteger64i_v(GLenum target, GLuint index, GLint64 *data);
ANGLE_EXPORT void GL_APIENTRY GetInteger64v(GLenum pname, GLint64 *data);
ANGLE_EXPORT void GL_APIENTRY GetMultisamplefv(GLenum pname, GLuint index, GLfloat *val);
ANGLE_EXPORT void GL_APIENTRY
GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
ANGLE_EXPORT GLboolean GL_APIENTRY IsSync(GLsync sync);
ANGLE_EXPORT void GL_APIENTRY MultiDrawElementsBaseVertex(GLenum mode,
                                                          const GLsizei *count,
                                                          GLenum type,
                                                          const void *const *indices,
                                                          GLsizei drawcount,
                                                          const GLint *basevertex);
ANGLE_EXPORT void GL_APIENTRY ProvokingVertex(GLenum mode);
ANGLE_EXPORT void GL_APIENTRY SampleMaski(GLuint maskNumber, GLbitfield mask);
ANGLE_EXPORT void GL_APIENTRY TexImage2DMultisample(GLenum target,
                                                    GLsizei samples,
                                                    GLenum internalformat,
                                                    GLsizei width,
                                                    GLsizei height,
                                                    GLboolean fixedsamplelocations);
ANGLE_EXPORT void GL_APIENTRY TexImage3DMultisample(GLenum target,
                                                    GLsizei samples,
                                                    GLenum internalformat,
                                                    GLsizei width,
                                                    GLsizei height,
                                                    GLsizei depth,
                                                    GLboolean fixedsamplelocations);
ANGLE_EXPORT void GL_APIENTRY WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);
}  // namespace gl

#endif  // LIBGL_ENTRY_POINTS_GL_3_2_AUTOGEN_H_
