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

#ifndef ANGLE_CONTEXT_GL_4_4_AUTOGEN_H_
#define ANGLE_CONTEXT_GL_4_4_AUTOGEN_H_

#define ANGLE_GL_4_4_CONTEXT_API                                                              \
    void bindBuffersBase(GLenum target, GLuint first, GLsizei count,                          \
                         const BufferID *buffersPacked);                                      \
    void bindBuffersRange(GLenum target, GLuint first, GLsizei count,                         \
                          const BufferID *buffersPacked, const GLintptr *offsets,             \
                          const GLsizeiptr *sizes);                                           \
    void bindImageTextures(GLuint first, GLsizei count, const GLuint *textures);              \
    void bindSamplers(GLuint first, GLsizei count, const GLuint *samplers);                   \
    void bindTextures(GLuint first, GLsizei count, const GLuint *textures);                   \
    void bindVertexBuffers(GLuint first, GLsizei count, const BufferID *buffersPacked,        \
                           const GLintptr *offsets, const GLsizei *strides);                  \
    void bufferStorage(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);   \
    void clearTexImage(TextureID texturePacked, GLint level, GLenum format, GLenum type,      \
                       const void *data);                                                     \
    void clearTexSubImage(TextureID texturePacked, GLint level, GLint xoffset, GLint yoffset, \
                          GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,        \
                          GLenum format, GLenum type, const void *data);

#endif  // ANGLE_CONTEXT_API_4_4_AUTOGEN_H_
