// 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.
//
// Context_gl_2_0_autogen.h: Creates a macro for interfaces in Context.

#ifndef ANGLE_CONTEXT_GL_2_0_AUTOGEN_H_
#define ANGLE_CONTEXT_GL_2_0_AUTOGEN_H_

#define ANGLE_GL_2_0_CONTEXT_API                                                       \
    void getVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);              \
    void vertexAttrib1d(GLuint index, GLdouble x);                                     \
    void vertexAttrib1dv(GLuint index, const GLdouble *v);                             \
    void vertexAttrib1s(GLuint index, GLshort x);                                      \
    void vertexAttrib1sv(GLuint index, const GLshort *v);                              \
    void vertexAttrib2d(GLuint index, GLdouble x, GLdouble y);                         \
    void vertexAttrib2dv(GLuint index, const GLdouble *v);                             \
    void vertexAttrib2s(GLuint index, GLshort x, GLshort y);                           \
    void vertexAttrib2sv(GLuint index, const GLshort *v);                              \
    void vertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z);             \
    void vertexAttrib3dv(GLuint index, const GLdouble *v);                             \
    void vertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z);                \
    void vertexAttrib3sv(GLuint index, const GLshort *v);                              \
    void vertexAttrib4Nbv(GLuint index, const GLbyte *v);                              \
    void vertexAttrib4Niv(GLuint index, const GLint *v);                               \
    void vertexAttrib4Nsv(GLuint index, const GLshort *v);                             \
    void vertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);   \
    void vertexAttrib4Nubv(GLuint index, const GLubyte *v);                            \
    void vertexAttrib4Nuiv(GLuint index, const GLuint *v);                             \
    void vertexAttrib4Nusv(GLuint index, const GLushort *v);                           \
    void vertexAttrib4bv(GLuint index, const GLbyte *v);                               \
    void vertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); \
    void vertexAttrib4dv(GLuint index, const GLdouble *v);                             \
    void vertexAttrib4iv(GLuint index, const GLint *v);                                \
    void vertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);     \
    void vertexAttrib4sv(GLuint index, const GLshort *v);                              \
    void vertexAttrib4ubv(GLuint index, const GLubyte *v);                             \
    void vertexAttrib4uiv(GLuint index, const GLuint *v);                              \
    void vertexAttrib4usv(GLuint index, const GLushort *v);

#endif  // ANGLE_CONTEXT_API_2_0_AUTOGEN_H_
