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

#ifndef ANGLE_CONTEXT_GLES_3_0_AUTOGEN_H_
#define ANGLE_CONTEXT_GLES_3_0_AUTOGEN_H_

#define ANGLE_GLES_3_0_CONTEXT_API                                                                 \
    void beginQuery(QueryType targetPacked, QueryID idPacked);                                     \
    void beginTransformFeedback(PrimitiveMode primitiveModePacked);                                \
    void bindBufferBase(BufferBinding targetPacked, GLuint index, BufferID bufferPacked);          \
    void bindBufferRange(BufferBinding targetPacked, GLuint index, BufferID bufferPacked,          \
                         GLintptr offset, GLsizeiptr size);                                        \
    void bindSampler(GLuint unit, SamplerID samplerPacked);                                        \
    void bindTransformFeedback(GLenum target, TransformFeedbackID idPacked);                       \
    void bindVertexArray(VertexArrayID arrayPacked);                                               \
    void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0,          \
                         GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);   \
    void clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);             \
    void clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value);                     \
    void clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value);                       \
    void clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value);                     \
    GLenum clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);                        \
    void compressedTexImage3D(TextureTarget targetPacked, GLint level, GLenum internalformat,      \
                              GLsizei width, GLsizei height, GLsizei depth, GLint border,          \
                              GLsizei imageSize, const void *data);                                \
    void compressedTexSubImage3D(TextureTarget targetPacked, GLint level, GLint xoffset,           \
                                 GLint yoffset, GLint zoffset, GLsizei width, GLsizei height,      \
                                 GLsizei depth, GLenum format, GLsizei imageSize,                  \
                                 const void *data);                                                \
    void copyBufferSubData(BufferBinding readTargetPacked, BufferBinding writeTargetPacked,        \
                           GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);            \
    void copyTexSubImage3D(TextureTarget targetPacked, GLint level, GLint xoffset, GLint yoffset,  \
                           GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);        \
    void deleteQueries(GLsizei n, const QueryID *idsPacked);                                       \
    void deleteSamplers(GLsizei count, const SamplerID *samplersPacked);                           \
    void deleteSync(GLsync sync);                                                                  \
    void deleteTransformFeedbacks(GLsizei n, const TransformFeedbackID *idsPacked);                \
    void deleteVertexArrays(GLsizei n, const VertexArrayID *arraysPacked);                         \
    void drawArraysInstanced(PrimitiveMode modePacked, GLint first, GLsizei count,                 \
                             GLsizei instancecount);                                               \
    void drawBuffers(GLsizei n, const GLenum *bufs);                                               \
    void drawElementsInstanced(PrimitiveMode modePacked, GLsizei count,                            \
                               DrawElementsType typePacked, const void *indices,                   \
                               GLsizei instancecount);                                             \
    void drawRangeElements(PrimitiveMode modePacked, GLuint start, GLuint end, GLsizei count,      \
                           DrawElementsType typePacked, const void *indices);                      \
    void endQuery(QueryType targetPacked);                                                         \
    void endTransformFeedback();                                                                   \
    GLsync fenceSync(GLenum condition, GLbitfield flags);                                          \
    void flushMappedBufferRange(BufferBinding targetPacked, GLintptr offset, GLsizeiptr length);   \
    void framebufferTextureLayer(GLenum target, GLenum attachment, TextureID texturePacked,        \
                                 GLint level, GLint layer);                                        \
    void genQueries(GLsizei n, QueryID *idsPacked);                                                \
    void genSamplers(GLsizei count, SamplerID *samplersPacked);                                    \
    void genTransformFeedbacks(GLsizei n, TransformFeedbackID *idsPacked);                         \
    void genVertexArrays(GLsizei n, VertexArrayID *arraysPacked);                                  \
    void getActiveUniformBlockName(ShaderProgramID programPacked, GLuint uniformBlockIndex,        \
                                   GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);    \
    void getActiveUniformBlockiv(ShaderProgramID programPacked, GLuint uniformBlockIndex,          \
                                 GLenum pname, GLint *params);                                     \
    void getActiveUniformsiv(ShaderProgramID programPacked, GLsizei uniformCount,                  \
                             const GLuint *uniformIndices, GLenum pname, GLint *params);           \
    void getBufferParameteri64v(BufferBinding targetPacked, GLenum pname, GLint64 *params);        \
    void getBufferPointerv(BufferBinding targetPacked, GLenum pname, void **params);               \
    GLint getFragDataLocation(ShaderProgramID programPacked, const GLchar *name);                  \
    void getInteger64i_v(GLenum target, GLuint index, GLint64 *data);                              \
    void getInteger64v(GLenum pname, GLint64 *data);                                               \
    void getIntegeri_v(GLenum target, GLuint index, GLint *data);                                  \
    void getInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize,  \
                             GLint *params);                                                       \
    void getProgramBinary(ShaderProgramID programPacked, GLsizei bufSize, GLsizei *length,         \
                          GLenum *binaryFormat, void *binary);                                     \
    void getQueryObjectuiv(QueryID idPacked, GLenum pname, GLuint *params);                        \
    void getQueryiv(QueryType targetPacked, GLenum pname, GLint *params);                          \
    void getSamplerParameterfv(SamplerID samplerPacked, GLenum pname, GLfloat *params);            \
    void getSamplerParameteriv(SamplerID samplerPacked, GLenum pname, GLint *params);              \
    const GLubyte *getStringi(GLenum name, GLuint index);                                          \
    void getSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);    \
    void getTransformFeedbackVarying(ShaderProgramID programPacked, GLuint index, GLsizei bufSize, \
                                     GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);  \
    GLuint getUniformBlockIndex(ShaderProgramID programPacked, const GLchar *uniformBlockName);    \
    void getUniformIndices(ShaderProgramID programPacked, GLsizei uniformCount,                    \
                           const GLchar *const *uniformNames, GLuint *uniformIndices);             \
    void getUniformuiv(ShaderProgramID programPacked, GLint location, GLuint *params);             \
    void getVertexAttribIiv(GLuint index, GLenum pname, GLint *params);                            \
    void getVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);                          \
    void invalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments);  \
    void invalidateSubFramebuffer(GLenum target, GLsizei numAttachments,                           \
                                  const GLenum *attachments, GLint x, GLint y, GLsizei width,      \
                                  GLsizei height);                                                 \
    GLboolean isQuery(QueryID idPacked);                                                           \
    GLboolean isSampler(SamplerID samplerPacked);                                                  \
    GLboolean isSync(GLsync sync);                                                                 \
    GLboolean isTransformFeedback(TransformFeedbackID idPacked);                                   \
    GLboolean isVertexArray(VertexArrayID arrayPacked);                                            \
    void *mapBufferRange(BufferBinding targetPacked, GLintptr offset, GLsizeiptr length,           \
                         GLbitfield access);                                                       \
    void pauseTransformFeedback();                                                                 \
    void programBinary(ShaderProgramID programPacked, GLenum binaryFormat, const void *binary,     \
                       GLsizei length);                                                            \
    void programParameteri(ShaderProgramID programPacked, GLenum pname, GLint value);              \
    void readBuffer(GLenum src);                                                                   \
    void renderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat,     \
                                        GLsizei width, GLsizei height);                            \
    void resumeTransformFeedback();                                                                \
    void samplerParameterf(SamplerID samplerPacked, GLenum pname, GLfloat param);                  \
    void samplerParameterfv(SamplerID samplerPacked, GLenum pname, const GLfloat *param);          \
    void samplerParameteri(SamplerID samplerPacked, GLenum pname, GLint param);                    \
    void samplerParameteriv(SamplerID samplerPacked, GLenum pname, const GLint *param);            \
    void texImage3D(TextureTarget targetPacked, GLint level, GLint internalformat, GLsizei width,  \
                    GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type,       \
                    const void *pixels);                                                           \
    void texStorage2D(TextureType targetPacked, GLsizei levels, GLenum internalformat,             \
                      GLsizei width, GLsizei height);                                              \
    void texStorage3D(TextureType targetPacked, GLsizei levels, GLenum internalformat,             \
                      GLsizei width, GLsizei height, GLsizei depth);                               \
    void texSubImage3D(TextureTarget targetPacked, GLint level, GLint xoffset, GLint yoffset,      \
                       GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, \
                       GLenum type, const void *pixels);                                           \
    void transformFeedbackVaryings(ShaderProgramID programPacked, GLsizei count,                   \
                                   const GLchar *const *varyings, GLenum bufferMode);              \
    void uniform1ui(GLint location, GLuint v0);                                                    \
    void uniform1uiv(GLint location, GLsizei count, const GLuint *value);                          \
    void uniform2ui(GLint location, GLuint v0, GLuint v1);                                         \
    void uniform2uiv(GLint location, GLsizei count, const GLuint *value);                          \
    void uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);                              \
    void uniform3uiv(GLint location, GLsizei count, const GLuint *value);                          \
    void uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);                   \
    void uniform4uiv(GLint location, GLsizei count, const GLuint *value);                          \
    void uniformBlockBinding(ShaderProgramID programPacked, GLuint uniformBlockIndex,              \
                             GLuint uniformBlockBinding);                                          \
    void uniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,                    \
                            const GLfloat *value);                                                 \
    void uniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,                    \
                            const GLfloat *value);                                                 \
    void uniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,                    \
                            const GLfloat *value);                                                 \
    void uniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,                    \
                            const GLfloat *value);                                                 \
    void uniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,                    \
                            const GLfloat *value);                                                 \
    void uniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,                    \
                            const GLfloat *value);                                                 \
    GLboolean unmapBuffer(BufferBinding targetPacked);                                             \
    void vertexAttribDivisor(GLuint index, GLuint divisor);                                        \
    void vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);                        \
    void vertexAttribI4iv(GLuint index, const GLint *v);                                           \
    void vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);                   \
    void vertexAttribI4uiv(GLuint index, const GLuint *v);                                         \
    void vertexAttribIPointer(GLuint index, GLint size, VertexAttribType typePacked,               \
                              GLsizei stride, const void *pointer);                                \
    void waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout);

#endif  // ANGLE_CONTEXT_API_3_0_AUTOGEN_H_
