Bug 1472851 - Update ANGLE to mozilla/angle/firefox-63. (chromium 3440) r=jgilbert

MozReview-Commit-ID: Hm6jbnqpaTt

--HG--
extra : rebase_source : 0943bf9e0e8f4e7c92941d7b0c6a54189d33acb4
This commit is contained in:
jgilbert@mozilla.com 2018-06-29 19:13:04 -07:00
parent 02099856bd
commit 4e1ae147c5
214 changed files with 36183 additions and 8911 deletions

View file

@ -69,6 +69,7 @@
#define EGL_ANGLE_platform_angle_opengl 1
#define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x320D
#define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x320E
#define EGL_PLATFORM_ANGLE_EGL_HANDLE_ANGLE 0x3480
#endif /* EGL_ANGLE_platform_angle_opengl */
#ifndef EGL_ANGLE_platform_angle_null

View file

@ -12,6 +12,12 @@
// clang-format off
#ifndef GL_ANGLE_explicit_context_gles1
#define GL_ANGLE_explicit_context_gles1
typedef void *GLeglContext;
#include "glext_explicit_context_autogen.inc"
#endif /* GL_ANGLE_explicit_context_gles1 */
// clang-format on
#endif // INCLUDE_GLES_GLEXT_ANGLE_H_

View file

@ -0,0 +1,260 @@
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_entry_points.py using data from gl.xml and gl_angle_ext.xml.
//
// Copyright 2018 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.
//
// glext_explicit_context_autogen.inc:
// Function declarations for the EGL_ANGLE_explicit_context extension
typedef void (GL_APIENTRYP PFNGLALPHAFUNCCONTEXTANGLE)(GLeglContext ctx, GLenum func, GLfloat ref);
typedef void (GL_APIENTRYP PFNGLALPHAFUNCXCONTEXTANGLE)(GLeglContext ctx, GLenum func, GLfixed ref);
typedef void (GL_APIENTRYP PFNGLCLEARCOLORXCONTEXTANGLE)(GLeglContext ctx, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
typedef void (GL_APIENTRYP PFNGLCLEARDEPTHXCONTEXTANGLE)(GLeglContext ctx, GLfixed depth);
typedef void (GL_APIENTRYP PFNGLCLIENTACTIVETEXTURECONTEXTANGLE)(GLeglContext ctx, GLenum texture);
typedef void (GL_APIENTRYP PFNGLCLIPPLANEFCONTEXTANGLE)(GLeglContext ctx, GLenum p, const GLfloat *eqn);
typedef void (GL_APIENTRYP PFNGLCLIPPLANEXCONTEXTANGLE)(GLeglContext ctx, GLenum plane, const GLfixed *equation);
typedef void (GL_APIENTRYP PFNGLCOLOR4FCONTEXTANGLE)(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
typedef void (GL_APIENTRYP PFNGLCOLOR4UBCONTEXTANGLE)(GLeglContext ctx, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
typedef void (GL_APIENTRYP PFNGLCOLOR4XCONTEXTANGLE)(GLeglContext ctx, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
typedef void (GL_APIENTRYP PFNGLCOLORPOINTERCONTEXTANGLE)(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer);
typedef void (GL_APIENTRYP PFNGLDEPTHRANGEXCONTEXTANGLE)(GLeglContext ctx, GLfixed n, GLfixed f);
typedef void (GL_APIENTRYP PFNGLDISABLECLIENTSTATECONTEXTANGLE)(GLeglContext ctx, GLenum array);
typedef void (GL_APIENTRYP PFNGLENABLECLIENTSTATECONTEXTANGLE)(GLeglContext ctx, GLenum array);
typedef void (GL_APIENTRYP PFNGLFOGFCONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLfloat param);
typedef void (GL_APIENTRYP PFNGLFOGFVCONTEXTANGLE)(GLeglContext ctx, GLenum pname, const GLfloat *params);
typedef void (GL_APIENTRYP PFNGLFOGXCONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLfixed param);
typedef void (GL_APIENTRYP PFNGLFOGXVCONTEXTANGLE)(GLeglContext ctx, GLenum pname, const GLfixed *param);
typedef void (GL_APIENTRYP PFNGLFRUSTUMFCONTEXTANGLE)(GLeglContext ctx, GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
typedef void (GL_APIENTRYP PFNGLFRUSTUMXCONTEXTANGLE)(GLeglContext ctx, GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
typedef void (GL_APIENTRYP PFNGLGETCLIPPLANEFCONTEXTANGLE)(GLeglContext ctx, GLenum plane, GLfloat *equation);
typedef void (GL_APIENTRYP PFNGLGETCLIPPLANEXCONTEXTANGLE)(GLeglContext ctx, GLenum plane, GLfixed *equation);
typedef void (GL_APIENTRYP PFNGLGETFIXEDVCONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLfixed *params);
typedef void (GL_APIENTRYP PFNGLGETLIGHTFVCONTEXTANGLE)(GLeglContext ctx, GLenum light, GLenum pname, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETLIGHTXVCONTEXTANGLE)(GLeglContext ctx, GLenum light, GLenum pname, GLfixed *params);
typedef void (GL_APIENTRYP PFNGLGETMATERIALFVCONTEXTANGLE)(GLeglContext ctx, GLenum face, GLenum pname, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETMATERIALXVCONTEXTANGLE)(GLeglContext ctx, GLenum face, GLenum pname, GLfixed *params);
typedef void (GL_APIENTRYP PFNGLGETPOINTERVCONTEXTANGLE)(GLeglContext ctx, GLenum pname, void **params);
typedef void (GL_APIENTRYP PFNGLGETTEXENVFVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETTEXENVIVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETTEXENVXVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLfixed *params);
typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERXVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLfixed *params);
typedef void (GL_APIENTRYP PFNGLLIGHTMODELFCONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLfloat param);
typedef void (GL_APIENTRYP PFNGLLIGHTMODELFVCONTEXTANGLE)(GLeglContext ctx, GLenum pname, const GLfloat *params);
typedef void (GL_APIENTRYP PFNGLLIGHTMODELXCONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLfixed param);
typedef void (GL_APIENTRYP PFNGLLIGHTMODELXVCONTEXTANGLE)(GLeglContext ctx, GLenum pname, const GLfixed *param);
typedef void (GL_APIENTRYP PFNGLLIGHTFCONTEXTANGLE)(GLeglContext ctx, GLenum light, GLenum pname, GLfloat param);
typedef void (GL_APIENTRYP PFNGLLIGHTFVCONTEXTANGLE)(GLeglContext ctx, GLenum light, GLenum pname, const GLfloat *params);
typedef void (GL_APIENTRYP PFNGLLIGHTXCONTEXTANGLE)(GLeglContext ctx, GLenum light, GLenum pname, GLfixed param);
typedef void (GL_APIENTRYP PFNGLLIGHTXVCONTEXTANGLE)(GLeglContext ctx, GLenum light, GLenum pname, const GLfixed *params);
typedef void (GL_APIENTRYP PFNGLLINEWIDTHXCONTEXTANGLE)(GLeglContext ctx, GLfixed width);
typedef void (GL_APIENTRYP PFNGLLOADIDENTITYCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLLOADMATRIXFCONTEXTANGLE)(GLeglContext ctx, const GLfloat *m);
typedef void (GL_APIENTRYP PFNGLLOADMATRIXXCONTEXTANGLE)(GLeglContext ctx, const GLfixed *m);
typedef void (GL_APIENTRYP PFNGLLOGICOPCONTEXTANGLE)(GLeglContext ctx, GLenum opcode);
typedef void (GL_APIENTRYP PFNGLMATERIALFCONTEXTANGLE)(GLeglContext ctx, GLenum face, GLenum pname, GLfloat param);
typedef void (GL_APIENTRYP PFNGLMATERIALFVCONTEXTANGLE)(GLeglContext ctx, GLenum face, GLenum pname, const GLfloat *params);
typedef void (GL_APIENTRYP PFNGLMATERIALXCONTEXTANGLE)(GLeglContext ctx, GLenum face, GLenum pname, GLfixed param);
typedef void (GL_APIENTRYP PFNGLMATERIALXVCONTEXTANGLE)(GLeglContext ctx, GLenum face, GLenum pname, const GLfixed *param);
typedef void (GL_APIENTRYP PFNGLMATRIXMODECONTEXTANGLE)(GLeglContext ctx, GLenum mode);
typedef void (GL_APIENTRYP PFNGLMULTMATRIXFCONTEXTANGLE)(GLeglContext ctx, const GLfloat *m);
typedef void (GL_APIENTRYP PFNGLMULTMATRIXXCONTEXTANGLE)(GLeglContext ctx, const GLfixed *m);
typedef void (GL_APIENTRYP PFNGLMULTITEXCOORD4FCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
typedef void (GL_APIENTRYP PFNGLMULTITEXCOORD4XCONTEXTANGLE)(GLeglContext ctx, GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
typedef void (GL_APIENTRYP PFNGLNORMAL3FCONTEXTANGLE)(GLeglContext ctx, GLfloat nx, GLfloat ny, GLfloat nz);
typedef void (GL_APIENTRYP PFNGLNORMAL3XCONTEXTANGLE)(GLeglContext ctx, GLfixed nx, GLfixed ny, GLfixed nz);
typedef void (GL_APIENTRYP PFNGLNORMALPOINTERCONTEXTANGLE)(GLeglContext ctx, GLenum type, GLsizei stride, const void *pointer);
typedef void (GL_APIENTRYP PFNGLORTHOFCONTEXTANGLE)(GLeglContext ctx, GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
typedef void (GL_APIENTRYP PFNGLORTHOXCONTEXTANGLE)(GLeglContext ctx, GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERFCONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLfloat param);
typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERFVCONTEXTANGLE)(GLeglContext ctx, GLenum pname, const GLfloat *params);
typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERXCONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLfixed param);
typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERXVCONTEXTANGLE)(GLeglContext ctx, GLenum pname, const GLfixed *params);
typedef void (GL_APIENTRYP PFNGLPOINTSIZECONTEXTANGLE)(GLeglContext ctx, GLfloat size);
typedef void (GL_APIENTRYP PFNGLPOINTSIZEXCONTEXTANGLE)(GLeglContext ctx, GLfixed size);
typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETXCONTEXTANGLE)(GLeglContext ctx, GLfixed factor, GLfixed units);
typedef void (GL_APIENTRYP PFNGLPOPMATRIXCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLPUSHMATRIXCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLROTATEFCONTEXTANGLE)(GLeglContext ctx, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
typedef void (GL_APIENTRYP PFNGLROTATEXCONTEXTANGLE)(GLeglContext ctx, GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEXCONTEXTANGLE)(GLeglContext ctx, GLclampx value, GLboolean invert);
typedef void (GL_APIENTRYP PFNGLSCALEFCONTEXTANGLE)(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z);
typedef void (GL_APIENTRYP PFNGLSCALEXCONTEXTANGLE)(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z);
typedef void (GL_APIENTRYP PFNGLSHADEMODELCONTEXTANGLE)(GLeglContext ctx, GLenum mode);
typedef void (GL_APIENTRYP PFNGLTEXCOORDPOINTERCONTEXTANGLE)(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer);
typedef void (GL_APIENTRYP PFNGLTEXENVFCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLfloat param);
typedef void (GL_APIENTRYP PFNGLTEXENVFVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, const GLfloat *params);
typedef void (GL_APIENTRYP PFNGLTEXENVICONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLint param);
typedef void (GL_APIENTRYP PFNGLTEXENVIVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, const GLint *params);
typedef void (GL_APIENTRYP PFNGLTEXENVXCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLfixed param);
typedef void (GL_APIENTRYP PFNGLTEXENVXVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, const GLfixed *params);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERXCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLfixed param);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERXVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, const GLfixed *params);
typedef void (GL_APIENTRYP PFNGLTRANSLATEFCONTEXTANGLE)(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z);
typedef void (GL_APIENTRYP PFNGLTRANSLATEXCONTEXTANGLE)(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z);
typedef void (GL_APIENTRYP PFNGLVERTEXPOINTERCONTEXTANGLE)(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer);
typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFEROESCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint framebuffer);
typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFEROESCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint renderbuffer);
typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSOESCONTEXTANGLE)(GLeglContext ctx, GLenum target);
typedef void (GL_APIENTRYP PFNGLCURRENTPALETTEMATRIXOESCONTEXTANGLE)(GLeglContext ctx, GLuint matrixpaletteindex);
typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSOESCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *framebuffers);
typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSOESCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *renderbuffers);
typedef void (GL_APIENTRYP PFNGLDRAWTEXFOESCONTEXTANGLE)(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
typedef void (GL_APIENTRYP PFNGLDRAWTEXFVOESCONTEXTANGLE)(GLeglContext ctx, const GLfloat *coords);
typedef void (GL_APIENTRYP PFNGLDRAWTEXIOESCONTEXTANGLE)(GLeglContext ctx, GLint x, GLint y, GLint z, GLint width, GLint height);
typedef void (GL_APIENTRYP PFNGLDRAWTEXIVOESCONTEXTANGLE)(GLeglContext ctx, const GLint *coords);
typedef void (GL_APIENTRYP PFNGLDRAWTEXSOESCONTEXTANGLE)(GLeglContext ctx, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
typedef void (GL_APIENTRYP PFNGLDRAWTEXSVOESCONTEXTANGLE)(GLeglContext ctx, const GLshort *coords);
typedef void (GL_APIENTRYP PFNGLDRAWTEXXOESCONTEXTANGLE)(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
typedef void (GL_APIENTRYP PFNGLDRAWTEXXVOESCONTEXTANGLE)(GLeglContext ctx, const GLfixed *coords);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEROESCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DOESCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSOESCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *framebuffers);
typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSOESCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *renderbuffers);
typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPOESCONTEXTANGLE)(GLeglContext ctx, GLenum target);
typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVOESCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETTEXGENFVOESCONTEXTANGLE)(GLeglContext ctx, GLenum coord, GLenum pname, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETTEXGENIVOESCONTEXTANGLE)(GLeglContext ctx, GLenum coord, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETTEXGENXVOESCONTEXTANGLE)(GLeglContext ctx, GLenum coord, GLenum pname, GLfixed *params);
typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFEROESCONTEXTANGLE)(GLeglContext ctx, GLuint framebuffer);
typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFEROESCONTEXTANGLE)(GLeglContext ctx, GLuint renderbuffer);
typedef void (GL_APIENTRYP PFNGLLOADPALETTEFROMMODELVIEWMATRIXOESCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLMATRIXINDEXPOINTEROESCONTEXTANGLE)(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer);
typedef void (GL_APIENTRYP PFNGLPOINTSIZEPOINTEROESCONTEXTANGLE)(GLeglContext ctx, GLenum type, GLsizei stride, const void *pointer);
typedef GLbitfield (GL_APIENTRYP PFNGLQUERYMATRIXXOESCONTEXTANGLE)(GLeglContext ctx, GLfixed *mantissa, GLint *exponent);
typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEOESCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLTEXGENFOESCONTEXTANGLE)(GLeglContext ctx, GLenum coord, GLenum pname, GLfloat param);
typedef void (GL_APIENTRYP PFNGLTEXGENFVOESCONTEXTANGLE)(GLeglContext ctx, GLenum coord, GLenum pname, const GLfloat *params);
typedef void (GL_APIENTRYP PFNGLTEXGENIOESCONTEXTANGLE)(GLeglContext ctx, GLenum coord, GLenum pname, GLint param);
typedef void (GL_APIENTRYP PFNGLTEXGENIVOESCONTEXTANGLE)(GLeglContext ctx, GLenum coord, GLenum pname, const GLint *params);
typedef void (GL_APIENTRYP PFNGLTEXGENXOESCONTEXTANGLE)(GLeglContext ctx, GLenum coord, GLenum pname, GLfixed param);
typedef void (GL_APIENTRYP PFNGLTEXGENXVOESCONTEXTANGLE)(GLeglContext ctx, GLenum coord, GLenum pname, const GLfixed *params);
typedef void (GL_APIENTRYP PFNGLWEIGHTPOINTEROESCONTEXTANGLE)(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer);
#ifdef GL_GLEXT_PROTOTYPES
GL_API void GL_APIENTRY glAlphaFuncContextANGLE(GLeglContext ctx, GLenum func, GLfloat ref);
GL_API void GL_APIENTRY glAlphaFuncxContextANGLE(GLeglContext ctx, GLenum func, GLfixed ref);
GL_API void GL_APIENTRY glClearColorxContextANGLE(GLeglContext ctx, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
GL_API void GL_APIENTRY glClearDepthxContextANGLE(GLeglContext ctx, GLfixed depth);
GL_API void GL_APIENTRY glClientActiveTextureContextANGLE(GLeglContext ctx, GLenum texture);
GL_API void GL_APIENTRY glClipPlanefContextANGLE(GLeglContext ctx, GLenum p, const GLfloat *eqn);
GL_API void GL_APIENTRY glClipPlanexContextANGLE(GLeglContext ctx, GLenum plane, const GLfixed *equation);
GL_API void GL_APIENTRY glColor4fContextANGLE(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
GL_API void GL_APIENTRY glColor4ubContextANGLE(GLeglContext ctx, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
GL_API void GL_APIENTRY glColor4xContextANGLE(GLeglContext ctx, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
GL_API void GL_APIENTRY glColorPointerContextANGLE(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer);
GL_API void GL_APIENTRY glDepthRangexContextANGLE(GLeglContext ctx, GLfixed n, GLfixed f);
GL_API void GL_APIENTRY glDisableClientStateContextANGLE(GLeglContext ctx, GLenum array);
GL_API void GL_APIENTRY glEnableClientStateContextANGLE(GLeglContext ctx, GLenum array);
GL_API void GL_APIENTRY glFogfContextANGLE(GLeglContext ctx, GLenum pname, GLfloat param);
GL_API void GL_APIENTRY glFogfvContextANGLE(GLeglContext ctx, GLenum pname, const GLfloat *params);
GL_API void GL_APIENTRY glFogxContextANGLE(GLeglContext ctx, GLenum pname, GLfixed param);
GL_API void GL_APIENTRY glFogxvContextANGLE(GLeglContext ctx, GLenum pname, const GLfixed *param);
GL_API void GL_APIENTRY glFrustumfContextANGLE(GLeglContext ctx, GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
GL_API void GL_APIENTRY glFrustumxContextANGLE(GLeglContext ctx, GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
GL_API void GL_APIENTRY glGetClipPlanefContextANGLE(GLeglContext ctx, GLenum plane, GLfloat *equation);
GL_API void GL_APIENTRY glGetClipPlanexContextANGLE(GLeglContext ctx, GLenum plane, GLfixed *equation);
GL_API void GL_APIENTRY glGetFixedvContextANGLE(GLeglContext ctx, GLenum pname, GLfixed *params);
GL_API void GL_APIENTRY glGetLightfvContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, GLfloat *params);
GL_API void GL_APIENTRY glGetLightxvContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, GLfixed *params);
GL_API void GL_APIENTRY glGetMaterialfvContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, GLfloat *params);
GL_API void GL_APIENTRY glGetMaterialxvContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, GLfixed *params);
GL_API void GL_APIENTRY glGetPointervContextANGLE(GLeglContext ctx, GLenum pname, void **params);
GL_API void GL_APIENTRY glGetTexEnvfvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfloat *params);
GL_API void GL_APIENTRY glGetTexEnvivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
GL_API void GL_APIENTRY glGetTexEnvxvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfixed *params);
GL_API void GL_APIENTRY glGetTexParameterxvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfixed *params);
GL_API void GL_APIENTRY glLightModelfContextANGLE(GLeglContext ctx, GLenum pname, GLfloat param);
GL_API void GL_APIENTRY glLightModelfvContextANGLE(GLeglContext ctx, GLenum pname, const GLfloat *params);
GL_API void GL_APIENTRY glLightModelxContextANGLE(GLeglContext ctx, GLenum pname, GLfixed param);
GL_API void GL_APIENTRY glLightModelxvContextANGLE(GLeglContext ctx, GLenum pname, const GLfixed *param);
GL_API void GL_APIENTRY glLightfContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, GLfloat param);
GL_API void GL_APIENTRY glLightfvContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, const GLfloat *params);
GL_API void GL_APIENTRY glLightxContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, GLfixed param);
GL_API void GL_APIENTRY glLightxvContextANGLE(GLeglContext ctx, GLenum light, GLenum pname, const GLfixed *params);
GL_API void GL_APIENTRY glLineWidthxContextANGLE(GLeglContext ctx, GLfixed width);
GL_API void GL_APIENTRY glLoadIdentityContextANGLE(GLeglContext ctx);
GL_API void GL_APIENTRY glLoadMatrixfContextANGLE(GLeglContext ctx, const GLfloat *m);
GL_API void GL_APIENTRY glLoadMatrixxContextANGLE(GLeglContext ctx, const GLfixed *m);
GL_API void GL_APIENTRY glLogicOpContextANGLE(GLeglContext ctx, GLenum opcode);
GL_API void GL_APIENTRY glMaterialfContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, GLfloat param);
GL_API void GL_APIENTRY glMaterialfvContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, const GLfloat *params);
GL_API void GL_APIENTRY glMaterialxContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, GLfixed param);
GL_API void GL_APIENTRY glMaterialxvContextANGLE(GLeglContext ctx, GLenum face, GLenum pname, const GLfixed *param);
GL_API void GL_APIENTRY glMatrixModeContextANGLE(GLeglContext ctx, GLenum mode);
GL_API void GL_APIENTRY glMultMatrixfContextANGLE(GLeglContext ctx, const GLfloat *m);
GL_API void GL_APIENTRY glMultMatrixxContextANGLE(GLeglContext ctx, const GLfixed *m);
GL_API void GL_APIENTRY glMultiTexCoord4fContextANGLE(GLeglContext ctx, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
GL_API void GL_APIENTRY glMultiTexCoord4xContextANGLE(GLeglContext ctx, GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
GL_API void GL_APIENTRY glNormal3fContextANGLE(GLeglContext ctx, GLfloat nx, GLfloat ny, GLfloat nz);
GL_API void GL_APIENTRY glNormal3xContextANGLE(GLeglContext ctx, GLfixed nx, GLfixed ny, GLfixed nz);
GL_API void GL_APIENTRY glNormalPointerContextANGLE(GLeglContext ctx, GLenum type, GLsizei stride, const void *pointer);
GL_API void GL_APIENTRY glOrthofContextANGLE(GLeglContext ctx, GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
GL_API void GL_APIENTRY glOrthoxContextANGLE(GLeglContext ctx, GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
GL_API void GL_APIENTRY glPointParameterfContextANGLE(GLeglContext ctx, GLenum pname, GLfloat param);
GL_API void GL_APIENTRY glPointParameterfvContextANGLE(GLeglContext ctx, GLenum pname, const GLfloat *params);
GL_API void GL_APIENTRY glPointParameterxContextANGLE(GLeglContext ctx, GLenum pname, GLfixed param);
GL_API void GL_APIENTRY glPointParameterxvContextANGLE(GLeglContext ctx, GLenum pname, const GLfixed *params);
GL_API void GL_APIENTRY glPointSizeContextANGLE(GLeglContext ctx, GLfloat size);
GL_API void GL_APIENTRY glPointSizexContextANGLE(GLeglContext ctx, GLfixed size);
GL_API void GL_APIENTRY glPolygonOffsetxContextANGLE(GLeglContext ctx, GLfixed factor, GLfixed units);
GL_API void GL_APIENTRY glPopMatrixContextANGLE(GLeglContext ctx);
GL_API void GL_APIENTRY glPushMatrixContextANGLE(GLeglContext ctx);
GL_API void GL_APIENTRY glRotatefContextANGLE(GLeglContext ctx, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
GL_API void GL_APIENTRY glRotatexContextANGLE(GLeglContext ctx, GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
GL_API void GL_APIENTRY glSampleCoveragexContextANGLE(GLeglContext ctx, GLclampx value, GLboolean invert);
GL_API void GL_APIENTRY glScalefContextANGLE(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z);
GL_API void GL_APIENTRY glScalexContextANGLE(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z);
GL_API void GL_APIENTRY glShadeModelContextANGLE(GLeglContext ctx, GLenum mode);
GL_API void GL_APIENTRY glTexCoordPointerContextANGLE(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer);
GL_API void GL_APIENTRY glTexEnvfContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfloat param);
GL_API void GL_APIENTRY glTexEnvfvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLfloat *params);
GL_API void GL_APIENTRY glTexEnviContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint param);
GL_API void GL_APIENTRY glTexEnvivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLint *params);
GL_API void GL_APIENTRY glTexEnvxContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfixed param);
GL_API void GL_APIENTRY glTexEnvxvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLfixed *params);
GL_API void GL_APIENTRY glTexParameterxContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfixed param);
GL_API void GL_APIENTRY glTexParameterxvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLfixed *params);
GL_API void GL_APIENTRY glTranslatefContextANGLE(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z);
GL_API void GL_APIENTRY glTranslatexContextANGLE(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z);
GL_API void GL_APIENTRY glVertexPointerContextANGLE(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer);
GL_API void GL_APIENTRY glBindFramebufferOESContextANGLE(GLeglContext ctx, GLenum target, GLuint framebuffer);
GL_API void GL_APIENTRY glBindRenderbufferOESContextANGLE(GLeglContext ctx, GLenum target, GLuint renderbuffer);
GL_API GLenum GL_APIENTRY glCheckFramebufferStatusOESContextANGLE(GLeglContext ctx, GLenum target);
GL_API void GL_APIENTRY glCurrentPaletteMatrixOESContextANGLE(GLeglContext ctx, GLuint matrixpaletteindex);
GL_API void GL_APIENTRY glDeleteFramebuffersOESContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *framebuffers);
GL_API void GL_APIENTRY glDeleteRenderbuffersOESContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *renderbuffers);
GL_API void GL_APIENTRY glDrawTexfOESContextANGLE(GLeglContext ctx, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
GL_API void GL_APIENTRY glDrawTexfvOESContextANGLE(GLeglContext ctx, const GLfloat *coords);
GL_API void GL_APIENTRY glDrawTexiOESContextANGLE(GLeglContext ctx, GLint x, GLint y, GLint z, GLint width, GLint height);
GL_API void GL_APIENTRY glDrawTexivOESContextANGLE(GLeglContext ctx, const GLint *coords);
GL_API void GL_APIENTRY glDrawTexsOESContextANGLE(GLeglContext ctx, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
GL_API void GL_APIENTRY glDrawTexsvOESContextANGLE(GLeglContext ctx, const GLshort *coords);
GL_API void GL_APIENTRY glDrawTexxOESContextANGLE(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
GL_API void GL_APIENTRY glDrawTexxvOESContextANGLE(GLeglContext ctx, const GLfixed *coords);
GL_API void GL_APIENTRY glFramebufferRenderbufferOESContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
GL_API void GL_APIENTRY glFramebufferTexture2DOESContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
GL_API void GL_APIENTRY glGenFramebuffersOESContextANGLE(GLeglContext ctx, GLsizei n, GLuint *framebuffers);
GL_API void GL_APIENTRY glGenRenderbuffersOESContextANGLE(GLeglContext ctx, GLsizei n, GLuint *renderbuffers);
GL_API void GL_APIENTRY glGenerateMipmapOESContextANGLE(GLeglContext ctx, GLenum target);
GL_API void GL_APIENTRY glGetFramebufferAttachmentParameterivOESContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum pname, GLint *params);
GL_API void GL_APIENTRY glGetRenderbufferParameterivOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
GL_API void GL_APIENTRY glGetTexGenfvOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLfloat *params);
GL_API void GL_APIENTRY glGetTexGenivOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLint *params);
GL_API void GL_APIENTRY glGetTexGenxvOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLfixed *params);
GL_API GLboolean GL_APIENTRY glIsFramebufferOESContextANGLE(GLeglContext ctx, GLuint framebuffer);
GL_API GLboolean GL_APIENTRY glIsRenderbufferOESContextANGLE(GLeglContext ctx, GLuint renderbuffer);
GL_API void GL_APIENTRY glLoadPaletteFromModelViewMatrixOESContextANGLE(GLeglContext ctx);
GL_API void GL_APIENTRY glMatrixIndexPointerOESContextANGLE(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer);
GL_API void GL_APIENTRY glPointSizePointerOESContextANGLE(GLeglContext ctx, GLenum type, GLsizei stride, const void *pointer);
GL_API GLbitfield GL_APIENTRY glQueryMatrixxOESContextANGLE(GLeglContext ctx, GLfixed *mantissa, GLint *exponent);
GL_API void GL_APIENTRY glRenderbufferStorageOESContextANGLE(GLeglContext ctx, GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
GL_API void GL_APIENTRY glTexGenfOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLfloat param);
GL_API void GL_APIENTRY glTexGenfvOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, const GLfloat *params);
GL_API void GL_APIENTRY glTexGeniOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLint param);
GL_API void GL_APIENTRY glTexGenivOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, const GLint *params);
GL_API void GL_APIENTRY glTexGenxOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, GLfixed param);
GL_API void GL_APIENTRY glTexGenxvOESContextANGLE(GLeglContext ctx, GLenum coord, GLenum pname, const GLfixed *params);
GL_API void GL_APIENTRY glWeightPointerOESContextANGLE(GLeglContext ctx, GLint size, GLenum type, GLsizei stride, const void *pointer);
#endif

View file

@ -546,6 +546,14 @@ GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewSideBySideANGLE(GLenum
#define GL_SAMPLER_2D_RECT_ANGLE 0x8B63
#endif /* GL_ANGLE_texture_rectangle */
#ifndef GL_ANGLE_explicit_context
#define GL_ANGLE_explicit_context
typedef void *GLeglContext;
#include "gl2ext_explicit_context_autogen.inc"
#include "../GLES3/gl3ext_explicit_context_autogen.inc"
#include "../GLES3/gl31ext_explicit_context_autogen.inc"
#endif /* GL_ANGLE_explicit_context */
// clang-format on
#endif // INCLUDE_GLES2_GL2EXT_ANGLE_H_

View file

@ -0,0 +1,610 @@
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_entry_points.py using data from gl.xml and gl_angle_ext.xml.
//
// Copyright 2018 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.
//
// gl2ext_explicit_context_autogen.inc:
// Function declarations for the EGL_ANGLE_explicit_context extension
typedef void (GL_APIENTRYP PFNGLACTIVETEXTURECONTEXTANGLE)(GLeglContext ctx, GLenum texture);
typedef void (GL_APIENTRYP PFNGLATTACHSHADERCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLuint shader);
typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLuint index, const GLchar *name);
typedef void (GL_APIENTRYP PFNGLBINDBUFFERCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint buffer);
typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint framebuffer);
typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint renderbuffer);
typedef void (GL_APIENTRYP PFNGLBINDTEXTURECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint texture);
typedef void (GL_APIENTRYP PFNGLBLENDCOLORCONTEXTANGLE)(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONCONTEXTANGLE)(GLeglContext ctx, GLenum mode);
typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATECONTEXTANGLE)(GLeglContext ctx, GLenum modeRGB, GLenum modeAlpha);
typedef void (GL_APIENTRYP PFNGLBLENDFUNCCONTEXTANGLE)(GLeglContext ctx, GLenum sfactor, GLenum dfactor);
typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATECONTEXTANGLE)(GLeglContext ctx, GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
typedef void (GL_APIENTRYP PFNGLBUFFERDATACONTEXTANGLE)(GLeglContext ctx, GLenum target, GLsizeiptr size, const void *data, GLenum usage);
typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATACONTEXTANGLE)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSCONTEXTANGLE)(GLeglContext ctx, GLenum target);
typedef void (GL_APIENTRYP PFNGLCLEARCONTEXTANGLE)(GLeglContext ctx, GLbitfield mask);
typedef void (GL_APIENTRYP PFNGLCLEARCOLORCONTEXTANGLE)(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFCONTEXTANGLE)(GLeglContext ctx, GLfloat d);
typedef void (GL_APIENTRYP PFNGLCLEARSTENCILCONTEXTANGLE)(GLeglContext ctx, GLint s);
typedef void (GL_APIENTRYP PFNGLCOLORMASKCONTEXTANGLE)(GLeglContext ctx, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
typedef void (GL_APIENTRYP PFNGLCOMPILESHADERCONTEXTANGLE)(GLeglContext ctx, GLuint shader);
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMCONTEXTANGLE)(GLeglContext ctx);
typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERCONTEXTANGLE)(GLeglContext ctx, GLenum type);
typedef void (GL_APIENTRYP PFNGLCULLFACECONTEXTANGLE)(GLeglContext ctx, GLenum mode);
typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *buffers);
typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *framebuffers);
typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMCONTEXTANGLE)(GLeglContext ctx, GLuint program);
typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *renderbuffers);
typedef void (GL_APIENTRYP PFNGLDELETESHADERCONTEXTANGLE)(GLeglContext ctx, GLuint shader);
typedef void (GL_APIENTRYP PFNGLDELETETEXTURESCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *textures);
typedef void (GL_APIENTRYP PFNGLDEPTHFUNCCONTEXTANGLE)(GLeglContext ctx, GLenum func);
typedef void (GL_APIENTRYP PFNGLDEPTHMASKCONTEXTANGLE)(GLeglContext ctx, GLboolean flag);
typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFCONTEXTANGLE)(GLeglContext ctx, GLfloat n, GLfloat f);
typedef void (GL_APIENTRYP PFNGLDETACHSHADERCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLuint shader);
typedef void (GL_APIENTRYP PFNGLDISABLECONTEXTANGLE)(GLeglContext ctx, GLenum cap);
typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYCONTEXTANGLE)(GLeglContext ctx, GLuint index);
typedef void (GL_APIENTRYP PFNGLDRAWARRAYSCONTEXTANGLE)(GLeglContext ctx, GLenum mode, GLint first, GLsizei count);
typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSCONTEXTANGLE)(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices);
typedef void (GL_APIENTRYP PFNGLENABLECONTEXTANGLE)(GLeglContext ctx, GLenum cap);
typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYCONTEXTANGLE)(GLeglContext ctx, GLuint index);
typedef void (GL_APIENTRYP PFNGLFINISHCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLFLUSHCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
typedef void (GL_APIENTRYP PFNGLFRONTFACECONTEXTANGLE)(GLeglContext ctx, GLenum mode);
typedef void (GL_APIENTRYP PFNGLGENBUFFERSCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *buffers);
typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *framebuffers);
typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *renderbuffers);
typedef void (GL_APIENTRYP PFNGLGENTEXTURESCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *textures);
typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPCONTEXTANGLE)(GLeglContext ctx, GLenum target);
typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONCONTEXTANGLE)(GLeglContext ctx, GLuint program, const GLchar *name);
typedef void (GL_APIENTRYP PFNGLGETBOOLEANVCONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLboolean *data);
typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
typedef GLenum (GL_APIENTRYP PFNGLGETERRORCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLGETFLOATVCONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLfloat *data);
typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETINTEGERVCONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLint *data);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGCONTEXTANGLE)(GLeglContext ctx, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATCONTEXTANGLE)(GLeglContext ctx, GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCECONTEXTANGLE)(GLeglContext ctx, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
typedef void (GL_APIENTRYP PFNGLGETSHADERIVCONTEXTANGLE)(GLeglContext ctx, GLuint shader, GLenum pname, GLint *params);
typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGCONTEXTANGLE)(GLeglContext ctx, GLenum name);
typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONCONTEXTANGLE)(GLeglContext ctx, GLuint program, const GLchar *name);
typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVCONTEXTANGLE)(GLeglContext ctx, GLuint index, GLenum pname, void **pointer);
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVCONTEXTANGLE)(GLeglContext ctx, GLuint index, GLenum pname, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVCONTEXTANGLE)(GLeglContext ctx, GLuint index, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLHINTCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum mode);
typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERCONTEXTANGLE)(GLeglContext ctx, GLuint buffer);
typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDCONTEXTANGLE)(GLeglContext ctx, GLenum cap);
typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERCONTEXTANGLE)(GLeglContext ctx, GLuint framebuffer);
typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMCONTEXTANGLE)(GLeglContext ctx, GLuint program);
typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERCONTEXTANGLE)(GLeglContext ctx, GLuint renderbuffer);
typedef GLboolean (GL_APIENTRYP PFNGLISSHADERCONTEXTANGLE)(GLeglContext ctx, GLuint shader);
typedef GLboolean (GL_APIENTRYP PFNGLISTEXTURECONTEXTANGLE)(GLeglContext ctx, GLuint texture);
typedef void (GL_APIENTRYP PFNGLLINEWIDTHCONTEXTANGLE)(GLeglContext ctx, GLfloat width);
typedef void (GL_APIENTRYP PFNGLLINKPROGRAMCONTEXTANGLE)(GLeglContext ctx, GLuint program);
typedef void (GL_APIENTRYP PFNGLPIXELSTOREICONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLint param);
typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETCONTEXTANGLE)(GLeglContext ctx, GLfloat factor, GLfloat units);
typedef void (GL_APIENTRYP PFNGLREADPIXELSCONTEXTANGLE)(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGECONTEXTANGLE)(GLeglContext ctx, GLfloat value, GLboolean invert);
typedef void (GL_APIENTRYP PFNGLSCISSORCONTEXTANGLE)(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLSHADERBINARYCONTEXTANGLE)(GLeglContext ctx, GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
typedef void (GL_APIENTRYP PFNGLSHADERSOURCECONTEXTANGLE)(GLeglContext ctx, GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
typedef void (GL_APIENTRYP PFNGLSTENCILFUNCCONTEXTANGLE)(GLeglContext ctx, GLenum func, GLint ref, GLuint mask);
typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATECONTEXTANGLE)(GLeglContext ctx, GLenum face, GLenum func, GLint ref, GLuint mask);
typedef void (GL_APIENTRYP PFNGLSTENCILMASKCONTEXTANGLE)(GLeglContext ctx, GLuint mask);
typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATECONTEXTANGLE)(GLeglContext ctx, GLenum face, GLuint mask);
typedef void (GL_APIENTRYP PFNGLSTENCILOPCONTEXTANGLE)(GLeglContext ctx, GLenum fail, GLenum zfail, GLenum zpass);
typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATECONTEXTANGLE)(GLeglContext ctx, GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLfloat param);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, const GLfloat *params);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERICONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLint param);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, const GLint *params);
typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
typedef void (GL_APIENTRYP PFNGLUNIFORM1FCONTEXTANGLE)(GLeglContext ctx, GLint location, GLfloat v0);
typedef void (GL_APIENTRYP PFNGLUNIFORM1FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLUNIFORM1ICONTEXTANGLE)(GLeglContext ctx, GLint location, GLint v0);
typedef void (GL_APIENTRYP PFNGLUNIFORM1IVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, const GLint *value);
typedef void (GL_APIENTRYP PFNGLUNIFORM2FCONTEXTANGLE)(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1);
typedef void (GL_APIENTRYP PFNGLUNIFORM2FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLUNIFORM2ICONTEXTANGLE)(GLeglContext ctx, GLint location, GLint v0, GLint v1);
typedef void (GL_APIENTRYP PFNGLUNIFORM2IVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, const GLint *value);
typedef void (GL_APIENTRYP PFNGLUNIFORM3FCONTEXTANGLE)(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
typedef void (GL_APIENTRYP PFNGLUNIFORM3FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLUNIFORM3ICONTEXTANGLE)(GLeglContext ctx, GLint location, GLint v0, GLint v1, GLint v2);
typedef void (GL_APIENTRYP PFNGLUNIFORM3IVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, const GLint *value);
typedef void (GL_APIENTRYP PFNGLUNIFORM4FCONTEXTANGLE)(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
typedef void (GL_APIENTRYP PFNGLUNIFORM4FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLUNIFORM4ICONTEXTANGLE)(GLeglContext ctx, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
typedef void (GL_APIENTRYP PFNGLUNIFORM4IVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, const GLint *value);
typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLUSEPROGRAMCONTEXTANGLE)(GLeglContext ctx, GLuint program);
typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMCONTEXTANGLE)(GLeglContext ctx, GLuint program);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FCONTEXTANGLE)(GLeglContext ctx, GLuint index, GLfloat x);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVCONTEXTANGLE)(GLeglContext ctx, GLuint index, const GLfloat *v);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FCONTEXTANGLE)(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVCONTEXTANGLE)(GLeglContext ctx, GLuint index, const GLfloat *v);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FCONTEXTANGLE)(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y, GLfloat z);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVCONTEXTANGLE)(GLeglContext ctx, GLuint index, const GLfloat *v);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FCONTEXTANGLE)(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVCONTEXTANGLE)(GLeglContext ctx, GLuint index, const GLfloat *v);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERCONTEXTANGLE)(GLeglContext ctx, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
typedef void (GL_APIENTRYP PFNGLVIEWPORTCONTEXTANGLE)(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint id);
typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESCONTEXTANGLE)(GLeglContext ctx, GLuint array);
typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLECONTEXTANGLE)(GLeglContext ctx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRCONTEXTANGLE)(GLeglContext ctx, GLDEBUGPROCKHR callback, const void *userParam);
typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRCONTEXTANGLE)(GLeglContext ctx, GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRCONTEXTANGLE)(GLeglContext ctx, GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *fences);
typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *ids);
typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *arrays);
typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments);
typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLECONTEXTANGLE)(GLeglContext ctx, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXTCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLenum *bufs);
typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLECONTEXTANGLE)(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLeglImageOES image);
typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLeglImageOES image);
typedef void (GL_APIENTRYP PFNGLENDQUERYEXTCONTEXTANGLE)(GLeglContext ctx, GLenum target);
typedef void (GL_APIENTRYP PFNGLFINISHFENCENVCONTEXTANGLE)(GLeglContext ctx, GLuint fence);
typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length);
typedef void (GL_APIENTRYP PFNGLGENFENCESNVCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *fences);
typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *ids);
typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *arrays);
typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, void **params);
typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRCONTEXTANGLE)(GLeglContext ctx, GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVCONTEXTANGLE)(GLeglContext ctx, GLuint fence, GLenum pname, GLint *params);
typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRCONTEXTANGLE)(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRCONTEXTANGLE)(GLeglContext ctx, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
typedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRCONTEXTANGLE)(GLeglContext ctx, GLenum pname, void **params);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VEXTCONTEXTANGLE)(GLeglContext ctx, GLuint id, GLenum pname, GLint64 *params);
typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVEXTCONTEXTANGLE)(GLeglContext ctx, GLuint id, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTCONTEXTANGLE)(GLeglContext ctx, GLuint id, GLenum pname, GLuint64 *params);
typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTCONTEXTANGLE)(GLeglContext ctx, GLuint id, GLenum pname, GLuint *params);
typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLECONTEXTANGLE)(GLeglContext ctx, GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);
typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLint *params);
typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTCONTEXTANGLE)(GLeglContext ctx, GLsizei length, const GLchar *marker);
typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVCONTEXTANGLE)(GLeglContext ctx, GLuint fence);
typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTCONTEXTANGLE)(GLeglContext ctx, GLuint id);
typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESCONTEXTANGLE)(GLeglContext ctx, GLuint array);
typedef void *(GL_APIENTRYP PFNGLMAPBUFFEROESCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum access);
typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
typedef void (GL_APIENTRYP PFNGLOBJECTLABELKHRCONTEXTANGLE)(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELKHRCONTEXTANGLE)(GLeglContext ctx, const void *ptr, GLsizei length, const GLchar *label);
typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLenum binaryFormat, const void *binary, GLint length);
typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPKHRCONTEXTANGLE)(GLeglContext ctx, GLenum source, GLuint id, GLsizei length, const GLchar *message);
typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTCONTEXTANGLE)(GLeglContext ctx, GLsizei length, const GLchar *marker);
typedef void (GL_APIENTRYP PFNGLQUERYCOUNTEREXTCONTEXTANGLE)(GLeglContext ctx, GLuint id, GLenum target);
typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTCONTEXTANGLE)(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLSETFENCENVCONTEXTANGLE)(GLeglContext ctx, GLuint fence, GLenum condition);
typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVCONTEXTANGLE)(GLeglContext ctx, GLuint fence);
typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESCONTEXTANGLE)(GLeglContext ctx, GLenum target);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLECONTEXTANGLE)(GLeglContext ctx, GLuint index, GLuint divisor);
typedef void (GL_APIENTRYP PFNGLBINDUNIFORMLOCATIONCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, const GLchar* name);
typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLenum components);
typedef void (GL_APIENTRYP PFNGLMATRIXLOADFCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLenum matrixMode, const GLfloat * matrix);
typedef void (GL_APIENTRYP PFNGLMATRIXLOADIDENTITYCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLenum matrixMode);
typedef GLuint (GL_APIENTRYP PFNGLGENPATHSCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLsizei range);
typedef void (GL_APIENTRYP PFNGLDELETEPATHSCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint first, GLsizei range);
typedef GLboolean (GL_APIENTRYP PFNGLISPATHCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint path);
typedef void (GL_APIENTRYP PFNGLPATHCOMMANDSCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint path, GLsizei numCommands, const GLubyte * commands, GLsizei numCoords, GLenum coordType, const void* coords);
typedef void (GL_APIENTRYP PFNGLPATHPARAMETERFCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint path, GLenum pname, GLfloat value);
typedef void (GL_APIENTRYP PFNGLPATHPARAMETERICHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint path, GLenum pname, GLint value);
typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERFVCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint path, GLenum pname, GLfloat * value);
typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERIVCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint path, GLenum pname, GLint * value);
typedef void (GL_APIENTRYP PFNGLPATHSTENCILFUNCCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLenum func, GLint ref, GLuint mask);
typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint path, GLenum fillMode, GLuint mask);
typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint path, GLint reference, GLuint mask);
typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint path, GLenum coverMode);
typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint path, GLenum coverMode);
typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);
typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint path, GLint reference, GLuint mask, GLenum coverMode);
typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHINSTANCEDCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLsizei numPath, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat * transformValues);
typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLsizei numPath, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat * transformValues);
typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLsizei numPath, GLenum pathNameType, const void * paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat * transformValues);
typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat * transformValues);
typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat * transformValues);
typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat * transformValues);
typedef void (GL_APIENTRYP PFNGLBINDFRAGMENTINPUTLOCATIONCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint programs, GLint location, const GLchar * name);
typedef void (GL_APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENCHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat * coeffs);
typedef void (GL_APIENTRYP PFNGLCOPYTEXTURECHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint internalFormat, GLenum destType, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha);
typedef void (GL_APIENTRYP PFNGLCOPYSUBTEXTURECHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint xoffset, GLint yoffset, GLint x, GLint y, GLint width, GLint height, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha);
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDCOPYTEXTURECHROMIUMCONTEXTANGLE)(GLeglContext ctx, GLuint sourceId, GLuint destId);
typedef void (GL_APIENTRYP PFNGLREQUESTEXTENSIONANGLECONTEXTANGLE)(GLeglContext ctx, const GLchar * name);
typedef void (GL_APIENTRYP PFNGLGETBOOLEANVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLboolean * params);
typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETFLOATVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params);
typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum attachment, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETINTEGERVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * data);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint program, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETSHADERIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint shader, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params);
typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLfloat * params);
typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params);
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, void ** pointer);
typedef void (GL_APIENTRYP PFNGLREADPIXELSROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei * length, GLsizei * columns, GLsizei * rows, void * pixels);
typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void * pixels);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLfloat * params);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLint * params);
typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, const void * pixels);
typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void * pixels);
typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, const void * pixels);
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, GLsizei dataSize, const GLvoid * data);
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLsizei xoffset, GLsizei yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLsizei dataSize, const GLvoid * data);
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLsizei dataSize, const GLvoid * data);
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, GLsizei dataSize, const GLvoid * data);
typedef void (GL_APIENTRYP PFNGLGETQUERYIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params);
typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, void ** params);
typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint index, GLsizei bufSize, GLsizei * length, GLint * data);
typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params);
typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLuint * params);
typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETINTEGER64VROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * data);
typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint index, GLsizei bufSize, GLsizei * length, GLint64 * data);
typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * params);
typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLuint pname, GLsizei bufSize, const GLint * param);
typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, const GLfloat * param);
typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params);
typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMINTERFACEIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint program, GLenum programInterface, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETBOOLEANI_VROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint index, GLsizei bufSize, GLsizei * length, GLboolean * data);
typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLuint index, GLsizei bufSize, GLsizei * length, GLfloat * val);
typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params);
typedef void (GL_APIENTRYP PFNGLGETPOINTERVROBUSTANGLEROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, void ** params);
typedef void (GL_APIENTRYP PFNGLREADNPIXELSROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei * length, GLsizei * columns, GLsizei * rows, void * data);
typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLfloat * params);
typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLuint * params);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLint * params);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLuint * params);
typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params);
typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, const GLint * param);
typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, const GLuint * param);
typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params);
typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * params);
typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VROBUSTANGLECONTEXTANGLE)(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint64 * params);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWLAYEREDANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWSIDEBYSIDEANGLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei numViews, const GLint * viewportOffsets);
#ifdef GL_GLEXT_PROTOTYPES
GL_APICALL void GL_APIENTRY glActiveTextureContextANGLE(GLeglContext ctx, GLenum texture);
GL_APICALL void GL_APIENTRY glAttachShaderContextANGLE(GLeglContext ctx, GLuint program, GLuint shader);
GL_APICALL void GL_APIENTRY glBindAttribLocationContextANGLE(GLeglContext ctx, GLuint program, GLuint index, const GLchar *name);
GL_APICALL void GL_APIENTRY glBindBufferContextANGLE(GLeglContext ctx, GLenum target, GLuint buffer);
GL_APICALL void GL_APIENTRY glBindFramebufferContextANGLE(GLeglContext ctx, GLenum target, GLuint framebuffer);
GL_APICALL void GL_APIENTRY glBindRenderbufferContextANGLE(GLeglContext ctx, GLenum target, GLuint renderbuffer);
GL_APICALL void GL_APIENTRY glBindTextureContextANGLE(GLeglContext ctx, GLenum target, GLuint texture);
GL_APICALL void GL_APIENTRY glBlendColorContextANGLE(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
GL_APICALL void GL_APIENTRY glBlendEquationContextANGLE(GLeglContext ctx, GLenum mode);
GL_APICALL void GL_APIENTRY glBlendEquationSeparateContextANGLE(GLeglContext ctx, GLenum modeRGB, GLenum modeAlpha);
GL_APICALL void GL_APIENTRY glBlendFuncContextANGLE(GLeglContext ctx, GLenum sfactor, GLenum dfactor);
GL_APICALL void GL_APIENTRY glBlendFuncSeparateContextANGLE(GLeglContext ctx, GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
GL_APICALL void GL_APIENTRY glBufferDataContextANGLE(GLeglContext ctx, GLenum target, GLsizeiptr size, const void *data, GLenum usage);
GL_APICALL void GL_APIENTRY glBufferSubDataContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatusContextANGLE(GLeglContext ctx, GLenum target);
GL_APICALL void GL_APIENTRY glClearContextANGLE(GLeglContext ctx, GLbitfield mask);
GL_APICALL void GL_APIENTRY glClearColorContextANGLE(GLeglContext ctx, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
GL_APICALL void GL_APIENTRY glClearDepthfContextANGLE(GLeglContext ctx, GLfloat d);
GL_APICALL void GL_APIENTRY glClearStencilContextANGLE(GLeglContext ctx, GLint s);
GL_APICALL void GL_APIENTRY glColorMaskContextANGLE(GLeglContext ctx, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
GL_APICALL void GL_APIENTRY glCompileShaderContextANGLE(GLeglContext ctx, GLuint shader);
GL_APICALL void GL_APIENTRY glCompressedTexImage2DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
GL_APICALL void GL_APIENTRY glCompressedTexSubImage2DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
GL_APICALL void GL_APIENTRY glCopyTexImage2DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
GL_APICALL void GL_APIENTRY glCopyTexSubImage2DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
GL_APICALL GLuint GL_APIENTRY glCreateProgramContextANGLE(GLeglContext ctx);
GL_APICALL GLuint GL_APIENTRY glCreateShaderContextANGLE(GLeglContext ctx, GLenum type);
GL_APICALL void GL_APIENTRY glCullFaceContextANGLE(GLeglContext ctx, GLenum mode);
GL_APICALL void GL_APIENTRY glDeleteBuffersContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *buffers);
GL_APICALL void GL_APIENTRY glDeleteFramebuffersContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *framebuffers);
GL_APICALL void GL_APIENTRY glDeleteProgramContextANGLE(GLeglContext ctx, GLuint program);
GL_APICALL void GL_APIENTRY glDeleteRenderbuffersContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *renderbuffers);
GL_APICALL void GL_APIENTRY glDeleteShaderContextANGLE(GLeglContext ctx, GLuint shader);
GL_APICALL void GL_APIENTRY glDeleteTexturesContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *textures);
GL_APICALL void GL_APIENTRY glDepthFuncContextANGLE(GLeglContext ctx, GLenum func);
GL_APICALL void GL_APIENTRY glDepthMaskContextANGLE(GLeglContext ctx, GLboolean flag);
GL_APICALL void GL_APIENTRY glDepthRangefContextANGLE(GLeglContext ctx, GLfloat n, GLfloat f);
GL_APICALL void GL_APIENTRY glDetachShaderContextANGLE(GLeglContext ctx, GLuint program, GLuint shader);
GL_APICALL void GL_APIENTRY glDisableContextANGLE(GLeglContext ctx, GLenum cap);
GL_APICALL void GL_APIENTRY glDisableVertexAttribArrayContextANGLE(GLeglContext ctx, GLuint index);
GL_APICALL void GL_APIENTRY glDrawArraysContextANGLE(GLeglContext ctx, GLenum mode, GLint first, GLsizei count);
GL_APICALL void GL_APIENTRY glDrawElementsContextANGLE(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices);
GL_APICALL void GL_APIENTRY glEnableContextANGLE(GLeglContext ctx, GLenum cap);
GL_APICALL void GL_APIENTRY glEnableVertexAttribArrayContextANGLE(GLeglContext ctx, GLuint index);
GL_APICALL void GL_APIENTRY glFinishContextANGLE(GLeglContext ctx);
GL_APICALL void GL_APIENTRY glFlushContextANGLE(GLeglContext ctx);
GL_APICALL void GL_APIENTRY glFramebufferRenderbufferContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
GL_APICALL void GL_APIENTRY glFramebufferTexture2DContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
GL_APICALL void GL_APIENTRY glFrontFaceContextANGLE(GLeglContext ctx, GLenum mode);
GL_APICALL void GL_APIENTRY glGenBuffersContextANGLE(GLeglContext ctx, GLsizei n, GLuint *buffers);
GL_APICALL void GL_APIENTRY glGenFramebuffersContextANGLE(GLeglContext ctx, GLsizei n, GLuint *framebuffers);
GL_APICALL void GL_APIENTRY glGenRenderbuffersContextANGLE(GLeglContext ctx, GLsizei n, GLuint *renderbuffers);
GL_APICALL void GL_APIENTRY glGenTexturesContextANGLE(GLeglContext ctx, GLsizei n, GLuint *textures);
GL_APICALL void GL_APIENTRY glGenerateMipmapContextANGLE(GLeglContext ctx, GLenum target);
GL_APICALL void GL_APIENTRY glGetActiveAttribContextANGLE(GLeglContext ctx, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
GL_APICALL void GL_APIENTRY glGetActiveUniformContextANGLE(GLeglContext ctx, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
GL_APICALL void GL_APIENTRY glGetAttachedShadersContextANGLE(GLeglContext ctx, GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
GL_APICALL GLint GL_APIENTRY glGetAttribLocationContextANGLE(GLeglContext ctx, GLuint program, const GLchar *name);
GL_APICALL void GL_APIENTRY glGetBooleanvContextANGLE(GLeglContext ctx, GLenum pname, GLboolean *data);
GL_APICALL void GL_APIENTRY glGetBufferParameterivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
GL_APICALL GLenum GL_APIENTRY glGetErrorContextANGLE(GLeglContext ctx);
GL_APICALL void GL_APIENTRY glGetFloatvContextANGLE(GLeglContext ctx, GLenum pname, GLfloat *data);
GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameterivContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetIntegervContextANGLE(GLeglContext ctx, GLenum pname, GLint *data);
GL_APICALL void GL_APIENTRY glGetProgramInfoLogContextANGLE(GLeglContext ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
GL_APICALL void GL_APIENTRY glGetProgramivContextANGLE(GLeglContext ctx, GLuint program, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetRenderbufferParameterivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetShaderInfoLogContextANGLE(GLeglContext ctx, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormatContextANGLE(GLeglContext ctx, GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
GL_APICALL void GL_APIENTRY glGetShaderSourceContextANGLE(GLeglContext ctx, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
GL_APICALL void GL_APIENTRY glGetShaderivContextANGLE(GLeglContext ctx, GLuint shader, GLenum pname, GLint *params);
GL_APICALL const GLubyte *GL_APIENTRY glGetStringContextANGLE(GLeglContext ctx, GLenum name);
GL_APICALL void GL_APIENTRY glGetTexParameterfvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfloat *params);
GL_APICALL void GL_APIENTRY glGetTexParameterivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
GL_APICALL GLint GL_APIENTRY glGetUniformLocationContextANGLE(GLeglContext ctx, GLuint program, const GLchar *name);
GL_APICALL void GL_APIENTRY glGetUniformfvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLfloat *params);
GL_APICALL void GL_APIENTRY glGetUniformivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLint *params);
GL_APICALL void GL_APIENTRY glGetVertexAttribPointervContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, void **pointer);
GL_APICALL void GL_APIENTRY glGetVertexAttribfvContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLfloat *params);
GL_APICALL void GL_APIENTRY glGetVertexAttribivContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glHintContextANGLE(GLeglContext ctx, GLenum target, GLenum mode);
GL_APICALL GLboolean GL_APIENTRY glIsBufferContextANGLE(GLeglContext ctx, GLuint buffer);
GL_APICALL GLboolean GL_APIENTRY glIsEnabledContextANGLE(GLeglContext ctx, GLenum cap);
GL_APICALL GLboolean GL_APIENTRY glIsFramebufferContextANGLE(GLeglContext ctx, GLuint framebuffer);
GL_APICALL GLboolean GL_APIENTRY glIsProgramContextANGLE(GLeglContext ctx, GLuint program);
GL_APICALL GLboolean GL_APIENTRY glIsRenderbufferContextANGLE(GLeglContext ctx, GLuint renderbuffer);
GL_APICALL GLboolean GL_APIENTRY glIsShaderContextANGLE(GLeglContext ctx, GLuint shader);
GL_APICALL GLboolean GL_APIENTRY glIsTextureContextANGLE(GLeglContext ctx, GLuint texture);
GL_APICALL void GL_APIENTRY glLineWidthContextANGLE(GLeglContext ctx, GLfloat width);
GL_APICALL void GL_APIENTRY glLinkProgramContextANGLE(GLeglContext ctx, GLuint program);
GL_APICALL void GL_APIENTRY glPixelStoreiContextANGLE(GLeglContext ctx, GLenum pname, GLint param);
GL_APICALL void GL_APIENTRY glPolygonOffsetContextANGLE(GLeglContext ctx, GLfloat factor, GLfloat units);
GL_APICALL void GL_APIENTRY glReadPixelsContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
GL_APICALL void GL_APIENTRY glReleaseShaderCompilerContextANGLE(GLeglContext ctx);
GL_APICALL void GL_APIENTRY glRenderbufferStorageContextANGLE(GLeglContext ctx, GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
GL_APICALL void GL_APIENTRY glSampleCoverageContextANGLE(GLeglContext ctx, GLfloat value, GLboolean invert);
GL_APICALL void GL_APIENTRY glScissorContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height);
GL_APICALL void GL_APIENTRY glShaderBinaryContextANGLE(GLeglContext ctx, GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
GL_APICALL void GL_APIENTRY glShaderSourceContextANGLE(GLeglContext ctx, GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
GL_APICALL void GL_APIENTRY glStencilFuncContextANGLE(GLeglContext ctx, GLenum func, GLint ref, GLuint mask);
GL_APICALL void GL_APIENTRY glStencilFuncSeparateContextANGLE(GLeglContext ctx, GLenum face, GLenum func, GLint ref, GLuint mask);
GL_APICALL void GL_APIENTRY glStencilMaskContextANGLE(GLeglContext ctx, GLuint mask);
GL_APICALL void GL_APIENTRY glStencilMaskSeparateContextANGLE(GLeglContext ctx, GLenum face, GLuint mask);
GL_APICALL void GL_APIENTRY glStencilOpContextANGLE(GLeglContext ctx, GLenum fail, GLenum zfail, GLenum zpass);
GL_APICALL void GL_APIENTRY glStencilOpSeparateContextANGLE(GLeglContext ctx, GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
GL_APICALL void GL_APIENTRY glTexImage2DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
GL_APICALL void GL_APIENTRY glTexParameterfContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLfloat param);
GL_APICALL void GL_APIENTRY glTexParameterfvContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLfloat *params);
GL_APICALL void GL_APIENTRY glTexParameteriContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint param);
GL_APICALL void GL_APIENTRY glTexParameterivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLint *params);
GL_APICALL void GL_APIENTRY glTexSubImage2DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
GL_APICALL void GL_APIENTRY glUniform1fContextANGLE(GLeglContext ctx, GLint location, GLfloat v0);
GL_APICALL void GL_APIENTRY glUniform1fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value);
GL_APICALL void GL_APIENTRY glUniform1iContextANGLE(GLeglContext ctx, GLint location, GLint v0);
GL_APICALL void GL_APIENTRY glUniform1ivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLint *value);
GL_APICALL void GL_APIENTRY glUniform2fContextANGLE(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1);
GL_APICALL void GL_APIENTRY glUniform2fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value);
GL_APICALL void GL_APIENTRY glUniform2iContextANGLE(GLeglContext ctx, GLint location, GLint v0, GLint v1);
GL_APICALL void GL_APIENTRY glUniform2ivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLint *value);
GL_APICALL void GL_APIENTRY glUniform3fContextANGLE(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
GL_APICALL void GL_APIENTRY glUniform3fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value);
GL_APICALL void GL_APIENTRY glUniform3iContextANGLE(GLeglContext ctx, GLint location, GLint v0, GLint v1, GLint v2);
GL_APICALL void GL_APIENTRY glUniform3ivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLint *value);
GL_APICALL void GL_APIENTRY glUniform4fContextANGLE(GLeglContext ctx, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
GL_APICALL void GL_APIENTRY glUniform4fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLfloat *value);
GL_APICALL void GL_APIENTRY glUniform4iContextANGLE(GLeglContext ctx, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
GL_APICALL void GL_APIENTRY glUniform4ivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLint *value);
GL_APICALL void GL_APIENTRY glUniformMatrix2fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glUniformMatrix3fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glUniformMatrix4fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glUseProgramContextANGLE(GLeglContext ctx, GLuint program);
GL_APICALL void GL_APIENTRY glValidateProgramContextANGLE(GLeglContext ctx, GLuint program);
GL_APICALL void GL_APIENTRY glVertexAttrib1fContextANGLE(GLeglContext ctx, GLuint index, GLfloat x);
GL_APICALL void GL_APIENTRY glVertexAttrib1fvContextANGLE(GLeglContext ctx, GLuint index, const GLfloat *v);
GL_APICALL void GL_APIENTRY glVertexAttrib2fContextANGLE(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y);
GL_APICALL void GL_APIENTRY glVertexAttrib2fvContextANGLE(GLeglContext ctx, GLuint index, const GLfloat *v);
GL_APICALL void GL_APIENTRY glVertexAttrib3fContextANGLE(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y, GLfloat z);
GL_APICALL void GL_APIENTRY glVertexAttrib3fvContextANGLE(GLeglContext ctx, GLuint index, const GLfloat *v);
GL_APICALL void GL_APIENTRY glVertexAttrib4fContextANGLE(GLeglContext ctx, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
GL_APICALL void GL_APIENTRY glVertexAttrib4fvContextANGLE(GLeglContext ctx, GLuint index, const GLfloat *v);
GL_APICALL void GL_APIENTRY glVertexAttribPointerContextANGLE(GLeglContext ctx, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
GL_APICALL void GL_APIENTRY glViewportContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height);
GL_APICALL void GL_APIENTRY glBeginQueryEXTContextANGLE(GLeglContext ctx, GLenum target, GLuint id);
GL_APICALL void GL_APIENTRY glBindVertexArrayOESContextANGLE(GLeglContext ctx, GLuint array);
GL_APICALL void GL_APIENTRY glBlitFramebufferANGLEContextANGLE(GLeglContext ctx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
GL_APICALL void GL_APIENTRY glDebugMessageCallbackKHRContextANGLE(GLeglContext ctx, GLDEBUGPROCKHR callback, const void *userParam);
GL_APICALL void GL_APIENTRY glDebugMessageControlKHRContextANGLE(GLeglContext ctx, GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
GL_APICALL void GL_APIENTRY glDebugMessageInsertKHRContextANGLE(GLeglContext ctx, GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
GL_APICALL void GL_APIENTRY glDeleteFencesNVContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *fences);
GL_APICALL void GL_APIENTRY glDeleteQueriesEXTContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *ids);
GL_APICALL void GL_APIENTRY glDeleteVertexArraysOESContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *arrays);
GL_APICALL void GL_APIENTRY glDiscardFramebufferEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments);
GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLEContextANGLE(GLeglContext ctx, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
GL_APICALL void GL_APIENTRY glDrawBuffersEXTContextANGLE(GLeglContext ctx, GLsizei n, const GLenum *bufs);
GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLEContextANGLE(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOESContextANGLE(GLeglContext ctx, GLenum target, GLeglImageOES image);
GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOESContextANGLE(GLeglContext ctx, GLenum target, GLeglImageOES image);
GL_APICALL void GL_APIENTRY glEndQueryEXTContextANGLE(GLeglContext ctx, GLenum target);
GL_APICALL void GL_APIENTRY glFinishFenceNVContextANGLE(GLeglContext ctx, GLuint fence);
GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXTContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length);
GL_APICALL void GL_APIENTRY glGenFencesNVContextANGLE(GLeglContext ctx, GLsizei n, GLuint *fences);
GL_APICALL void GL_APIENTRY glGenQueriesEXTContextANGLE(GLeglContext ctx, GLsizei n, GLuint *ids);
GL_APICALL void GL_APIENTRY glGenVertexArraysOESContextANGLE(GLeglContext ctx, GLsizei n, GLuint *arrays);
GL_APICALL void GL_APIENTRY glGetBufferPointervOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, void **params);
GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLogKHRContextANGLE(GLeglContext ctx, GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
GL_APICALL void GL_APIENTRY glGetFenceivNVContextANGLE(GLeglContext ctx, GLuint fence, GLenum pname, GLint *params);
GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXTContextANGLE(GLeglContext ctx);
GL_APICALL void GL_APIENTRY glGetObjectLabelKHRContextANGLE(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
GL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHRContextANGLE(GLeglContext ctx, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
GL_APICALL void GL_APIENTRY glGetPointervKHRContextANGLE(GLeglContext ctx, GLenum pname, void **params);
GL_APICALL void GL_APIENTRY glGetProgramBinaryOESContextANGLE(GLeglContext ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
GL_APICALL void GL_APIENTRY glGetQueryObjecti64vEXTContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLint64 *params);
GL_APICALL void GL_APIENTRY glGetQueryObjectivEXTContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetQueryObjectui64vEXTContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLuint64 *params);
GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXTContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLuint *params);
GL_APICALL void GL_APIENTRY glGetQueryivEXTContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLEContextANGLE(GLeglContext ctx, GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);
GL_APICALL void GL_APIENTRY glGetnUniformfvEXTContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
GL_APICALL void GL_APIENTRY glGetnUniformivEXTContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLint *params);
GL_APICALL void GL_APIENTRY glInsertEventMarkerEXTContextANGLE(GLeglContext ctx, GLsizei length, const GLchar *marker);
GL_APICALL GLboolean GL_APIENTRY glIsFenceNVContextANGLE(GLeglContext ctx, GLuint fence);
GL_APICALL GLboolean GL_APIENTRY glIsQueryEXTContextANGLE(GLeglContext ctx, GLuint id);
GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOESContextANGLE(GLeglContext ctx, GLuint array);
GL_APICALL void *GL_APIENTRY glMapBufferOESContextANGLE(GLeglContext ctx, GLenum target, GLenum access);
GL_APICALL void *GL_APIENTRY glMapBufferRangeEXTContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
GL_APICALL void GL_APIENTRY glObjectLabelKHRContextANGLE(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
GL_APICALL void GL_APIENTRY glObjectPtrLabelKHRContextANGLE(GLeglContext ctx, const void *ptr, GLsizei length, const GLchar *label);
GL_APICALL void GL_APIENTRY glPopDebugGroupKHRContextANGLE(GLeglContext ctx);
GL_APICALL void GL_APIENTRY glPopGroupMarkerEXTContextANGLE(GLeglContext ctx);
GL_APICALL void GL_APIENTRY glProgramBinaryOESContextANGLE(GLeglContext ctx, GLuint program, GLenum binaryFormat, const void *binary, GLint length);
GL_APICALL void GL_APIENTRY glPushDebugGroupKHRContextANGLE(GLeglContext ctx, GLenum source, GLuint id, GLsizei length, const GLchar *message);
GL_APICALL void GL_APIENTRY glPushGroupMarkerEXTContextANGLE(GLeglContext ctx, GLsizei length, const GLchar *marker);
GL_APICALL void GL_APIENTRY glQueryCounterEXTContextANGLE(GLeglContext ctx, GLuint id, GLenum target);
GL_APICALL void GL_APIENTRY glReadnPixelsEXTContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLEContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
GL_APICALL void GL_APIENTRY glSetFenceNVContextANGLE(GLeglContext ctx, GLuint fence, GLenum condition);
GL_APICALL GLboolean GL_APIENTRY glTestFenceNVContextANGLE(GLeglContext ctx, GLuint fence);
GL_APICALL void GL_APIENTRY glTexStorage1DEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
GL_APICALL void GL_APIENTRY glTexStorage2DEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
GL_APICALL void GL_APIENTRY glTexStorage3DEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOESContextANGLE(GLeglContext ctx, GLenum target);
GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLEContextANGLE(GLeglContext ctx, GLuint index, GLuint divisor);
GL_APICALL void GL_APIENTRY glBindUniformLocationCHROMIUMContextANGLE(GLeglContext ctx, GLuint program, GLint location, const GLchar* name);
GL_APICALL void GL_APIENTRY glCoverageModulationCHROMIUMContextANGLE(GLeglContext ctx, GLenum components);
GL_APICALL void GL_APIENTRY glMatrixLoadfCHROMIUMContextANGLE(GLeglContext ctx, GLenum matrixMode, const GLfloat * matrix);
GL_APICALL void GL_APIENTRY glMatrixLoadIdentityCHROMIUMContextANGLE(GLeglContext ctx, GLenum matrixMode);
GL_APICALL GLuint GL_APIENTRY glGenPathsCHROMIUMContextANGLE(GLeglContext ctx, GLsizei range);
GL_APICALL void GL_APIENTRY glDeletePathsCHROMIUMContextANGLE(GLeglContext ctx, GLuint first, GLsizei range);
GL_APICALL GLboolean GL_APIENTRY glIsPathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path);
GL_APICALL void GL_APIENTRY glPathCommandsCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLsizei numCommands, const GLubyte * commands, GLsizei numCoords, GLenum coordType, const void* coords);
GL_APICALL void GL_APIENTRY glPathParameterfCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum pname, GLfloat value);
GL_APICALL void GL_APIENTRY glPathParameteriCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum pname, GLint value);
GL_APICALL void GL_APIENTRY glGetPathParameterfvCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum pname, GLfloat * value);
GL_APICALL void GL_APIENTRY glGetPathParameterivCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum pname, GLint * value);
GL_APICALL void GL_APIENTRY glPathStencilFuncCHROMIUMContextANGLE(GLeglContext ctx, GLenum func, GLint ref, GLuint mask);
GL_APICALL void GL_APIENTRY glStencilFillPathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum fillMode, GLuint mask);
GL_APICALL void GL_APIENTRY glStencilStrokePathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLint reference, GLuint mask);
GL_APICALL void GL_APIENTRY glCoverFillPathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum coverMode);
GL_APICALL void GL_APIENTRY glCoverStrokePathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum coverMode);
GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);
GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathCHROMIUMContextANGLE(GLeglContext ctx, GLuint path, GLint reference, GLuint mask, GLenum coverMode);
GL_APICALL void GL_APIENTRY glCoverFillPathInstancedCHROMIUMContextANGLE(GLeglContext ctx, GLsizei numPath, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat * transformValues);
GL_APICALL void GL_APIENTRY glCoverStrokePathInstancedCHROMIUMContextANGLE(GLeglContext ctx, GLsizei numPath, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat * transformValues);
GL_APICALL void GL_APIENTRY glStencilStrokePathInstancedCHROMIUMContextANGLE(GLeglContext ctx, GLsizei numPath, GLenum pathNameType, const void * paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat * transformValues);
GL_APICALL void GL_APIENTRY glStencilFillPathInstancedCHROMIUMContextANGLE(GLeglContext ctx, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat * transformValues);
GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathInstancedCHROMIUMContextANGLE(GLeglContext ctx, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat * transformValues);
GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathInstancedCHROMIUMContextANGLE(GLeglContext ctx, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat * transformValues);
GL_APICALL void GL_APIENTRY glBindFragmentInputLocationCHROMIUMContextANGLE(GLeglContext ctx, GLuint programs, GLint location, const GLchar * name);
GL_APICALL void GL_APIENTRY glProgramPathFragmentInputGenCHROMIUMContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat * coeffs);
GL_APICALL void GL_APIENTRY glCopyTextureCHROMIUMContextANGLE(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint internalFormat, GLenum destType, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha);
GL_APICALL void GL_APIENTRY glCopySubTextureCHROMIUMContextANGLE(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint xoffset, GLint yoffset, GLint x, GLint y, GLint width, GLint height, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha);
GL_APICALL void GL_APIENTRY glCompressedCopyTextureCHROMIUMContextANGLE(GLeglContext ctx, GLuint sourceId, GLuint destId);
GL_APICALL void GL_APIENTRY glRequestExtensionANGLEContextANGLE(GLeglContext ctx, const GLchar * name);
GL_APICALL void GL_APIENTRY glGetBooleanvRobustANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLboolean * params);
GL_APICALL void GL_APIENTRY glGetBufferParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetFloatvRobustANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params);
GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetIntegervRobustANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * data);
GL_APICALL void GL_APIENTRY glGetProgramivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetRenderbufferParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetShaderivRobustANGLEContextANGLE(GLeglContext ctx, GLuint shader, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetTexParameterfvRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params);
GL_APICALL void GL_APIENTRY glGetTexParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetUniformfvRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLfloat * params);
GL_APICALL void GL_APIENTRY glGetUniformivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetVertexAttribfvRobustANGLEContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params);
GL_APICALL void GL_APIENTRY glGetVertexAttribivRobustANGLEContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetVertexAttribPointervRobustANGLEContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, void ** pointer);
GL_APICALL void GL_APIENTRY glReadPixelsRobustANGLEContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei * length, GLsizei * columns, GLsizei * rows, void * pixels);
GL_APICALL void GL_APIENTRY glTexImage2DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void * pixels);
GL_APICALL void GL_APIENTRY glTexParameterfvRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLfloat * params);
GL_APICALL void GL_APIENTRY glTexParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLint * params);
GL_APICALL void GL_APIENTRY glTexSubImage2DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, const void * pixels);
GL_APICALL void GL_APIENTRY glTexImage3DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void * pixels);
GL_APICALL void GL_APIENTRY glTexSubImage3DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, const void * pixels);
GL_APICALL void GL_APIENTRY glCompressedTexImage2DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, GLsizei dataSize, const GLvoid * data);
GL_APICALL void GL_APIENTRY glCompressedTexSubImage2DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLsizei xoffset, GLsizei yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLsizei dataSize, const GLvoid * data);
GL_APICALL void GL_APIENTRY glCompressedTexImage3DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLsizei dataSize, const GLvoid * data);
GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, GLsizei dataSize, const GLvoid * data);
GL_APICALL void GL_APIENTRY glGetQueryivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetQueryObjectuivRobustANGLEContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params);
GL_APICALL void GL_APIENTRY glGetBufferPointervRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, void ** params);
GL_APICALL void GL_APIENTRY glGetIntegeri_vRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLsizei bufSize, GLsizei * length, GLint * data);
GL_APICALL void GL_APIENTRY glGetInternalformativRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetVertexAttribIivRobustANGLEContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetVertexAttribIuivRobustANGLEContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params);
GL_APICALL void GL_APIENTRY glGetUniformuivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLuint * params);
GL_APICALL void GL_APIENTRY glGetActiveUniformBlockivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetInteger64vRobustANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * data);
GL_APICALL void GL_APIENTRY glGetInteger64i_vRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLsizei bufSize, GLsizei * length, GLint64 * data);
GL_APICALL void GL_APIENTRY glGetBufferParameteri64vRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * params);
GL_APICALL void GL_APIENTRY glSamplerParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLuint pname, GLsizei bufSize, const GLint * param);
GL_APICALL void GL_APIENTRY glSamplerParameterfvRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, const GLfloat * param);
GL_APICALL void GL_APIENTRY glGetSamplerParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetSamplerParameterfvRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params);
GL_APICALL void GL_APIENTRY glGetFramebufferParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetProgramInterfaceivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetBooleani_vRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLsizei bufSize, GLsizei * length, GLboolean * data);
GL_APICALL void GL_APIENTRY glGetMultisamplefvRobustANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLuint index, GLsizei bufSize, GLsizei * length, GLfloat * val);
GL_APICALL void GL_APIENTRY glGetTexLevelParameterivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetTexLevelParameterfvRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei * length, GLfloat * params);
GL_APICALL void GL_APIENTRY glGetPointervRobustANGLERobustANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLsizei bufSize, GLsizei * length, void ** params);
GL_APICALL void GL_APIENTRY glReadnPixelsRobustANGLEContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei * length, GLsizei * columns, GLsizei * rows, void * data);
GL_APICALL void GL_APIENTRY glGetnUniformfvRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLfloat * params);
GL_APICALL void GL_APIENTRY glGetnUniformivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetnUniformuivRobustANGLEContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLsizei * length, GLuint * params);
GL_APICALL void GL_APIENTRY glTexParameterIivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLint * params);
GL_APICALL void GL_APIENTRY glTexParameterIuivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, const GLuint * params);
GL_APICALL void GL_APIENTRY glGetTexParameterIivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetTexParameterIuivRobustANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params);
GL_APICALL void GL_APIENTRY glSamplerParameterIivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, const GLint * param);
GL_APICALL void GL_APIENTRY glSamplerParameterIuivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, const GLuint * param);
GL_APICALL void GL_APIENTRY glGetSamplerParameterIivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivRobustANGLEContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint * params);
GL_APICALL void GL_APIENTRY glGetQueryObjectivRobustANGLEContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetQueryObjecti64vRobustANGLEContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * params);
GL_APICALL void GL_APIENTRY glGetQueryObjectui64vRobustANGLEContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint64 * params);
GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewLayeredANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewSideBySideANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei numViews, const GLint * viewportOffsets);
#endif

View file

@ -0,0 +1,148 @@
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_entry_points.py using data from gl.xml and gl_angle_ext.xml.
//
// Copyright 2018 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.
//
// gl31ext_explicit_context_autogen.inc:
// Function declarations for the EGL_ANGLE_explicit_context extension
typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMCONTEXTANGLE)(GLeglContext ctx, GLuint pipeline, GLuint program);
typedef void (GL_APIENTRYP PFNGLBINDIMAGETEXTURECONTEXTANGLE)(GLeglContext ctx, GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINECONTEXTANGLE)(GLeglContext ctx, GLuint pipeline);
typedef void (GL_APIENTRYP PFNGLBINDVERTEXBUFFERCONTEXTANGLE)(GLeglContext ctx, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVCONTEXTANGLE)(GLeglContext ctx, GLenum type, GLsizei count, const GLchar *const*strings);
typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *pipelines);
typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTECONTEXTANGLE)(GLeglContext ctx, GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTCONTEXTANGLE)(GLeglContext ctx, GLintptr indirect);
typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINDIRECTCONTEXTANGLE)(GLeglContext ctx, GLenum mode, const void *indirect);
typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINDIRECTCONTEXTANGLE)(GLeglContext ctx, GLenum mode, GLenum type, const void *indirect);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPARAMETERICONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLint param);
typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *pipelines);
typedef void (GL_APIENTRYP PFNGLGETBOOLEANI_VCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint index, GLboolean *data);
typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVCONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLuint index, GLfloat *val);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMINTERFACEIVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLenum programInterface, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGCONTEXTANGLE)(GLeglContext ctx, GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVCONTEXTANGLE)(GLeglContext ctx, GLuint pipeline, GLenum pname, GLint *params);
typedef GLuint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLenum programInterface, const GLchar *name);
typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLenum programInterface, const GLchar *name);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCENAMECONTEXTANGLE)(GLeglContext ctx, GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEIVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLint *params);
typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINECONTEXTANGLE)(GLeglContext ctx, GLuint pipeline);
typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERCONTEXTANGLE)(GLeglContext ctx, GLbitfield barriers);
typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERBYREGIONCONTEXTANGLE)(GLeglContext ctx, GLbitfield barriers);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLfloat v0);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1ICONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLint v0);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UICONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLuint v0);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLfloat v0, GLfloat v1);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2ICONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UICONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLuint v0, GLuint v1);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3ICONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UICONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4ICONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UICONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLSAMPLEMASKICONTEXTANGLE)(GLeglContext ctx, GLuint maskNumber, GLbitfield mask);
typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESCONTEXTANGLE)(GLeglContext ctx, GLuint pipeline, GLbitfield stages, GLuint program);
typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINECONTEXTANGLE)(GLeglContext ctx, GLuint pipeline);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBBINDINGCONTEXTANGLE)(GLeglContext ctx, GLuint attribindex, GLuint bindingindex);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBFORMATCONTEXTANGLE)(GLeglContext ctx, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIFORMATCONTEXTANGLE)(GLeglContext ctx, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
typedef void (GL_APIENTRYP PFNGLVERTEXBINDINGDIVISORCONTEXTANGLE)(GLeglContext ctx, GLuint bindingindex, GLuint divisor);
#ifdef GL_GLEXT_PROTOTYPES
GL_APICALL void GL_APIENTRY glActiveShaderProgramContextANGLE(GLeglContext ctx, GLuint pipeline, GLuint program);
GL_APICALL void GL_APIENTRY glBindImageTextureContextANGLE(GLeglContext ctx, GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
GL_APICALL void GL_APIENTRY glBindProgramPipelineContextANGLE(GLeglContext ctx, GLuint pipeline);
GL_APICALL void GL_APIENTRY glBindVertexBufferContextANGLE(GLeglContext ctx, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvContextANGLE(GLeglContext ctx, GLenum type, GLsizei count, const GLchar *const*strings);
GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *pipelines);
GL_APICALL void GL_APIENTRY glDispatchComputeContextANGLE(GLeglContext ctx, GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
GL_APICALL void GL_APIENTRY glDispatchComputeIndirectContextANGLE(GLeglContext ctx, GLintptr indirect);
GL_APICALL void GL_APIENTRY glDrawArraysIndirectContextANGLE(GLeglContext ctx, GLenum mode, const void *indirect);
GL_APICALL void GL_APIENTRY glDrawElementsIndirectContextANGLE(GLeglContext ctx, GLenum mode, GLenum type, const void *indirect);
GL_APICALL void GL_APIENTRY glFramebufferParameteriContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint param);
GL_APICALL void GL_APIENTRY glGenProgramPipelinesContextANGLE(GLeglContext ctx, GLsizei n, GLuint *pipelines);
GL_APICALL void GL_APIENTRY glGetBooleani_vContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLboolean *data);
GL_APICALL void GL_APIENTRY glGetFramebufferParameterivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetMultisamplefvContextANGLE(GLeglContext ctx, GLenum pname, GLuint index, GLfloat *val);
GL_APICALL void GL_APIENTRY glGetProgramInterfaceivContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogContextANGLE(GLeglContext ctx, GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
GL_APICALL void GL_APIENTRY glGetProgramPipelineivContextANGLE(GLeglContext ctx, GLuint pipeline, GLenum pname, GLint *params);
GL_APICALL GLuint GL_APIENTRY glGetProgramResourceIndexContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, const GLchar *name);
GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocationContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, const GLchar *name);
GL_APICALL void GL_APIENTRY glGetProgramResourceNameContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
GL_APICALL void GL_APIENTRY glGetProgramResourceivContextANGLE(GLeglContext ctx, GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
GL_APICALL void GL_APIENTRY glGetTexLevelParameterfvContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLfloat *params);
GL_APICALL void GL_APIENTRY glGetTexLevelParameterivContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum pname, GLint *params);
GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineContextANGLE(GLeglContext ctx, GLuint pipeline);
GL_APICALL void GL_APIENTRY glMemoryBarrierContextANGLE(GLeglContext ctx, GLbitfield barriers);
GL_APICALL void GL_APIENTRY glMemoryBarrierByRegionContextANGLE(GLeglContext ctx, GLbitfield barriers);
GL_APICALL void GL_APIENTRY glProgramUniform1fContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLfloat v0);
GL_APICALL void GL_APIENTRY glProgramUniform1fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value);
GL_APICALL void GL_APIENTRY glProgramUniform1iContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLint v0);
GL_APICALL void GL_APIENTRY glProgramUniform1ivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value);
GL_APICALL void GL_APIENTRY glProgramUniform1uiContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLuint v0);
GL_APICALL void GL_APIENTRY glProgramUniform1uivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value);
GL_APICALL void GL_APIENTRY glProgramUniform2fContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLfloat v0, GLfloat v1);
GL_APICALL void GL_APIENTRY glProgramUniform2fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value);
GL_APICALL void GL_APIENTRY glProgramUniform2iContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1);
GL_APICALL void GL_APIENTRY glProgramUniform2ivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value);
GL_APICALL void GL_APIENTRY glProgramUniform2uiContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLuint v0, GLuint v1);
GL_APICALL void GL_APIENTRY glProgramUniform2uivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value);
GL_APICALL void GL_APIENTRY glProgramUniform3fContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
GL_APICALL void GL_APIENTRY glProgramUniform3fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value);
GL_APICALL void GL_APIENTRY glProgramUniform3iContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
GL_APICALL void GL_APIENTRY glProgramUniform3ivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value);
GL_APICALL void GL_APIENTRY glProgramUniform3uiContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
GL_APICALL void GL_APIENTRY glProgramUniform3uivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value);
GL_APICALL void GL_APIENTRY glProgramUniform4fContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
GL_APICALL void GL_APIENTRY glProgramUniform4fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLfloat *value);
GL_APICALL void GL_APIENTRY glProgramUniform4iContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
GL_APICALL void GL_APIENTRY glProgramUniform4ivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLint *value);
GL_APICALL void GL_APIENTRY glProgramUniform4uiContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
GL_APICALL void GL_APIENTRY glProgramUniform4uivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, const GLuint *value);
GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fvContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glSampleMaskiContextANGLE(GLeglContext ctx, GLuint maskNumber, GLbitfield mask);
GL_APICALL void GL_APIENTRY glTexStorage2DMultisampleContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
GL_APICALL void GL_APIENTRY glUseProgramStagesContextANGLE(GLeglContext ctx, GLuint pipeline, GLbitfield stages, GLuint program);
GL_APICALL void GL_APIENTRY glValidateProgramPipelineContextANGLE(GLeglContext ctx, GLuint pipeline);
GL_APICALL void GL_APIENTRY glVertexAttribBindingContextANGLE(GLeglContext ctx, GLuint attribindex, GLuint bindingindex);
GL_APICALL void GL_APIENTRY glVertexAttribFormatContextANGLE(GLeglContext ctx, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
GL_APICALL void GL_APIENTRY glVertexAttribIFormatContextANGLE(GLeglContext ctx, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
GL_APICALL void GL_APIENTRY glVertexBindingDivisorContextANGLE(GLeglContext ctx, GLuint bindingindex, GLuint divisor);
#endif

View file

@ -0,0 +1,220 @@
// GENERATED FILE - DO NOT EDIT.
// Generated by generate_entry_points.py using data from gl.xml and gl_angle_ext.xml.
//
// Copyright 2018 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.
//
// gl3ext_explicit_context_autogen.inc:
// Function declarations for the EGL_ANGLE_explicit_context extension
typedef void (GL_APIENTRYP PFNGLBEGINQUERYCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint id);
typedef void (GL_APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKCONTEXTANGLE)(GLeglContext ctx, GLenum primitiveMode);
typedef void (GL_APIENTRYP PFNGLBINDBUFFERBASECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint index, GLuint buffer);
typedef void (GL_APIENTRYP PFNGLBINDBUFFERRANGECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
typedef void (GL_APIENTRYP PFNGLBINDSAMPLERCONTEXTANGLE)(GLeglContext ctx, GLuint unit, GLuint sampler);
typedef void (GL_APIENTRYP PFNGLBINDTRANSFORMFEEDBACKCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint id);
typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYCONTEXTANGLE)(GLeglContext ctx, GLuint array);
typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERCONTEXTANGLE)(GLeglContext ctx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFICONTEXTANGLE)(GLeglContext ctx, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFVCONTEXTANGLE)(GLeglContext ctx, GLenum buffer, GLint drawbuffer, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLCLEARBUFFERIVCONTEXTANGLE)(GLeglContext ctx, GLenum buffer, GLint drawbuffer, const GLint *value);
typedef void (GL_APIENTRYP PFNGLCLEARBUFFERUIVCONTEXTANGLE)(GLeglContext ctx, GLenum buffer, GLint drawbuffer, const GLuint *value);
typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCCONTEXTANGLE)(GLeglContext ctx, GLsync sync, GLbitfield flags, GLuint64 timeout);
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATACONTEXTANGLE)(GLeglContext ctx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLDELETEQUERIESCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *ids);
typedef void (GL_APIENTRYP PFNGLDELETESAMPLERSCONTEXTANGLE)(GLeglContext ctx, GLsizei count, const GLuint *samplers);
typedef void (GL_APIENTRYP PFNGLDELETESYNCCONTEXTANGLE)(GLeglContext ctx, GLsync sync);
typedef void (GL_APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *ids);
typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLuint *arrays);
typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDCONTEXTANGLE)(GLeglContext ctx, GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSCONTEXTANGLE)(GLeglContext ctx, GLsizei n, const GLenum *bufs);
typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDCONTEXTANGLE)(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSCONTEXTANGLE)(GLeglContext ctx, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
typedef void (GL_APIENTRYP PFNGLENDQUERYCONTEXTANGLE)(GLeglContext ctx, GLenum target);
typedef void (GL_APIENTRYP PFNGLENDTRANSFORMFEEDBACKCONTEXTANGLE)(GLeglContext ctx);
typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCCONTEXTANGLE)(GLeglContext ctx, GLenum condition, GLbitfield flags);
typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
typedef void (GL_APIENTRYP PFNGLGENQUERIESCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *ids);
typedef void (GL_APIENTRYP PFNGLGENSAMPLERSCONTEXTANGLE)(GLeglContext ctx, GLsizei count, GLuint *samplers);
typedef void (GL_APIENTRYP PFNGLGENTRANSFORMFEEDBACKSCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *ids);
typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSCONTEXTANGLE)(GLeglContext ctx, GLsizei n, GLuint *arrays);
typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMECONTEXTANGLE)(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMSIVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLint64 *params);
typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, void **params);
typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATALOCATIONCONTEXTANGLE)(GLeglContext ctx, GLuint program, const GLchar *name);
typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint index, GLint64 *data);
typedef void (GL_APIENTRYP PFNGLGETINTEGER64VCONTEXTANGLE)(GLeglContext ctx, GLenum pname, GLint64 *data);
typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLuint index, GLint *data);
typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVCONTEXTANGLE)(GLeglContext ctx, GLuint id, GLenum pname, GLuint *params);
typedef void (GL_APIENTRYP PFNGLGETQUERYIVCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVCONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVCONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, GLint *params);
typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGICONTEXTANGLE)(GLeglContext ctx, GLenum name, GLuint index);
typedef void (GL_APIENTRYP PFNGLGETSYNCIVCONTEXTANGLE)(GLeglContext ctx, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
typedef void (GL_APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
typedef GLuint (GL_APIENTRYP PFNGLGETUNIFORMBLOCKINDEXCONTEXTANGLE)(GLeglContext ctx, GLuint program, const GLchar *uniformBlockName);
typedef void (GL_APIENTRYP PFNGLGETUNIFORMINDICESCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLint location, GLuint *params);
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVCONTEXTANGLE)(GLeglContext ctx, GLuint index, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVCONTEXTANGLE)(GLeglContext ctx, GLuint index, GLenum pname, GLuint *params);
typedef void (GL_APIENTRYP PFNGLINVALIDATEFRAMEBUFFERCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments);
typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
typedef GLboolean (GL_APIENTRYP PFNGLISQUERYCONTEXTANGLE)(GLeglContext ctx, GLuint id);
typedef GLboolean (GL_APIENTRYP PFNGLISSAMPLERCONTEXTANGLE)(GLeglContext ctx, GLuint sampler);
typedef GLboolean (GL_APIENTRYP PFNGLISSYNCCONTEXTANGLE)(GLeglContext ctx, GLsync sync);
typedef GLboolean (GL_APIENTRYP PFNGLISTRANSFORMFEEDBACKCONTEXTANGLE)(GLeglContext ctx, GLuint id);
typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYCONTEXTANGLE)(GLeglContext ctx, GLuint array);
typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
typedef void (GL_APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERICONTEXTANGLE)(GLeglContext ctx, GLuint program, GLenum pname, GLint value);
typedef void (GL_APIENTRYP PFNGLREADBUFFERCONTEXTANGLE)(GLeglContext ctx, GLenum src);
typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECONTEXTANGLE)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKCONTEXTANGLE)(GLeglContext ctx);
typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFCONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, GLfloat param);
typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVCONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, const GLfloat *param);
typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERICONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, GLint param);
typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVCONTEXTANGLE)(GLeglContext ctx, GLuint sampler, GLenum pname, const GLint *param);
typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DCONTEXTANGLE)(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
typedef void (GL_APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
typedef void (GL_APIENTRYP PFNGLUNIFORM1UICONTEXTANGLE)(GLeglContext ctx, GLint location, GLuint v0);
typedef void (GL_APIENTRYP PFNGLUNIFORM1UIVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value);
typedef void (GL_APIENTRYP PFNGLUNIFORM2UICONTEXTANGLE)(GLeglContext ctx, GLint location, GLuint v0, GLuint v1);
typedef void (GL_APIENTRYP PFNGLUNIFORM2UIVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value);
typedef void (GL_APIENTRYP PFNGLUNIFORM3UICONTEXTANGLE)(GLeglContext ctx, GLint location, GLuint v0, GLuint v1, GLuint v2);
typedef void (GL_APIENTRYP PFNGLUNIFORM3UIVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value);
typedef void (GL_APIENTRYP PFNGLUNIFORM4UICONTEXTANGLE)(GLeglContext ctx, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
typedef void (GL_APIENTRYP PFNGLUNIFORM4UIVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value);
typedef void (GL_APIENTRYP PFNGLUNIFORMBLOCKBINDINGCONTEXTANGLE)(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVCONTEXTANGLE)(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFERCONTEXTANGLE)(GLeglContext ctx, GLenum target);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORCONTEXTANGLE)(GLeglContext ctx, GLuint index, GLuint divisor);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4ICONTEXTANGLE)(GLeglContext ctx, GLuint index, GLint x, GLint y, GLint z, GLint w);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IVCONTEXTANGLE)(GLeglContext ctx, GLuint index, const GLint *v);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UICONTEXTANGLE)(GLeglContext ctx, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIVCONTEXTANGLE)(GLeglContext ctx, GLuint index, const GLuint *v);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIPOINTERCONTEXTANGLE)(GLeglContext ctx, GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
typedef void (GL_APIENTRYP PFNGLWAITSYNCCONTEXTANGLE)(GLeglContext ctx, GLsync sync, GLbitfield flags, GLuint64 timeout);
#ifdef GL_GLEXT_PROTOTYPES
GL_APICALL void GL_APIENTRY glBeginQueryContextANGLE(GLeglContext ctx, GLenum target, GLuint id);
GL_APICALL void GL_APIENTRY glBeginTransformFeedbackContextANGLE(GLeglContext ctx, GLenum primitiveMode);
GL_APICALL void GL_APIENTRY glBindBufferBaseContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLuint buffer);
GL_APICALL void GL_APIENTRY glBindBufferRangeContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
GL_APICALL void GL_APIENTRY glBindSamplerContextANGLE(GLeglContext ctx, GLuint unit, GLuint sampler);
GL_APICALL void GL_APIENTRY glBindTransformFeedbackContextANGLE(GLeglContext ctx, GLenum target, GLuint id);
GL_APICALL void GL_APIENTRY glBindVertexArrayContextANGLE(GLeglContext ctx, GLuint array);
GL_APICALL void GL_APIENTRY glBlitFramebufferContextANGLE(GLeglContext ctx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
GL_APICALL void GL_APIENTRY glClearBufferfiContextANGLE(GLeglContext ctx, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
GL_APICALL void GL_APIENTRY glClearBufferfvContextANGLE(GLeglContext ctx, GLenum buffer, GLint drawbuffer, const GLfloat *value);
GL_APICALL void GL_APIENTRY glClearBufferivContextANGLE(GLeglContext ctx, GLenum buffer, GLint drawbuffer, const GLint *value);
GL_APICALL void GL_APIENTRY glClearBufferuivContextANGLE(GLeglContext ctx, GLenum buffer, GLint drawbuffer, const GLuint *value);
GL_APICALL GLenum GL_APIENTRY glClientWaitSyncContextANGLE(GLeglContext ctx, GLsync sync, GLbitfield flags, GLuint64 timeout);
GL_APICALL void GL_APIENTRY glCompressedTexImage3DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
GL_APICALL void GL_APIENTRY glCopyBufferSubDataContextANGLE(GLeglContext ctx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
GL_APICALL void GL_APIENTRY glCopyTexSubImage3DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
GL_APICALL void GL_APIENTRY glDeleteQueriesContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *ids);
GL_APICALL void GL_APIENTRY glDeleteSamplersContextANGLE(GLeglContext ctx, GLsizei count, const GLuint *samplers);
GL_APICALL void GL_APIENTRY glDeleteSyncContextANGLE(GLeglContext ctx, GLsync sync);
GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacksContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *ids);
GL_APICALL void GL_APIENTRY glDeleteVertexArraysContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *arrays);
GL_APICALL void GL_APIENTRY glDrawArraysInstancedContextANGLE(GLeglContext ctx, GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
GL_APICALL void GL_APIENTRY glDrawBuffersContextANGLE(GLeglContext ctx, GLsizei n, const GLenum *bufs);
GL_APICALL void GL_APIENTRY glDrawElementsInstancedContextANGLE(GLeglContext ctx, GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
GL_APICALL void GL_APIENTRY glDrawRangeElementsContextANGLE(GLeglContext ctx, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
GL_APICALL void GL_APIENTRY glEndQueryContextANGLE(GLeglContext ctx, GLenum target);
GL_APICALL void GL_APIENTRY glEndTransformFeedbackContextANGLE(GLeglContext ctx);
GL_APICALL GLsync GL_APIENTRY glFenceSyncContextANGLE(GLeglContext ctx, GLenum condition, GLbitfield flags);
GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length);
GL_APICALL void GL_APIENTRY glFramebufferTextureLayerContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
GL_APICALL void GL_APIENTRY glGenQueriesContextANGLE(GLeglContext ctx, GLsizei n, GLuint *ids);
GL_APICALL void GL_APIENTRY glGenSamplersContextANGLE(GLeglContext ctx, GLsizei count, GLuint *samplers);
GL_APICALL void GL_APIENTRY glGenTransformFeedbacksContextANGLE(GLeglContext ctx, GLsizei n, GLuint *ids);
GL_APICALL void GL_APIENTRY glGenVertexArraysContextANGLE(GLeglContext ctx, GLsizei n, GLuint *arrays);
GL_APICALL void GL_APIENTRY glGetActiveUniformBlockNameContextANGLE(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
GL_APICALL void GL_APIENTRY glGetActiveUniformBlockivContextANGLE(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetActiveUniformsivContextANGLE(GLeglContext ctx, GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetBufferParameteri64vContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint64 *params);
GL_APICALL void GL_APIENTRY glGetBufferPointervContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, void **params);
GL_APICALL GLint GL_APIENTRY glGetFragDataLocationContextANGLE(GLeglContext ctx, GLuint program, const GLchar *name);
GL_APICALL void GL_APIENTRY glGetInteger64i_vContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLint64 *data);
GL_APICALL void GL_APIENTRY glGetInteger64vContextANGLE(GLeglContext ctx, GLenum pname, GLint64 *data);
GL_APICALL void GL_APIENTRY glGetIntegeri_vContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLint *data);
GL_APICALL void GL_APIENTRY glGetInternalformativContextANGLE(GLeglContext ctx, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
GL_APICALL void GL_APIENTRY glGetProgramBinaryContextANGLE(GLeglContext ctx, GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
GL_APICALL void GL_APIENTRY glGetQueryObjectuivContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLuint *params);
GL_APICALL void GL_APIENTRY glGetQueryivContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetSamplerParameterfvContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLfloat *params);
GL_APICALL void GL_APIENTRY glGetSamplerParameterivContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLint *params);
GL_APICALL const GLubyte *GL_APIENTRY glGetStringiContextANGLE(GLeglContext ctx, GLenum name, GLuint index);
GL_APICALL void GL_APIENTRY glGetSyncivContextANGLE(GLeglContext ctx, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
GL_APICALL void GL_APIENTRY glGetTransformFeedbackVaryingContextANGLE(GLeglContext ctx, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndexContextANGLE(GLeglContext ctx, GLuint program, const GLchar *uniformBlockName);
GL_APICALL void GL_APIENTRY glGetUniformIndicesContextANGLE(GLeglContext ctx, GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
GL_APICALL void GL_APIENTRY glGetUniformuivContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLuint *params);
GL_APICALL void GL_APIENTRY glGetVertexAttribIivContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetVertexAttribIuivContextANGLE(GLeglContext ctx, GLuint index, GLenum pname, GLuint *params);
GL_APICALL void GL_APIENTRY glInvalidateFramebufferContextANGLE(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments);
GL_APICALL void GL_APIENTRY glInvalidateSubFramebufferContextANGLE(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
GL_APICALL GLboolean GL_APIENTRY glIsQueryContextANGLE(GLeglContext ctx, GLuint id);
GL_APICALL GLboolean GL_APIENTRY glIsSamplerContextANGLE(GLeglContext ctx, GLuint sampler);
GL_APICALL GLboolean GL_APIENTRY glIsSyncContextANGLE(GLeglContext ctx, GLsync sync);
GL_APICALL GLboolean GL_APIENTRY glIsTransformFeedbackContextANGLE(GLeglContext ctx, GLuint id);
GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayContextANGLE(GLeglContext ctx, GLuint array);
GL_APICALL void *GL_APIENTRY glMapBufferRangeContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
GL_APICALL void GL_APIENTRY glPauseTransformFeedbackContextANGLE(GLeglContext ctx);
GL_APICALL void GL_APIENTRY glProgramBinaryContextANGLE(GLeglContext ctx, GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
GL_APICALL void GL_APIENTRY glProgramParameteriContextANGLE(GLeglContext ctx, GLuint program, GLenum pname, GLint value);
GL_APICALL void GL_APIENTRY glReadBufferContextANGLE(GLeglContext ctx, GLenum src);
GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
GL_APICALL void GL_APIENTRY glResumeTransformFeedbackContextANGLE(GLeglContext ctx);
GL_APICALL void GL_APIENTRY glSamplerParameterfContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLfloat param);
GL_APICALL void GL_APIENTRY glSamplerParameterfvContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, const GLfloat *param);
GL_APICALL void GL_APIENTRY glSamplerParameteriContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLint param);
GL_APICALL void GL_APIENTRY glSamplerParameterivContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, const GLint *param);
GL_APICALL void GL_APIENTRY glTexImage3DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
GL_APICALL void GL_APIENTRY glTexStorage2DContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
GL_APICALL void GL_APIENTRY glTexStorage3DContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
GL_APICALL void GL_APIENTRY glTexSubImage3DContextANGLE(GLeglContext ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
GL_APICALL void GL_APIENTRY glTransformFeedbackVaryingsContextANGLE(GLeglContext ctx, GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
GL_APICALL void GL_APIENTRY glUniform1uiContextANGLE(GLeglContext ctx, GLint location, GLuint v0);
GL_APICALL void GL_APIENTRY glUniform1uivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value);
GL_APICALL void GL_APIENTRY glUniform2uiContextANGLE(GLeglContext ctx, GLint location, GLuint v0, GLuint v1);
GL_APICALL void GL_APIENTRY glUniform2uivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value);
GL_APICALL void GL_APIENTRY glUniform3uiContextANGLE(GLeglContext ctx, GLint location, GLuint v0, GLuint v1, GLuint v2);
GL_APICALL void GL_APIENTRY glUniform3uivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value);
GL_APICALL void GL_APIENTRY glUniform4uiContextANGLE(GLeglContext ctx, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
GL_APICALL void GL_APIENTRY glUniform4uivContextANGLE(GLeglContext ctx, GLint location, GLsizei count, const GLuint *value);
GL_APICALL void GL_APIENTRY glUniformBlockBindingContextANGLE(GLeglContext ctx, GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
GL_APICALL void GL_APIENTRY glUniformMatrix2x3fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glUniformMatrix2x4fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glUniformMatrix3x2fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glUniformMatrix3x4fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glUniformMatrix4x2fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL void GL_APIENTRY glUniformMatrix4x3fvContextANGLE(GLeglContext ctx, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
GL_APICALL GLboolean GL_APIENTRY glUnmapBufferContextANGLE(GLeglContext ctx, GLenum target);
GL_APICALL void GL_APIENTRY glVertexAttribDivisorContextANGLE(GLeglContext ctx, GLuint index, GLuint divisor);
GL_APICALL void GL_APIENTRY glVertexAttribI4iContextANGLE(GLeglContext ctx, GLuint index, GLint x, GLint y, GLint z, GLint w);
GL_APICALL void GL_APIENTRY glVertexAttribI4ivContextANGLE(GLeglContext ctx, GLuint index, const GLint *v);
GL_APICALL void GL_APIENTRY glVertexAttribI4uiContextANGLE(GLeglContext ctx, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
GL_APICALL void GL_APIENTRY glVertexAttribI4uivContextANGLE(GLeglContext ctx, GLuint index, const GLuint *v);
GL_APICALL void GL_APIENTRY glVertexAttribIPointerContextANGLE(GLeglContext ctx, GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
GL_APICALL void GL_APIENTRY glWaitSyncContextANGLE(GLeglContext ctx, GLsync sync, GLbitfield flags, GLuint64 timeout);
#endif

View file

@ -261,6 +261,10 @@ const ShCompileOptions SH_SKIP_D3D_CONSTANT_REGISTER_ZERO = UINT64_C(1) << 37;
// Clamp gl_FragDepth to the range [0.0, 1.0] in case it is statically used.
const ShCompileOptions SH_CLAMP_FRAG_DEPTH = UINT64_C(1) << 38;
// Rewrite expressions like "v.x = z = expression;". Works around a bug in NVIDIA OpenGL drivers
// prior to version 397.31.
const ShCompileOptions SH_REWRITE_REPEATED_ASSIGN_TO_SWIZZLED = UINT64_C(1) << 39;
// Defines alternate strategies for implementing array index clamping.
enum ShArrayIndexClampingStrategy
{

View file

@ -1,3 +1,3 @@
#define ANGLE_COMMIT_HASH "595ccab4acc3"
#define ANGLE_COMMIT_HASH "fc96a1a98357"
#define ANGLE_COMMIT_HASH_SIZE 12
#define ANGLE_COMMIT_DATE "2018-06-01 17:26:22 -0700"
#define ANGLE_COMMIT_DATE "2018-06-29 19:06:56 -0700"

View file

@ -45,7 +45,7 @@ bool ShouldCreateLogMessage(LogSeverity severity)
#if defined(ANGLE_TRACE_ENABLED)
return true;
#elif defined(ANGLE_ENABLE_ASSERTS)
return severity == LOG_ERR;
return severity != LOG_EVENT;
#else
return false;
#endif
@ -65,6 +65,9 @@ bool ShouldCreatePlatformLogMessage(LogSeverity severity)
#endif
}
// This is never instantiated, it's just used for EAT_STREAM_PARAMETERS to an object of the correct
// type on the LHS of the unused part of the ternary operator.
std::ostream *gSwallowStream;
} // namespace priv
bool DebugAnnotationsActive()
@ -213,18 +216,15 @@ std::string LogMessage::getMessage() const
}
#if defined(ANGLE_PLATFORM_WINDOWS)
std::ostream &operator<<(std::ostream &os, const FmtHR &fmt)
priv::FmtHexHelper<HRESULT> FmtHR(HRESULT value)
{
os << "HRESULT: ";
return FmtHexInt(os, fmt.mHR);
return priv::FmtHexHelper<HRESULT>("HRESULT: ", value);
}
std::ostream &operator<<(std::ostream &os, const FmtErr &fmt)
priv::FmtHexHelper<DWORD> FmtErr(DWORD value)
{
os << "error: ";
return FmtHexInt(os, fmt.mErr);
return priv::FmtHexHelper<DWORD>("error: ", value);
}
#endif // defined(ANGLE_PLATFORM_WINDOWS)
} // namespace gl

View file

@ -4,7 +4,8 @@
// found in the LICENSE file.
//
// debug.h: Debugging utilities.
// debug.h: Debugging utilities. A lot of the logging code is adapted from Chromium's
// base/logging.h.
#ifndef COMMON_DEBUG_H_
#define COMMON_DEBUG_H_
@ -104,6 +105,8 @@ class LogMessageVoidify
void operator&(std::ostream &) {}
};
extern std::ostream *gSwallowStream;
// Used by ANGLE_LOG_IS_ON to lazy-evaluate stream arguments.
bool ShouldCreatePlatformLogMessage(LogSeverity severity);
@ -124,39 +127,52 @@ std::ostream &FmtHex(std::ostream &os, T value)
return os;
}
} // namespace priv
#if defined(ANGLE_PLATFORM_WINDOWS)
class FmtHR
{
public:
explicit FmtHR(HRESULT hresult) : mHR(hresult) {}
private:
HRESULT mHR;
friend std::ostream &operator<<(std::ostream &os, const FmtHR &fmt);
};
class FmtErr
{
public:
explicit FmtErr(DWORD err) : mErr(err) {}
private:
DWORD mErr;
friend std::ostream &operator<<(std::ostream &os, const FmtErr &fmt);
};
#endif // defined(ANGLE_PLATFORM_WINDOWS)
template <typename T>
std::ostream &FmtHexShort(std::ostream &os, T value)
std::ostream &FmtHexAutoSized(std::ostream &os, T value)
{
return priv::FmtHex<4>(os, value);
constexpr int N = sizeof(T) * 2;
return priv::FmtHex<N>(os, value);
}
template <typename T>
std::ostream &FmtHexInt(std::ostream &os, T value)
class FmtHexHelper
{
return priv::FmtHex<8>(os, value);
public:
FmtHexHelper(const char *prefix, T value) : mPrefix(prefix), mValue(value) {}
explicit FmtHexHelper(T value) : mPrefix(nullptr), mValue(value) {}
private:
const char *mPrefix;
T mValue;
friend std::ostream &operator<<(std::ostream &os, const FmtHexHelper &fmt)
{
if (fmt.mPrefix)
{
os << fmt.mPrefix;
}
return FmtHexAutoSized(os, fmt.mValue);
}
};
} // namespace priv
template <typename T>
priv::FmtHexHelper<T> FmtHex(T value)
{
return priv::FmtHexHelper<T>(value);
}
#if defined(ANGLE_PLATFORM_WINDOWS)
priv::FmtHexHelper<HRESULT> FmtHR(HRESULT value);
priv::FmtHexHelper<DWORD> FmtErr(DWORD value);
#endif // defined(ANGLE_PLATFORM_WINDOWS)
template <typename T>
std::ostream &FmtHex(std::ostream &os, T value)
{
return priv::FmtHexAutoSized(os, value);
}
// A few definitions of macros that don't generate much code. These are used
@ -232,6 +248,18 @@ std::ostream &FmtHexInt(std::ostream &os, T value)
#define ANGLE_ASSERT_IMPL_IS_NORETURN 1
#endif // !defined(NDEBUG)
// Note that gSwallowStream is used instead of an arbitrary LOG() stream to avoid the creation of an
// object with a non-trivial destructor (LogMessage). On MSVC x86 (checked on 2015 Update 3), this
// causes a few additional pointless instructions to be emitted even at full optimization level,
// even though the : arm of the ternary operator is clearly never executed. Using a simpler object
// to be &'d with Voidify() avoids these extra instructions. Using a simpler POD object with a
// templated operator<< also works to avoid these instructions. However, this causes warnings on
// statically defined implementations of operator<<(std::ostream, ...) in some .cpp files, because
// they become defined-but-unreferenced functions. A reinterpret_cast of 0 to an ostream* also is
// not suitable, because some compilers warn of undefined behavior.
#define ANGLE_EAT_STREAM_PARAMETERS \
true ? static_cast<void>(0) : ::gl::priv::LogMessageVoidify() & (*::gl::priv::gSwallowStream)
// A macro asserting a condition and outputting failures to the debug log
#if defined(ANGLE_ENABLE_ASSERTS)
#define ASSERT(expression) \
@ -240,22 +268,11 @@ std::ostream &FmtHexInt(std::ostream &os, T value)
ANGLE_ASSERT_IMPL(expression)))
#define UNREACHABLE_IS_NORETURN ANGLE_ASSERT_IMPL_IS_NORETURN
#else
// These are just dummy values.
#define COMPACT_ANGLE_LOG_EX_ASSERT(ClassName, ...) \
COMPACT_ANGLE_LOG_EX_EVENT(ClassName, ##__VA_ARGS__)
#define COMPACT_ANGLE_LOG_ASSERT COMPACT_ANGLE_LOG_EVENT
namespace gl
{
constexpr LogSeverity LOG_ASSERT = LOG_EVENT;
} // namespace gl
#define ASSERT(condition) \
ANGLE_LAZY_STREAM(ANGLE_LOG_STREAM(ASSERT), false ? !(condition) : false) \
<< "Check failed: " #condition ". "
#define ASSERT(condition) ANGLE_EAT_STREAM_PARAMETERS << !(condition)
#define UNREACHABLE_IS_NORETURN 0
#endif // defined(ANGLE_ENABLE_ASSERTS)
#define UNUSED_VARIABLE(variable) ((void)variable)
#define ANGLE_UNUSED_VARIABLE(variable) (static_cast<void>(variable))
// A macro to indicate unimplemented functionality
#ifndef NOASSERT_UNIMPLEMENTED
@ -263,19 +280,22 @@ constexpr LogSeverity LOG_ASSERT = LOG_EVENT;
#endif
#if defined(ANGLE_TRACE_ENABLED) || defined(ANGLE_ENABLE_ASSERTS)
#define UNIMPLEMENTED() \
{ \
ERR() << "\t! Unimplemented: " << __FUNCTION__ << "(" << __FILE__ << ":" << __LINE__ \
<< ")"; \
ASSERT(NOASSERT_UNIMPLEMENTED); \
} \
#define UNIMPLEMENTED() \
{ \
WARN() << "\t! Unimplemented: " << __FUNCTION__ << "(" << __FILE__ << ":" << __LINE__ \
<< ")"; \
ASSERT(NOASSERT_UNIMPLEMENTED); \
} \
ANGLE_EMPTY_STATEMENT
// A macro for code which is not expected to be reached under valid assumptions
#define UNREACHABLE() \
((ERR() << "\t! Unreachable reached: " << __FUNCTION__ << "(" << __FILE__ << ":" << __LINE__ \
<< ")"), \
ASSERT(false))
#define UNREACHABLE() \
{ \
ERR() << "\t! Unreachable reached: " << __FUNCTION__ << "(" << __FILE__ << ":" << __LINE__ \
<< ")"; \
ASSERT(false); \
} \
ANGLE_EMPTY_STATEMENT
#else
#define UNIMPLEMENTED() \
{ \
@ -284,7 +304,11 @@ constexpr LogSeverity LOG_ASSERT = LOG_EVENT;
ANGLE_EMPTY_STATEMENT
// A macro for code which is not expected to be reached under valid assumptions
#define UNREACHABLE() ASSERT(false)
#define UNREACHABLE() \
{ \
ASSERT(false); \
} \
ANGLE_EMPTY_STATEMENT
#endif // defined(ANGLE_TRACE_ENABLED) || defined(ANGLE_ENABLE_ASSERTS)
#endif // COMMON_DEBUG_H_

View file

@ -101,4 +101,15 @@
// We will undef the macro so that the function name does not get replaced
#undef MemoryBarrier
// Macro for hinting that an expression is likely to be true/false.
#if !defined(ANGLE_LIKELY) || !defined(ANGLE_UNLIKELY)
#if defined(__GNUC__) || defined(__clang__)
#define ANGLE_LIKELY(x) __builtin_expect(!!(x), 1)
#define ANGLE_UNLIKELY(x) __builtin_expect(!!(x), 0)
#else
#define ANGLE_LIKELY(x) (x)
#define ANGLE_UNLIKELY(x) (x)
#endif // defined(__GNUC__) || defined(__clang__)
#endif // !defined(ANGLE_LIKELY) || !defined(ANGLE_UNLIKELY)
#endif // COMMON_PLATFORM_H_

View file

@ -20,7 +20,7 @@
// Unfortunately ANGLE relies on ASSERT being an empty statement, which these libs don't respect.
#ifndef NOTREACHED
#define NOTREACHED() UNREACHABLE()
#define NOTREACHED() ({ UNREACHABLE(); })
#endif
#endif // ANGLEBASE_LOGGING_H_

View file

@ -8,6 +8,9 @@
#include "common/debug.h"
namespace angle
{
namespace pp
{
@ -141,3 +144,5 @@ const char *Diagnostics::message(ID id)
}
} // namespace pp
} // namespace angle

View file

@ -9,6 +9,9 @@
#include <string>
namespace angle
{
namespace pp
{
@ -87,4 +90,6 @@ class Diagnostics
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_DIAGNOSTICSBASE_H_

View file

@ -6,6 +6,9 @@
#include "compiler/preprocessor/DirectiveHandlerBase.h"
namespace angle
{
namespace pp
{
@ -14,3 +17,5 @@ DirectiveHandler::~DirectiveHandler()
}
} // namespace pp
} // namespace angle

View file

@ -9,6 +9,9 @@
#include <string>
namespace angle
{
namespace pp
{
@ -40,4 +43,6 @@ class DirectiveHandler
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_DIRECTIVEHANDLERBASE_H_

View file

@ -18,6 +18,9 @@
#include "compiler/preprocessor/Token.h"
#include "compiler/preprocessor/Tokenizer.h"
namespace angle
{
namespace
{
enum DirectiveType
@ -998,3 +1001,5 @@ int DirectiveParser::parseExpressionIfdef(Token *token)
}
} // namespace pp
} // namespace angle

View file

@ -11,6 +11,9 @@
#include "compiler/preprocessor/Macro.h"
#include "compiler/preprocessor/SourceLocation.h"
namespace angle
{
namespace pp
{
@ -80,4 +83,6 @@ class DirectiveParser : public Lexer
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_DIRECTIVEPARSER_H_

View file

@ -117,13 +117,13 @@ typedef uint32_t UNSIGNED_TYPE;
namespace {
struct Context
{
pp::Diagnostics* diagnostics;
pp::Lexer* lexer;
pp::Token* token;
angle::pp::Diagnostics *diagnostics;
angle::pp::Lexer *lexer;
angle::pp::Token *token;
int* result;
bool parsePresetToken;
pp::ExpressionParser::ErrorSettings errorSettings;
angle::pp::ExpressionParser::ErrorSettings errorSettings;
bool *valid;
void startIgnoreErrors() { ++ignoreErrors; }
@ -1497,9 +1497,8 @@ yyreduce:
std::ostringstream stream;
stream << (yyvsp[-2]) << " >> " << (yyvsp[0]);
std::string text = stream.str();
context->diagnostics->report(pp::Diagnostics::PP_UNDEFINED_SHIFT,
context->token->location,
text.c_str());
context->diagnostics->report(angle::pp::Diagnostics::PP_UNDEFINED_SHIFT,
context->token->location, text.c_str());
*(context->valid) = false;
}
(yyval) = static_cast<YYSTYPE>(0);
@ -1527,9 +1526,8 @@ yyreduce:
std::ostringstream stream;
stream << (yyvsp[-2]) << " << " << (yyvsp[0]);
std::string text = stream.str();
context->diagnostics->report(pp::Diagnostics::PP_UNDEFINED_SHIFT,
context->token->location,
text.c_str());
context->diagnostics->report(angle::pp::Diagnostics::PP_UNDEFINED_SHIFT,
context->token->location, text.c_str());
*(context->valid) = false;
}
(yyval) = static_cast<YYSTYPE>(0);
@ -1570,9 +1568,8 @@ yyreduce:
std::ostringstream stream;
stream << (yyvsp[-2]) << " % " << (yyvsp[0]);
std::string text = stream.str();
context->diagnostics->report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
context->token->location,
text.c_str());
context->diagnostics->report(angle::pp::Diagnostics::PP_DIVISION_BY_ZERO,
context->token->location, text.c_str());
*(context->valid) = false;
}
(yyval) = static_cast<YYSTYPE>(0);
@ -1601,9 +1598,8 @@ yyreduce:
std::ostringstream stream;
stream << (yyvsp[-2]) << " / " << (yyvsp[0]);
std::string text = stream.str();
context->diagnostics->report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
context->token->location,
text.c_str());
context->diagnostics->report(angle::pp::Diagnostics::PP_DIVISION_BY_ZERO,
context->token->location, text.c_str());
*(context->valid) = false;
}
(yyval) = static_cast<YYSTYPE>(0);
@ -1914,7 +1910,7 @@ yyreturn:
int yylex(YYSTYPE *lvalp, Context *context)
{
pp::Token *token = context->token;
angle::pp::Token *token = context->token;
if (!context->parsePresetToken)
{
context->lexer->lex(token);
@ -1925,48 +1921,50 @@ int yylex(YYSTYPE *lvalp, Context *context)
switch (token->type)
{
case pp::Token::CONST_INT: {
unsigned int val = 0;
int testVal = 0;
if (!token->uValue(&val) || (!token->iValue(&testVal) &&
context->errorSettings.integerLiteralsMustFit32BitSignedRange))
case angle::pp::Token::CONST_INT:
{
context->diagnostics->report(pp::Diagnostics::PP_INTEGER_OVERFLOW,
token->location, token->text);
*(context->valid) = false;
}
*lvalp = static_cast<YYSTYPE>(val);
type = TOK_CONST_INT;
break;
unsigned int val = 0;
int testVal = 0;
if (!token->uValue(&val) ||
(!token->iValue(&testVal) &&
context->errorSettings.integerLiteralsMustFit32BitSignedRange))
{
context->diagnostics->report(angle::pp::Diagnostics::PP_INTEGER_OVERFLOW,
token->location, token->text);
*(context->valid) = false;
}
*lvalp = static_cast<YYSTYPE>(val);
type = TOK_CONST_INT;
break;
}
case pp::Token::IDENTIFIER:
*lvalp = static_cast<YYSTYPE>(-1);
type = TOK_IDENTIFIER;
break;
case pp::Token::OP_OR:
type = TOK_OP_OR;
break;
case pp::Token::OP_AND:
type = TOK_OP_AND;
break;
case pp::Token::OP_NE:
type = TOK_OP_NE;
break;
case pp::Token::OP_EQ:
type = TOK_OP_EQ;
break;
case pp::Token::OP_GE:
type = TOK_OP_GE;
break;
case pp::Token::OP_LE:
type = TOK_OP_LE;
break;
case pp::Token::OP_RIGHT:
type = TOK_OP_RIGHT;
break;
case pp::Token::OP_LEFT:
type = TOK_OP_LEFT;
break;
case angle::pp::Token::IDENTIFIER:
*lvalp = static_cast<YYSTYPE>(-1);
type = TOK_IDENTIFIER;
break;
case angle::pp::Token::OP_OR:
type = TOK_OP_OR;
break;
case angle::pp::Token::OP_AND:
type = TOK_OP_AND;
break;
case angle::pp::Token::OP_NE:
type = TOK_OP_NE;
break;
case angle::pp::Token::OP_EQ:
type = TOK_OP_EQ;
break;
case angle::pp::Token::OP_GE:
type = TOK_OP_GE;
break;
case angle::pp::Token::OP_LE:
type = TOK_OP_LE;
break;
case angle::pp::Token::OP_RIGHT:
type = TOK_OP_RIGHT;
break;
case angle::pp::Token::OP_LEFT:
type = TOK_OP_LEFT;
break;
case '|':
case '^':
case '&':
@ -1993,11 +1991,13 @@ int yylex(YYSTYPE *lvalp, Context *context)
void yyerror(Context *context, const char *reason)
{
context->diagnostics->report(pp::Diagnostics::PP_INVALID_EXPRESSION,
context->token->location,
reason);
context->diagnostics->report(angle::pp::Diagnostics::PP_INVALID_EXPRESSION,
context->token->location, reason);
}
namespace angle
{
namespace pp {
ExpressionParser::ExpressionParser(Lexer *lexer, Diagnostics *diagnostics)
@ -2042,3 +2042,5 @@ bool ExpressionParser::parse(Token *token,
}
} // namespace pp
} // namespace angle

View file

@ -10,6 +10,9 @@
#include "common/angleutils.h"
#include "compiler/preprocessor/DiagnosticsBase.h"
namespace angle
{
namespace pp
{
@ -40,4 +43,6 @@ class ExpressionParser : angle::NonCopyable
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_EXPRESSIONPARSER_H_

View file

@ -59,13 +59,13 @@ typedef uint32_t UNSIGNED_TYPE;
namespace {
struct Context
{
pp::Diagnostics* diagnostics;
pp::Lexer* lexer;
pp::Token* token;
angle::pp::Diagnostics *diagnostics;
angle::pp::Lexer *lexer;
angle::pp::Token *token;
int* result;
bool parsePresetToken;
pp::ExpressionParser::ErrorSettings errorSettings;
angle::pp::ExpressionParser::ErrorSettings errorSettings;
bool *valid;
void startIgnoreErrors() { ++ignoreErrors; }
@ -201,7 +201,7 @@ expression
std::ostringstream stream;
stream << $1 << " >> " << $3;
std::string text = stream.str();
context->diagnostics->report(pp::Diagnostics::PP_UNDEFINED_SHIFT,
context->diagnostics->report(angle::pp::Diagnostics::PP_UNDEFINED_SHIFT,
context->token->location,
text.c_str());
*(context->valid) = false;
@ -226,7 +226,7 @@ expression
std::ostringstream stream;
stream << $1 << " << " << $3;
std::string text = stream.str();
context->diagnostics->report(pp::Diagnostics::PP_UNDEFINED_SHIFT,
context->diagnostics->report(angle::pp::Diagnostics::PP_UNDEFINED_SHIFT,
context->token->location,
text.c_str());
*(context->valid) = false;
@ -254,7 +254,7 @@ expression
std::ostringstream stream;
stream << $1 << " % " << $3;
std::string text = stream.str();
context->diagnostics->report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
context->diagnostics->report(angle::pp::Diagnostics::PP_DIVISION_BY_ZERO,
context->token->location,
text.c_str());
*(context->valid) = false;
@ -280,7 +280,7 @@ expression
std::ostringstream stream;
stream << $1 << " / " << $3;
std::string text = stream.str();
context->diagnostics->report(pp::Diagnostics::PP_DIVISION_BY_ZERO,
context->diagnostics->report(angle::pp::Diagnostics::PP_DIVISION_BY_ZERO,
context->token->location,
text.c_str());
*(context->valid) = false;
@ -332,7 +332,7 @@ expression
int yylex(YYSTYPE *lvalp, Context *context)
{
pp::Token *token = context->token;
angle::pp::Token *token = context->token;
if (!context->parsePresetToken)
{
context->lexer->lex(token);
@ -343,13 +343,13 @@ int yylex(YYSTYPE *lvalp, Context *context)
switch (token->type)
{
case pp::Token::CONST_INT: {
case angle::pp::Token::CONST_INT: {
unsigned int val = 0;
int testVal = 0;
if (!token->uValue(&val) || (!token->iValue(&testVal) &&
context->errorSettings.integerLiteralsMustFit32BitSignedRange))
{
context->diagnostics->report(pp::Diagnostics::PP_INTEGER_OVERFLOW,
context->diagnostics->report(angle::pp::Diagnostics::PP_INTEGER_OVERFLOW,
token->location, token->text);
*(context->valid) = false;
}
@ -357,32 +357,32 @@ int yylex(YYSTYPE *lvalp, Context *context)
type = TOK_CONST_INT;
break;
}
case pp::Token::IDENTIFIER:
case angle::pp::Token::IDENTIFIER:
*lvalp = static_cast<YYSTYPE>(-1);
type = TOK_IDENTIFIER;
break;
case pp::Token::OP_OR:
case angle::pp::Token::OP_OR:
type = TOK_OP_OR;
break;
case pp::Token::OP_AND:
case angle::pp::Token::OP_AND:
type = TOK_OP_AND;
break;
case pp::Token::OP_NE:
case angle::pp::Token::OP_NE:
type = TOK_OP_NE;
break;
case pp::Token::OP_EQ:
case angle::pp::Token::OP_EQ:
type = TOK_OP_EQ;
break;
case pp::Token::OP_GE:
case angle::pp::Token::OP_GE:
type = TOK_OP_GE;
break;
case pp::Token::OP_LE:
case angle::pp::Token::OP_LE:
type = TOK_OP_LE;
break;
case pp::Token::OP_RIGHT:
case angle::pp::Token::OP_RIGHT:
type = TOK_OP_RIGHT;
break;
case pp::Token::OP_LEFT:
case angle::pp::Token::OP_LEFT:
type = TOK_OP_LEFT;
break;
case '|':
@ -411,11 +411,13 @@ int yylex(YYSTYPE *lvalp, Context *context)
void yyerror(Context *context, const char *reason)
{
context->diagnostics->report(pp::Diagnostics::PP_INVALID_EXPRESSION,
context->diagnostics->report(angle::pp::Diagnostics::PP_INVALID_EXPRESSION,
context->token->location,
reason);
}
namespace angle {
namespace pp {
ExpressionParser::ExpressionParser(Lexer *lexer, Diagnostics *diagnostics)
@ -460,3 +462,5 @@ bool ExpressionParser::parse(Token *token,
}
} // namespace pp
} // namespace angle

View file

@ -11,6 +11,9 @@
#include "common/debug.h"
namespace angle
{
namespace pp
{
@ -127,3 +130,5 @@ size_t Input::read(char *buf, size_t maxSize, int *lineNo)
}
} // namespace pp
} // namespace angle

View file

@ -10,6 +10,9 @@
#include <cstddef>
#include <vector>
namespace angle
{
namespace pp
{
@ -51,4 +54,6 @@ class Input
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_INPUT_H_

View file

@ -6,6 +6,9 @@
#include "compiler/preprocessor/Lexer.h"
namespace angle
{
namespace pp
{
@ -14,3 +17,5 @@ Lexer::~Lexer()
}
} // namespace pp
} // namespace angle

View file

@ -9,6 +9,9 @@
#include "common/angleutils.h"
namespace angle
{
namespace pp
{
@ -24,4 +27,6 @@ class Lexer : angle::NonCopyable
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_LEXER_H_

View file

@ -9,6 +9,9 @@
#include "common/angleutils.h"
#include "compiler/preprocessor/Token.h"
namespace angle
{
namespace pp
{
@ -42,3 +45,5 @@ void PredefineMacro(MacroSet *macroSet, const char *name, int value)
}
} // namespace pp
} // namespace angle

View file

@ -12,6 +12,9 @@
#include <string>
#include <vector>
namespace angle
{
namespace pp
{
@ -47,4 +50,6 @@ void PredefineMacro(MacroSet *macroSet, const char *name, int value);
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_MACRO_H_

View file

@ -12,6 +12,9 @@
#include "compiler/preprocessor/DiagnosticsBase.h"
#include "compiler/preprocessor/Token.h"
namespace angle
{
namespace pp
{
@ -479,3 +482,5 @@ void MacroExpander::MacroContext::unget()
}
} // namespace pp
} // namespace angle

View file

@ -13,6 +13,9 @@
#include "compiler/preprocessor/Lexer.h"
#include "compiler/preprocessor/Macro.h"
namespace angle
{
namespace pp
{
@ -80,4 +83,6 @@ class MacroExpander : public Lexer
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_MACROEXPANDER_H_

View file

@ -14,6 +14,9 @@
#include "compiler/preprocessor/Token.h"
#include "compiler/preprocessor/Tokenizer.h"
namespace angle
{
namespace pp
{
@ -105,3 +108,5 @@ void Preprocessor::setMaxTokenSize(size_t maxTokenSize)
}
} // namespace pp
} // namespace angle

View file

@ -11,6 +11,9 @@
#include "common/angleutils.h"
namespace angle
{
namespace pp
{
@ -57,4 +60,6 @@ class Preprocessor : angle::NonCopyable
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_PREPROCESSOR_H_

View file

@ -7,6 +7,9 @@
#ifndef COMPILER_PREPROCESSOR_SOURCELOCATION_H_
#define COMPILER_PREPROCESSOR_SOURCELOCATION_H_
namespace angle
{
namespace pp
{
@ -36,4 +39,6 @@ inline bool operator!=(const SourceLocation &lhs, const SourceLocation &rhs)
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_SOURCELOCATION_H_

View file

@ -9,6 +9,9 @@
#include "common/debug.h"
#include "compiler/preprocessor/numeric_lex.h"
namespace angle
{
namespace pp
{
@ -78,3 +81,5 @@ std::ostream &operator<<(std::ostream &out, const Token &token)
}
} // namespace pp
} // namespace angle

View file

@ -12,6 +12,9 @@
#include "compiler/preprocessor/SourceLocation.h"
namespace angle
{
namespace pp
{
@ -104,6 +107,8 @@ inline bool operator!=(const Token &lhs, const Token &rhs)
std::ostream &operator<<(std::ostream &out, const Token &token);
} // namepsace pp
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_TOKEN_H_

View file

@ -924,7 +924,7 @@ IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh.
#endif
typedef std::string YYSTYPE;
typedef pp::SourceLocation YYLTYPE;
typedef angle::pp::SourceLocation YYLTYPE;
// Use the unused yycolumn variable to track file (string) number.
#define yyfileno yycolumn
@ -941,18 +941,19 @@ typedef pp::SourceLocation YYLTYPE;
#define YY_USER_ACTION \
do \
{ \
pp::Input* input = &yyextra->input; \
pp::Input::Location* scanLoc = &yyextra->scanLoc; \
angle::pp::Input *input = &yyextra->input; \
angle::pp::Input::Location *scanLoc = &yyextra->scanLoc; \
while ((scanLoc->sIndex < input->count()) && \
(scanLoc->cIndex >= input->length(scanLoc->sIndex))) \
{ \
scanLoc->cIndex -= input->length(scanLoc->sIndex++); \
++yyfileno; yylineno = 1; \
++yyfileno; \
yylineno = 1; \
} \
yylloc->file = yyfileno; \
yylloc->line = yylineno; \
scanLoc->cIndex += yyleng; \
} while(0);
} while (0);
#define YY_INPUT(buf, result, maxSize) \
result = yyextra->input.read(buf, maxSize, &yylineno);
@ -964,15 +965,7 @@ typedef pp::SourceLocation YYLTYPE;
#define INITIAL 0
#define COMMENT 1
#define YY_EXTRA_TYPE pp::Tokenizer::Context*
#define YY_EXTRA_TYPE angle::pp::Tokenizer::Context *
/* Holds the entire state of the reentrant scanner. */
struct yyguts_t
@ -1436,7 +1429,7 @@ YY_RULE_SETUP
if (yylineno == INT_MAX)
{
*yylval = "Integer overflow on line number";
return pp::Token::GOT_ERROR;
return angle::pp::Token::GOT_ERROR;
}
++yylineno;
}
@ -1453,28 +1446,28 @@ YY_RULE_SETUP
{
// # is only valid at start of line for preprocessor directives.
yylval->assign(1, yytext[0]);
return yyextra->lineStart ? pp::Token::PP_HASH : pp::Token::PP_OTHER;
return yyextra->lineStart ? angle::pp::Token::PP_HASH : angle::pp::Token::PP_OTHER;
}
YY_BREAK
case 8:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::IDENTIFIER;
return angle::pp::Token::IDENTIFIER;
}
YY_BREAK
case 9:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::CONST_INT;
return angle::pp::Token::CONST_INT;
}
YY_BREAK
case 10:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::CONST_FLOAT;
return angle::pp::Token::CONST_FLOAT;
}
YY_BREAK
/* Anything that starts with a {DIGIT} or .{DIGIT} must be a number. */
@ -1483,154 +1476,154 @@ case 11:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::PP_NUMBER;
return angle::pp::Token::PP_NUMBER;
}
YY_BREAK
case 12:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_INC;
return angle::pp::Token::OP_INC;
}
YY_BREAK
case 13:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_DEC;
return angle::pp::Token::OP_DEC;
}
YY_BREAK
case 14:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_LEFT;
return angle::pp::Token::OP_LEFT;
}
YY_BREAK
case 15:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_RIGHT;
return angle::pp::Token::OP_RIGHT;
}
YY_BREAK
case 16:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_LE;
return angle::pp::Token::OP_LE;
}
YY_BREAK
case 17:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_GE;
return angle::pp::Token::OP_GE;
}
YY_BREAK
case 18:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_EQ;
return angle::pp::Token::OP_EQ;
}
YY_BREAK
case 19:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_NE;
return angle::pp::Token::OP_NE;
}
YY_BREAK
case 20:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_AND;
return angle::pp::Token::OP_AND;
}
YY_BREAK
case 21:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_XOR;
return angle::pp::Token::OP_XOR;
}
YY_BREAK
case 22:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_OR;
return angle::pp::Token::OP_OR;
}
YY_BREAK
case 23:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_ADD_ASSIGN;
return angle::pp::Token::OP_ADD_ASSIGN;
}
YY_BREAK
case 24:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_SUB_ASSIGN;
return angle::pp::Token::OP_SUB_ASSIGN;
}
YY_BREAK
case 25:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_MUL_ASSIGN;
return angle::pp::Token::OP_MUL_ASSIGN;
}
YY_BREAK
case 26:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_DIV_ASSIGN;
return angle::pp::Token::OP_DIV_ASSIGN;
}
YY_BREAK
case 27:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_MOD_ASSIGN;
return angle::pp::Token::OP_MOD_ASSIGN;
}
YY_BREAK
case 28:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_LEFT_ASSIGN;
return angle::pp::Token::OP_LEFT_ASSIGN;
}
YY_BREAK
case 29:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_RIGHT_ASSIGN;
return angle::pp::Token::OP_RIGHT_ASSIGN;
}
YY_BREAK
case 30:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_AND_ASSIGN;
return angle::pp::Token::OP_AND_ASSIGN;
}
YY_BREAK
case 31:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_XOR_ASSIGN;
return angle::pp::Token::OP_XOR_ASSIGN;
}
YY_BREAK
case 32:
YY_RULE_SETUP
{
yylval->assign(yytext, yyleng);
return pp::Token::OP_OR_ASSIGN;
return angle::pp::Token::OP_OR_ASSIGN;
}
YY_BREAK
case 33:
@ -1651,7 +1644,7 @@ YY_RULE_SETUP
if (yylineno == INT_MAX)
{
*yylval = "Integer overflow on line number";
return pp::Token::GOT_ERROR;
return angle::pp::Token::GOT_ERROR;
}
++yylineno;
yylval->assign(1, '\n');
@ -1662,7 +1655,7 @@ case 36:
YY_RULE_SETUP
{
yylval->assign(1, yytext[0]);
return pp::Token::PP_OTHER;
return angle::pp::Token::PP_OTHER;
}
YY_BREAK
case YY_STATE_EOF(INITIAL):
@ -1670,8 +1663,8 @@ case YY_STATE_EOF(COMMENT):
{
// YY_USER_ACTION is not invoked for handling EOF.
// Set the location for EOF token manually.
pp::Input* input = &yyextra->input;
pp::Input::Location* scanLoc = &yyextra->scanLoc;
angle::pp::Input *input = &yyextra->input;
angle::pp::Input::Location *scanLoc = &yyextra->scanLoc;
yy_size_t sIndexMax = input->count() ? input->count() - 1 : 0;
if (scanLoc->sIndex != sIndexMax)
{
@ -1688,14 +1681,14 @@ case YY_STATE_EOF(COMMENT):
// Line number overflows fake EOFs to exit early, check for this case.
if (yylineno == INT_MAX)
{
yyextra->diagnostics->report(pp::Diagnostics::PP_TOKENIZER_ERROR,
pp::SourceLocation(yyfileno, yylineno),
yyextra->diagnostics->report(angle::pp::Diagnostics::PP_TOKENIZER_ERROR,
angle::pp::SourceLocation(yyfileno, yylineno),
"Integer overflow on line number");
}
else if (YY_START == COMMENT)
{
yyextra->diagnostics->report(pp::Diagnostics::PP_EOF_IN_COMMENT,
pp::SourceLocation(yyfileno, yylineno),
yyextra->diagnostics->report(angle::pp::Diagnostics::PP_EOF_IN_COMMENT,
angle::pp::SourceLocation(yyfileno, yylineno),
"EOF while in a comment");
}
yyterminate();
@ -2976,12 +2969,8 @@ void yyfree (void * ptr , yyscan_t yyscanner)
#define YYTABLES_NAME "yytables"
namespace angle
{
namespace pp {
@ -3071,4 +3060,4 @@ void Tokenizer::destroyScanner()
} // namespace pp
} // namespace angle

View file

@ -11,6 +11,9 @@
#include "compiler/preprocessor/Input.h"
#include "compiler/preprocessor/Lexer.h"
namespace angle
{
namespace pp
{
@ -55,4 +58,6 @@ class Tokenizer : public Lexer
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_TOKENIZER_H_

View file

@ -51,7 +51,7 @@ IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh.
#endif
typedef std::string YYSTYPE;
typedef pp::SourceLocation YYLTYPE;
typedef angle::pp::SourceLocation YYLTYPE;
// Use the unused yycolumn variable to track file (string) number.
#define yyfileno yycolumn
@ -68,8 +68,8 @@ typedef pp::SourceLocation YYLTYPE;
#define YY_USER_ACTION \
do \
{ \
pp::Input* input = &yyextra->input; \
pp::Input::Location* scanLoc = &yyextra->scanLoc; \
angle::pp::Input* input = &yyextra->input; \
angle::pp::Input::Location* scanLoc = &yyextra->scanLoc; \
while ((scanLoc->sIndex < input->count()) && \
(scanLoc->cIndex >= input->length(scanLoc->sIndex))) \
{ \
@ -89,7 +89,7 @@ typedef pp::SourceLocation YYLTYPE;
%option noyywrap nounput never-interactive
%option reentrant bison-bridge bison-locations
%option prefix="pp"
%option extra-type="pp::Tokenizer::Context*"
%option extra-type="angle::pp::Tokenizer::Context*"
%x COMMENT
NEWLINE \n|\r|\r\n
@ -119,7 +119,7 @@ FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".")
if (yylineno == INT_MAX)
{
*yylval = "Integer overflow on line number";
return pp::Token::GOT_ERROR;
return angle::pp::Token::GOT_ERROR;
}
++yylineno;
}
@ -131,114 +131,114 @@ FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".")
# {
// # is only valid at start of line for preprocessor directives.
yylval->assign(1, yytext[0]);
return yyextra->lineStart ? pp::Token::PP_HASH : pp::Token::PP_OTHER;
return yyextra->lineStart ? angle::pp::Token::PP_HASH : angle::pp::Token::PP_OTHER;
}
{IDENTIFIER} {
yylval->assign(yytext, yyleng);
return pp::Token::IDENTIFIER;
return angle::pp::Token::IDENTIFIER;
}
({DECIMAL_CONSTANT}[uU]?)|({OCTAL_CONSTANT}[uU]?)|({HEXADECIMAL_CONSTANT}[uU]?) {
yylval->assign(yytext, yyleng);
return pp::Token::CONST_INT;
return angle::pp::Token::CONST_INT;
}
({DIGIT}+{EXPONENT_PART}[fF]?)|({FRACTIONAL_CONSTANT}{EXPONENT_PART}?[fF]?) {
yylval->assign(yytext, yyleng);
return pp::Token::CONST_FLOAT;
return angle::pp::Token::CONST_FLOAT;
}
/* Anything that starts with a {DIGIT} or .{DIGIT} must be a number. */
/* Rule to catch all invalid integers and floats. */
({DIGIT}+[_a-zA-Z0-9.]*)|("."{DIGIT}+[_a-zA-Z0-9.]*) {
yylval->assign(yytext, yyleng);
return pp::Token::PP_NUMBER;
return angle::pp::Token::PP_NUMBER;
}
"++" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_INC;
return angle::pp::Token::OP_INC;
}
"--" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_DEC;
return angle::pp::Token::OP_DEC;
}
"<<" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_LEFT;
return angle::pp::Token::OP_LEFT;
}
">>" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_RIGHT;
return angle::pp::Token::OP_RIGHT;
}
"<=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_LE;
return angle::pp::Token::OP_LE;
}
">=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_GE;
return angle::pp::Token::OP_GE;
}
"==" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_EQ;
return angle::pp::Token::OP_EQ;
}
"!=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_NE;
return angle::pp::Token::OP_NE;
}
"&&" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_AND;
return angle::pp::Token::OP_AND;
}
"^^" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_XOR;
return angle::pp::Token::OP_XOR;
}
"||" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_OR;
return angle::pp::Token::OP_OR;
}
"+=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_ADD_ASSIGN;
return angle::pp::Token::OP_ADD_ASSIGN;
}
"-=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_SUB_ASSIGN;
return angle::pp::Token::OP_SUB_ASSIGN;
}
"*=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_MUL_ASSIGN;
return angle::pp::Token::OP_MUL_ASSIGN;
}
"/=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_DIV_ASSIGN;
return angle::pp::Token::OP_DIV_ASSIGN;
}
"%=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_MOD_ASSIGN;
return angle::pp::Token::OP_MOD_ASSIGN;
}
"<<=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_LEFT_ASSIGN;
return angle::pp::Token::OP_LEFT_ASSIGN;
}
">>=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_RIGHT_ASSIGN;
return angle::pp::Token::OP_RIGHT_ASSIGN;
}
"&=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_AND_ASSIGN;
return angle::pp::Token::OP_AND_ASSIGN;
}
"^=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_XOR_ASSIGN;
return angle::pp::Token::OP_XOR_ASSIGN;
}
"|=" {
yylval->assign(yytext, yyleng);
return pp::Token::OP_OR_ASSIGN;
return angle::pp::Token::OP_OR_ASSIGN;
}
{PUNCTUATOR} {
@ -252,7 +252,7 @@ FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".")
if (yylineno == INT_MAX)
{
*yylval = "Integer overflow on line number";
return pp::Token::GOT_ERROR;
return angle::pp::Token::GOT_ERROR;
}
++yylineno;
yylval->assign(1, '\n');
@ -261,14 +261,14 @@ FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".")
. {
yylval->assign(1, yytext[0]);
return pp::Token::PP_OTHER;
return angle::pp::Token::PP_OTHER;
}
<*><<EOF>> {
// YY_USER_ACTION is not invoked for handling EOF.
// Set the location for EOF token manually.
pp::Input* input = &yyextra->input;
pp::Input::Location* scanLoc = &yyextra->scanLoc;
angle::pp::Input* input = &yyextra->input;
angle::pp::Input::Location* scanLoc = &yyextra->scanLoc;
yy_size_t sIndexMax = input->count() ? input->count() - 1 : 0;
if (scanLoc->sIndex != sIndexMax)
{
@ -284,14 +284,14 @@ FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".")
// Line number overflows fake EOFs to exit early, check for this case.
if (yylineno == INT_MAX) {
yyextra->diagnostics->report(pp::Diagnostics::PP_TOKENIZER_ERROR,
pp::SourceLocation(yyfileno, yylineno),
yyextra->diagnostics->report(angle::pp::Diagnostics::PP_TOKENIZER_ERROR,
angle::pp::SourceLocation(yyfileno, yylineno),
"Integer overflow on line number");
}
else if (YY_START == COMMENT)
{
yyextra->diagnostics->report(pp::Diagnostics::PP_EOF_IN_COMMENT,
pp::SourceLocation(yyfileno, yylineno),
yyextra->diagnostics->report(angle::pp::Diagnostics::PP_EOF_IN_COMMENT,
angle::pp::SourceLocation(yyfileno, yylineno),
"EOF while in a comment");
}
yyterminate();
@ -299,6 +299,8 @@ FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".")
%%
namespace angle {
namespace pp {
Tokenizer::Tokenizer(Diagnostics *diagnostics) : mHandle(nullptr), mMaxTokenSize(256)
@ -387,3 +389,5 @@ void Tokenizer::destroyScanner()
} // namespace pp
} // namespace angle

View file

@ -12,6 +12,9 @@
#include <cmath>
#include <sstream>
namespace angle
{
namespace pp
{
@ -61,6 +64,8 @@ bool numeric_lex_float(const std::string &str, FloatType *value)
return !stream.fail() && std::isfinite(*value);
}
} // namespace pp.
} // namespace pp
} // namespace angle
#endif // COMPILER_PREPROCESSOR_NUMERICLEX_H_

View file

@ -284,7 +284,7 @@ void CollectVariablesTraverser::recordBuiltInVaryingUsed(const TVariable &variab
setBuiltInInfoFromSymbol(variable, &info);
info.staticUse = true;
info.active = true;
info.isInvariant = mSymbolTable->isVaryingInvariant(variable.name());
info.isInvariant = mSymbolTable->isVaryingInvariant(variable);
varyings->push_back(info);
(*addedFlag) = true;
}
@ -668,7 +668,7 @@ Varying CollectVariablesTraverser::recordVarying(const TIntermSymbol &variable)
case EvqFlatOut:
case EvqCentroidOut:
case EvqGeometryOut:
if (mSymbolTable->isVaryingInvariant(variable.getName()) || type.isInvariant())
if (mSymbolTable->isVaryingInvariant(variable.variable()) || type.isInvariant())
{
varying.isInvariant = true;
}

View file

@ -38,6 +38,7 @@
#include "compiler/translator/tree_ops/RemovePow.h"
#include "compiler/translator/tree_ops/RemoveUnreferencedVariables.h"
#include "compiler/translator/tree_ops/RewriteDoWhile.h"
#include "compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.h"
#include "compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.h"
#include "compiler/translator/tree_ops/SeparateDeclarations.h"
#include "compiler/translator/tree_ops/SimplifyLoopConditions.h"
@ -737,6 +738,11 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root,
ClampFragDepth(root, &getSymbolTable());
}
if (compileOptions & SH_REWRITE_REPEATED_ASSIGN_TO_SWIZZLED)
{
sh::RewriteRepeatedAssignToSwizzled(root);
}
if (compileOptions & SH_REWRITE_VECTOR_SCALAR_ARITHMETIC)
{
VectorizeVectorScalarArithmetic(root, &getSymbolTable());

View file

@ -157,7 +157,16 @@ bool TConstantUnion::cast(TBasicType newType, const TConstantUnion &constant)
setUConst(static_cast<unsigned int>(constant.getBConst()));
break;
case EbtFloat:
setUConst(static_cast<unsigned int>(constant.getFConst()));
if (constant.getFConst() < 0.0f)
{
// Avoid undefined behavior in C++ by first casting to signed int.
setUConst(
static_cast<unsigned int>(static_cast<int>(constant.getFConst())));
}
else
{
setUConst(static_cast<unsigned int>(constant.getFConst()));
}
break;
default:
return false;

View file

@ -24,7 +24,7 @@ TDiagnostics::~TDiagnostics()
}
void TDiagnostics::writeInfo(Severity severity,
const pp::SourceLocation &loc,
const angle::pp::SourceLocation &loc,
const char *reason,
const char *token)
{
@ -54,19 +54,23 @@ void TDiagnostics::globalError(const char *message)
mInfoSink << message << "\n";
}
void TDiagnostics::error(const pp::SourceLocation &loc, const char *reason, const char *token)
void TDiagnostics::error(const angle::pp::SourceLocation &loc,
const char *reason,
const char *token)
{
writeInfo(SH_ERROR, loc, reason, token);
}
void TDiagnostics::warning(const pp::SourceLocation &loc, const char *reason, const char *token)
void TDiagnostics::warning(const angle::pp::SourceLocation &loc,
const char *reason,
const char *token)
{
writeInfo(SH_WARNING, loc, reason, token);
}
void TDiagnostics::error(const TSourceLoc &loc, const char *reason, const char *token)
{
pp::SourceLocation srcLoc;
angle::pp::SourceLocation srcLoc;
srcLoc.file = loc.first_file;
srcLoc.line = loc.first_line;
error(srcLoc, reason, token);
@ -74,13 +78,13 @@ void TDiagnostics::error(const TSourceLoc &loc, const char *reason, const char *
void TDiagnostics::warning(const TSourceLoc &loc, const char *reason, const char *token)
{
pp::SourceLocation srcLoc;
angle::pp::SourceLocation srcLoc;
srcLoc.file = loc.first_file;
srcLoc.line = loc.first_line;
warning(srcLoc, reason, token);
}
void TDiagnostics::print(ID id, const pp::SourceLocation &loc, const std::string &text)
void TDiagnostics::print(ID id, const angle::pp::SourceLocation &loc, const std::string &text)
{
writeInfo(isError(id) ? SH_ERROR : SH_WARNING, loc, message(id), text.c_str());
}

View file

@ -17,7 +17,7 @@ namespace sh
class TInfoSinkBase;
struct TSourceLoc;
class TDiagnostics : public pp::Diagnostics, angle::NonCopyable
class TDiagnostics : public angle::pp::Diagnostics, angle::NonCopyable
{
public:
TDiagnostics(TInfoSinkBase &infoSink);
@ -26,8 +26,8 @@ class TDiagnostics : public pp::Diagnostics, angle::NonCopyable
int numErrors() const { return mNumErrors; }
int numWarnings() const { return mNumWarnings; }
void error(const pp::SourceLocation &loc, const char *reason, const char *token);
void warning(const pp::SourceLocation &loc, const char *reason, const char *token);
void error(const angle::pp::SourceLocation &loc, const char *reason, const char *token);
void warning(const angle::pp::SourceLocation &loc, const char *reason, const char *token);
void error(const TSourceLoc &loc, const char *reason, const char *token);
void warning(const TSourceLoc &loc, const char *reason, const char *token);
@ -38,11 +38,11 @@ class TDiagnostics : public pp::Diagnostics, angle::NonCopyable
protected:
void writeInfo(Severity severity,
const pp::SourceLocation &loc,
const angle::pp::SourceLocation &loc,
const char *reason,
const char *token);
void print(ID id, const pp::SourceLocation &loc, const std::string &text) override;
void print(ID id, const angle::pp::SourceLocation &loc, const std::string &text) override;
private:
TInfoSinkBase &mInfoSink;

View file

@ -50,12 +50,12 @@ TDirectiveHandler::~TDirectiveHandler()
{
}
void TDirectiveHandler::handleError(const pp::SourceLocation &loc, const std::string &msg)
void TDirectiveHandler::handleError(const angle::pp::SourceLocation &loc, const std::string &msg)
{
mDiagnostics.error(loc, msg.c_str(), "");
}
void TDirectiveHandler::handlePragma(const pp::SourceLocation &loc,
void TDirectiveHandler::handlePragma(const angle::pp::SourceLocation &loc,
const std::string &name,
const std::string &value,
bool stdgl)
@ -119,7 +119,7 @@ void TDirectiveHandler::handlePragma(const pp::SourceLocation &loc,
}
else
{
mDiagnostics.report(pp::Diagnostics::PP_UNRECOGNIZED_PRAGMA, loc, name);
mDiagnostics.report(angle::pp::Diagnostics::PP_UNRECOGNIZED_PRAGMA, loc, name);
return;
}
@ -130,7 +130,7 @@ void TDirectiveHandler::handlePragma(const pp::SourceLocation &loc,
}
}
void TDirectiveHandler::handleExtension(const pp::SourceLocation &loc,
void TDirectiveHandler::handleExtension(const angle::pp::SourceLocation &loc,
const std::string &name,
const std::string &behavior)
{
@ -185,7 +185,7 @@ void TDirectiveHandler::handleExtension(const pp::SourceLocation &loc,
}
}
void TDirectiveHandler::handleVersion(const pp::SourceLocation &loc, int version)
void TDirectiveHandler::handleVersion(const angle::pp::SourceLocation &loc, int version)
{
if (version == 100 || version == 300 || version == 310)
{

View file

@ -17,7 +17,7 @@ namespace sh
{
class TDiagnostics;
class TDirectiveHandler : public pp::DirectiveHandler, angle::NonCopyable
class TDirectiveHandler : public angle::pp::DirectiveHandler, angle::NonCopyable
{
public:
TDirectiveHandler(TExtensionBehavior &extBehavior,
@ -30,18 +30,18 @@ class TDirectiveHandler : public pp::DirectiveHandler, angle::NonCopyable
const TPragma &pragma() const { return mPragma; }
const TExtensionBehavior &extensionBehavior() const { return mExtensionBehavior; }
void handleError(const pp::SourceLocation &loc, const std::string &msg) override;
void handleError(const angle::pp::SourceLocation &loc, const std::string &msg) override;
void handlePragma(const pp::SourceLocation &loc,
void handlePragma(const angle::pp::SourceLocation &loc,
const std::string &name,
const std::string &value,
bool stdgl) override;
void handleExtension(const pp::SourceLocation &loc,
void handleExtension(const angle::pp::SourceLocation &loc,
const std::string &name,
const std::string &behavior) override;
void handleVersion(const pp::SourceLocation &loc, int version) override;
void handleVersion(const angle::pp::SourceLocation &loc, int version) override;
private:
TPragma mPragma;

View file

@ -1711,6 +1711,32 @@ TIntermTyped *TIntermAggregate::fold(TDiagnostics *diagnostics)
if (mType.canReplaceWithConstantUnion())
{
constArray = getConstantValue();
if (constArray && mType.getBasicType() == EbtUInt)
{
// Check if we converted a negative float to uint and issue a warning in that case.
size_t sizeRemaining = mType.getObjectSize();
for (TIntermNode *arg : mArguments)
{
TIntermTyped *typedArg = arg->getAsTyped();
if (typedArg->getBasicType() == EbtFloat)
{
const TConstantUnion *argValue = typedArg->getConstantValue();
size_t castSize =
std::min(typedArg->getType().getObjectSize(), sizeRemaining);
for (size_t i = 0; i < castSize; ++i)
{
if (argValue[i].getFConst() < 0.0f)
{
// ESSL 3.00.6 section 5.4.1.
diagnostics->warning(
mLine, "casting a negative float to uint is undefined",
mType.getBuiltInTypeNameString());
}
}
}
sizeRemaining -= typedArg->getType().getObjectSize();
}
}
}
}
else if (CanFoldAggregateBuiltInOp(mOp))
@ -1900,11 +1926,11 @@ const TConstantUnion *TIntermConstantUnion::FoldBinary(TOperator op,
if (lhs < 0 || divisor < 0)
{
// ESSL 3.00.6 section 5.9: Results of modulus are undefined
// when
// either one of the operands is negative.
// when either one of the operands is negative.
diagnostics->warning(line,
"Negative modulus operator operand "
"encountered during constant folding",
"encountered during constant folding. "
"Results are undefined.",
"%");
resultArray[i].setIConst(0);
}

View file

@ -214,6 +214,15 @@ void TOutputGLSLBase::writeLayoutQualifier(TIntermTyped *variable)
out << ") ";
}
void TOutputGLSLBase::writeQualifier(TQualifier qualifier, const TSymbol *symbol)
{
const char *result = mapQualifierToString(qualifier);
if (result && result[0] != '\0')
{
objSink() << result << " ";
}
}
const char *TOutputGLSLBase::mapQualifierToString(TQualifier qualifier)
{
if (sh::IsGLSL410OrOlder(mOutput) && mShaderVersion >= 300 &&
@ -250,7 +259,7 @@ const char *TOutputGLSLBase::mapQualifierToString(TQualifier qualifier)
return sh::getQualifierString(qualifier);
}
void TOutputGLSLBase::writeVariableType(const TType &type)
void TOutputGLSLBase::writeVariableType(const TType &type, const TSymbol *symbol)
{
TQualifier qualifier = type.getQualifier();
TInfoSinkBase &out = objSink();
@ -265,11 +274,7 @@ void TOutputGLSLBase::writeVariableType(const TType &type)
}
if (qualifier != EvqTemporary && qualifier != EvqGlobal)
{
const char *qualifierString = mapQualifierToString(qualifier);
if (qualifierString && qualifierString[0] != '\0')
{
out << qualifierString << " ";
}
writeQualifier(qualifier, symbol);
}
const TMemoryQualifier &memoryQualifier = type.getMemoryQualifier();
@ -309,11 +314,6 @@ void TOutputGLSLBase::writeVariableType(const TType &type)
const TStructure *structure = type.getStruct();
declareStruct(structure);
if (structure->symbolType() != SymbolType::Empty)
{
mDeclaredStructs.insert(structure->uniqueId().get());
}
}
else if (type.getBasicType() == EbtInterfaceBlock)
{
@ -336,7 +336,7 @@ void TOutputGLSLBase::writeFunctionParameters(const TFunction *func)
{
const TVariable *param = func->getParam(i);
const TType &type = param->getType();
writeVariableType(type);
writeVariableType(type, param);
if (param->symbolType() != SymbolType::Empty)
out << " " << hashName(param);
@ -894,7 +894,7 @@ void TOutputGLSLBase::visitFunctionPrototype(TIntermFunctionPrototype *node)
TInfoSinkBase &out = objSink();
const TType &type = node->getType();
writeVariableType(type);
writeVariableType(type, node->getFunction());
if (type.isArray())
out << ArrayString(type);
@ -995,7 +995,8 @@ bool TOutputGLSLBase::visitDeclaration(Visit visit, TIntermDeclaration *node)
const TIntermSequence &sequence = *(node->getSequence());
TIntermTyped *variable = sequence.front()->getAsTyped();
writeLayoutQualifier(variable);
writeVariableType(variable->getType());
TIntermSymbol *symbolNode = variable->getAsSymbolNode();
writeVariableType(variable->getType(), symbolNode ? &symbolNode->variable() : nullptr);
if (variable->getAsSymbolNode() == nullptr ||
variable->getAsSymbolNode()->variable().symbolType() != SymbolType::Empty)
{
@ -1174,6 +1175,11 @@ void TOutputGLSLBase::declareStruct(const TStructure *structure)
out << ";\n";
}
out << "}";
if (structure->symbolType() != SymbolType::Empty)
{
mDeclaredStructs.insert(structure->uniqueId().get());
}
}
void TOutputGLSLBase::declareInterfaceBlockLayout(const TInterfaceBlock *interfaceBlock)

View file

@ -42,7 +42,7 @@ class TOutputGLSLBase : public TIntermTraverser
void writeTriplet(Visit visit, const char *preStr, const char *inStr, const char *postStr);
virtual void writeLayoutQualifier(TIntermTyped *variable);
void writeInvariantQualifier(const TType &type);
void writeVariableType(const TType &type);
void writeVariableType(const TType &type, const TSymbol *symbol);
virtual bool writeVariablePrecision(TPrecision precision) = 0;
void writeFunctionParameters(const TFunction *func);
const TConstantUnion *writeConstantUnion(const TType &type, const TConstantUnion *pConstUnion);
@ -77,16 +77,17 @@ class TOutputGLSLBase : public TIntermTraverser
virtual ImmutableString translateTextureFunction(const ImmutableString &name) { return name; }
void declareStruct(const TStructure *structure);
virtual void writeQualifier(TQualifier qualifier, const TSymbol *symbol);
bool structDeclared(const TStructure *structure) const;
private:
bool structDeclared(const TStructure *structure) const;
void declareInterfaceBlockLayout(const TInterfaceBlock *interfaceBlock);
void declareInterfaceBlock(const TInterfaceBlock *interfaceBlock);
void writeBuiltInFunctionTriplet(Visit visit, TOperator op, bool useEmulatedFunction);
const char *mapQualifierToString(TQualifier qialifier);
const char *mapQualifierToString(TQualifier qualifier);
TInfoSinkBase &mObjSink;
bool mDeclaringVariable;

View file

@ -626,14 +626,6 @@ void OutputHLSL::header(TInfoSinkBase &out,
"\n";
}
if (!mappedStructs.empty())
{
out << "// Structures from std140 blocks with padding removed\n";
out << "\n";
out << mappedStructs;
out << "\n";
}
if (usingMRTExtension && mNumRenderTargets > 1)
{
out << "#define GL_USES_MRT\n";
@ -738,14 +730,6 @@ void OutputHLSL::header(TInfoSinkBase &out,
"dx_DepthRange.y, dx_DepthRange.z};\n"
"\n";
}
if (!mappedStructs.empty())
{
out << "// Structures from std140 blocks with padding removed\n";
out << "\n";
out << mappedStructs;
out << "\n";
}
}
else // Compute shader
{
@ -785,6 +769,14 @@ void OutputHLSL::header(TInfoSinkBase &out,
}
}
if (!mappedStructs.empty())
{
out << "// Structures from std140 blocks with padding removed\n";
out << "\n";
out << mappedStructs;
out << "\n";
}
bool getDimensionsIgnoresBaseLevel =
(mCompileOptions & SH_HLSL_GET_DIMENSIONS_IGNORES_BASE_LEVEL) != 0;
mTextureFunctionHLSL->textureFunctionHeader(out, mOutputType, getDimensionsIgnoresBaseLevel);

View file

@ -194,7 +194,7 @@ TParseContext::TParseContext(TSymbolTable &symt,
mShaderVersion,
mShaderType,
resources.WEBGL_debug_shader_precision == 1),
mPreprocessor(mDiagnostics, &mDirectiveHandler, pp::PreprocessorSettings()),
mPreprocessor(mDiagnostics, &mDirectiveHandler, angle::pp::PreprocessorSettings()),
mScanner(nullptr),
mMinProgramTexelOffset(resources.MinProgramTexelOffset),
mMaxProgramTexelOffset(resources.MaxProgramTexelOffset),
@ -1755,7 +1755,7 @@ void TParseContext::handleExtensionDirective(const TSourceLoc &loc,
const char *extName,
const char *behavior)
{
pp::SourceLocation srcLoc;
angle::pp::SourceLocation srcLoc;
srcLoc.file = loc.first_file;
srcLoc.line = loc.first_line;
mDirectiveHandler.handleExtension(srcLoc, extName, behavior);
@ -1766,7 +1766,7 @@ void TParseContext::handlePragmaDirective(const TSourceLoc &loc,
const char *value,
bool stdgl)
{
pp::SourceLocation srcLoc;
angle::pp::SourceLocation srcLoc;
srcLoc.file = loc.first_file;
srcLoc.line = loc.first_line;
mDirectiveHandler.handlePragma(srcLoc, name, value, stdgl);
@ -2632,7 +2632,7 @@ TIntermInvariantDeclaration *TParseContext::parseInvariantDeclaration(
typeQualifier.line);
checkMemoryQualifierIsNotSpecified(typeQualifier.memoryQualifier, typeQualifier.line);
symbolTable.addInvariantVarying(identifier);
symbolTable.addInvariantVarying(*variable);
TIntermSymbol *intermSymbol = new TIntermSymbol(variable);
intermSymbol->setLine(identifierLoc);

View file

@ -43,8 +43,8 @@ class TParseContext : angle::NonCopyable
const ShBuiltInResources &resources);
~TParseContext();
const pp::Preprocessor &getPreprocessor() const { return mPreprocessor; }
pp::Preprocessor &getPreprocessor() { return mPreprocessor; }
const angle::pp::Preprocessor &getPreprocessor() const { return mPreprocessor; }
angle::pp::Preprocessor &getPreprocessor() { return mPreprocessor; }
void *getScanner() const { return mScanner; }
void setScanner(void *scanner) { mScanner = scanner; }
int getShaderVersion() const { return mShaderVersion; }
@ -607,7 +607,7 @@ class TParseContext : angle::NonCopyable
TString mHashErrMsg;
TDiagnostics *mDiagnostics;
TDirectiveHandler mDirectiveHandler;
pp::Preprocessor mPreprocessor;
angle::pp::Preprocessor mPreprocessor;
void *mScanner;
int mMinProgramTexelOffset;
int mMaxProgramTexelOffset;

View file

@ -33,11 +33,13 @@ static const char kFunctionMangledNameSeparator = '(';
TSymbol::TSymbol(TSymbolTable *symbolTable,
const ImmutableString &name,
SymbolType symbolType,
SymbolClass symbolClass,
TExtension extension)
: mName(name),
mUniqueId(symbolTable->nextUniqueId()),
mSymbolType(symbolType),
mExtension(extension)
mExtension(extension),
mSymbolClass(symbolClass)
{
ASSERT(mSymbolType == SymbolType::BuiltIn || mExtension == TExtension::UNDEFINED);
ASSERT(mName != "" || mSymbolType == SymbolType::AngleInternal ||
@ -62,6 +64,12 @@ ImmutableString TSymbol::name() const
ImmutableString TSymbol::getMangledName() const
{
if (mSymbolClass == SymbolClass::Function)
{
// We do this instead of using proper virtual functions so that we can better support
// constexpr symbols.
return static_cast<const TFunction *>(this)->getFunctionMangledName();
}
ASSERT(mSymbolType != SymbolType::Empty);
return name();
}
@ -71,7 +79,9 @@ TVariable::TVariable(TSymbolTable *symbolTable,
const TType *type,
SymbolType symbolType,
TExtension extension)
: TSymbol(symbolTable, name, symbolType, extension), mType(type), unionArray(nullptr)
: TSymbol(symbolTable, name, symbolType, SymbolClass::Variable, extension),
mType(type),
unionArray(nullptr)
{
ASSERT(mType);
}
@ -80,7 +90,7 @@ TStructure::TStructure(TSymbolTable *symbolTable,
const ImmutableString &name,
const TFieldList *fields,
SymbolType symbolType)
: TSymbol(symbolTable, name, symbolType), TFieldListCollection(fields)
: TSymbol(symbolTable, name, symbolType, SymbolClass::Struct), TFieldListCollection(fields)
{
}
@ -88,7 +98,8 @@ TStructure::TStructure(const TSymbolUniqueId &id,
const ImmutableString &name,
TExtension extension,
const TFieldList *fields)
: TSymbol(id, name, SymbolType::BuiltIn, extension), TFieldListCollection(fields)
: TSymbol(id, name, SymbolType::BuiltIn, extension, SymbolClass::Struct),
TFieldListCollection(fields)
{
}
@ -126,7 +137,7 @@ TInterfaceBlock::TInterfaceBlock(TSymbolTable *symbolTable,
const TLayoutQualifier &layoutQualifier,
SymbolType symbolType,
TExtension extension)
: TSymbol(symbolTable, name, symbolType, extension),
: TSymbol(symbolTable, name, symbolType, SymbolClass::InterfaceBlock, extension),
TFieldListCollection(fields),
mBlockStorage(layoutQualifier.blockStorage),
mBinding(layoutQualifier.binding)
@ -138,7 +149,7 @@ TInterfaceBlock::TInterfaceBlock(const TSymbolUniqueId &id,
const ImmutableString &name,
TExtension extension,
const TFieldList *fields)
: TSymbol(id, name, SymbolType::BuiltIn, extension),
: TSymbol(id, name, SymbolType::BuiltIn, extension, SymbolClass::InterfaceBlock),
TFieldListCollection(fields),
mBlockStorage(EbsUnspecified),
mBinding(0)
@ -150,7 +161,7 @@ TFunction::TFunction(TSymbolTable *symbolTable,
SymbolType symbolType,
const TType *retType,
bool knownToNotHaveSideEffects)
: TSymbol(symbolTable, name, symbolType, TExtension::UNDEFINED),
: TSymbol(symbolTable, name, symbolType, SymbolClass::Function, TExtension::UNDEFINED),
mParametersVector(new TParamVector()),
mParameters(nullptr),
mParamCount(0u),

View file

@ -28,6 +28,14 @@ enum class SymbolType
Empty // Meaning symbol without a name.
};
enum class SymbolClass
{
Function,
Variable,
Struct,
InterfaceBlock
};
// Symbol base class. (Can build functions or variables out of these...)
class TSymbol : angle::NonCopyable
{
@ -36,9 +44,10 @@ class TSymbol : angle::NonCopyable
TSymbol(TSymbolTable *symbolTable,
const ImmutableString &name,
SymbolType symbolType,
SymbolClass symbolClass,
TExtension extension = TExtension::UNDEFINED);
// Note that we don't have a virtual destructor in order to support constexpr symbols. Data is
// Note that we can't have a virtual destructor in order to support constexpr symbols. Data is
// either statically allocated or pool allocated.
~TSymbol() = default;
@ -46,11 +55,11 @@ class TSymbol : angle::NonCopyable
// as for internal variables.
ImmutableString name() const;
// Don't call getMangledName() for empty symbols (symbolType == SymbolType::Empty).
virtual ImmutableString getMangledName() const;
ImmutableString getMangledName() const;
virtual bool isFunction() const { return false; }
virtual bool isVariable() const { return false; }
virtual bool isStruct() const { return false; }
bool isFunction() const { return mSymbolClass == SymbolClass::Function; }
bool isVariable() const { return mSymbolClass == SymbolClass::Variable; }
bool isStruct() const { return mSymbolClass == SymbolClass::Struct; }
const TSymbolUniqueId &uniqueId() const { return mUniqueId; }
SymbolType symbolType() const { return mSymbolType; }
@ -60,8 +69,13 @@ class TSymbol : angle::NonCopyable
constexpr TSymbol(const TSymbolUniqueId &id,
const ImmutableString &name,
SymbolType symbolType,
TExtension extension)
: mName(name), mUniqueId(id), mSymbolType(symbolType), mExtension(extension)
TExtension extension,
SymbolClass symbolClass)
: mName(name),
mUniqueId(id),
mSymbolType(symbolType),
mExtension(extension),
mSymbolClass(symbolClass)
{
}
@ -71,6 +85,10 @@ class TSymbol : angle::NonCopyable
const TSymbolUniqueId mUniqueId;
const SymbolType mSymbolType;
const TExtension mExtension;
// We use this instead of having virtual functions for querying the class in order to support
// constexpr symbols.
const SymbolClass mSymbolClass;
};
// Variable.
@ -84,7 +102,6 @@ class TVariable : public TSymbol
SymbolType symbolType,
TExtension ext = TExtension::UNDEFINED);
bool isVariable() const override { return true; }
const TType &getType() const { return *mType; }
const TConstantUnion *getConstPointer() const { return unionArray; }
@ -97,7 +114,9 @@ class TVariable : public TSymbol
SymbolType symbolType,
TExtension extension,
const TType *type)
: TSymbol(id, name, symbolType, extension), mType(type), unionArray(nullptr)
: TSymbol(id, name, symbolType, extension, SymbolClass::Variable),
mType(type),
unionArray(nullptr)
{
}
@ -115,8 +134,6 @@ class TStructure : public TSymbol, public TFieldListCollection
const TFieldList *fields,
SymbolType symbolType);
bool isStruct() const override { return true; }
// The char arrays passed in must be pool allocated or static.
void createSamplerSymbols(const char *namePrefix,
const TString &apiNamePrefix,
@ -204,12 +221,10 @@ class TFunction : public TSymbol
const TType *retType,
bool knownToNotHaveSideEffects);
bool isFunction() const override { return true; }
void addParameter(const TVariable *p);
void shareParameters(const TFunction &parametersSource);
ImmutableString getMangledName() const override
ImmutableString getFunctionMangledName() const
{
ASSERT(symbolType() != SymbolType::BuiltIn);
if (mMangledName.empty())
@ -245,7 +260,7 @@ class TFunction : public TSymbol
const TType *retType,
TOperator op,
bool knownToNotHaveSideEffects)
: TSymbol(id, name, SymbolType::BuiltIn, extension),
: TSymbol(id, name, SymbolType::BuiltIn, extension, SymbolClass::Function),
mParametersVector(nullptr),
mParameters(parameters),
mParamCount(paramCount),

View file

@ -13,9 +13,6 @@
#include "compiler/translator/SymbolTable.h"
#include <algorithm>
#include <set>
#include "angle_gl.h"
#include "compiler/translator/ImmutableString.h"
#include "compiler/translator/IntermNode.h"
@ -27,7 +24,7 @@ namespace sh
class TSymbolTable::TSymbolTableLevel
{
public:
TSymbolTableLevel() : mGlobalInvariant(false) {}
TSymbolTableLevel() {}
bool insert(TSymbol *symbol);
@ -36,15 +33,6 @@ class TSymbolTable::TSymbolTableLevel
TSymbol *find(const ImmutableString &name) const;
void addInvariantVarying(const ImmutableString &name) { mInvariantVaryings.insert(name); }
bool isVaryingInvariant(const ImmutableString &name)
{
return (mGlobalInvariant || mInvariantVaryings.count(name) > 0);
}
void setGlobalInvariant(bool invariant) { mGlobalInvariant = invariant; }
private:
using tLevel = TUnorderedMap<ImmutableString,
TSymbol *,
@ -53,9 +41,6 @@ class TSymbolTable::TSymbolTableLevel
using tInsertResult = std::pair<tLevel::iterator, bool>;
tLevel level;
std::set<ImmutableString> mInvariantVaryings;
bool mGlobalInvariant;
};
bool TSymbolTable::TSymbolTableLevel::insert(TSymbol *symbol)
@ -80,7 +65,10 @@ TSymbol *TSymbolTable::TSymbolTableLevel::find(const ImmutableString &name) cons
}
TSymbolTable::TSymbolTable()
: mUniqueIdCounter(0), mShaderType(GL_FRAGMENT_SHADER), mGlInVariableWithArraySize(nullptr)
: mGlobalInvariant(false),
mUniqueIdCounter(0),
mShaderType(GL_FRAGMENT_SHADER),
mGlInVariableWithArraySize(nullptr)
{
}
@ -168,26 +156,26 @@ const TVariable *TSymbolTable::gl_SecondaryFragDataEXT() const
return mVar_gl_SecondaryFragDataEXT;
}
void TSymbolTable::markStaticWrite(const TVariable &variable)
{
int id = variable.uniqueId().get();
TSymbolTable::VariableMetadata *TSymbolTable::getOrCreateVariableMetadata(const TVariable &variable) {
int id = variable.uniqueId().get();
auto iter = mVariableMetadata.find(id);
if (iter == mVariableMetadata.end())
{
iter = mVariableMetadata.insert(std::make_pair(id, VariableMetadata())).first;
}
iter->second.staticWrite = true;
return &iter->second;
}
void TSymbolTable::markStaticWrite(const TVariable &variable)
{
auto metadata = getOrCreateVariableMetadata(variable);
metadata->staticWrite = true;
}
void TSymbolTable::markStaticRead(const TVariable &variable)
{
int id = variable.uniqueId().get();
auto iter = mVariableMetadata.find(id);
if (iter == mVariableMetadata.end())
{
iter = mVariableMetadata.insert(std::make_pair(id, VariableMetadata())).first;
}
iter->second.staticRead = true;
auto metadata = getOrCreateVariableMetadata(variable);
metadata->staticRead = true;
}
bool TSymbolTable::isStaticallyUsed(const TVariable &variable) const
@ -195,7 +183,32 @@ bool TSymbolTable::isStaticallyUsed(const TVariable &variable) const
ASSERT(!variable.getConstPointer());
int id = variable.uniqueId().get();
auto iter = mVariableMetadata.find(id);
return iter != mVariableMetadata.end();
return iter != mVariableMetadata.end() && (iter->second.staticRead || iter->second.staticWrite);
}
void TSymbolTable::addInvariantVarying(const TVariable &variable)
{
ASSERT(atGlobalLevel());
auto metadata = getOrCreateVariableMetadata(variable);
metadata->invariant = true;
}
bool TSymbolTable::isVaryingInvariant(const TVariable &variable) const
{
ASSERT(atGlobalLevel());
if (mGlobalInvariant)
{
return true;
}
int id = variable.uniqueId().get();
auto iter = mVariableMetadata.find(id);
return iter != mVariableMetadata.end() && iter->second.invariant;
}
void TSymbolTable::setGlobalInvariant(bool invariant)
{
ASSERT(atGlobalLevel());
mGlobalInvariant = invariant;
}
const TSymbol *TSymbolTable::find(const ImmutableString &name, int shaderVersion) const
@ -278,26 +291,9 @@ TPrecision TSymbolTable::getDefaultPrecision(TBasicType type) const
return prec;
}
void TSymbolTable::addInvariantVarying(const ImmutableString &originalName)
{
ASSERT(atGlobalLevel());
mTable.back()->addInvariantVarying(originalName);
}
bool TSymbolTable::isVaryingInvariant(const ImmutableString &originalName) const
{
ASSERT(atGlobalLevel());
return mTable.back()->isVaryingInvariant(originalName);
}
void TSymbolTable::setGlobalInvariant(bool invariant)
{
ASSERT(atGlobalLevel());
mTable.back()->setGlobalInvariant(invariant);
}
void TSymbolTable::clearCompilationResults()
{
mGlobalInvariant = false;
mUniqueIdCounter = kLastBuiltInId + 1;
mVariableMetadata.clear();
mGlInVariableWithArraySize = nullptr;
@ -360,7 +356,7 @@ void TSymbolTable::initSamplerDefaultPrecision(TBasicType samplerType)
setDefaultPrecision(samplerType, EbpLow);
}
TSymbolTable::VariableMetadata::VariableMetadata() : staticRead(false), staticWrite(false)
TSymbolTable::VariableMetadata::VariableMetadata() : staticRead(false), staticWrite(false), invariant(false)
{
}

View file

@ -31,6 +31,7 @@
//
#include <memory>
#include <set>
#include "common/angleutils.h"
#include "compiler/translator/ExtensionBehavior.h"
@ -117,15 +118,11 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase
// for the specified TBasicType
TPrecision getDefaultPrecision(TBasicType type) const;
// This records invariant varyings declared through
// "invariant varying_name;".
void addInvariantVarying(const ImmutableString &originalName);
// This records invariant varyings declared through "invariant varying_name;".
void addInvariantVarying(const TVariable &variable);
// If this returns false, the varying could still be invariant
// if it is set as invariant during the varying variable
// declaration - this piece of information is stored in the
// variable's type, not here.
bool isVaryingInvariant(const ImmutableString &originalName) const;
// If this returns false, the varying could still be invariant if it is set as invariant during the varying variable declaration - this piece of information is stored in the variable's type, not here.
bool isVaryingInvariant(const TVariable &variable) const;
void setGlobalInvariant(bool invariant);
@ -142,6 +139,15 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase
private:
friend class TSymbolUniqueId;
struct VariableMetadata
{
VariableMetadata();
bool staticRead;
bool staticWrite;
bool invariant;
};
int nextUniqueIdValue();
class TSymbolTableLevel;
@ -154,6 +160,8 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase
ShShaderSpec spec,
const ShBuiltInResources &resources);
VariableMetadata *getOrCreateVariableMetadata(const TVariable &variable);
std::vector<std::unique_ptr<TSymbolTableLevel>> mTable;
// There's one precision stack level for predefined precisions and then one level for each scope
@ -161,6 +169,8 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase
typedef TMap<TBasicType, TPrecision> PrecisionStackLevel;
std::vector<std::unique_ptr<PrecisionStackLevel>> mPrecisionStack;
bool mGlobalInvariant;
int mUniqueIdCounter;
static const int kLastBuiltInId;
@ -168,13 +178,6 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase
sh::GLenum mShaderType;
ShBuiltInResources mResources;
struct VariableMetadata
{
VariableMetadata();
bool staticRead;
bool staticWrite;
};
// Indexed by unique id. Map instead of vector since the variables are fairly sparse.
std::map<int, VariableMetadata> mVariableMetadata;

View file

@ -66,6 +66,7 @@ using namespace sh;
#endif
#endif
#define YY_NO_INPUT
#define YY_USER_ACTION \
yylloc->first_file = yylloc->last_file = yycolumn; \
yylloc->first_line = yylloc->last_line = yylineno;
@ -425,9 +426,9 @@ O [0-7]
%%
yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) {
pp::Token token;
angle::pp::Token token;
yyget_extra(yyscanner)->getPreprocessor().lex(&token);
yy_size_t len = token.type == pp::Token::LAST ? 0 : token.text.size();
yy_size_t len = token.type == angle::pp::Token::LAST ? 0 : token.text.size();
if (len < max_size)
memcpy(buf, token.text.c_str(), len);
yyset_column(token.location.file, yyscanner);
@ -679,7 +680,7 @@ int glslang_scan(size_t count, const char* const string[], const int length[],
yyset_lineno(1, context->getScanner());
// Initialize preprocessor.
pp::Preprocessor *preprocessor = &context->getPreprocessor();
angle::pp::Preprocessor *preprocessor = &context->getPreprocessor();
if (!preprocessor->init(count, string, length))
return 1;

View file

@ -1205,6 +1205,7 @@ using namespace sh;
#endif
#endif
#define YY_NO_INPUT
#define YY_USER_ACTION \
yylloc->first_file = yylloc->last_file = yycolumn; \
yylloc->first_line = yylloc->last_line = yylineno;
@ -3781,9 +3782,9 @@ void yyfree (void * ptr , yyscan_t yyscanner)
yy_size_t string_input(char* buf, yy_size_t max_size, yyscan_t yyscanner) {
pp::Token token;
angle::pp::Token token;
yyget_extra(yyscanner)->getPreprocessor().lex(&token);
yy_size_t len = token.type == pp::Token::LAST ? 0 : token.text.size();
yy_size_t len = token.type == angle::pp::Token::LAST ? 0 : token.text.size();
if (len < max_size)
memcpy(buf, token.text.c_str(), len);
yyset_column(token.location.file, yyscanner);
@ -4035,7 +4036,7 @@ int glslang_scan(size_t count, const char* const string[], const int length[],
yyset_lineno(1, context->getScanner());
// Initialize preprocessor.
pp::Preprocessor *preprocessor = &context->getPreprocessor();
angle::pp::Preprocessor *preprocessor = &context->getPreprocessor();
if (!preprocessor->init(count, string, length))
return 1;

View file

@ -0,0 +1,93 @@
//
// Copyright (c) 2018 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.
//
// RewriteRepeatedAssignToSwizzled.cpp: Rewrite expressions that assign an assignment to a swizzled
// vector, like:
// v.x = z = expression;
// to:
// z = expression;
// v.x = z;
//
// Note that this doesn't handle some corner cases: expressions nested inside other expressions,
// inside loop headers, or inside if conditions.
#include "compiler/translator/tree_ops/RewriteRepeatedAssignToSwizzled.h"
#include "compiler/translator/tree_util/IntermNode_util.h"
#include "compiler/translator/tree_util/IntermTraverse.h"
namespace sh
{
namespace
{
class RewriteAssignToSwizzledTraverser : public TIntermTraverser
{
public:
static void rewrite(TIntermBlock *root);
private:
RewriteAssignToSwizzledTraverser();
bool visitBinary(Visit, TIntermBinary *node) override;
void nextIteration();
bool didRewrite() { return mDidRewrite; }
bool mDidRewrite;
};
// static
void RewriteAssignToSwizzledTraverser::rewrite(TIntermBlock *root)
{
RewriteAssignToSwizzledTraverser rewrite;
do
{
rewrite.nextIteration();
root->traverse(&rewrite);
rewrite.updateTree();
} while (rewrite.didRewrite());
}
RewriteAssignToSwizzledTraverser::RewriteAssignToSwizzledTraverser()
: TIntermTraverser(true, false, false), mDidRewrite(false)
{
}
void RewriteAssignToSwizzledTraverser::nextIteration()
{
mDidRewrite = false;
}
bool RewriteAssignToSwizzledTraverser::visitBinary(Visit, TIntermBinary *node)
{
TIntermBinary *rightBinary = node->getRight()->getAsBinaryNode();
TIntermBlock *parentBlock = getParentNode()->getAsBlock();
if (parentBlock && node->isAssignment() && node->getLeft()->getAsSwizzleNode() && rightBinary &&
rightBinary->isAssignment())
{
TIntermSequence replacements;
replacements.push_back(rightBinary);
TIntermTyped *rightAssignmentTargetCopy = rightBinary->getLeft()->deepCopy();
TIntermBinary *lastAssign =
new TIntermBinary(EOpAssign, node->getLeft(), rightAssignmentTargetCopy);
replacements.push_back(lastAssign);
mMultiReplacements.push_back(NodeReplaceWithMultipleEntry(parentBlock, node, replacements));
mDidRewrite = true;
return false;
}
return true;
}
} // anonymous namespace
void RewriteRepeatedAssignToSwizzled(TIntermBlock *root)
{
RewriteAssignToSwizzledTraverser::rewrite(root);
}
} // namespace sh

View file

@ -0,0 +1,28 @@
//
// Copyright (c) 2018 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.
//
// RewriteRepeatedAssignToSwizzled.h: Rewrite expressions that assign an assignment to a swizzled
// vector, like:
// v.x = z = expression;
// to:
// z = expression;
// v.x = z;
//
// Note that this doesn't handle some corner cases: expressions nested inside other expressions,
// inside loop headers, or inside if conditions.
#ifndef COMPILER_TRANSLATOR_TREEOPS_REWRITEREPEATEDASSIGNTOSWIZZLED_H_
#define COMPILER_TRANSLATOR_TREEOPS_REWRITEREPEATEDASSIGNTOSWIZZLED_H_
namespace sh
{
class TIntermBlock;
void RewriteRepeatedAssignToSwizzled(TIntermBlock *root);
} // namespace sh
#endif // COMPILER_TRANSLATOR_TREEOPS_REWRITEREPEATEDASSIGNTOSWIZZLED_H_

View file

@ -33,6 +33,9 @@ enum Visit
//
// When using this, just fill in the methods for nodes you want visited.
// Return false from a pre-visit to skip visiting that node's subtree.
//
// See also how to write AST transformations documentation:
// https://github.com/google/angle/blob/master/doc/WritingShaderASTTransformations.md
class TIntermTraverser : angle::NonCopyable
{
public:

View file

@ -14,7 +14,7 @@
bool atoi_clamp(const char *str, unsigned int *value)
{
bool success = pp::numeric_lex_int(str, value);
bool success = angle::pp::numeric_lex_int(str, value);
if (!success)
*value = std::numeric_limits<unsigned int>::max();
return success;
@ -184,7 +184,7 @@ float NumericLexFloat32OutOfRangeToInfinity(const std::string &str)
bool strtof_clamp(const std::string &str, float *value)
{
// Try the standard float parsing path first.
bool success = pp::numeric_lex_float(str, value);
bool success = angle::pp::numeric_lex_float(str, value);
// If the standard path doesn't succeed, take the path that can handle the following corner
// cases:

View file

@ -19,11 +19,6 @@ namespace angle
using VendorID = uint32_t;
using DeviceID = uint32_t;
constexpr VendorID kVendorID_AMD = 0x1002;
constexpr VendorID kVendorID_Intel = 0x8086;
constexpr VendorID kVendorID_Nvidia = 0x10DE;
constexpr VendorID kVendorID_Qualcomm = 0x5143;
struct GPUDeviceInfo
{
GPUDeviceInfo();
@ -47,7 +42,12 @@ struct SystemInfo
SystemInfo(const SystemInfo &other);
std::vector<GPUDeviceInfo> gpus;
// Index of the primary GPU (the discrete one on dual GPU systems) in `gpus`.
// Will never be -1 after a successful GetSystemInfo.
int primaryGPUIndex = -1;
// Index of the currently active GPU in `gpus`, can be -1 if the active GPU could not be
// detected.
int activeGPUIndex = -1;
bool isOptimus = false;
@ -61,8 +61,18 @@ struct SystemInfo
std::string primaryDisplayDeviceId;
};
// Gathers information about the system without starting a GPU driver and returns them in `info`.
// Returns true if all info was gathered, false otherwise. Even when false is returned, `info` will
// be filled with partial information.
bool GetSystemInfo(SystemInfo *info);
// Known PCI vendor IDs
constexpr VendorID kVendorID_AMD = 0x1002;
constexpr VendorID kVendorID_Intel = 0x8086;
constexpr VendorID kVendorID_Nvidia = 0x10DE;
constexpr VendorID kVendorID_Qualcomm = 0x5143;
// Predicates on vendor IDs
bool IsAMD(VendorID vendorId);
bool IsIntel(VendorID vendorId);
bool IsNvidia(VendorID vendorId);

View file

@ -7,6 +7,7 @@
#ifndef LIBANGLE_ATTRIBUTEMAP_H_
#define LIBANGLE_ATTRIBUTEMAP_H_
#include "libANGLE/PackedEnums.h"
#include <EGL/egl.h>
@ -25,10 +26,27 @@ class AttributeMap final
void insert(EGLAttrib key, EGLAttrib value);
bool contains(EGLAttrib key) const;
EGLAttrib get(EGLAttrib key) const;
EGLAttrib get(EGLAttrib key, EGLAttrib defaultValue) const;
EGLint getAsInt(EGLAttrib key) const;
EGLint getAsInt(EGLAttrib key, EGLint defaultValue) const;
template <typename PackedEnumT>
PackedEnumT getAsPackedEnum(EGLAttrib key) const
{
return FromEGLenum<PackedEnumT>(static_cast<EGLenum>(get(key)));
}
template <typename PackedEnumT>
PackedEnumT getAsPackedEnum(EGLAttrib key, PackedEnumT defaultValue) const
{
auto iter = mAttributes.find(key);
return (mAttributes.find(key) != mAttributes.end())
? FromEGLenum<PackedEnumT>(static_cast<EGLenum>(iter->second))
: defaultValue;
}
bool isEmpty() const;
std::vector<EGLint> toIntVector() const;

View file

@ -88,8 +88,8 @@ Error Buffer::bufferData(const Context *context,
mState.mUsage = usage;
mState.mSize = size;
// Notify when data changes.
mImpl->onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
// Notify when storage changes.
mImpl->onStateChange(context, angle::SubjectMessage::STORAGE_CHANGED);
return NoError();
}
@ -243,7 +243,7 @@ bool Buffer::isBoundForTransformFeedbackAndOtherUse() const
mState.mTransformFeedbackBindingCount != mState.mBindingCount;
}
void Buffer::onBindingChanged(bool bound, BufferBinding target)
void Buffer::onBindingChanged(const Context *context, bool bound, BufferBinding target)
{
ASSERT(bound || mState.mBindingCount > 0);
mState.mBindingCount += bound ? 1 : -1;
@ -251,6 +251,8 @@ void Buffer::onBindingChanged(bool bound, BufferBinding target)
{
ASSERT(bound || mState.mTransformFeedbackBindingCount > 0);
mState.mTransformFeedbackBindingCount += bound ? 1 : -1;
mImpl->onStateChange(context, angle::SubjectMessage::BINDING_CHANGED);
}
}

View file

@ -15,7 +15,7 @@
#include "libANGLE/Debug.h"
#include "libANGLE/Error.h"
#include "libANGLE/IndexRangeCache.h"
#include "libANGLE/PackedGLEnums.h"
#include "libANGLE/PackedEnums.h"
#include "libANGLE/RefCountObject.h"
namespace rx
@ -116,7 +116,7 @@ class Buffer final : public RefCountObject, public LabeledObject
bool isBound() const;
bool isBoundForTransformFeedbackAndOtherUse() const;
void onBindingChanged(bool bound, BufferBinding target);
void onBindingChanged(const Context *context, bool bound, BufferBinding target);
private:
BufferState mState;

View file

@ -160,6 +160,16 @@ Extensions::Extensions()
textureCompressionASTCHDR(false),
textureCompressionASTCLDR(false),
compressedETC1RGB8Texture(false),
compressedETC2RGB8Texture(false),
compressedETC2sRGB8Texture(false),
compressedETC2PunchthroughARGB8Texture(false),
compressedETC2PunchthroughAsRGB8AlphaTexture(false),
compressedETC2RGBA8Texture(false),
compressedETC2sRGB8Alpha8Texture(false),
compressedEACR11UnsignedTexture(false),
compressedEACR11SignedTexture(false),
compressedEACRG11UnsignedTexture(false),
compressedEACRG11SignedTexture(false),
sRGB(false),
depthTextures(false),
depth32(false),
@ -226,7 +236,11 @@ Extensions::Extensions()
robustResourceInitialization(false),
programCacheControl(false),
textureRectangle(false),
geometryShader(false)
geometryShader(false),
pointSizeArray(false),
textureCubeMap(false),
explicitContextGles1(false),
explicitContext(false)
{
}
@ -490,6 +504,106 @@ static bool DetermineETC1RGB8TextureSupport(const TextureCapsMap &textureCaps)
return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
}
// Check for OES_compressed_ETC2_RGB8_texture
static bool DetermineETC2RGB8TextureSupport(const TextureCapsMap &textureCaps)
{
constexpr GLenum requiredFormats[] = {
GL_COMPRESSED_RGB8_ETC2,
};
return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
}
// Check for OES_compressed_ETC2_sRGB8_texture
static bool DetermineETC2sRGB8TextureSupport(const TextureCapsMap &textureCaps)
{
constexpr GLenum requiredFormats[] = {
GL_COMPRESSED_SRGB8_ETC2,
};
return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
}
// Check for OES_compressed_ETC2_punchthroughA_RGBA8_texture
static bool DetermineETC2PunchthroughARGB8TextureSupport(const TextureCapsMap &textureCaps)
{
constexpr GLenum requiredFormats[] = {
GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
};
return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
}
// Check for OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture
static bool DetermineETC2PunchthroughAsRGB8AlphaTextureSupport(const TextureCapsMap &textureCaps)
{
constexpr GLenum requiredFormats[] = {
GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
};
return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
}
// Check for OES_compressed_ETC2_RGBA8_texture
static bool DetermineETC2RGBA8TextureSupport(const TextureCapsMap &textureCaps)
{
constexpr GLenum requiredFormats[] = {
GL_COMPRESSED_RGBA8_ETC2_EAC,
};
return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
}
// Check for OES_compressed_ETC2_sRGB8_alpha8_texture
static bool DetermineETC2sRGB8Alpha8TextureSupport(const TextureCapsMap &textureCaps)
{
constexpr GLenum requiredFormats[] = {
GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,
};
return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
}
// Check for OES_compressed_EAC_R11_unsigned_texture
static bool DetermineEACR11UnsignedTextureSupport(const TextureCapsMap &textureCaps)
{
constexpr GLenum requiredFormats[] = {
GL_COMPRESSED_R11_EAC,
};
return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
}
// Check for OES_compressed_EAC_R11_signed_texture
static bool DetermineEACR11SignedTextureSupport(const TextureCapsMap &textureCaps)
{
constexpr GLenum requiredFormats[] = {
GL_COMPRESSED_SIGNED_R11_EAC,
};
return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
}
// Check for OES_compressed_EAC_RG11_unsigned_texture
static bool DetermineEACRG11UnsignedTextureSupport(const TextureCapsMap &textureCaps)
{
constexpr GLenum requiredFormats[] = {
GL_COMPRESSED_RG11_EAC,
};
return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
}
// Check for OES_compressed_EAC_RG11_signed_texture
static bool DetermineEACRG11SignedTextureSupport(const TextureCapsMap &textureCaps)
{
constexpr GLenum requiredFormats[] = {
GL_COMPRESSED_SIGNED_RG11_EAC,
};
return GetFormatSupport(textureCaps, requiredFormats, true, true, false);
}
// Check for GL_ANGLE_texture_compression_dxt5
static bool DetermineSRGBTextureSupport(const TextureCapsMap &textureCaps)
{
@ -589,6 +703,18 @@ void Extensions::setTextureExtensionSupport(const TextureCapsMap &textureCaps)
textureCompressionASTCHDR = DetermineASTCTextureSupport(textureCaps);
textureCompressionASTCLDR = textureCompressionASTCHDR;
compressedETC1RGB8Texture = DetermineETC1RGB8TextureSupport(textureCaps);
compressedETC2RGB8Texture = DetermineETC2RGB8TextureSupport(textureCaps);
compressedETC2sRGB8Texture = DetermineETC2sRGB8TextureSupport(textureCaps);
compressedETC2PunchthroughARGB8Texture =
DetermineETC2PunchthroughARGB8TextureSupport(textureCaps);
compressedETC2PunchthroughAsRGB8AlphaTexture =
DetermineETC2PunchthroughAsRGB8AlphaTextureSupport(textureCaps);
compressedETC2RGBA8Texture = DetermineETC2RGBA8TextureSupport(textureCaps);
compressedETC2sRGB8Alpha8Texture = DetermineETC2sRGB8Alpha8TextureSupport(textureCaps);
compressedEACR11UnsignedTexture = DetermineEACR11UnsignedTextureSupport(textureCaps);
compressedEACR11SignedTexture = DetermineEACR11SignedTextureSupport(textureCaps);
compressedEACRG11UnsignedTexture = DetermineEACRG11UnsignedTextureSupport(textureCaps);
compressedEACRG11SignedTexture = DetermineEACRG11SignedTextureSupport(textureCaps);
sRGB = DetermineSRGBTextureSupport(textureCaps);
depthTextures = DetermineDepthTextureSupport(textureCaps);
depth32 = DetermineDepth32Support(textureCaps);
@ -638,10 +764,20 @@ const ExtensionInfoMap &GetExtensionInfoMap()
map["GL_KHR_texture_compression_astc_hdr"] = enableableExtension(&Extensions::textureCompressionASTCHDR);
map["GL_KHR_texture_compression_astc_ldr"] = enableableExtension(&Extensions::textureCompressionASTCLDR);
map["GL_OES_compressed_ETC1_RGB8_texture"] = enableableExtension(&Extensions::compressedETC1RGB8Texture);
map["OES_compressed_ETC2_RGB8_texture"] = enableableExtension(&Extensions::compressedETC2RGB8Texture);
map["OES_compressed_ETC2_sRGB8_texture"] = enableableExtension(&Extensions::compressedETC2sRGB8Texture);
map["OES_compressed_ETC2_punchthroughA_RGBA8_texture"] = enableableExtension(&Extensions::compressedETC2PunchthroughARGB8Texture);
map["OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture"] = enableableExtension(&Extensions::compressedETC2PunchthroughAsRGB8AlphaTexture);
map["OES_compressed_ETC2_RGBA8_texture"] = enableableExtension(&Extensions::compressedETC2RGBA8Texture);
map["OES_compressed_ETC2_sRGB8_alpha8_texture"] = enableableExtension(&Extensions::compressedETC2sRGB8Alpha8Texture);
map["OES_compressed_EAC_R11_unsigned_texture"] = enableableExtension(&Extensions::compressedEACR11UnsignedTexture);
map["OES_compressed_EAC_R11_signed_texture"] = enableableExtension(&Extensions::compressedEACR11SignedTexture);
map["OES_compressed_EAC_RG11_unsigned_texture"] = enableableExtension(&Extensions::compressedEACRG11UnsignedTexture);
map["OES_compressed_EAC_RG11_signed_texture"] = enableableExtension(&Extensions::compressedEACRG11SignedTexture);
map["GL_EXT_sRGB"] = enableableExtension(&Extensions::sRGB);
map["GL_ANGLE_depth_texture"] = esOnlyExtension(&Extensions::depthTextures);
map["GL_OES_depth32"] = esOnlyExtension(&Extensions::depth32);
map["GL_EXT_texture_storage"] = esOnlyExtension(&Extensions::textureStorage);
map["GL_EXT_texture_storage"] = enableableExtension(&Extensions::textureStorage);
map["GL_OES_texture_npot"] = enableableExtension(&Extensions::textureNPOT);
map["GL_EXT_draw_buffers"] = enableableExtension(&Extensions::drawBuffers);
map["GL_EXT_texture_filter_anisotropic"] = enableableExtension(&Extensions::textureFilterAnisotropic);
@ -664,14 +800,14 @@ const ExtensionInfoMap &GetExtensionInfoMap()
map["GL_OES_fbo_render_mipmap"] = enableableExtension(&Extensions::fboRenderMipmap);
map["GL_EXT_discard_framebuffer"] = esOnlyExtension(&Extensions::discardFramebuffer);
map["GL_EXT_debug_marker"] = esOnlyExtension(&Extensions::debugMarker);
map["GL_OES_EGL_image"] = esOnlyExtension(&Extensions::eglImage);
map["GL_OES_EGL_image_external"] = esOnlyExtension(&Extensions::eglImageExternal);
map["GL_OES_EGL_image_external_essl3"] = esOnlyExtension(&Extensions::eglImageExternalEssl3);
map["GL_NV_EGL_stream_consumer_external"] = esOnlyExtension(&Extensions::eglStreamConsumerExternal);
map["GL_OES_EGL_image"] = enableableExtension(&Extensions::eglImage);
map["GL_OES_EGL_image_external"] = enableableExtension(&Extensions::eglImageExternal);
map["GL_OES_EGL_image_external_essl3"] = enableableExtension(&Extensions::eglImageExternalEssl3);
map["GL_NV_EGL_stream_consumer_external"] = enableableExtension(&Extensions::eglStreamConsumerExternal);
map["GL_EXT_unpack_subimage"] = enableableExtension(&Extensions::unpackSubimage);
map["GL_NV_pack_subimage"] = enableableExtension(&Extensions::packSubimage);
map["GL_EXT_color_buffer_float"] = enableableExtension(&Extensions::colorBufferFloat);
map["GL_OES_vertex_array_object"] = esOnlyExtension(&Extensions::vertexArrayObject);
map["GL_OES_vertex_array_object"] = enableableExtension(&Extensions::vertexArrayObject);
map["GL_KHR_debug"] = esOnlyExtension(&Extensions::debug);
// TODO(jmadill): Enable this when complete.
//map["GL_KHR_no_error"] = esOnlyExtension(&Extensions::noError);
@ -698,6 +834,11 @@ const ExtensionInfoMap &GetExtensionInfoMap()
map["GL_ANGLE_program_cache_control"] = esOnlyExtension(&Extensions::programCacheControl);
map["GL_ANGLE_texture_rectangle"] = enableableExtension(&Extensions::textureRectangle);
map["GL_EXT_geometry_shader"] = enableableExtension(&Extensions::geometryShader);
map["GL_ANGLE_explicit_context_gles1"] = enableableExtension(&Extensions::explicitContextGles1);
map["GL_ANGLE_explicit_context"] = enableableExtension(&Extensions::explicitContext);
// GLES1 extensinos
map["GL_OES_point_size_array"] = enableableExtension(&Extensions::pointSizeArray);
map["GL_OES_texture_cube_map"] = enableableExtension(&Extensions::textureCubeMap);
// clang-format on
return map;
@ -778,28 +919,30 @@ Caps::Caps()
maxElementsIndices(0),
maxElementsVertices(0),
// Table 20.43
// Table 20.44
// Table 20.45
// Table 20.43gs (GL_EXT_geometry_shader)
maxShaderUniformBlocks({}),
maxShaderTextureImageUnits({}),
maxShaderStorageBlocks({}),
// Table 20.43
maxVertexAttributes(0),
maxVertexUniformComponents(0),
maxVertexUniformVectors(0),
maxVertexUniformBlocks(0),
maxVertexOutputComponents(0),
maxVertexTextureImageUnits(0),
maxVertexAtomicCounterBuffers(0),
maxVertexAtomicCounters(0),
maxVertexImageUniforms(0),
maxVertexShaderStorageBlocks(0),
// Table 20.44
maxFragmentUniformComponents(0),
maxFragmentUniformVectors(0),
maxFragmentUniformBlocks(0),
maxFragmentInputComponents(0),
maxTextureImageUnits(0),
maxFragmentAtomicCounterBuffers(0),
maxFragmentAtomicCounters(0),
maxFragmentImageUniforms(0),
maxFragmentShaderStorageBlocks(0),
minProgramTextureGatherOffset(0),
maxProgramTextureGatherOffset(0),
minProgramTexelOffset(0),
@ -807,15 +950,12 @@ Caps::Caps()
// Table 20.45
maxComputeWorkGroupInvocations(0),
maxComputeUniformBlocks(0),
maxComputeTextureImageUnits(0),
maxComputeSharedMemorySize(0),
maxComputeUniformComponents(0),
maxComputeAtomicCounterBuffers(0),
maxComputeAtomicCounters(0),
maxComputeImageUniforms(0),
maxCombinedComputeUniformComponents(0),
maxComputeShaderStorageBlocks(0),
// Table 20.46
maxUniformBufferBindings(0),
@ -856,15 +996,12 @@ Caps::Caps()
// Table 20.43gs (GL_EXT_geometry_shader)
maxGeometryUniformComponents(0),
maxGeometryUniformBlocks(0),
maxGeometryInputComponents(0),
maxGeometryOutputComponents(0),
maxGeometryOutputVertices(0),
maxGeometryTotalOutputComponents(0),
maxGeometryTextureImageUnits(0),
maxGeometryAtomicCounterBuffers(0),
maxGeometryAtomicCounters(0),
maxGeometryShaderStorageBlocks(0),
maxGeometryShaderInvocations(0),
// Table 20.46 (GL_EXT_geometry_shader)
@ -937,7 +1074,7 @@ Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensi
caps.maxVertexUniformVectors = 128;
caps.maxVaryingVectors = 8;
caps.maxCombinedTextureImageUnits = 8;
caps.maxTextureImageUnits = 8;
caps.maxShaderTextureImageUnits[ShaderType::Fragment] = 8;
caps.maxFragmentUniformVectors = 16;
caps.maxRenderbufferSize = 1;
}
@ -982,16 +1119,16 @@ Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensi
caps.maxVertexAttributes = 16;
caps.maxVertexUniformComponents = 1024;
caps.maxVertexUniformVectors = 256;
caps.maxVertexUniformBlocks = 12;
caps.maxShaderUniformBlocks[ShaderType::Vertex] = 12;
caps.maxVertexOutputComponents = 64;
caps.maxVertexTextureImageUnits = 16;
caps.maxShaderTextureImageUnits[ShaderType::Vertex] = 16;
// Table 6.32
caps.maxFragmentUniformComponents = 896;
caps.maxFragmentUniformVectors = 224;
caps.maxFragmentUniformBlocks = 12;
caps.maxShaderUniformBlocks[ShaderType::Fragment] = 12;
caps.maxFragmentInputComponents = 60;
caps.maxTextureImageUnits = 16;
caps.maxShaderTextureImageUnits[ShaderType::Fragment] = 16;
caps.minProgramTexelOffset = -8;
caps.maxProgramTexelOffset = 7;
@ -1001,10 +1138,10 @@ Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensi
caps.uniformBufferOffsetAlignment = 256;
caps.maxCombinedUniformBlocks = 24;
caps.maxCombinedVertexUniformComponents =
caps.maxVertexUniformBlocks * (caps.maxUniformBlockSize / 4) +
caps.maxShaderUniformBlocks[ShaderType::Vertex] * (caps.maxUniformBlockSize / 4) +
caps.maxVertexUniformComponents;
caps.maxCombinedFragmentUniformComponents =
caps.maxFragmentUniformBlocks * (caps.maxUniformBlockSize / 4) +
caps.maxShaderUniformBlocks[ShaderType::Fragment] * (caps.maxUniformBlockSize / 4) +
caps.maxFragmentUniformComponents;
caps.maxVaryingComponents = 60;
caps.maxVaryingVectors = 15;
@ -1039,7 +1176,7 @@ Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensi
caps.maxVertexAtomicCounterBuffers = 0;
caps.maxVertexAtomicCounters = 0;
caps.maxVertexImageUniforms = 0;
caps.maxVertexShaderStorageBlocks = 0;
caps.maxShaderStorageBlocks[ShaderType::Vertex] = 0;
// Table 20.44
caps.maxFragmentUniformComponents = 1024;
@ -1047,7 +1184,7 @@ Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensi
caps.maxFragmentAtomicCounterBuffers = 0;
caps.maxFragmentAtomicCounters = 0;
caps.maxFragmentImageUniforms = 0;
caps.maxFragmentShaderStorageBlocks = 0;
caps.maxShaderStorageBlocks[ShaderType::Fragment] = 0;
caps.minProgramTextureGatherOffset = 0;
caps.maxProgramTextureGatherOffset = 0;
@ -1055,22 +1192,23 @@ Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensi
caps.maxComputeWorkGroupCount = {{65535, 65535, 65535}};
caps.maxComputeWorkGroupSize = {{128, 128, 64}};
caps.maxComputeWorkGroupInvocations = 12;
caps.maxComputeUniformBlocks = 12;
caps.maxComputeTextureImageUnits = 16;
caps.maxShaderUniformBlocks[ShaderType::Compute] = 12;
caps.maxShaderTextureImageUnits[ShaderType::Compute] = 16;
caps.maxComputeSharedMemorySize = 16384;
caps.maxComputeUniformComponents = 1024;
caps.maxComputeAtomicCounterBuffers = 1;
caps.maxComputeAtomicCounters = 8;
caps.maxComputeImageUniforms = 4;
caps.maxCombinedComputeUniformComponents =
caps.maxComputeUniformBlocks * static_cast<GLuint>(caps.maxUniformBlockSize / 4) +
caps.maxShaderUniformBlocks[ShaderType::Compute] *
static_cast<GLuint>(caps.maxUniformBlockSize / 4) +
caps.maxComputeUniformComponents;
caps.maxComputeShaderStorageBlocks = 4;
caps.maxShaderStorageBlocks[ShaderType::Compute] = 4;
// Table 20.46
caps.maxUniformBufferBindings = 36;
caps.maxCombinedFragmentUniformComponents =
caps.maxFragmentUniformBlocks * (caps.maxUniformBlockSize / 4) +
caps.maxShaderUniformBlocks[ShaderType::Fragment] * (caps.maxUniformBlockSize / 4) +
caps.maxFragmentUniformComponents;
caps.maxCombinedTextureImageUnits = 48;
caps.maxCombinedShaderOutputResources = 4;
@ -1102,21 +1240,22 @@ Caps GenerateMinimumCaps(const Version &clientVersion, const Extensions &extensi
// Table 20.43gs (GL_EXT_geometry_shader)
caps.maxGeometryUniformComponents = 1024;
caps.maxGeometryUniformBlocks = 12;
caps.maxShaderUniformBlocks[ShaderType::Geometry] = 12;
caps.maxGeometryInputComponents = 64;
caps.maxGeometryOutputComponents = 64;
caps.maxGeometryOutputVertices = 256;
caps.maxGeometryTotalOutputComponents = 1024;
caps.maxGeometryTextureImageUnits = 16;
caps.maxShaderTextureImageUnits[ShaderType::Geometry] = 16;
caps.maxGeometryAtomicCounterBuffers = 0;
caps.maxGeometryAtomicCounters = 0;
caps.maxGeometryShaderStorageBlocks = 0;
caps.maxShaderStorageBlocks[ShaderType::Geometry] = 0;
caps.maxGeometryShaderInvocations = 32;
// Table 20.46 (GL_EXT_geometry_shader)
caps.maxGeometryImageUniforms = 0;
caps.maxCombinedGeometryUniformComponents =
caps.maxGeometryUniformBlocks * static_cast<GLuint>(caps.maxUniformBlockSize / 4) +
caps.maxShaderUniformBlocks[ShaderType::Geometry] *
static_cast<GLuint>(caps.maxUniformBlockSize / 4) +
caps.maxGeometryUniformComponents;
// Table 20.46 (GL_EXT_geometry_shader)
@ -1256,7 +1395,8 @@ ClientExtensions::ClientExtensions()
deviceCreationD3D11(false),
x11Visual(false),
experimentalPresentPath(false),
clientGetAllProcAddresses(false)
clientGetAllProcAddresses(false),
explicitContext(false)
{
}
@ -1281,6 +1421,7 @@ std::vector<std::string> ClientExtensions::getStrings() const
InsertExtensionString("EGL_ANGLE_x11_visual", x11Visual, &extensionStrings);
InsertExtensionString("EGL_ANGLE_experimental_present_path", experimentalPresentPath, &extensionStrings);
InsertExtensionString("EGL_KHR_client_get_all_proc_addresses", clientGetAllProcAddresses, &extensionStrings);
InsertExtensionString("EGL_ANGLE_explicit_context", explicitContext, &extensionStrings);
// clang-format on
return extensionStrings;

View file

@ -183,6 +183,36 @@ struct Extensions
// Implies that TextureCaps for GL_ETC1_RGB8_OES exist
bool compressedETC1RGB8Texture;
// OES_compressed_ETC2_RGB8_texture
bool compressedETC2RGB8Texture;
// OES_compressed_ETC2_sRGB8_texture
bool compressedETC2sRGB8Texture;
// OES_compressed_ETC2_punchthroughA_RGBA8_texture
bool compressedETC2PunchthroughARGB8Texture;
// OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture
bool compressedETC2PunchthroughAsRGB8AlphaTexture;
// OES_compressed_ETC2_RGBA8_texture
bool compressedETC2RGBA8Texture;
// OES_compressed_ETC2_sRGB8_alpha8_texture
bool compressedETC2sRGB8Alpha8Texture;
// OES_compressed_EAC_R11_unsigned_texture
bool compressedEACR11UnsignedTexture;
// OES_compressed_EAC_R11_signed_texture
bool compressedEACR11SignedTexture;
// OES_compressed_EAC_RG11_unsigned_texture
bool compressedEACRG11UnsignedTexture;
// OES_compressed_EAC_RG11_signed_texture
bool compressedEACRG11SignedTexture;
// GL_EXT_sRGB
// Implies that TextureCaps for GL_SRGB8_ALPHA8 and GL_SRGB8 exist
// TODO: Don't advertise this extension in ES3
@ -374,6 +404,18 @@ struct Extensions
// GL_EXT_geometry_shader
bool geometryShader;
// GLES1 emulation: GLES1 extensions
// GL_OES_point_size_array
bool pointSizeArray;
// GL_OES_texture_cube_map
bool textureCubeMap;
// EGL_ANGLE_explicit_context GL subextensions
// GL_ANGLE_explicit_context_gles1
bool explicitContextGles1;
// GL_ANGLE_explicit_context
bool explicitContext;
};
struct ExtensionInfo
@ -488,28 +530,33 @@ struct Caps
TypePrecision fragmentMediumpInt;
TypePrecision fragmentLowpInt;
// Implementation dependent limits required on all shader types.
// TODO(jiawei.shao@intel.com): organize all such limits into ShaderMap.
// ES 3.1 (April 29, 2015) Table 20.43: Implementation dependent Vertex shader limits
// ES 3.1 (April 29, 2015) Table 20.44: Implementation dependent Fragment shader limits
// ES 3.1 (April 29, 2015) Table 20.45: implementation dependent compute shader limits
// GL_EXT_geometry_shader (May 31, 2016) Table 20.43gs: Implementation dependent geometry shader
// limits
ShaderMap<GLuint> maxShaderUniformBlocks;
ShaderMap<GLuint> maxShaderTextureImageUnits;
ShaderMap<GLuint> maxShaderStorageBlocks;
// ES 3.1 (April 29, 2015) Table 20.43: Implementation dependent Vertex shader limits
GLuint maxVertexAttributes;
GLuint maxVertexUniformComponents;
GLuint maxVertexUniformVectors;
GLuint maxVertexUniformBlocks;
GLuint maxVertexOutputComponents;
GLuint maxVertexTextureImageUnits;
GLuint maxVertexAtomicCounterBuffers;
GLuint maxVertexAtomicCounters;
GLuint maxVertexImageUniforms;
GLuint maxVertexShaderStorageBlocks;
// ES 3.1 (April 29, 2015) Table 20.44: Implementation dependent Fragment shader limits
GLuint maxFragmentUniformComponents;
GLuint maxFragmentUniformVectors;
GLuint maxFragmentUniformBlocks;
GLuint maxFragmentInputComponents;
GLuint maxTextureImageUnits;
GLuint maxFragmentAtomicCounterBuffers;
GLuint maxFragmentAtomicCounters;
GLuint maxFragmentImageUniforms;
GLuint maxFragmentShaderStorageBlocks;
GLint minProgramTextureGatherOffset;
GLuint maxProgramTextureGatherOffset;
GLint minProgramTexelOffset;
@ -519,15 +566,12 @@ struct Caps
std::array<GLuint, 3> maxComputeWorkGroupCount;
std::array<GLuint, 3> maxComputeWorkGroupSize;
GLuint maxComputeWorkGroupInvocations;
GLuint maxComputeUniformBlocks;
GLuint maxComputeTextureImageUnits;
GLuint maxComputeSharedMemorySize;
GLuint maxComputeUniformComponents;
GLuint maxComputeAtomicCounterBuffers;
GLuint maxComputeAtomicCounters;
GLuint maxComputeImageUniforms;
GLuint maxCombinedComputeUniformComponents;
GLuint maxComputeShaderStorageBlocks;
// ES 3.1 (April 29, 2015) Table 20.46: implementation dependent aggregate shader limits
GLuint maxUniformBufferBindings;
@ -569,15 +613,12 @@ struct Caps
// GL_EXT_geometry_shader (May 31, 2016) Table 20.43gs: Implementation dependent geometry shader
// limits
GLuint maxGeometryUniformComponents;
GLuint maxGeometryUniformBlocks;
GLuint maxGeometryInputComponents;
GLuint maxGeometryOutputComponents;
GLuint maxGeometryOutputVertices;
GLuint maxGeometryTotalOutputComponents;
GLuint maxGeometryTextureImageUnits;
GLuint maxGeometryAtomicCounterBuffers;
GLuint maxGeometryAtomicCounters;
GLuint maxGeometryShaderStorageBlocks;
GLuint maxGeometryShaderInvocations;
// GL_EXT_geometry_shader (May 31, 2016) Table 20.46: Implementation dependent aggregate shader
@ -788,6 +829,9 @@ struct ClientExtensions
// EGL_KHR_client_get_all_proc_addresses
bool clientGetAllProcAddresses;
// EGL_ANGLE_explicit_context
bool explicitContext;
};
} // namespace egl

View file

@ -55,12 +55,10 @@ Compiler::Compiler(rx::GLImplFactory *implFactory, const ContextState &state)
state.getExtensions().webglCompatibility)),
mOutputType(mImplementation->getTranslatorOutputType()),
mResources(),
mFragmentCompiler(nullptr),
mVertexCompiler(nullptr),
mComputeCompiler(nullptr),
mGeometryCompiler(nullptr)
mShaderCompilers({})
{
ASSERT(state.getClientMajorVersion() == 2 || state.getClientMajorVersion() == 3);
ASSERT(state.getClientMajorVersion() == 1 || state.getClientMajorVersion() == 2 ||
state.getClientMajorVersion() == 3);
const gl::Caps &caps = state.getCaps();
const gl::Extensions &extensions = state.getExtensions();
@ -69,16 +67,16 @@ Compiler::Compiler(rx::GLImplFactory *implFactory, const ContextState &state)
mResources.MaxVertexAttribs = caps.maxVertexAttributes;
mResources.MaxVertexUniformVectors = caps.maxVertexUniformVectors;
mResources.MaxVaryingVectors = caps.maxVaryingVectors;
mResources.MaxVertexTextureImageUnits = caps.maxVertexTextureImageUnits;
mResources.MaxVertexTextureImageUnits = caps.maxShaderTextureImageUnits[ShaderType::Vertex];
mResources.MaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
mResources.MaxTextureImageUnits = caps.maxTextureImageUnits;
mResources.MaxTextureImageUnits = caps.maxShaderTextureImageUnits[ShaderType::Fragment];
mResources.MaxFragmentUniformVectors = caps.maxFragmentUniformVectors;
mResources.MaxDrawBuffers = caps.maxDrawBuffers;
mResources.OES_standard_derivatives = extensions.standardDerivatives;
mResources.EXT_draw_buffers = extensions.drawBuffers;
mResources.EXT_shader_texture_lod = extensions.shaderTextureLOD;
mResources.OES_EGL_image_external = extensions.eglImageExternal;
mResources.OES_EGL_image_external_essl3 = extensions.eglImageExternalEssl3;
mResources.OES_EGL_image_external = extensions.eglImageExternal;
mResources.OES_EGL_image_external_essl3 = extensions.eglImageExternalEssl3;
mResources.NV_EGL_stream_consumer_external = extensions.eglStreamConsumerExternal;
mResources.ARB_texture_rectangle = extensions.textureRectangle;
// TODO: use shader precision caps to determine if high precision is supported?
@ -113,7 +111,7 @@ Compiler::Compiler(rx::GLImplFactory *implFactory, const ContextState &state)
}
mResources.MaxComputeUniformComponents = caps.maxComputeUniformComponents;
mResources.MaxComputeTextureImageUnits = caps.maxComputeTextureImageUnits;
mResources.MaxComputeTextureImageUnits = caps.maxShaderTextureImageUnits[ShaderType::Compute];
mResources.MaxComputeAtomicCounters = caps.maxComputeAtomicCounters;
mResources.MaxComputeAtomicCounterBuffers = caps.maxComputeAtomicCounterBuffers;
@ -127,7 +125,7 @@ Compiler::Compiler(rx::GLImplFactory *implFactory, const ContextState &state)
mResources.MaxCombinedAtomicCounterBuffers = caps.maxCombinedAtomicCounterBuffers;
mResources.MaxAtomicCounterBufferSize = caps.maxAtomicCounterBufferSize;
mResources.MaxUniformBufferBindings = caps.maxUniformBufferBindings;
mResources.MaxUniformBufferBindings = caps.maxUniformBufferBindings;
mResources.MaxShaderStorageBufferBindings = caps.maxShaderStorageBufferBindings;
// Needed by point size clamping workaround
@ -141,55 +139,32 @@ Compiler::Compiler(rx::GLImplFactory *implFactory, const ContextState &state)
// Geometry Shader constants
mResources.EXT_geometry_shader = extensions.geometryShader;
mResources.MaxGeometryUniformComponents = caps.maxGeometryUniformComponents;
mResources.MaxGeometryUniformBlocks = caps.maxGeometryUniformBlocks;
mResources.MaxGeometryUniformBlocks = caps.maxShaderUniformBlocks[ShaderType::Geometry];
mResources.MaxGeometryInputComponents = caps.maxGeometryInputComponents;
mResources.MaxGeometryOutputComponents = caps.maxGeometryOutputComponents;
mResources.MaxGeometryOutputVertices = caps.maxGeometryOutputVertices;
mResources.MaxGeometryTotalOutputComponents = caps.maxGeometryTotalOutputComponents;
mResources.MaxGeometryTextureImageUnits = caps.maxGeometryTextureImageUnits;
mResources.MaxGeometryAtomicCounterBuffers = caps.maxGeometryAtomicCounterBuffers;
mResources.MaxGeometryAtomicCounters = caps.maxGeometryAtomicCounters;
mResources.MaxGeometryShaderStorageBlocks = caps.maxGeometryShaderStorageBlocks;
mResources.MaxGeometryShaderInvocations = caps.maxGeometryShaderInvocations;
mResources.MaxGeometryImageUniforms = caps.maxGeometryImageUniforms;
mResources.MaxGeometryTextureImageUnits = caps.maxShaderTextureImageUnits[ShaderType::Geometry];
mResources.MaxGeometryAtomicCounterBuffers = caps.maxGeometryAtomicCounterBuffers;
mResources.MaxGeometryAtomicCounters = caps.maxGeometryAtomicCounters;
mResources.MaxGeometryShaderStorageBlocks = caps.maxShaderStorageBlocks[ShaderType::Geometry];
mResources.MaxGeometryShaderInvocations = caps.maxGeometryShaderInvocations;
mResources.MaxGeometryImageUniforms = caps.maxGeometryImageUniforms;
}
Compiler::~Compiler()
{
if (mFragmentCompiler)
for (ShaderType shaderType : AllShaderTypes())
{
sh::Destruct(mFragmentCompiler);
mFragmentCompiler = nullptr;
ShHandle compilerHandle = mShaderCompilers[shaderType];
if (compilerHandle)
{
sh::Destruct(compilerHandle);
mShaderCompilers[shaderType] = nullptr;
ASSERT(activeCompilerHandles > 0);
activeCompilerHandles--;
}
if (mVertexCompiler)
{
sh::Destruct(mVertexCompiler);
mVertexCompiler = nullptr;
ASSERT(activeCompilerHandles > 0);
activeCompilerHandles--;
}
if (mComputeCompiler)
{
sh::Destruct(mComputeCompiler);
mComputeCompiler = nullptr;
ASSERT(activeCompilerHandles > 0);
activeCompilerHandles--;
}
if (mGeometryCompiler)
{
sh::Destruct(mGeometryCompiler);
mGeometryCompiler = nullptr;
ASSERT(activeCompilerHandles > 0);
activeCompilerHandles--;
ASSERT(activeCompilerHandles > 0);
activeCompilerHandles--;
}
}
if (activeCompilerHandles == 0)
@ -202,26 +177,8 @@ Compiler::~Compiler()
ShHandle Compiler::getCompilerHandle(ShaderType type)
{
ShHandle *compiler = nullptr;
switch (type)
{
case ShaderType::Vertex:
compiler = &mVertexCompiler;
break;
case ShaderType::Fragment:
compiler = &mFragmentCompiler;
break;
case ShaderType::Compute:
compiler = &mComputeCompiler;
break;
case ShaderType::Geometry:
compiler = &mGeometryCompiler;
break;
default:
UNREACHABLE();
return nullptr;
}
ASSERT(type != ShaderType::InvalidEnum);
ShHandle *compiler = &mShaderCompilers[type];
if (!(*compiler))
{

View file

@ -12,7 +12,7 @@
#include "GLSLANG/ShaderLang.h"
#include "libANGLE/Error.h"
#include "libANGLE/PackedGLEnums_autogen.h"
#include "libANGLE/PackedEnums.h"
#include "libANGLE/RefCountObject.h"
namespace rx
@ -41,10 +41,7 @@ class Compiler final : public RefCountObjectNoID
ShShaderOutput mOutputType;
ShBuiltInResources mResources;
ShHandle mFragmentCompiler;
ShHandle mVertexCompiler;
ShHandle mComputeCompiler;
ShHandle mGeometryCompiler;
ShaderMap<ShHandle> mShaderCompilers;
};
} // namespace gl

View file

@ -24,6 +24,7 @@
#include "libANGLE/Fence.h"
#include "libANGLE/Framebuffer.h"
#include "libANGLE/FramebufferAttachment.h"
#include "libANGLE/GLES1Renderer.h"
#include "libANGLE/Path.h"
#include "libANGLE/Program.h"
#include "libANGLE/ProgramPipeline.h"
@ -264,7 +265,8 @@ Context::Context(rx::EGLImplFactory *implFactory,
TextureManager *shareTextures,
MemoryProgramCache *memoryProgramCache,
const egl::AttributeMap &attribs,
const egl::DisplayExtensions &displayExtensions)
const egl::DisplayExtensions &displayExtensions,
const egl::ClientExtensions &clientExtensions)
: mState(reinterpret_cast<ContextID>(this),
shareContext ? &shareContext->mState : nullptr,
shareTextures,
@ -297,13 +299,13 @@ Context::Context(rx::EGLImplFactory *implFactory,
mZeroFilledBuffer(1000u)
{
// Needed to solve a Clang warning of unused variables.
UNUSED_VARIABLE(mSavedArgsType);
UNUSED_VARIABLE(mParamsBuffer);
ANGLE_UNUSED_VARIABLE(mSavedArgsType);
ANGLE_UNUSED_VARIABLE(mParamsBuffer);
mImplementation->setMemoryProgramCache(memoryProgramCache);
bool robustResourceInit = GetRobustResourceInit(attribs);
initCaps(displayExtensions, robustResourceInit);
initCaps(displayExtensions, clientExtensions, robustResourceInit);
initWorkarounds();
mGLState.initialize(this, GetDebug(attribs), GetBindGeneratesResource(attribs),
@ -350,15 +352,14 @@ Context::Context(rx::EGLImplFactory *implFactory,
}
}
const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
if (nativeExtensions.textureRectangle)
if (mSupportedExtensions.textureRectangle)
{
Texture *zeroTextureRectangle =
new Texture(mImplementation.get(), 0, TextureType::Rectangle);
mZeroTextures[TextureType::Rectangle].set(this, zeroTextureRectangle);
}
if (nativeExtensions.eglImageExternal || nativeExtensions.eglStreamConsumerExternal)
if (mSupportedExtensions.eglImageExternal || mSupportedExtensions.eglStreamConsumerExternal)
{
Texture *zeroTextureExternal = new Texture(mImplementation.get(), 0, TextureType::External);
mZeroTextures[TextureType::External].set(this, zeroTextureExternal);
@ -389,6 +390,12 @@ Context::Context(rx::EGLImplFactory *implFactory,
bindBufferRange(BufferBinding::Uniform, i, 0, 0, -1);
}
// Initialize GLES1 renderer if appropriate.
if (getClientVersion() < Version(2, 0))
{
mGLES1Renderer.reset(new GLES1Renderer());
}
// Initialize dirty bit masks
mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_STATE);
mTexImageDirtyBits.set(State::DIRTY_BIT_UNPACK_BUFFER_BINDING);
@ -432,8 +439,17 @@ Context::Context(rx::EGLImplFactory *implFactory,
egl::Error Context::onDestroy(const egl::Display *display)
{
if (mGLES1Renderer)
{
mGLES1Renderer->onDestroy(this, &mGLState);
}
// Delete the Surface first to trigger a finish() in Vulkan.
SafeDelete(mSurfacelessFramebuffer);
if (mSurfacelessFramebuffer)
{
mSurfacelessFramebuffer->onDestroy(this);
SafeDelete(mSurfacelessFramebuffer);
}
ANGLE_TRY(releaseSurface(display));
@ -1013,7 +1029,7 @@ void Context::bindDrawFramebuffer(GLuint framebufferHandle)
void Context::bindVertexArray(GLuint vertexArrayHandle)
{
VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
mGLState.setVertexArrayBinding(vertexArray);
mGLState.setVertexArrayBinding(this, vertexArray);
}
void Context::bindVertexBuffer(GLuint bindingIndex,
@ -1070,7 +1086,7 @@ void Context::bindProgramPipeline(GLuint pipelineHandle)
mGLState.setProgramPipelineBinding(this, pipeline);
}
void Context::beginQuery(GLenum target, GLuint query)
void Context::beginQuery(QueryType target, GLuint query)
{
Query *queryObject = getQuery(query, true, target);
ASSERT(queryObject);
@ -1082,7 +1098,7 @@ void Context::beginQuery(GLenum target, GLuint query)
mGLState.setActiveQuery(this, target, queryObject);
}
void Context::endQuery(GLenum target)
void Context::endQuery(QueryType target)
{
Query *queryObject = mGLState.getActiveQuery(target);
ASSERT(queryObject);
@ -1093,9 +1109,9 @@ void Context::endQuery(GLenum target)
mGLState.setActiveQuery(this, target, nullptr);
}
void Context::queryCounter(GLuint id, GLenum target)
void Context::queryCounter(GLuint id, QueryType target)
{
ASSERT(target == GL_TIMESTAMP_EXT);
ASSERT(target == QueryType::Timestamp);
Query *queryObject = getQuery(id, true, target);
ASSERT(queryObject);
@ -1103,7 +1119,7 @@ void Context::queryCounter(GLuint id, GLenum target)
handleError(queryObject->queryCounter());
}
void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
void Context::getQueryiv(QueryType target, GLenum pname, GLint *params)
{
switch (pname)
{
@ -1113,10 +1129,10 @@ void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
case GL_QUERY_COUNTER_BITS_EXT:
switch (target)
{
case GL_TIME_ELAPSED_EXT:
case QueryType::TimeElapsed:
params[0] = getExtensions().queryCounterBitsTimeElapsed;
break;
case GL_TIMESTAMP_EXT:
case QueryType::Timestamp:
params[0] = getExtensions().queryCounterBitsTimestamp;
break;
default:
@ -1131,7 +1147,7 @@ void Context::getQueryiv(GLenum target, GLenum pname, GLint *params)
}
}
void Context::getQueryivRobust(GLenum target,
void Context::getQueryivRobust(QueryType target,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
@ -1206,7 +1222,7 @@ FenceNV *Context::getFenceNV(GLuint handle)
return mFenceNVMap.query(handle);
}
Query *Context::getQuery(GLuint handle, bool create, GLenum type)
Query *Context::getQuery(GLuint handle, bool create, QueryType type)
{
if (!mQueryMap.contains(handle))
{
@ -1216,6 +1232,7 @@ Query *Context::getQuery(GLuint handle, bool create, GLenum type)
Query *query = mQueryMap.query(handle);
if (!query && create)
{
ASSERT(type != QueryType::InvalidEnum);
query = new Query(mImplementation->createQuery(type), handle);
query->addRef();
mQueryMap.assign(handle, query);
@ -1336,10 +1353,10 @@ void Context::getIntegervImpl(GLenum pname, GLint *params)
*params = mCaps.maxCombinedTextureImageUnits;
break;
case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
*params = mCaps.maxVertexTextureImageUnits;
*params = mCaps.maxShaderTextureImageUnits[ShaderType::Vertex];
break;
case GL_MAX_TEXTURE_IMAGE_UNITS:
*params = mCaps.maxTextureImageUnits;
*params = mCaps.maxShaderTextureImageUnits[ShaderType::Fragment];
break;
case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
*params = mCaps.maxFragmentUniformVectors;
@ -1383,10 +1400,10 @@ void Context::getIntegervImpl(GLenum pname, GLint *params)
*params = mCaps.maxUniformBufferBindings;
break;
case GL_MAX_VERTEX_UNIFORM_BLOCKS:
*params = mCaps.maxVertexUniformBlocks;
*params = mCaps.maxShaderUniformBlocks[ShaderType::Vertex];
break;
case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
*params = mCaps.maxFragmentUniformBlocks;
*params = mCaps.maxShaderUniformBlocks[ShaderType::Fragment];
break;
case GL_MAX_COMBINED_UNIFORM_BLOCKS:
*params = mCaps.maxCombinedTextureImageUnits;
@ -1522,7 +1539,7 @@ void Context::getIntegervImpl(GLenum pname, GLint *params)
*params = mCaps.maxVertexImageUniforms;
break;
case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
*params = mCaps.maxVertexShaderStorageBlocks;
*params = mCaps.maxShaderStorageBlocks[ShaderType::Vertex];
break;
case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
*params = mCaps.maxFragmentAtomicCounterBuffers;
@ -1534,7 +1551,7 @@ void Context::getIntegervImpl(GLenum pname, GLint *params)
*params = mCaps.maxFragmentImageUniforms;
break;
case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
*params = mCaps.maxFragmentShaderStorageBlocks;
*params = mCaps.maxShaderStorageBlocks[ShaderType::Fragment];
break;
case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
*params = mCaps.minProgramTextureGatherOffset;
@ -1546,10 +1563,10 @@ void Context::getIntegervImpl(GLenum pname, GLint *params)
*params = mCaps.maxComputeWorkGroupInvocations;
break;
case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
*params = mCaps.maxComputeUniformBlocks;
*params = mCaps.maxShaderUniformBlocks[ShaderType::Compute];
break;
case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
*params = mCaps.maxComputeTextureImageUnits;
*params = mCaps.maxShaderTextureImageUnits[ShaderType::Compute];
break;
case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
*params = mCaps.maxComputeSharedMemorySize;
@ -1570,7 +1587,7 @@ void Context::getIntegervImpl(GLenum pname, GLint *params)
*params = mCaps.maxCombinedComputeUniformComponents;
break;
case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
*params = mCaps.maxComputeShaderStorageBlocks;
*params = mCaps.maxShaderStorageBlocks[ShaderType::Compute];
break;
case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
*params = mCaps.maxCombinedShaderOutputResources;
@ -1617,7 +1634,7 @@ void Context::getIntegervImpl(GLenum pname, GLint *params)
*params = mCaps.maxGeometryUniformComponents;
break;
case GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT:
*params = mCaps.maxGeometryUniformBlocks;
*params = mCaps.maxShaderUniformBlocks[ShaderType::Geometry];
break;
case GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT:
*params = mCaps.maxCombinedGeometryUniformComponents;
@ -1638,7 +1655,7 @@ void Context::getIntegervImpl(GLenum pname, GLint *params)
*params = mCaps.maxGeometryShaderInvocations;
break;
case GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT:
*params = mCaps.maxGeometryTextureImageUnits;
*params = mCaps.maxShaderTextureImageUnits[ShaderType::Geometry];
break;
case GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT:
*params = mCaps.maxGeometryAtomicCounterBuffers;
@ -1650,7 +1667,7 @@ void Context::getIntegervImpl(GLenum pname, GLint *params)
*params = mCaps.maxGeometryImageUniforms;
break;
case GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT:
*params = mCaps.maxGeometryShaderStorageBlocks;
*params = mCaps.maxShaderStorageBlocks[ShaderType::Geometry];
break;
// GLES1 emulation: Caps queries
case GL_MAX_TEXTURE_UNITS:
@ -1665,6 +1682,38 @@ void Context::getIntegervImpl(GLenum pname, GLint *params)
case GL_MAX_TEXTURE_STACK_DEPTH:
*params = mCaps.maxTextureMatrixStackDepth;
break;
// GLES1 emulation: Vertex attribute queries
case GL_VERTEX_ARRAY_BUFFER_BINDING:
case GL_NORMAL_ARRAY_BUFFER_BINDING:
case GL_COLOR_ARRAY_BUFFER_BINDING:
case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, params);
break;
case GL_VERTEX_ARRAY_STRIDE:
case GL_NORMAL_ARRAY_STRIDE:
case GL_COLOR_ARRAY_STRIDE:
case GL_POINT_SIZE_ARRAY_STRIDE_OES:
case GL_TEXTURE_COORD_ARRAY_STRIDE:
getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
GL_VERTEX_ATTRIB_ARRAY_STRIDE, params);
break;
case GL_VERTEX_ARRAY_SIZE:
case GL_COLOR_ARRAY_SIZE:
case GL_TEXTURE_COORD_ARRAY_SIZE:
getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
GL_VERTEX_ATTRIB_ARRAY_SIZE, params);
break;
case GL_VERTEX_ARRAY_TYPE:
case GL_COLOR_ARRAY_TYPE:
case GL_NORMAL_ARRAY_TYPE:
case GL_POINT_SIZE_ARRAY_TYPE_OES:
case GL_TEXTURE_COORD_ARRAY_TYPE:
getVertexAttribiv(static_cast<GLuint>(vertexArrayIndex(ParamToVertexArrayType(pname))),
GL_VERTEX_ATTRIB_ARRAY_TYPE, params);
break;
default:
handleError(mGLState.getIntegerv(this, pname, params));
break;
@ -1709,7 +1758,7 @@ void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
void Context::getPointerv(GLenum pname, void **params) const
{
mGLState.getPointerv(pname, params);
mGLState.getPointerv(this, pname, params);
}
void Context::getPointervRobustANGLERobust(GLenum pname,
@ -2420,9 +2469,9 @@ void Context::getProgramInterfaceivRobust(GLuint program,
UNIMPLEMENTED();
}
void Context::handleError(const Error &error)
void Context::handleError(const Error &error) const
{
if (error.isError())
if (ANGLE_UNLIKELY(error.isError()))
{
GLenum code = error.getCode();
mErrors.insert(code);
@ -2454,7 +2503,7 @@ GLenum Context::getError()
}
// NOTE: this function should not assume that this context is current!
void Context::markContextLost()
void Context::markContextLost() const
{
if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
{
@ -2464,7 +2513,7 @@ void Context::markContextLost()
mContextLost = true;
}
bool Context::isContextLost()
bool Context::isContextLost() const
{
return mContextLost;
}
@ -2638,7 +2687,7 @@ void Context::detachVertexArray(GLuint vertexArray)
// [OpenGL ES 3.0.2] section 2.10 page 43:
// If a vertex array object that is currently bound is deleted, the binding
// for that object reverts to zero and the default vertex array becomes current.
if (mGLState.removeVertexArrayBinding(vertexArray))
if (mGLState.removeVertexArrayBinding(this, vertexArray))
{
bindVertexArray(0);
}
@ -2839,14 +2888,12 @@ void Context::initExtensionStrings()
}
mExtensionString = mergeExtensionStrings(mExtensionStrings);
const gl::Extensions &nativeExtensions = mImplementation->getNativeExtensions();
mRequestableExtensionStrings.clear();
for (const auto &extensionInfo : GetExtensionInfoMap())
{
if (extensionInfo.second.Requestable &&
!(mExtensions.*(extensionInfo.second.ExtensionsMember)) &&
nativeExtensions.*(extensionInfo.second.ExtensionsMember))
mSupportedExtensions.*(extensionInfo.second.ExtensionsMember))
{
mRequestableExtensionStrings.push_back(MakeStaticString(extensionInfo.first));
}
@ -2908,9 +2955,8 @@ bool Context::isExtensionRequestable(const char *name)
const ExtensionInfoMap &extensionInfos = GetExtensionInfoMap();
auto extension = extensionInfos.find(name);
const Extensions &nativeExtensions = mImplementation->getNativeExtensions();
return extension != extensionInfos.end() && extension->second.Requestable &&
nativeExtensions.*(extension->second.ExtensionsMember);
mSupportedExtensions.*(extension->second.ExtensionsMember);
}
void Context::requestExtension(const char *name)
@ -2919,7 +2965,7 @@ void Context::requestExtension(const char *name)
ASSERT(extensionInfos.find(name) != extensionInfos.end());
const auto &extension = extensionInfos.at(name);
ASSERT(extension.Requestable);
ASSERT(mImplementation->getNativeExtensions().*(extension.ExtensionsMember));
ASSERT(isExtensionRequestable(name));
if (mExtensions.*(extension.ExtensionsMember))
{
@ -2974,10 +3020,99 @@ bool Context::hasActiveTransformFeedback(GLuint program) const
return false;
}
void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit)
Extensions Context::generateSupportedExtensions(const egl::DisplayExtensions &displayExtensions,
const egl::ClientExtensions &clientExtensions,
bool robustResourceInit) const
{
Extensions supportedExtensions = mImplementation->getNativeExtensions();
if (getClientVersion() < ES_2_0)
{
// Default extensions for GLES1
supportedExtensions.pointSizeArray = true;
supportedExtensions.textureCubeMap = true;
}
if (getClientVersion() < ES_3_0)
{
// Disable ES3+ extensions
supportedExtensions.colorBufferFloat = false;
supportedExtensions.eglImageExternalEssl3 = false;
supportedExtensions.textureNorm16 = false;
supportedExtensions.multiview = false;
supportedExtensions.maxViews = 1u;
}
if (getClientVersion() < ES_3_1)
{
// Disable ES3.1+ extensions
supportedExtensions.geometryShader = false;
}
if (getClientVersion() > ES_2_0)
{
// FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
// supportedExtensions.sRGB = false;
}
// Some extensions are always available because they are implemented in the GL layer.
supportedExtensions.bindUniformLocation = true;
supportedExtensions.vertexArrayObject = true;
supportedExtensions.bindGeneratesResource = true;
supportedExtensions.clientArrays = true;
supportedExtensions.requestExtension = true;
// Enable the no error extension if the context was created with the flag.
supportedExtensions.noError = mSkipValidation;
// Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
supportedExtensions.surfacelessContext = displayExtensions.surfacelessContext;
// Explicitly enable GL_KHR_debug
supportedExtensions.debug = true;
supportedExtensions.maxDebugMessageLength = 1024;
supportedExtensions.maxDebugLoggedMessages = 1024;
supportedExtensions.maxDebugGroupStackDepth = 1024;
supportedExtensions.maxLabelLength = 1024;
// Explicitly enable GL_ANGLE_robust_client_memory
supportedExtensions.robustClientMemory = true;
// Determine robust resource init availability from EGL.
supportedExtensions.robustResourceInitialization = robustResourceInit;
// mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
// supports it.
supportedExtensions.robustBufferAccessBehavior =
mRobustAccess && supportedExtensions.robustBufferAccessBehavior;
// Enable the cache control query unconditionally.
supportedExtensions.programCacheControl = true;
// Enable EGL_ANGLE_explicit_context subextensions
if (clientExtensions.explicitContext)
{
// GL_ANGLE_explicit_context_gles1
supportedExtensions.explicitContextGles1 = true;
// GL_ANGLE_explicit_context
supportedExtensions.explicitContext = true;
}
return supportedExtensions;
}
void Context::initCaps(const egl::DisplayExtensions &displayExtensions,
const egl::ClientExtensions &clientExtensions,
bool robustResourceInit)
{
mCaps = mImplementation->getNativeCaps();
mSupportedExtensions =
generateSupportedExtensions(displayExtensions, clientExtensions, robustResourceInit);
mExtensions = mSupportedExtensions;
mLimitations = mImplementation->getNativeLimitations();
// GLES1 emulation: Initialize caps (Table 6.20 / 6.22 in the ES 1.1 spec)
if (getClientVersion() < Version(2, 0))
{
@ -2989,66 +3124,6 @@ void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool rob
mCaps.maxTextureMatrixStackDepth = Caps::GlobalMatrixStackDepth;
}
mExtensions = mImplementation->getNativeExtensions();
mLimitations = mImplementation->getNativeLimitations();
if (getClientVersion() < Version(3, 0))
{
// Disable ES3+ extensions
mExtensions.colorBufferFloat = false;
mExtensions.eglImageExternalEssl3 = false;
mExtensions.textureNorm16 = false;
mExtensions.multiview = false;
mExtensions.maxViews = 1u;
}
if (getClientVersion() < ES_3_1)
{
// Disable ES3.1+ extensions
mExtensions.geometryShader = false;
}
if (getClientVersion() > Version(2, 0))
{
// FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
// mExtensions.sRGB = false;
}
// Some extensions are always available because they are implemented in the GL layer.
mExtensions.bindUniformLocation = true;
mExtensions.vertexArrayObject = true;
mExtensions.bindGeneratesResource = true;
mExtensions.clientArrays = true;
mExtensions.requestExtension = true;
// Enable the no error extension if the context was created with the flag.
mExtensions.noError = mSkipValidation;
// Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
mExtensions.surfacelessContext = displayExtensions.surfacelessContext;
// Explicitly enable GL_KHR_debug
mExtensions.debug = true;
mExtensions.maxDebugMessageLength = 1024;
mExtensions.maxDebugLoggedMessages = 1024;
mExtensions.maxDebugGroupStackDepth = 1024;
mExtensions.maxLabelLength = 1024;
// Explicitly enable GL_ANGLE_robust_client_memory
mExtensions.robustClientMemory = true;
// Determine robust resource init availability from EGL.
mExtensions.robustResourceInitialization = robustResourceInit;
// mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
// supports it.
mExtensions.robustBufferAccessBehavior =
mRobustAccess && mExtensions.robustBufferAccessBehavior;
// Enable the cache control query unconditionally.
mExtensions.programCacheControl = true;
// Apply implementation limits
LimitCap(&mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
@ -3061,14 +3136,17 @@ void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool rob
LimitCap(&mCaps.maxVertexAttribBindings, MAX_VERTEX_ATTRIB_BINDINGS);
}
LimitCap(&mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
LimitCap(&mCaps.maxShaderUniformBlocks[ShaderType::Vertex],
IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
LimitCap(&mCaps.maxVertexOutputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
LimitCap(&mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
// Limit textures as well, so we can use fast bitsets with texture bindings.
LimitCap(&mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES);
LimitCap(&mCaps.maxVertexTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
LimitCap(&mCaps.maxTextureImageUnits, IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Vertex],
IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
LimitCap(&mCaps.maxShaderTextureImageUnits[ShaderType::Fragment],
IMPLEMENTATION_MAX_ACTIVE_TEXTURES / 2);
mCaps.maxSampleMaskWords = std::min<GLuint>(mCaps.maxSampleMaskWords, MAX_SAMPLE_MASK_WORDS);
@ -3172,7 +3250,7 @@ void Context::updateCaps()
}
// If program binary is disabled, blank out the memory cache pointer.
if (!mImplementation->getNativeExtensions().getProgramBinary)
if (!mSupportedExtensions.getProgramBinary)
{
mMemoryProgramCache = nullptr;
}
@ -3217,6 +3295,11 @@ void Context::initWorkarounds()
Error Context::prepareForDraw()
{
if (mGLES1Renderer)
{
ANGLE_TRY(mGLES1Renderer->prepareForDraw(this, &mGLState));
}
ANGLE_TRY(syncDirtyObjects());
if (isRobustResourceInitEnabled())
@ -3493,28 +3576,7 @@ void Context::framebufferTexture2D(GLenum target,
if (texture != 0)
{
Texture *textureObj = getTexture(texture);
ImageIndex index = ImageIndex::MakeInvalid();
if (textarget == TextureTarget::_2D)
{
index = ImageIndex::Make2D(level);
}
else if (textarget == TextureTarget::Rectangle)
{
index = ImageIndex::MakeRectangle(level);
}
else if (textarget == TextureTarget::_2DMultisample)
{
ASSERT(level == 0);
index = ImageIndex::Make2DMultisample();
}
else
{
ASSERT(TextureTargetToType(textarget) == TextureType::CubeMap);
index = ImageIndex::MakeCube(textarget, level);
}
ImageIndex index = ImageIndex::MakeFromTarget(textarget, level);
framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObj);
}
else
@ -3537,7 +3599,7 @@ void Context::framebufferRenderbuffer(GLenum target,
{
Renderbuffer *renderbufferObject = getRenderbuffer(renderbuffer);
framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex::MakeInvalid(),
framebuffer->setAttachment(this, GL_RENDERBUFFER, attachment, gl::ImageIndex(),
renderbufferObject);
}
else
@ -3560,19 +3622,7 @@ void Context::framebufferTextureLayer(GLenum target,
if (texture != 0)
{
Texture *textureObject = getTexture(texture);
ImageIndex index = ImageIndex::MakeInvalid();
if (textureObject->getType() == TextureType::_3D)
{
index = ImageIndex::Make3D(level, layer);
}
else
{
ASSERT(textureObject->getType() == TextureType::_2DArray);
index = ImageIndex::Make2DArray(level, layer);
}
ImageIndex index = ImageIndex::MakeFromType(textureObject->getType(), level, layer);
framebuffer->setAttachment(this, GL_TEXTURE, attachment, index, textureObject);
}
else
@ -3673,9 +3723,7 @@ void Context::invalidateFramebuffer(GLenum target,
Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
ASSERT(framebuffer);
bool complete = false;
ANGLE_CONTEXT_TRY(framebuffer->isComplete(this, &complete));
if (!complete)
if (!framebuffer->isComplete(this))
{
return;
}
@ -3697,9 +3745,7 @@ void Context::invalidateSubFramebuffer(GLenum target,
Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
ASSERT(framebuffer);
bool complete = false;
ANGLE_CONTEXT_TRY(framebuffer->isComplete(this, &complete));
if (!complete)
if (!framebuffer->isComplete(this))
{
return;
}
@ -4793,7 +4839,7 @@ void Context::getMultisamplefv(GLenum pname, GLuint index, GLfloat *val)
switch (pname)
{
case GL_SAMPLE_POSITION:
handleError(framebuffer->getSamplePosition(index, val));
handleError(framebuffer->getSamplePosition(this, index, val));
break;
default:
UNREACHABLE();
@ -4948,15 +4994,7 @@ GLenum Context::checkFramebufferStatus(GLenum target)
{
Framebuffer *framebuffer = mGLState.getTargetFramebuffer(target);
ASSERT(framebuffer);
GLenum status = GL_NONE;
Error err = framebuffer->checkStatus(this, &status);
if (err.isError())
{
handleError(err);
return 0;
}
return status;
return framebuffer->checkStatus(this);
}
void Context::compileShader(GLuint shader)
@ -5691,7 +5729,7 @@ void Context::deleteQueries(GLsizei n, const GLuint *ids)
GLboolean Context::isQuery(GLuint id)
{
return (getQuery(id, false, GL_NONE) != nullptr) ? GL_TRUE : GL_FALSE;
return (getQuery(id, false, QueryType::InvalidEnum) != nullptr) ? GL_TRUE : GL_FALSE;
}
void Context::uniformMatrix2x3fv(GLint location,
@ -7020,6 +7058,24 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
case GL_MAX_MODELVIEW_STACK_DEPTH:
case GL_MAX_PROJECTION_STACK_DEPTH:
case GL_MAX_TEXTURE_STACK_DEPTH:
case GL_VERTEX_ARRAY_STRIDE:
case GL_NORMAL_ARRAY_STRIDE:
case GL_COLOR_ARRAY_STRIDE:
case GL_TEXTURE_COORD_ARRAY_STRIDE:
case GL_VERTEX_ARRAY_SIZE:
case GL_COLOR_ARRAY_SIZE:
case GL_TEXTURE_COORD_ARRAY_SIZE:
case GL_VERTEX_ARRAY_TYPE:
case GL_NORMAL_ARRAY_TYPE:
case GL_COLOR_ARRAY_TYPE:
case GL_TEXTURE_COORD_ARRAY_TYPE:
case GL_VERTEX_ARRAY_BUFFER_BINDING:
case GL_NORMAL_ARRAY_BUFFER_BINDING:
case GL_COLOR_ARRAY_BUFFER_BINDING:
case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
case GL_POINT_SIZE_ARRAY_STRIDE_OES:
case GL_POINT_SIZE_ARRAY_TYPE_OES:
case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
*type = GL_INT;
*numParams = 1;
return true;

View file

@ -22,7 +22,7 @@
#include "libANGLE/Context_gles_1_0_autogen.h"
#include "libANGLE/Error.h"
#include "libANGLE/HandleAllocator.h"
#include "libANGLE/PackedGLEnums.h"
#include "libANGLE/PackedEnums.h"
#include "libANGLE/RefCountObject.h"
#include "libANGLE/ResourceMap.h"
#include "libANGLE/VertexAttribute.h"
@ -48,19 +48,20 @@ namespace gl
class Buffer;
class Compiler;
class FenceNV;
class Sync;
class Framebuffer;
class GLES1Renderer;
class MemoryProgramCache;
class Program;
class ProgramPipeline;
class Query;
class Renderbuffer;
class Sampler;
class Shader;
class Sync;
class Texture;
class TransformFeedback;
class VertexArray;
struct VertexAttribute;
class ProgramPipeline;
class Context final : angle::NonCopyable
{
@ -71,7 +72,8 @@ class Context final : angle::NonCopyable
TextureManager *shareTextures,
MemoryProgramCache *memoryProgramCache,
const egl::AttributeMap &attribs,
const egl::DisplayExtensions &displayExtensions);
const egl::DisplayExtensions &displayExtensions,
const egl::ClientExtensions &clientExtensions);
egl::Error onDestroy(const egl::Display *display);
~Context();
@ -151,16 +153,15 @@ class Context final : angle::NonCopyable
void bindTransformFeedback(GLenum target, GLuint transformFeedbackHandle);
void bindProgramPipeline(GLuint pipelineHandle);
void beginQuery(GLenum target, GLuint query);
void endQuery(GLenum target);
void queryCounter(GLuint id, GLenum target);
void getQueryiv(GLenum target, GLenum pname, GLint *params);
void getQueryivRobust(GLenum target,
void beginQuery(QueryType target, GLuint query);
void endQuery(QueryType target);
void queryCounter(GLuint id, QueryType target);
void getQueryiv(QueryType target, GLenum pname, GLint *params);
void getQueryivRobust(QueryType target,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params);
void getQueryObjectiv(GLuint id, GLenum pname, GLint *params);
void getQueryObjectivRobust(GLuint id,
GLenum pname,
@ -352,7 +353,7 @@ class Context final : angle::NonCopyable
Renderbuffer *getRenderbuffer(GLuint handle) const;
VertexArray *getVertexArray(GLuint handle) const;
Sampler *getSampler(GLuint handle) const;
Query *getQuery(GLuint handle, bool create, GLenum type);
Query *getQuery(GLuint handle, bool create, QueryType type);
Query *getQuery(GLuint handle) const;
TransformFeedback *getTransformFeedback(GLuint handle) const;
ProgramPipeline *getProgramPipeline(GLuint handle) const;
@ -1374,11 +1375,11 @@ class Context final : angle::NonCopyable
void memoryBarrierByRegion(GLbitfield barriers);
// Consumes the error.
void handleError(const Error &error);
void handleError(const Error &error) const;
GLenum getError();
void markContextLost();
bool isContextLost();
void markContextLost() const;
bool isContextLost() const;
GLenum getGraphicsResetStatus();
bool isResetNotificationEnabled();
@ -1457,6 +1458,11 @@ class Context final : angle::NonCopyable
bool isValidBufferBinding(BufferBinding binding) const { return mValidBufferBindings[binding]; }
// GLES1 emulation: Renderer level (for validation)
int vertexArrayIndex(ClientVertexArrayType type) const;
static int TexCoordArrayIndex(unsigned int unit);
AttributesMask getVertexArraysAttributeMask() const;
private:
Error prepareForDraw();
Error prepareForClear(GLbitfield mask);
@ -1487,7 +1493,12 @@ class Context final : angle::NonCopyable
void initVersionStrings();
void initExtensionStrings();
void initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit);
Extensions generateSupportedExtensions(const egl::DisplayExtensions &displayExtensions,
const egl::ClientExtensions &clientExtensions,
bool robustResourceInit) const;
void initCaps(const egl::DisplayExtensions &displayExtensions,
const egl::ClientExtensions &clientExtensions,
bool robustResourceInit);
void updateCaps();
void initWorkarounds();
@ -1514,6 +1525,10 @@ class Context final : angle::NonCopyable
Extensions mExtensions;
Limitations mLimitations;
// Extensions supported by the implementation plus extensions that are implemented entirely
// within the frontend.
Extensions mSupportedExtensions;
// Shader compiler. Lazily initialized hence the mutable value.
mutable BindingPointer<Compiler> mCompiler;
@ -1546,13 +1561,16 @@ class Context final : angle::NonCopyable
// Recorded errors
typedef std::set<GLenum> ErrorSet;
ErrorSet mErrors;
mutable ErrorSet mErrors;
// GLES1 renderer state
std::unique_ptr<GLES1Renderer> mGLES1Renderer;
// Current/lost context flags
bool mHasBeenCurrent;
bool mContextLost;
GLenum mResetStatus;
bool mContextLostForced;
mutable bool mContextLost;
mutable GLenum mResetStatus;
mutable bool mContextLostForced;
GLenum mResetStrategy;
bool mRobustAccess;
egl::Surface *mCurrentSurface;

View file

@ -11,6 +11,8 @@
#include "common/mathutil.h"
#include "common/utilities.h"
#include "libANGLE/GLES1Renderer.h"
namespace
{
@ -87,7 +89,8 @@ void Context::color4x(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
void Context::colorPointer(GLint size, GLenum type, GLsizei stride, const void *ptr)
{
UNIMPLEMENTED();
vertexAttribPointer(vertexArrayIndex(ClientVertexArrayType::Color), size, type, GL_FALSE,
stride, ptr);
}
void Context::depthRangex(GLfixed n, GLfixed f)
@ -95,14 +98,16 @@ void Context::depthRangex(GLfixed n, GLfixed f)
UNIMPLEMENTED();
}
void Context::disableClientState(GLenum clientState)
void Context::disableClientState(ClientVertexArrayType clientState)
{
UNIMPLEMENTED();
mGLState.gles1().setClientStateEnabled(clientState, false);
disableVertexAttribArray(vertexArrayIndex(clientState));
}
void Context::enableClientState(GLenum clientState)
void Context::enableClientState(ClientVertexArrayType clientState)
{
UNIMPLEMENTED();
mGLState.gles1().setClientStateEnabled(clientState, true);
enableVertexAttribArray(vertexArrayIndex(clientState));
}
void Context::fogf(GLenum pname, GLfloat param)
@ -125,19 +130,16 @@ void Context::fogxv(GLenum pname, const GLfixed *param)
UNIMPLEMENTED();
}
void Context::frustumf(GLfloat left,
GLfloat right,
GLfloat bottom,
GLfloat top,
GLfloat zNear,
GLfloat zFar)
void Context::frustumf(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f)
{
UNIMPLEMENTED();
mGLState.gles1().multMatrix(angle::Mat4::Frustum(l, r, b, t, n, f));
}
void Context::frustumx(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f)
{
UNIMPLEMENTED();
mGLState.gles1().multMatrix(angle::Mat4::Frustum(FixedToFloat(l), FixedToFloat(r),
FixedToFloat(b), FixedToFloat(t),
FixedToFloat(n), FixedToFloat(f)));
}
void Context::getClipPlanef(GLenum plane, GLfloat *equation)
@ -322,7 +324,8 @@ void Context::normal3x(GLfixed nx, GLfixed ny, GLfixed nz)
void Context::normalPointer(GLenum type, GLsizei stride, const void *ptr)
{
UNIMPLEMENTED();
vertexAttribPointer(vertexArrayIndex(ClientVertexArrayType::Normal), 3, type, GL_FALSE, stride,
ptr);
}
void Context::orthof(GLfloat left,
@ -332,12 +335,14 @@ void Context::orthof(GLfloat left,
GLfloat zNear,
GLfloat zFar)
{
UNIMPLEMENTED();
mGLState.gles1().multMatrix(angle::Mat4::Ortho(left, right, bottom, top, zNear, zFar));
}
void Context::orthox(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f)
{
UNIMPLEMENTED();
mGLState.gles1().multMatrix(angle::Mat4::Ortho(FixedToFloat(l), FixedToFloat(r),
FixedToFloat(b), FixedToFloat(t),
FixedToFloat(n), FixedToFloat(f)));
}
void Context::pointParameterf(GLenum pname, GLfloat param)
@ -387,12 +392,13 @@ void Context::pushMatrix()
void Context::rotatef(float angle, float x, float y, float z)
{
UNIMPLEMENTED();
mGLState.gles1().multMatrix(angle::Mat4::Rotate(angle, angle::Vector3(x, y, z)));
}
void Context::rotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
{
UNIMPLEMENTED();
mGLState.gles1().multMatrix(angle::Mat4::Rotate(
FixedToFloat(angle), angle::Vector3(FixedToFloat(x), FixedToFloat(y), FixedToFloat(z))));
}
void Context::sampleCoveragex(GLclampx value, GLboolean invert)
@ -402,12 +408,13 @@ void Context::sampleCoveragex(GLclampx value, GLboolean invert)
void Context::scalef(float x, float y, float z)
{
UNIMPLEMENTED();
mGLState.gles1().multMatrix(angle::Mat4::Scale(angle::Vector3(x, y, z)));
}
void Context::scalex(GLfixed x, GLfixed y, GLfixed z)
{
UNIMPLEMENTED();
mGLState.gles1().multMatrix(
angle::Mat4::Scale(angle::Vector3(FixedToFloat(x), FixedToFloat(y), FixedToFloat(z))));
}
void Context::shadeModel(GLenum mode)
@ -417,7 +424,8 @@ void Context::shadeModel(GLenum mode)
void Context::texCoordPointer(GLint size, GLenum type, GLsizei stride, const void *ptr)
{
UNIMPLEMENTED();
vertexAttribPointer(vertexArrayIndex(ClientVertexArrayType::TextureCoord), size, type, GL_FALSE,
stride, ptr);
}
void Context::texEnvf(GLenum target, GLenum pname, GLfloat param)
@ -462,17 +470,19 @@ void Context::texParameterxv(TextureType target, GLenum pname, const GLfixed *pa
void Context::translatef(float x, float y, float z)
{
UNIMPLEMENTED();
mGLState.gles1().multMatrix(angle::Mat4::Translate(angle::Vector3(x, y, z)));
}
void Context::translatex(GLfixed x, GLfixed y, GLfixed z)
{
UNIMPLEMENTED();
mGLState.gles1().multMatrix(
angle::Mat4::Translate(angle::Vector3(FixedToFloat(x), FixedToFloat(y), FixedToFloat(z))));
}
void Context::vertexPointer(GLint size, GLenum type, GLsizei stride, const void *ptr)
{
UNIMPLEMENTED();
vertexAttribPointer(vertexArrayIndex(ClientVertexArrayType::Vertex), size, type, GL_FALSE,
stride, ptr);
}
// GL_OES_draw_texture
@ -540,7 +550,8 @@ void Context::weightPointer(GLint size, GLenum type, GLsizei stride, const void
// GL_OES_point_size_array
void Context::pointSizePointer(GLenum type, GLsizei stride, const void *ptr)
{
UNIMPLEMENTED();
vertexAttribPointer(vertexArrayIndex(ClientVertexArrayType::PointSize), 1, type, GL_FALSE,
stride, ptr);
}
// GL_OES_query_matrix
@ -596,4 +607,21 @@ void Context::texGenxv(GLenum coord, GLenum pname, const GLint *params)
UNIMPLEMENTED();
}
int Context::vertexArrayIndex(ClientVertexArrayType type) const
{
return mGLES1Renderer->vertexArrayIndex(type, &mGLState);
}
// static
int Context::TexCoordArrayIndex(unsigned int unit)
{
return GLES1Renderer::TexCoordArrayIndex(unit);
}
AttributesMask Context::getVertexArraysAttributeMask() const
{
return mGLES1Renderer->getVertexArraysAttributeMask(&mGLState);
}
// static
} // namespace gl

View file

@ -23,8 +23,8 @@
void color4x(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); \
void colorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer); \
void depthRangex(GLfixed n, GLfixed f); \
void disableClientState(GLenum array); \
void enableClientState(GLenum array); \
void disableClientState(ClientVertexArrayType arrayPacked); \
void enableClientState(ClientVertexArrayType arrayPacked); \
void fogf(GLenum pname, GLfloat param); \
void fogfv(GLenum pname, const GLfloat *params); \
void fogx(GLenum pname, GLfixed param); \

View file

@ -97,7 +97,7 @@ void Debug::insertMessage(GLenum source,
GLenum type,
GLuint id,
GLenum severity,
const std::string &message)
const std::string &message) const
{
std::string messageCopy(message);
insertMessage(source, type, id, severity, std::move(messageCopy));
@ -107,7 +107,7 @@ void Debug::insertMessage(GLenum source,
GLenum type,
GLuint id,
GLenum severity,
std::string &&message)
std::string &&message) const
{
if (!isMessageEnabled(source, type, id, severity))
{

View file

@ -49,12 +49,12 @@ class Debug : angle::NonCopyable
GLenum type,
GLuint id,
GLenum severity,
const std::string &message);
const std::string &message) const;
void insertMessage(GLenum source,
GLenum type,
GLuint id,
GLenum severity,
std::string &&message);
std::string &&message) const;
void setMessageControl(GLenum source,
GLenum type,
@ -119,7 +119,7 @@ class Debug : angle::NonCopyable
bool mOutputEnabled;
GLDEBUGPROCKHR mCallbackFunction;
const void *mCallbackUserParam;
std::deque<Message> mMessages;
mutable std::deque<Message> mMessages;
GLuint mMaxLoggedMessages;
bool mOutputSynchronous;
std::vector<Group> mGroups;

View file

@ -499,7 +499,14 @@ Error Display::initialize()
{
std::unique_ptr<rx::DeviceImpl> impl(mImplementation->createDevice());
ASSERT(impl != nullptr);
ANGLE_TRY(impl->initialize());
error = impl->initialize();
if (error.isError())
{
ERR() << "Failed to initialize display because device creation failed: "
<< error.getMessage();
mImplementation->terminate();
return error;
}
mDevice = new Device(this, impl.release());
}
else
@ -515,8 +522,9 @@ Error Display::initialize()
}
mProxyContext.reset(nullptr);
gl::Context *proxyContext = new gl::Context(mImplementation, nullptr, nullptr, nullptr, nullptr,
egl::AttributeMap(), mDisplayExtensions);
gl::Context *proxyContext =
new gl::Context(mImplementation, nullptr, nullptr, nullptr, nullptr, egl::AttributeMap(),
mDisplayExtensions, GetClientExtensions());
mProxyContext.reset(proxyContext);
mInitialized = true;
@ -526,12 +534,15 @@ Error Display::initialize()
Error Display::terminate()
{
if (!mInitialized)
{
return NoError();
}
ANGLE_TRY(makeCurrent(nullptr, nullptr, nullptr));
mMemoryProgramCache.clear();
mProxyContext.reset(nullptr);
while (!mContextSet.empty())
{
ANGLE_TRY(destroyContext(*mContextSet.begin()));
@ -555,6 +566,9 @@ Error Display::terminate()
ANGLE_TRY(destroySurface(*mState.surfaceSet.begin()));
}
// Allow the EGL objects that are being deleted to use the proxy context.
mProxyContext.reset(nullptr);
mConfigSet.clear();
if (mDevice != nullptr && mDevice->getOwningDisplay() != nullptr)
@ -780,7 +794,7 @@ Error Display::createContext(const Config *configuration,
gl::Context *context =
new gl::Context(mImplementation, configuration, shareContext, shareTextures, cachePointer,
attribs, mDisplayExtensions);
attribs, mDisplayExtensions, GetClientExtensions());
ASSERT(context != nullptr);
mContextSet.insert(context);
@ -1002,6 +1016,7 @@ static ClientExtensions GenerateClientExtensions()
#endif
extensions.clientGetAllProcAddresses = true;
extensions.explicitContext = true;
return extensions;
}

View file

@ -70,7 +70,7 @@ bool Error::operator!=(const Error &other) const
std::ostream &operator<<(std::ostream &os, const Error &err)
{
return gl::FmtHexShort(os, err.getCode());
return gl::FmtHex(os, err.getCode());
}
} // namespace gl
@ -104,7 +104,7 @@ const std::string &Error::getMessage() const
std::ostream &operator<<(std::ostream &os, const Error &err)
{
return gl::FmtHexShort(os, err.getCode());
return gl::FmtHex(os, err.getCode());
}
} // namespace egl

View file

@ -223,35 +223,35 @@ inline Error NoError()
#define ANGLE_CONCAT2(x, y) ANGLE_CONCAT1(x, y)
#define ANGLE_LOCAL_VAR ANGLE_CONCAT2(_localVar, __LINE__)
#define ANGLE_TRY_TEMPLATE(EXPR, FUNC) \
{ \
auto ANGLE_LOCAL_VAR = EXPR; \
if (ANGLE_LOCAL_VAR.isError()) \
{ \
FUNC(ANGLE_LOCAL_VAR); \
} \
} \
#define ANGLE_TRY_TEMPLATE(EXPR, FUNC) \
{ \
auto ANGLE_LOCAL_VAR = EXPR; \
if (ANGLE_UNLIKELY(ANGLE_LOCAL_VAR.isError())) \
{ \
FUNC(ANGLE_LOCAL_VAR); \
} \
} \
ANGLE_EMPTY_STATEMENT
#define ANGLE_RETURN(X) return X;
#define ANGLE_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_RETURN);
#define ANGLE_TRY_RESULT(EXPR, RESULT) \
{ \
auto ANGLE_LOCAL_VAR = EXPR; \
if (ANGLE_LOCAL_VAR.isError()) \
{ \
return ANGLE_LOCAL_VAR.getError(); \
} \
RESULT = ANGLE_LOCAL_VAR.getResult(); \
} \
#define ANGLE_TRY_RESULT(EXPR, RESULT) \
{ \
auto ANGLE_LOCAL_VAR = EXPR; \
if (ANGLE_UNLIKELY(ANGLE_LOCAL_VAR.isError())) \
{ \
return ANGLE_LOCAL_VAR.getError(); \
} \
RESULT = ANGLE_LOCAL_VAR.getResult(); \
} \
ANGLE_EMPTY_STATEMENT
// TODO(jmadill): Introduce way to store errors to a const Context.
#define ANGLE_SWALLOW_ERR(EXPR) \
{ \
auto ANGLE_LOCAL_VAR = EXPR; \
if (ANGLE_LOCAL_VAR.isError()) \
if (ANGLE_UNLIKELY(ANGLE_LOCAL_VAR.isError())) \
{ \
ERR() << "Unhandled internal error: " << ANGLE_LOCAL_VAR; \
} \

View file

@ -16,6 +16,7 @@
namespace gl
{
ERRMSG(BlitDimensionsOutOfRange, "BlitFramebuffer dimensions out of 32-bit integer range.");
ERRMSG(BufferBoundForTransformFeedback, "Buffer is bound for transform feedback.");
ERRMSG(BufferNotBound, "A buffer must be bound.");
ERRMSG(CompressedTextureDimensionsMustMatchData,
@ -64,6 +65,7 @@ ERRMSG(InvalidBorder, "Border must be 0.");
ERRMSG(InvalidBufferTypes, "Invalid buffer target enum.");
ERRMSG(InvalidBufferUsage, "Invalid buffer usage enum.");
ERRMSG(InvalidClearMask, "Invalid mask bits.");
ERRMSG(InvalidClientState, "Invalid client vertex array type.");
ERRMSG(InvalidCombinedImageUnit,
"Specified unit must be in [GL_TEXTURE0, GL_TEXTURE0 + GL_MAX_COMBINED_IMAGE_UNITS)");
ERRMSG(InvalidConstantColor,
@ -87,6 +89,8 @@ ERRMSG(InvalidFormat, "Invalid format.");
ERRMSG(InvalidFramebufferTarget, "Invalid framebuffer target.");
ERRMSG(InvalidFramebufferTextureLevel, "Mipmap level must be 0 when attaching a texture.");
ERRMSG(InvalidFramebufferAttachmentParameter, "Invalid parameter name for framebuffer attachment.");
ERRMSG(InvalidFramebufferLayer,
"Framebuffer layer cannot be less than 0 or greater than GL_MAX_FRAMEBUFFER_LAYERS_EXT.");
ERRMSG(InvalidImageUnit,
"Image unit cannot be greater than or equal to the value of MAX_IMAGE_UNITS.");
ERRMSG(InvalidInternalFormat, "Invalid internal format.");
@ -98,8 +102,12 @@ ERRMSG(InvalidMultitextureUnit,
ERRMSG(InvalidName, "Invalid name.");
ERRMSG(InvalidNameCharacters, "Name contains invalid characters.");
ERRMSG(InvalidPname, "Invalid pname.");
ERRMSG(InvalidPointerQuery, "Invalid pointer query.");
ERRMSG(InvalidPrecision, "Invalid or unsupported precision type.");
ERRMSG(InvalidProgramName, "Program object expected.");
ERRMSG(InvalidProjectionMatrix,
"Invalid projection matrix. Left/right, top/bottom, near/far intervals cannot be zero, and "
"near/far cannot be less than zero.");
ERRMSG(InvalidQueryId, "Invalid query Id.");
ERRMSG(InvalidQueryTarget, "Invalid query target.");
ERRMSG(InvalidQueryType, "Invalid query type.");
@ -125,6 +133,9 @@ ERRMSG(InvalidType, "Invalid type.");
ERRMSG(InvalidTypePureInt, "Invalid type, should be integer");
ERRMSG(InvalidUnpackAlignment, "Unpack alignment must be 1, 2, 4, or 8.");
ERRMSG(InvalidVertexAttrSize, "Vertex attribute size must be 1, 2, 3, or 4.");
ERRMSG(InvalidVertexPointerSize, "Size for built-in vertex attribute is outside allowed range.");
ERRMSG(InvalidVertexPointerStride, "Invalid stride for built-in vertex attribute.");
ERRMSG(InvalidVertexPointerType, "Invalid type for built-in vertex attribute.");
ERRMSG(InvalidWidth, "Invalid width.");
ERRMSG(InvalidWrapModeTexture, "Invalid wrap mode for texture type.");
ERRMSG(LevelNotZero, "Texture level must be zero.");
@ -169,6 +180,7 @@ ERRMSG(PixelPackBufferBoundForTransformFeedback,
ERRMSG(
PixelUnpackBufferBoundForTransformFeedback,
"It is undefined behavior to use a pixel unpack buffer that is bound for transform feedback.");
ERRMSG(PointSizeArrayExtensionNotEnabled, "GL_OES_point_size_array not enabled.");
ERRMSG(ProgramDoesNotExist, "Program doesn't exist.");
ERRMSG(ProgramNotBound, "A program must be bound.");
ERRMSG(ProgramNotLinked, "Program not linked.");
@ -201,6 +213,8 @@ ERRMSG(UniformBufferBoundForTransformFeedback,
"It is undefined behavior to use an uniform buffer that is bound for transform feedback.");
ERRMSG(UniformSizeMismatch, "Uniform size does not match uniform method.");
ERRMSG(UnknownParameter, "Unknown parameter value.");
ERRMSG(UnsupportedDrawModeForTransformFeedback,
"The draw command is unsupported when transform feedback is active and not paused.");
ERRMSG(VertexArrayNoBuffer, "An enabled vertex array has no buffer.");
ERRMSG(VertexArrayNoBufferPointer, "An enabled vertex array has no buffer and no pointer.");
ERRMSG(VertexBufferBoundForTransformFeedback,

View file

@ -146,8 +146,8 @@ bool CheckAttachmentSampleCompleteness(const Context *context,
// ES3.1 (section 9.4) requires that the value of TEXTURE_FIXED_SAMPLE_LOCATIONS should be
// the same for all attached textures.
bool fixedSampleloc = texture->getFixedSampleLocations(attachmentImageIndex.target,
attachmentImageIndex.mipIndex);
bool fixedSampleloc = texture->getFixedSampleLocations(
attachmentImageIndex.getTarget(), attachmentImageIndex.getLevelIndex());
if (fixedSampleLocations->valid() && fixedSampleloc != fixedSampleLocations->value())
{
return false;
@ -261,6 +261,7 @@ FramebufferState::FramebufferState()
mDefaultHeight(0),
mDefaultSamples(0),
mDefaultFixedSampleLocations(GL_FALSE),
mDefaultLayers(0),
mWebGLDepthStencilConsistent(true)
{
ASSERT(mDrawBufferStates.size() > 0);
@ -277,6 +278,7 @@ FramebufferState::FramebufferState(const Caps &caps)
mDefaultHeight(0),
mDefaultSamples(0),
mDefaultFixedSampleLocations(GL_FALSE),
mDefaultLayers(0),
mWebGLDepthStencilConsistent(true)
{
ASSERT(mDrawBufferStates.size() > 0);
@ -642,16 +644,16 @@ Framebuffer::Framebuffer(const egl::Display *display, egl::Surface *surface)
const Context *proxyContext = display->getProxyContext();
setAttachmentImpl(proxyContext, GL_FRAMEBUFFER_DEFAULT, GL_BACK, ImageIndex::MakeInvalid(),
surface, FramebufferAttachment::kDefaultNumViews,
setAttachmentImpl(proxyContext, GL_FRAMEBUFFER_DEFAULT, GL_BACK, ImageIndex(), surface,
FramebufferAttachment::kDefaultNumViews,
FramebufferAttachment::kDefaultBaseViewIndex,
FramebufferAttachment::kDefaultMultiviewLayout,
FramebufferAttachment::kDefaultViewportOffsets);
if (surface->getConfig()->depthSize > 0)
{
setAttachmentImpl(proxyContext, GL_FRAMEBUFFER_DEFAULT, GL_DEPTH, ImageIndex::MakeInvalid(),
surface, FramebufferAttachment::kDefaultNumViews,
setAttachmentImpl(proxyContext, GL_FRAMEBUFFER_DEFAULT, GL_DEPTH, ImageIndex(), surface,
FramebufferAttachment::kDefaultNumViews,
FramebufferAttachment::kDefaultBaseViewIndex,
FramebufferAttachment::kDefaultMultiviewLayout,
FramebufferAttachment::kDefaultViewportOffsets);
@ -659,11 +661,11 @@ Framebuffer::Framebuffer(const egl::Display *display, egl::Surface *surface)
if (surface->getConfig()->stencilSize > 0)
{
setAttachmentImpl(
proxyContext, GL_FRAMEBUFFER_DEFAULT, GL_STENCIL, ImageIndex::MakeInvalid(), surface,
FramebufferAttachment::kDefaultNumViews, FramebufferAttachment::kDefaultBaseViewIndex,
FramebufferAttachment::kDefaultMultiviewLayout,
FramebufferAttachment::kDefaultViewportOffsets);
setAttachmentImpl(proxyContext, GL_FRAMEBUFFER_DEFAULT, GL_STENCIL, ImageIndex(), surface,
FramebufferAttachment::kDefaultNumViews,
FramebufferAttachment::kDefaultBaseViewIndex,
FramebufferAttachment::kDefaultMultiviewLayout,
FramebufferAttachment::kDefaultViewportOffsets);
}
mState.mDrawBufferTypeMask.setIndex(getDrawbufferWriteType(0), 0);
}
@ -700,11 +702,6 @@ void Framebuffer::onDestroy(const Context *context)
mImpl->destroy(context);
}
void Framebuffer::destroyDefault(const egl::Display *display)
{
mImpl->destroyDefault(display);
}
void Framebuffer::setLabel(const std::string &label)
{
mState.mLabel = label;
@ -981,7 +978,7 @@ void Framebuffer::invalidateCompletenessCache()
}
}
Error Framebuffer::checkStatus(const Context *context, GLenum *statusOut)
GLenum Framebuffer::checkStatus(const Context *context)
{
// The default framebuffer is always complete except when it is surfaceless in which
// case it is always unsupported. We return early because the default framebuffer may
@ -991,8 +988,7 @@ Error Framebuffer::checkStatus(const Context *context, GLenum *statusOut)
ASSERT(mCachedStatus.valid());
ASSERT(mCachedStatus.value() == GL_FRAMEBUFFER_COMPLETE ||
mCachedStatus.value() == GL_FRAMEBUFFER_UNDEFINED_OES);
*statusOut = mCachedStatus.value();
return NoError();
return mCachedStatus.value();
}
if (hasAnyDirtyBit() || !mCachedStatus.valid())
@ -1001,7 +997,12 @@ Error Framebuffer::checkStatus(const Context *context, GLenum *statusOut)
if (mCachedStatus.value() == GL_FRAMEBUFFER_COMPLETE)
{
ANGLE_TRY(syncState(context));
Error err = syncState(context);
if (err.isError())
{
context->handleError(err);
return GetDefaultReturnValue<EntryPoint::CheckFramebufferStatus, GLenum>();
}
if (!mImpl->checkStatus(context))
{
mCachedStatus = GL_FRAMEBUFFER_UNSUPPORTED;
@ -1009,8 +1010,7 @@ Error Framebuffer::checkStatus(const Context *context, GLenum *statusOut)
}
}
*statusOut = mCachedStatus.value();
return NoError();
return mCachedStatus.value();
}
GLenum Framebuffer::checkStatusWithGLFrontEnd(const Context *context)
@ -1433,12 +1433,9 @@ Error Framebuffer::blit(const Context *context,
return mImpl->blit(context, sourceArea, destArea, blitMask, filter);
}
Error Framebuffer::getSamples(const Context *context, int *samplesOut)
int Framebuffer::getSamples(const Context *context)
{
bool completeness = false;
ANGLE_TRY(isComplete(context, &completeness));
*samplesOut = completeness ? getCachedSamples(context) : 0;
return NoError();
return (isComplete(context) ? getCachedSamples(context) : 0);
}
int Framebuffer::getCachedSamples(const Context *context)
@ -1458,9 +1455,9 @@ int Framebuffer::getCachedSamples(const Context *context)
return 0;
}
Error Framebuffer::getSamplePosition(size_t index, GLfloat *xy) const
Error Framebuffer::getSamplePosition(const Context *context, size_t index, GLfloat *xy) const
{
ANGLE_TRY(mImpl->getSamplePosition(index, xy));
ANGLE_TRY(mImpl->getSamplePosition(context, index, xy));
return NoError();
}
@ -1589,7 +1586,7 @@ void Framebuffer::commitWebGL1DepthStencilIfConsistent(const Context *context,
}
else
{
return ImageIndex::MakeInvalid();
return ImageIndex();
}
};
@ -1599,14 +1596,14 @@ void Framebuffer::commitWebGL1DepthStencilIfConsistent(const Context *context,
setAttachmentImpl(context, depth.type(), GL_DEPTH_ATTACHMENT,
getImageIndexIfTextureAttachment(depth), depth.getResource(), numViews,
baseViewIndex, multiviewLayout, viewportOffsets);
setAttachmentImpl(context, GL_NONE, GL_STENCIL_ATTACHMENT, ImageIndex::MakeInvalid(),
nullptr, numViews, baseViewIndex, multiviewLayout, viewportOffsets);
setAttachmentImpl(context, GL_NONE, GL_STENCIL_ATTACHMENT, ImageIndex(), nullptr, numViews,
baseViewIndex, multiviewLayout, viewportOffsets);
}
else if (mState.mWebGLStencilAttachment.isAttached())
{
const auto &stencil = mState.mWebGLStencilAttachment;
setAttachmentImpl(context, GL_NONE, GL_DEPTH_ATTACHMENT, ImageIndex::MakeInvalid(), nullptr,
numViews, baseViewIndex, multiviewLayout, viewportOffsets);
setAttachmentImpl(context, GL_NONE, GL_DEPTH_ATTACHMENT, ImageIndex(), nullptr, numViews,
baseViewIndex, multiviewLayout, viewportOffsets);
setAttachmentImpl(context, stencil.type(), GL_STENCIL_ATTACHMENT,
getImageIndexIfTextureAttachment(stencil), stencil.getResource(),
numViews, baseViewIndex, multiviewLayout, viewportOffsets);
@ -1625,10 +1622,10 @@ void Framebuffer::commitWebGL1DepthStencilIfConsistent(const Context *context,
}
else
{
setAttachmentImpl(context, GL_NONE, GL_DEPTH_ATTACHMENT, ImageIndex::MakeInvalid(), nullptr,
numViews, baseViewIndex, multiviewLayout, viewportOffsets);
setAttachmentImpl(context, GL_NONE, GL_STENCIL_ATTACHMENT, ImageIndex::MakeInvalid(),
nullptr, numViews, baseViewIndex, multiviewLayout, viewportOffsets);
setAttachmentImpl(context, GL_NONE, GL_DEPTH_ATTACHMENT, ImageIndex(), nullptr, numViews,
baseViewIndex, multiviewLayout, viewportOffsets);
setAttachmentImpl(context, GL_NONE, GL_STENCIL_ATTACHMENT, ImageIndex(), nullptr, numViews,
baseViewIndex, multiviewLayout, viewportOffsets);
}
}
@ -1736,7 +1733,7 @@ void Framebuffer::updateAttachment(const Context *context,
void Framebuffer::resetAttachment(const Context *context, GLenum binding)
{
setAttachment(context, GL_NONE, binding, ImageIndex::MakeInvalid(), nullptr);
setAttachment(context, GL_NONE, binding, ImageIndex(), nullptr);
}
Error Framebuffer::syncState(const Context *context)
@ -1792,12 +1789,9 @@ FramebufferAttachment *Framebuffer::getAttachmentFromSubjectIndex(angle::Subject
}
}
Error Framebuffer::isComplete(const Context *context, bool *completeOut)
bool Framebuffer::isComplete(const Context *context)
{
GLenum status = GL_NONE;
ANGLE_TRY(checkStatus(context, &status));
*completeOut = (status == GL_FRAMEBUFFER_COMPLETE);
return NoError();
return (checkStatus(context) == GL_FRAMEBUFFER_COMPLETE);
}
bool Framebuffer::formsRenderingFeedbackLoopWith(const State &state) const
@ -1879,12 +1873,11 @@ bool Framebuffer::formsCopyingFeedbackLoopWith(GLuint copyTextureID,
if (readAttachment->isTextureWithId(copyTextureID))
{
const auto &imageIndex = readAttachment->getTextureImageIndex();
if (imageIndex.mipIndex == copyTextureLevel)
if (imageIndex.getLevelIndex() == copyTextureLevel)
{
// Check 3D/Array texture layers.
return imageIndex.layerIndex == ImageIndex::ENTIRE_LEVEL ||
copyTextureLayer == ImageIndex::ENTIRE_LEVEL ||
imageIndex.layerIndex == copyTextureLayer;
return !imageIndex.hasLayer() || copyTextureLayer == ImageIndex::kEntireLevel ||
imageIndex.getLayerIndex() == copyTextureLayer;
}
}
return false;
@ -1910,6 +1903,11 @@ bool Framebuffer::getDefaultFixedSampleLocations() const
return mState.getDefaultFixedSampleLocations();
}
GLint Framebuffer::getDefaultLayers() const
{
return mState.getDefaultLayers();
}
void Framebuffer::setDefaultWidth(GLint defaultWidth)
{
mState.mDefaultWidth = defaultWidth;
@ -1938,6 +1936,12 @@ void Framebuffer::setDefaultFixedSampleLocations(bool defaultFixedSampleLocation
invalidateCompletenessCache();
}
void Framebuffer::setDefaultLayers(GLint defaultLayers)
{
mState.mDefaultLayers = defaultLayers;
mDirtyBits.set(DIRTY_BIT_DEFAULT_LAYERS);
}
GLsizei Framebuffer::getNumViews() const
{
return mState.getNumViews();

View file

@ -40,13 +40,13 @@ namespace gl
class Context;
class ContextState;
class Framebuffer;
class ImageIndex;
class Renderbuffer;
class State;
class Texture;
class TextureCapsMap;
struct Caps;
struct Extensions;
struct ImageIndex;
struct Rectangle;
class FramebufferState final : angle::NonCopyable
@ -89,6 +89,7 @@ class FramebufferState final : angle::NonCopyable
GLint getDefaultHeight() const { return mDefaultHeight; };
GLint getDefaultSamples() const { return mDefaultSamples; };
bool getDefaultFixedSampleLocations() const { return mDefaultFixedSampleLocations; };
GLint getDefaultLayers() const { return mDefaultLayers; }
bool hasDepth() const;
bool hasStencil() const;
@ -120,6 +121,7 @@ class FramebufferState final : angle::NonCopyable
GLint mDefaultHeight;
GLint mDefaultSamples;
bool mDefaultFixedSampleLocations;
GLint mDefaultLayers;
// It's necessary to store all this extra state so we can restore attachments
// when DEPTH_STENCIL/DEPTH/STENCIL is unbound in WebGL 1.
@ -144,7 +146,6 @@ class Framebuffer final : public angle::ObserverInterface, public LabeledObject
~Framebuffer() override;
void onDestroy(const Context *context);
void destroyDefault(const egl::Display *display);
void setLabel(const std::string &label) override;
const std::string &getLabel() const override;
@ -214,28 +215,30 @@ class Framebuffer final : public angle::ObserverInterface, public LabeledObject
bool usingExtendedDrawBuffers() const;
// This method calls checkStatus.
Error getSamples(const Context *context, int *samplesOut);
int getSamples(const Context *context);
Error getSamplePosition(size_t index, GLfloat *xy) const;
Error getSamplePosition(const Context *context, size_t index, GLfloat *xy) const;
GLint getDefaultWidth() const;
GLint getDefaultHeight() const;
GLint getDefaultSamples() const;
bool getDefaultFixedSampleLocations() const;
GLint getDefaultLayers() const;
void setDefaultWidth(GLint defaultWidth);
void setDefaultHeight(GLint defaultHeight);
void setDefaultSamples(GLint defaultSamples);
void setDefaultFixedSampleLocations(bool defaultFixedSampleLocations);
void setDefaultLayers(GLint defaultLayers);
void invalidateCompletenessCache();
Error checkStatus(const Context *context, GLenum *statusOut);
GLenum checkStatus(const Context *context);
// For when we don't want to check completeness in getSamples().
int getCachedSamples(const Context *context);
// Helper for checkStatus == GL_FRAMEBUFFER_COMPLETE.
Error isComplete(const Context *context, bool *completeOut);
bool isComplete(const Context *context);
bool hasValidDepthStencil() const;
@ -294,6 +297,7 @@ class Framebuffer final : public angle::ObserverInterface, public LabeledObject
DIRTY_BIT_DEFAULT_HEIGHT,
DIRTY_BIT_DEFAULT_SAMPLES,
DIRTY_BIT_DEFAULT_FIXED_SAMPLE_LOCATIONS,
DIRTY_BIT_DEFAULT_LAYERS,
DIRTY_BIT_UNKNOWN,
DIRTY_BIT_MAX = DIRTY_BIT_UNKNOWN
};

View file

@ -53,9 +53,7 @@ std::vector<Offset> FramebufferAttachment::GetDefaultViewportOffsetVector()
FramebufferAttachment::kDefaultViewportOffsets, FramebufferAttachment::kDefaultNumViews);
}
FramebufferAttachment::Target::Target()
: mBinding(GL_NONE),
mTextureIndex(ImageIndex::MakeInvalid())
FramebufferAttachment::Target::Target() : mBinding(GL_NONE), mTextureIndex()
{
}
@ -236,21 +234,21 @@ TextureTarget FramebufferAttachment::cubeMapFace() const
ASSERT(mType == GL_TEXTURE);
const auto &index = mTarget.textureIndex();
return index.type == TextureType::CubeMap ? index.target : TextureTarget::InvalidEnum;
return index.getType() == TextureType::CubeMap ? index.getTarget() : TextureTarget::InvalidEnum;
}
GLint FramebufferAttachment::mipLevel() const
{
ASSERT(type() == GL_TEXTURE);
return mTarget.textureIndex().mipIndex;
return mTarget.textureIndex().getLevelIndex();
}
GLint FramebufferAttachment::layer() const
{
ASSERT(mType == GL_TEXTURE);
const auto &index = mTarget.textureIndex();
return index.hasLayer() ? index.layerIndex : 0;
const gl::ImageIndex &index = mTarget.textureIndex();
return (index.has3DLayer() ? index.getLayerIndex() : 0);
}
GLsizei FramebufferAttachment::getNumViews() const
@ -370,10 +368,10 @@ Error FramebufferAttachmentObject::initializeContents(const Context *context,
// Because gl::Texture cannot support tracking individual layer dirtiness, we only handle
// initializing entire mip levels for 2D array textures.
if (imageIndex.type == TextureType::_2DArray && imageIndex.hasLayer())
if (imageIndex.getType() == TextureType::_2DArray && imageIndex.hasLayer())
{
ImageIndex fullMipIndex = imageIndex;
fullMipIndex.layerIndex = ImageIndex::ENTIRE_LEVEL;
ImageIndex fullMipIndex =
ImageIndex::Make2DArray(imageIndex.getLevelIndex(), ImageIndex::kEntireLevel);
return getAttachmentImpl()->initializeContents(context, fullMipIndex);
}
else

View file

@ -0,0 +1,410 @@
//
// Copyright 2018 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.
//
// GLES1Renderer.cpp: Implements the GLES1Renderer renderer.
#include "libANGLE/GLES1Renderer.h"
#include <string.h>
#include <iterator>
#include <sstream>
#include <vector>
#include "libANGLE/Context.h"
#include "libANGLE/Program.h"
#include "libANGLE/ResourceManager.h"
#include "libANGLE/Shader.h"
#include "libANGLE/State.h"
#include "libANGLE/renderer/ContextImpl.h"
namespace
{
#include "libANGLE/GLES1Shaders.inc"
} // anonymous namespace
namespace gl
{
GLES1Renderer::GLES1Renderer() : mRendererProgramInitialized(false)
{
}
void GLES1Renderer::onDestroy(Context *context, State *state)
{
if (mRendererProgramInitialized)
{
state->setProgram(context, 0);
mShaderPrograms->deleteProgram(context, mProgramState.program);
mShaderPrograms->release(context);
mShaderPrograms = nullptr;
mRendererProgramInitialized = false;
}
}
GLES1Renderer::~GLES1Renderer() = default;
Error GLES1Renderer::prepareForDraw(Context *context, State *glState)
{
ANGLE_TRY(initializeRendererProgram(context, glState));
const GLES1State &gles1State = glState->gles1();
Program *programObject = getProgram(mProgramState.program);
GLES1UniformBuffers &uniformBuffers = mUniformBuffers;
if (!gles1State.isClientStateEnabled(ClientVertexArrayType::Normal))
{
const angle::Vector3 normal = gles1State.getCurrentNormal();
context->vertexAttrib3f(kNormalAttribIndex, normal.x(), normal.y(), normal.z());
}
if (!gles1State.isClientStateEnabled(ClientVertexArrayType::Color))
{
const ColorF color = gles1State.getCurrentColor();
context->vertexAttrib4f(kColorAttribIndex, color.red, color.green, color.blue, color.alpha);
}
if (!gles1State.isClientStateEnabled(ClientVertexArrayType::PointSize))
{
GLfloat pointSize = gles1State.mPointParameters.pointSize;
context->vertexAttrib1f(kPointSizeAttribIndex, pointSize);
}
for (int i = 0; i < kTexUnitCount; i++)
{
if (!gles1State.mTexCoordArrayEnabled[i])
{
const TextureCoordF texcoord = gles1State.getCurrentTextureCoords(i);
context->vertexAttrib4f(kTextureCoordAttribIndexBase + i, texcoord.s, texcoord.t,
texcoord.r, texcoord.q);
}
}
{
angle::Mat4 proj = gles1State.mProjectionMatrices.back();
if (mProgramState.projMatrixLoc != -1)
{
programObject->setUniformMatrix4fv(mProgramState.projMatrixLoc, 1, GL_FALSE,
proj.data());
}
angle::Mat4 modelview = gles1State.mModelviewMatrices.back();
if (mProgramState.modelviewMatrixLoc != -1)
{
programObject->setUniformMatrix4fv(mProgramState.modelviewMatrixLoc, 1, GL_FALSE,
modelview.data());
}
angle::Mat4 modelviewInvTr = modelview.transpose().inverse();
if (mProgramState.modelviewInvTrLoc != -1)
{
programObject->setUniformMatrix4fv(mProgramState.modelviewInvTrLoc, 1, GL_FALSE,
modelviewInvTr.data());
}
Mat4Uniform *textureMatrixBuffer = uniformBuffers.textureMatrices.data();
for (int i = 0; i < kTexUnitCount; i++)
{
angle::Mat4 textureMatrix = gles1State.mTextureMatrices[i].back();
memcpy(textureMatrixBuffer + i, textureMatrix.data(), sizeof(Mat4Uniform));
}
if (mProgramState.textureMatrixLoc != -1)
{
programObject->setUniformMatrix4fv(mProgramState.textureMatrixLoc, 4, GL_FALSE,
(float *)uniformBuffers.textureMatrices.data());
}
}
{
std::array<GLint, kTexUnitCount> &tex2DEnables = uniformBuffers.tex2DEnables;
std::array<GLint, kTexUnitCount> &texCubeEnables = uniformBuffers.texCubeEnables;
for (int i = 0; i < kTexUnitCount; i++)
{
// GL_OES_cube_map allows only one of TEXTURE_2D / TEXTURE_CUBE_MAP
// to be enabled per unit, thankfully. From the extension text:
//
// -- Section 3.8.10 "Texture Application"
//
// Replace the beginning sentences of the first paragraph (page 138)
// with:
//
// "Texturing is enabled or disabled using the generic Enable
// and Disable commands, respectively, with the symbolic constants
// TEXTURE_2D or TEXTURE_CUBE_MAP_OES to enable the two-dimensional or cube
// map texturing respectively. If the cube map texture and the two-
// dimensional texture are enabled, then cube map texturing is used. If
// texturing is disabled, a rasterized fragment is passed on unaltered to the
// next stage of the GL (although its texture coordinates may be discarded).
// Otherwise, a texture value is found according to the parameter values of
// the currently bound texture image of the appropriate dimensionality.
texCubeEnables[i] = gles1State.isTextureTargetEnabled(i, TextureType::CubeMap);
tex2DEnables[i] =
!texCubeEnables[i] && (gles1State.isTextureTargetEnabled(i, TextureType::_2D));
}
if (mProgramState.enableTexture2DLoc != -1)
{
programObject->setUniform1iv(mProgramState.enableTexture2DLoc, kTexUnitCount,
tex2DEnables.data());
}
if (mProgramState.enableTextureCubeMapLoc != -1)
{
programObject->setUniform1iv(mProgramState.enableTextureCubeMapLoc, kTexUnitCount,
texCubeEnables.data());
}
GLint flatShading = gles1State.mShadeModel == ShadingModel::Flat;
if (mProgramState.shadeModelFlatLoc != -1)
{
programObject->setUniform1iv(mProgramState.shadeModelFlatLoc, 1, &flatShading);
}
}
// None of those are changes in sampler, so there is no need to set the GL_PROGRAM dirty.
// Otherwise, put the dirtying here.
return NoError();
}
int GLES1Renderer::vertexArrayIndex(ClientVertexArrayType type, const State *glState) const
{
switch (type)
{
case ClientVertexArrayType::Vertex:
return kVertexAttribIndex;
case ClientVertexArrayType::Normal:
return kNormalAttribIndex;
case ClientVertexArrayType::Color:
return kColorAttribIndex;
case ClientVertexArrayType::PointSize:
return kPointSizeAttribIndex;
case ClientVertexArrayType::TextureCoord:
return kTextureCoordAttribIndexBase + glState->gles1().getClientTextureUnit();
default:
UNREACHABLE();
return 0;
}
}
// static
int GLES1Renderer::TexCoordArrayIndex(unsigned int unit)
{
return kTextureCoordAttribIndexBase + unit;
}
AttributesMask GLES1Renderer::getVertexArraysAttributeMask(const State *glState) const
{
AttributesMask res;
const GLES1State &gles1 = glState->gles1();
ClientVertexArrayType nonTexcoordArrays[] = {
ClientVertexArrayType::Vertex, ClientVertexArrayType::Normal, ClientVertexArrayType::Color,
ClientVertexArrayType::PointSize,
};
for (const ClientVertexArrayType attrib : nonTexcoordArrays)
{
res.set(vertexArrayIndex(attrib, glState), gles1.isClientStateEnabled(attrib));
}
for (unsigned int i = 0; i < kTexUnitCount; i++)
{
res.set(TexCoordArrayIndex(i), gles1.isTexCoordArrayEnabled(i));
}
return res;
}
Shader *GLES1Renderer::getShader(GLuint handle) const
{
return mShaderPrograms->getShader(handle);
}
Program *GLES1Renderer::getProgram(GLuint handle) const
{
return mShaderPrograms->getProgram(handle);
}
Error GLES1Renderer::compileShader(Context *context,
ShaderType shaderType,
const char *src,
GLuint *shaderOut)
{
rx::ContextImpl *implementation = context->getImplementation();
const Limitations &limitations = implementation->getNativeLimitations();
GLuint shader = mShaderPrograms->createShader(implementation, limitations, shaderType);
Shader *shaderObject = getShader(shader);
if (!shaderObject)
return InternalError();
shaderObject->setSource(1, &src, nullptr);
shaderObject->compile(context);
*shaderOut = shader;
if (!shaderObject->isCompiled(context))
{
GLint infoLogLength = shaderObject->getInfoLogLength(context);
std::vector<char> infoLog(infoLogLength, 0);
shaderObject->getInfoLog(context, infoLogLength - 1, nullptr, infoLog.data());
fprintf(stderr, "GLES1Renderer::%s: Info log: %s\n", __func__, infoLog.data());
return InternalError() << "GLES1Renderer shader compile failed. Source: " << src
<< " Info log: " << infoLog.data();
}
return NoError();
}
Error GLES1Renderer::linkProgram(Context *context,
State *glState,
GLuint vertexShader,
GLuint fragmentShader,
const std::unordered_map<GLint, std::string> &attribLocs,
GLuint *programOut)
{
GLuint program = mShaderPrograms->createProgram(context->getImplementation());
Program *programObject = getProgram(program);
if (!programObject)
{
return InternalError();
}
*programOut = program;
programObject->attachShader(getShader(vertexShader));
programObject->attachShader(getShader(fragmentShader));
for (auto it : attribLocs)
{
GLint index = it.first;
const std::string &name = it.second;
programObject->bindAttributeLocation(index, name.c_str());
}
ANGLE_TRY(programObject->link(context));
glState->onProgramExecutableChange(programObject);
if (!programObject->isLinked())
{
GLint infoLogLength = programObject->getInfoLogLength();
std::vector<char> infoLog(infoLogLength, 0);
programObject->getInfoLog(infoLogLength - 1, nullptr, infoLog.data());
return InternalError() << "GLES1Renderer program link failed. Info log: " << infoLog.data();
}
programObject->detachShader(context, getShader(vertexShader));
programObject->detachShader(context, getShader(fragmentShader));
return NoError();
}
Error GLES1Renderer::initializeRendererProgram(Context *context, State *glState)
{
if (mRendererProgramInitialized)
{
return NoError();
}
mShaderPrograms = new ShaderProgramManager();
GLuint vertexShader;
GLuint fragmentShader;
ANGLE_TRY(compileShader(context, ShaderType::Vertex, kGLES1DrawVShader, &vertexShader));
std::stringstream fragmentStream;
fragmentStream << kGLES1DrawFShaderHeader;
fragmentStream << kGLES1DrawFShaderUniformDefs;
fragmentStream << kGLES1DrawFShaderFunctions;
fragmentStream << kGLES1DrawFShaderMain;
ANGLE_TRY(compileShader(context, ShaderType::Fragment, fragmentStream.str().c_str(),
&fragmentShader));
std::unordered_map<GLint, std::string> attribLocs;
attribLocs[(GLint)kVertexAttribIndex] = "pos";
attribLocs[(GLint)kNormalAttribIndex] = "normal";
attribLocs[(GLint)kColorAttribIndex] = "color";
attribLocs[(GLint)kPointSizeAttribIndex] = "pointsize";
for (int i = 0; i < kTexUnitCount; i++)
{
std::stringstream ss;
ss << "texcoord" << i;
attribLocs[kTextureCoordAttribIndexBase + i] = ss.str();
}
ANGLE_TRY(linkProgram(context, glState, vertexShader, fragmentShader, attribLocs,
&mProgramState.program));
mShaderPrograms->deleteShader(context, vertexShader);
mShaderPrograms->deleteShader(context, fragmentShader);
Program *programObject = getProgram(mProgramState.program);
mProgramState.projMatrixLoc = programObject->getUniformLocation("projection");
mProgramState.modelviewMatrixLoc = programObject->getUniformLocation("modelview");
mProgramState.textureMatrixLoc = programObject->getUniformLocation("texture_matrix");
mProgramState.modelviewInvTrLoc = programObject->getUniformLocation("modelview_invtr");
for (int i = 0; i < kTexUnitCount; i++)
{
std::stringstream ss2d;
std::stringstream sscube;
ss2d << "tex_sampler" << i;
sscube << "tex_cube_sampler" << i;
mProgramState.tex2DSamplerLocs[i] = programObject->getUniformLocation(ss2d.str().c_str());
mProgramState.texCubeSamplerLocs[i] =
programObject->getUniformLocation(sscube.str().c_str());
}
mProgramState.shadeModelFlatLoc = programObject->getUniformLocation("shade_model_flat");
mProgramState.enableTexture2DLoc = programObject->getUniformLocation("enable_texture_2d");
mProgramState.enableTextureCubeMapLoc =
programObject->getUniformLocation("enable_texture_cube_map");
glState->setProgram(context, programObject);
for (int i = 0; i < kTexUnitCount; i++)
{
if (mProgramState.tex2DSamplerLocs[i] != -1)
{
GLint val = i;
programObject->setUniform1iv(mProgramState.tex2DSamplerLocs[i], 1, &val);
}
if (mProgramState.texCubeSamplerLocs[i] != -1)
{
GLint val = i + kTexUnitCount;
programObject->setUniform1iv(mProgramState.texCubeSamplerLocs[i], 1, &val);
}
}
glState->setObjectDirty(GL_PROGRAM);
mRendererProgramInitialized = true;
return NoError();
}
} // namespace gl

View file

@ -0,0 +1,104 @@
//
// Copyright 2018 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.
//
// GLES1Renderer.h: Defines GLES1 emulation rendering operations on top of a GLES3
// context. Used by Context.h.
#ifndef LIBANGLE_GLES1_RENDERER_H_
#define LIBANGLE_GLES1_RENDERER_H_
#include "angle_gl.h"
#include "common/angleutils.h"
#include "libANGLE/angletypes.h"
#include <memory>
#include <string>
#include <unordered_map>
namespace gl
{
class Context;
class Program;
class State;
class Shader;
class ShaderProgramManager;
class GLES1Renderer final : angle::NonCopyable
{
public:
GLES1Renderer();
~GLES1Renderer();
void onDestroy(Context *context, State *state);
Error prepareForDraw(Context *context, State *glState);
int vertexArrayIndex(ClientVertexArrayType type, const State *glState) const;
static int TexCoordArrayIndex(unsigned int unit);
AttributesMask getVertexArraysAttributeMask(const State *glState) const;
private:
using Mat4Uniform = float[16];
Shader *getShader(GLuint handle) const;
Program *getProgram(GLuint handle) const;
Error compileShader(Context *context,
ShaderType shaderType,
const char *src,
GLuint *shaderOut);
Error linkProgram(Context *context,
State *glState,
GLuint vshader,
GLuint fshader,
const std::unordered_map<GLint, std::string> &attribLocs,
GLuint *programOut);
Error initializeRendererProgram(Context *context, State *glState);
static constexpr int kTexUnitCount = 4;
static constexpr int kVertexAttribIndex = 0;
static constexpr int kNormalAttribIndex = 1;
static constexpr int kColorAttribIndex = 2;
static constexpr int kPointSizeAttribIndex = 3;
static constexpr int kTextureCoordAttribIndexBase = 4;
bool mRendererProgramInitialized;
ShaderProgramManager *mShaderPrograms;
struct GLES1ProgramState
{
GLuint program;
GLint projMatrixLoc;
GLint modelviewMatrixLoc;
GLint textureMatrixLoc;
GLint modelviewInvTrLoc;
std::array<GLint, kTexUnitCount> tex2DSamplerLocs;
std::array<GLint, kTexUnitCount> texCubeSamplerLocs;
GLint shadeModelFlatLoc;
GLint enableTexture2DLoc;
GLint enableTextureCubeMapLoc;
};
struct GLES1UniformBuffers
{
std::array<Mat4Uniform, kTexUnitCount> textureMatrices;
std::array<GLint, kTexUnitCount> tex2DEnables;
std::array<GLint, kTexUnitCount> texCubeEnables;
};
GLES1UniformBuffers mUniformBuffers;
GLES1ProgramState mProgramState;
};
} // namespace gl
#endif // LIBANGLE_GLES1_RENDERER_H_

View file

@ -0,0 +1,262 @@
//
// Copyright 2018 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.
//
// GLES1Shaders.inc: Defines GLES1 emulation shader.
constexpr char kGLES1DrawVShader[] = R"(#version 300 es
precision highp float;
#define kMaxTexUnits 4
in vec4 pos;
in vec3 normal;
in vec4 color;
in float pointsize;
in vec4 texcoord0;
in vec4 texcoord1;
in vec4 texcoord2;
in vec4 texcoord3;
uniform mat4 projection;
uniform mat4 modelview;
uniform mat4 modelview_invtr;
uniform mat4 texture_matrix[4];
out vec4 pos_varying;
out vec3 normal_varying;
out vec4 color_varying;
flat out vec4 color_varying_flat;
out float pointsize_varying;
out vec4 texcoord0_varying;
out vec4 texcoord1_varying;
out vec4 texcoord2_varying;
out vec4 texcoord3_varying;
void main()
{
pos_varying = modelview * pos;
mat3 mvInvTr3 = mat3(modelview_invtr);
normal_varying = mvInvTr3 * normal;
color_varying = color;
color_varying_flat = color;
pointsize_varying = pointsize;
texcoord0_varying = texture_matrix[0] * texcoord0;
texcoord1_varying = texture_matrix[1] * texcoord1;
texcoord2_varying = texture_matrix[2] * texcoord2;
texcoord3_varying = texture_matrix[3] * texcoord3;
vec4 vertexPos = projection * modelview * pos;
gl_Position = vertexPos;
}
)";
// version, flat,
constexpr char kGLES1DrawFShaderHeader[] = R"(#version 300 es
precision highp float;
// Defines for GL constants
#define kMaxLights 8
#define kMaxTexUnits 4
#define kModulate 0x2100
#define kDecal 0x2101
#define kCombine 0x8570
#define kReplace 0x1E01
#define kBlend 0x0BE2
#define kAdd 0x0104
#define kAddSigned 0x8574
#define kInterpolate 0x8575
#define kSubtract 0x84E7
#define kDot3Rgb 0x86AE
#define kDot3Rgba 0x86AF
#define kAlpha 0x1906
#define kRGB 0x1907
#define kRGBA 0x1908
#define kLuminance 0x1909
#define kLuminanceAlpha 0x190A
#define kTexture 0x1702
#define kConstant 0x8576
#define kPrimaryColor 0x8577
#define kPrevious 0x8578
#define kSrcColor 0x0300
#define kOneMinusSrcColor 0x0301
#define kSrcAlpha 0x0302
#define kOneMinusSrcAlpha 0x0303
#define kLinear 0x2601
#define kExp 0x0800
#define kExp2 0x0801
#define kNever 0x0200
#define kLess 0x0201
#define kEqual 0x0202
#define kLequal 0x0203
#define kGreater 0x0204
#define kNotequal 0x0205
#define kGequal 0x0206
#define kAlways 0x0207
#define kZero 0x0
#define kOne 0x1
#define kClear 0x1500
#define kAnd 0x1501
#define kAnd_reverse 0x1502
#define kCopy 0x1503
#define kAnd_inverted 0x1504
#define kNoop 0x1505
#define kXor 0x1506
#define kOr 0x1507
#define kNor 0x1508
#define kEquiv 0x1509
#define kInvert 0x150A
#define kOr_reverse 0x150B
#define kCopy_inverted 0x150C
#define kOr_inverted 0x150D
#define kNand 0x150E
#define kSet 0x150F)";
constexpr char kGLES1DrawFShaderUniformDefs[] = R"(
// Texture units ///////////////////////////////////////////////////////////////
uniform bool enable_texture_2d[kMaxTexUnits];
uniform bool enable_texture_cube_map[kMaxTexUnits];
// These are not arrays because hw support for arrays
// of samplers is rather lacking.
uniform sampler2D tex_sampler0;
uniform samplerCube tex_cube_sampler0;
uniform sampler2D tex_sampler1;
uniform samplerCube tex_cube_sampler1;
uniform sampler2D tex_sampler2;
uniform samplerCube tex_cube_sampler2;
uniform sampler2D tex_sampler3;
uniform samplerCube tex_cube_sampler3;
// Global enables, alpha func, logic op ////////////////////////////////////////
uniform bool shade_model_flat;
// Vertex attributes////////////////////////////////////////////////////////////
in vec4 pos_varying;
in vec3 normal_varying;
in vec4 color_varying;
flat in vec4 color_varying_flat;
in float pointsize_varying;
in vec4 texcoord0_varying;
in vec4 texcoord1_varying;
in vec4 texcoord2_varying;
in vec4 texcoord3_varying;
// Outgoing fragment////////////////////////////////////////////////////////////
out vec4 frag_color;
)";
constexpr char kGLES1DrawFShaderFunctions[] = R"(
bool isTextureUnitEnabled(int unit)
{
return enable_texture_2d[unit] || enable_texture_cube_map[unit];
}
vec4 getTextureColor(int unit)
{
vec4 res;
switch (unit)
{
case 0:
if (enable_texture_2d[0])
{
res = texture(tex_sampler0, texcoord0_varying.xy);
}
else if (enable_texture_cube_map[0])
{
res = texture(tex_cube_sampler0, texcoord0_varying.xyz);
}
break;
case 1:
if (enable_texture_2d[1])
{
res = texture(tex_sampler1, texcoord1_varying.xy);
}
else if (enable_texture_cube_map[1])
{
res = texture(tex_cube_sampler1, texcoord1_varying.xyz);
}
break;
case 2:
if (enable_texture_2d[2])
{
res = texture(tex_sampler2, texcoord2_varying.xy);
}
else if (enable_texture_cube_map[2])
{
res = texture(tex_cube_sampler2, texcoord2_varying.xyz);
}
break;
case 3:
if (enable_texture_2d[3])
{
res = texture(tex_sampler3, texcoord3_varying.xy);
}
else if (enable_texture_cube_map[3])
{
// TODO: Weird stuff happens
// res = texture(tex_cube_sampler3, texcoord3_varying.xyz);
}
break;
default:
break;
}
return res;
}
vec4 getColor(int unit, vec4 vertexColor)
{
if (!isTextureUnitEnabled(unit))
{
return vertexColor;
}
return getTextureColor(unit);
}
)";
constexpr char kGLES1DrawFShaderMain[] = R"(
void main()
{
vec4 currentFragment;
vec4 vertex_color;
if (shade_model_flat)
{
vertex_color = color_varying_flat;
}
else
{
vertex_color = color_varying;
}
// Unit 0 only for now
currentFragment = getColor(0, vertex_color);
frag_color = currentFragment;
}
)";

View file

@ -69,8 +69,7 @@ void GLES1State::initialize(const Context *context, const State *state)
mTexUnitEnables.resize(caps.maxMultitextureUnits);
for (auto &enables : mTexUnitEnables)
{
enables.enable2D = false;
enables.enableCubeMap = false;
enables.reset();
}
mVertexArrayEnabled = false;
@ -264,8 +263,64 @@ void GLES1State::loadMatrix(const angle::Mat4 &m)
void GLES1State::multMatrix(const angle::Mat4 &m)
{
angle::Mat4 currentMatrix = currentMatrixStack().back();
angle::Mat4 currentMatrix = currentMatrixStack().back();
currentMatrixStack().back() = currentMatrix.product(m);
}
void GLES1State::setClientStateEnabled(ClientVertexArrayType clientState, bool enable)
{
switch (clientState)
{
case ClientVertexArrayType::Vertex:
mVertexArrayEnabled = enable;
break;
case ClientVertexArrayType::Normal:
mNormalArrayEnabled = enable;
break;
case ClientVertexArrayType::Color:
mColorArrayEnabled = enable;
break;
case ClientVertexArrayType::PointSize:
mPointSizeArrayEnabled = enable;
break;
case ClientVertexArrayType::TextureCoord:
mTexCoordArrayEnabled[mClientActiveTexture] = enable;
break;
default:
UNREACHABLE();
break;
}
}
bool GLES1State::isClientStateEnabled(ClientVertexArrayType clientState) const
{
switch (clientState)
{
case ClientVertexArrayType::Vertex:
return mVertexArrayEnabled;
case ClientVertexArrayType::Normal:
return mNormalArrayEnabled;
case ClientVertexArrayType::Color:
return mColorArrayEnabled;
case ClientVertexArrayType::PointSize:
return mPointSizeArrayEnabled;
case ClientVertexArrayType::TextureCoord:
return mTexCoordArrayEnabled[mClientActiveTexture];
default:
UNREACHABLE();
return false;
}
}
bool GLES1State::isTexCoordArrayEnabled(unsigned int unit) const
{
ASSERT(unit < mTexCoordArrayEnabled.size());
return mTexCoordArrayEnabled[unit];
}
bool GLES1State::isTextureTargetEnabled(unsigned int unit, const TextureType type) const
{
return mTexUnitEnables[unit].test(type);
}
} // namespace gl

View file

@ -115,7 +115,9 @@ struct PointParameters
};
class Context;
class GLES1Renderer;
class State;
class GLES1State final : angle::NonCopyable
{
public:
@ -150,20 +152,21 @@ class GLES1State final : angle::NonCopyable
void loadMatrix(const angle::Mat4 &m);
void multMatrix(const angle::Mat4 &m);
void setClientStateEnabled(ClientVertexArrayType clientState, bool enable);
bool isClientStateEnabled(ClientVertexArrayType clientState) const;
bool isTexCoordArrayEnabled(unsigned int unit) const;
bool isTextureTargetEnabled(unsigned int unit, const TextureType type) const;
private:
friend class State;
friend class GLES1Renderer;
// Back pointer for reading from State.
const State *mGLState;
// All initial state values come from the
// OpenGL ES 1.1 spec.
struct TextureEnables
{
bool enable2D = false;
bool enableCubeMap = false;
};
std::vector<TextureEnables> mTexUnitEnables;
std::vector<angle::PackedEnumBitSet<TextureType>> mTexUnitEnables;
// Table 6.4, 6.5 (IsEnabled)
bool mVertexArrayEnabled;

View file

@ -26,7 +26,7 @@ gl::ImageIndex GetImageIndex(EGLenum eglTarget, const egl::AttributeMap &attribs
{
if (eglTarget == EGL_GL_RENDERBUFFER)
{
return gl::ImageIndex::MakeInvalid();
return gl::ImageIndex();
}
gl::TextureTarget target = egl_gl::EGLImageTargetToTextureTarget(eglTarget);
@ -40,7 +40,7 @@ gl::ImageIndex GetImageIndex(EGLenum eglTarget, const egl::AttributeMap &attribs
else
{
ASSERT(layer == 0);
return gl::ImageIndex::MakeGeneric(target, mip);
return gl::ImageIndex::MakeFromTarget(target, mip);
}
}
} // anonymous namespace

View file

@ -1,4 +1,3 @@
#include "ImageIndex.h"
//
// Copyright 2014 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
@ -8,186 +7,253 @@
// ImageIndex.cpp: Implementation for ImageIndex methods.
#include "libANGLE/ImageIndex.h"
#include "libANGLE/Constants.h"
#include "common/utilities.h"
#include "libANGLE/Constants.h"
#include "libANGLE/angletypes.h"
#include <tuple>
namespace gl
{
namespace
{
GLint TextureTargetToLayer(TextureTarget target)
{
switch (target)
{
case TextureTarget::CubeMapPositiveX:
return 0;
case TextureTarget::CubeMapNegativeX:
return 1;
case TextureTarget::CubeMapPositiveY:
return 2;
case TextureTarget::CubeMapNegativeY:
return 3;
case TextureTarget::CubeMapPositiveZ:
return 4;
case TextureTarget::CubeMapNegativeZ:
return 5;
case TextureTarget::External:
return ImageIndex::kEntireLevel;
case TextureTarget::Rectangle:
return ImageIndex::kEntireLevel;
case TextureTarget::_2D:
return ImageIndex::kEntireLevel;
case TextureTarget::_2DArray:
return ImageIndex::kEntireLevel;
case TextureTarget::_2DMultisample:
return ImageIndex::kEntireLevel;
case TextureTarget::_3D:
return ImageIndex::kEntireLevel;
default:
UNREACHABLE();
return 0;
}
}
TextureTarget TextureTypeToTarget(TextureType type, GLint layerIndex)
{
if (type == TextureType::CubeMap)
{
return CubeFaceIndexToTextureTarget(layerIndex);
}
else
{
return NonCubeTextureTypeToTarget(type);
}
}
} // anonymous namespace
ImageIndex::ImageIndex()
: mType(TextureType::InvalidEnum), mLevelIndex(0), mLayerIndex(0), mLayerCount(kEntireLevel)
{
}
ImageIndex::ImageIndex(const ImageIndex &other) = default;
ImageIndex &ImageIndex::operator=(const ImageIndex &other) = default;
bool ImageIndex::is3D() const
bool ImageIndex::hasLayer() const
{
return type == TextureType::_3D || type == TextureType::_2DArray;
return mLayerIndex != kEntireLevel;
}
bool ImageIndex::has3DLayer() const
{
// It's quicker to check != CubeMap than calling usesTex3D, which checks multiple types. This
// ASSERT validates the check gives the same result.
ASSERT(!hasLayer() || (mType != TextureType::CubeMap == usesTex3D()));
return (hasLayer() && mType != TextureType::CubeMap);
}
bool ImageIndex::usesTex3D() const
{
return mType == TextureType::_3D || mType == TextureType::_2DArray;
}
TextureTarget ImageIndex::getTarget() const
{
return TextureTypeToTarget(mType, mLayerIndex);
}
GLint ImageIndex::cubeMapFaceIndex() const
{
ASSERT(type == TextureType::CubeMap);
ASSERT(TextureTargetToType(target) == TextureType::CubeMap);
return static_cast<GLint>(CubeMapTextureTargetToFaceIndex(target));
ASSERT(mType == TextureType::CubeMap);
ASSERT(mLayerIndex == kEntireLevel || mLayerIndex < static_cast<GLint>(CUBE_FACE_COUNT));
return mLayerIndex;
}
bool ImageIndex::valid() const
{
return type != TextureType::InvalidEnum;
return mType != TextureType::InvalidEnum;
}
ImageIndex ImageIndex::Make2D(GLint mipIndex)
ImageIndex ImageIndex::Make2D(GLint levelIndex)
{
return ImageIndex(TextureType::_2D, TextureTarget::_2D, mipIndex, ENTIRE_LEVEL, 1);
return ImageIndex(TextureType::_2D, levelIndex, kEntireLevel, 1);
}
ImageIndex ImageIndex::MakeRectangle(GLint mipIndex)
ImageIndex ImageIndex::MakeRectangle(GLint levelIndex)
{
return ImageIndex(TextureType::Rectangle, TextureTarget::Rectangle, mipIndex, ENTIRE_LEVEL, 1);
return ImageIndex(TextureType::Rectangle, levelIndex, kEntireLevel, 1);
}
ImageIndex ImageIndex::MakeCube(TextureTarget target, GLint mipIndex)
ImageIndex ImageIndex::MakeCube(TextureTarget target, GLint levelIndex)
{
ASSERT(TextureTargetToType(target) == TextureType::CubeMap);
return ImageIndex(TextureType::CubeMap, target, mipIndex, ENTIRE_LEVEL, 1);
return ImageIndex(TextureType::CubeMap, levelIndex, TextureTargetToLayer(target), 1);
}
ImageIndex ImageIndex::Make2DArray(GLint mipIndex, GLint layerIndex)
ImageIndex ImageIndex::Make2DArray(GLint levelIndex, GLint layerIndex)
{
return ImageIndex(TextureType::_2DArray, TextureTarget::_2DArray, mipIndex, layerIndex, 1);
return ImageIndex(TextureType::_2DArray, levelIndex, layerIndex, 1);
}
ImageIndex ImageIndex::Make2DArrayRange(GLint mipIndex, GLint layerIndex, GLint numLayers)
ImageIndex ImageIndex::Make2DArrayRange(GLint levelIndex, GLint layerIndex, GLint numLayers)
{
return ImageIndex(TextureType::_2DArray, TextureTarget::_2DArray, mipIndex, layerIndex,
numLayers);
return ImageIndex(TextureType::_2DArray, levelIndex, layerIndex, numLayers);
}
ImageIndex ImageIndex::Make3D(GLint mipIndex, GLint layerIndex)
ImageIndex ImageIndex::Make3D(GLint levelIndex, GLint layerIndex)
{
return ImageIndex(TextureType::_3D, TextureTarget::_3D, mipIndex, layerIndex, 1);
return ImageIndex(TextureType::_3D, levelIndex, layerIndex, 1);
}
ImageIndex ImageIndex::MakeGeneric(TextureTarget target, GLint mipIndex)
ImageIndex ImageIndex::MakeFromTarget(TextureTarget target, GLint levelIndex)
{
return ImageIndex(TextureTargetToType(target), target, mipIndex, ENTIRE_LEVEL, 1);
return ImageIndex(TextureTargetToType(target), levelIndex, TextureTargetToLayer(target), 1);
}
ImageIndex ImageIndex::MakeFromType(TextureType type,
GLint levelIndex,
GLint layerIndex,
GLint layerCount)
{
GLint overrideLayerCount =
(type == TextureType::CubeMap && layerIndex == kEntireLevel ? CUBE_FACE_COUNT : layerCount);
return ImageIndex(type, levelIndex, layerIndex, overrideLayerCount);
}
ImageIndex ImageIndex::Make2DMultisample()
{
return ImageIndex(TextureType::_2DMultisample, TextureTarget::_2DMultisample, 0, ENTIRE_LEVEL,
1);
return ImageIndex(TextureType::_2DMultisample, 0, kEntireLevel, 1);
}
ImageIndex ImageIndex::MakeInvalid()
bool ImageIndex::operator<(const ImageIndex &b) const
{
return ImageIndex(TextureType::InvalidEnum, TextureTarget::InvalidEnum, -1, -1, -1);
return std::tie(mType, mLevelIndex, mLayerIndex, mLayerCount) <
std::tie(b.mType, b.mLevelIndex, b.mLayerIndex, b.mLayerCount);
}
bool operator<(const ImageIndex &a, const ImageIndex &b)
bool ImageIndex::operator==(const ImageIndex &b) const
{
return std::tie(a.type, a.target, a.mipIndex, a.layerIndex, a.numLayers) <
std::tie(b.type, b.target, b.mipIndex, b.layerIndex, b.numLayers);
return std::tie(mType, mLevelIndex, mLayerIndex, mLayerCount) ==
std::tie(b.mType, b.mLevelIndex, b.mLayerIndex, b.mLayerCount);
}
bool operator==(const ImageIndex &a, const ImageIndex &b)
bool ImageIndex::operator!=(const ImageIndex &b) const
{
return std::tie(a.type, a.target, a.mipIndex, a.layerIndex, a.numLayers) ==
std::tie(b.type, b.target, b.mipIndex, b.layerIndex, b.numLayers);
return !(*this == b);
}
bool operator!=(const ImageIndex &a, const ImageIndex &b)
{
return !(a == b);
}
ImageIndex::ImageIndex(TextureType typeIn,
TextureTarget targetIn,
GLint mipIndexIn,
GLint layerIndexIn,
GLint numLayersIn)
: type(typeIn),
target(targetIn),
mipIndex(mipIndexIn),
layerIndex(layerIndexIn),
numLayers(numLayersIn)
ImageIndex::ImageIndex(TextureType type, GLint levelIndex, GLint layerIndex, GLint layerCount)
: mType(type), mLevelIndex(levelIndex), mLayerIndex(layerIndex), mLayerCount(layerCount)
{}
ImageIndexIterator ImageIndex::getLayerIterator(GLint layerCount) const
{
ASSERT(mType != TextureType::_2D && !hasLayer());
return ImageIndexIterator::MakeGeneric(mType, mLevelIndex, mLevelIndex + 1, 0, layerCount);
}
ImageIndexIterator::ImageIndexIterator(const ImageIndexIterator &other) = default;
ImageIndexIterator ImageIndexIterator::Make2D(GLint minMip, GLint maxMip)
{
return ImageIndexIterator(
TextureType::_2D, TextureTarget::_2D, TextureTarget::_2D, Range<GLint>(minMip, maxMip),
Range<GLint>(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL), nullptr);
return ImageIndexIterator(TextureType::_2D, Range<GLint>(minMip, maxMip),
Range<GLint>(ImageIndex::kEntireLevel, ImageIndex::kEntireLevel),
nullptr);
}
ImageIndexIterator ImageIndexIterator::MakeRectangle(GLint minMip, GLint maxMip)
{
return ImageIndexIterator(TextureType::Rectangle, TextureTarget::Rectangle,
TextureTarget::Rectangle, Range<GLint>(minMip, maxMip),
Range<GLint>(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL),
return ImageIndexIterator(TextureType::Rectangle, Range<GLint>(minMip, maxMip),
Range<GLint>(ImageIndex::kEntireLevel, ImageIndex::kEntireLevel),
nullptr);
}
ImageIndexIterator ImageIndexIterator::MakeCube(GLint minMip, GLint maxMip)
{
return ImageIndexIterator(TextureType::CubeMap, kCubeMapTextureTargetMin,
kCubeMapTextureTargetMax, Range<GLint>(minMip, maxMip),
Range<GLint>(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL),
nullptr);
return ImageIndexIterator(TextureType::CubeMap, Range<GLint>(minMip, maxMip),
Range<GLint>(0, 6), nullptr);
}
ImageIndexIterator ImageIndexIterator::Make3D(GLint minMip, GLint maxMip,
GLint minLayer, GLint maxLayer)
{
return ImageIndexIterator(TextureType::_3D, TextureTarget::_3D, TextureTarget::_3D,
Range<GLint>(minMip, maxMip), Range<GLint>(minLayer, maxLayer),
nullptr);
return ImageIndexIterator(TextureType::_3D, Range<GLint>(minMip, maxMip),
Range<GLint>(minLayer, maxLayer), nullptr);
}
ImageIndexIterator ImageIndexIterator::Make2DArray(GLint minMip, GLint maxMip,
const GLsizei *layerCounts)
{
return ImageIndexIterator(TextureType::_2DArray, TextureTarget::_2DArray,
TextureTarget::_2DArray, Range<GLint>(minMip, maxMip),
return ImageIndexIterator(TextureType::_2DArray, Range<GLint>(minMip, maxMip),
Range<GLint>(0, IMPLEMENTATION_MAX_2D_ARRAY_TEXTURE_LAYERS),
layerCounts);
}
ImageIndexIterator ImageIndexIterator::Make2DMultisample()
{
return ImageIndexIterator(TextureType::_2DMultisample, TextureTarget::_2DMultisample,
TextureTarget::_2DMultisample, Range<GLint>(0, 0),
Range<GLint>(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL),
return ImageIndexIterator(TextureType::_2DMultisample, Range<GLint>(0, 0),
Range<GLint>(ImageIndex::kEntireLevel, ImageIndex::kEntireLevel),
nullptr);
}
ImageIndexIterator ImageIndexIterator::MakeGeneric(TextureType type, GLint minMip, GLint maxMip)
ImageIndexIterator ImageIndexIterator::MakeGeneric(TextureType type,
GLint minMip,
GLint maxMip,
GLint minLayer,
GLint maxLayer)
{
if (type == TextureType::CubeMap)
{
return MakeCube(minMip, maxMip);
}
TextureTarget target = NonCubeTextureTypeToTarget(type);
return ImageIndexIterator(type, target, target, Range<GLint>(minMip, maxMip),
Range<GLint>(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL),
return ImageIndexIterator(type, Range<GLint>(minMip, maxMip), Range<GLint>(minLayer, maxLayer),
nullptr);
}
ImageIndexIterator::ImageIndexIterator(TextureType type,
angle::EnumIterator<TextureTarget> targetLow,
angle::EnumIterator<TextureTarget> targetHigh,
const Range<GLint> &mipRange,
const Range<GLint> &layerRange,
const GLsizei *layerCounts)
: mTargetLow(targetLow),
mTargetHigh(targetHigh),
mMipRange(mipRange),
: mMipRange(mipRange),
mLayerRange(layerRange),
mLayerCounts(layerCounts),
mCurrentIndex(type, *targetLow, mipRange.low(), layerRange.low(), 1)
mCurrentIndex(type, mipRange.low(), layerRange.low(), 1)
{}
GLint ImageIndexIterator::maxLayer() const
@ -195,8 +261,9 @@ GLint ImageIndexIterator::maxLayer() const
if (mLayerCounts)
{
ASSERT(mCurrentIndex.hasLayer());
return (mCurrentIndex.mipIndex < mMipRange.high()) ? mLayerCounts[mCurrentIndex.mipIndex]
: 0;
return (mCurrentIndex.getLevelIndex() < mMipRange.high())
? mLayerCounts[mCurrentIndex.getLevelIndex()]
: 0;
}
return mLayerRange.high();
}
@ -211,26 +278,18 @@ ImageIndex ImageIndexIterator::next()
// Iterate layers in the inner loop for now. We can add switchable
// layer or mip iteration if we need it.
angle::EnumIterator<TextureTarget> currentTarget = mCurrentIndex.target;
if (currentTarget != mTargetHigh)
if (mCurrentIndex.hasLayer() && mCurrentIndex.getLayerIndex() < maxLayer() - 1)
{
++currentTarget;
mCurrentIndex.target = *currentTarget;
mCurrentIndex.mLayerIndex++;
}
else if (mCurrentIndex.hasLayer() && mCurrentIndex.layerIndex < maxLayer() - 1)
else if (mCurrentIndex.mLevelIndex < mMipRange.high() - 1)
{
mCurrentIndex.target = *mTargetLow;
mCurrentIndex.layerIndex++;
}
else if (mCurrentIndex.mipIndex < mMipRange.high() - 1)
{
mCurrentIndex.target = *mTargetLow;
mCurrentIndex.layerIndex = mLayerRange.low();
mCurrentIndex.mipIndex++;
mCurrentIndex.mLayerIndex = mLayerRange.low();
mCurrentIndex.mLevelIndex++;
}
else
{
mCurrentIndex = ImageIndex::MakeInvalid();
mCurrentIndex = ImageIndex();
}
return previousIndex;

View file

@ -10,7 +10,7 @@
#define LIBANGLE_IMAGE_INDEX_H_
#include "common/mathutil.h"
#include "libANGLE/PackedGLEnums.h"
#include "libANGLE/PackedEnums.h"
#include "angle_gl.h"
@ -19,50 +19,57 @@ namespace gl
class ImageIndexIterator;
struct ImageIndex
class ImageIndex
{
TextureType type;
TextureTarget target;
GLint mipIndex;
GLint layerIndex;
GLint numLayers;
public:
ImageIndex();
ImageIndex(const ImageIndex &other);
ImageIndex &operator=(const ImageIndex &other);
bool hasLayer() const { return layerIndex != ENTIRE_LEVEL; }
bool is3D() const;
TextureType getType() const { return mType; }
GLint getLevelIndex() const { return mLevelIndex; }
GLint getLayerIndex() const { return mLayerIndex; }
GLint getLayerCount() const { return mLayerCount; }
bool hasLayer() const;
bool has3DLayer() const;
bool usesTex3D() const;
GLint cubeMapFaceIndex() const;
bool valid() const;
TextureTarget getTarget() const;
static ImageIndex Make2D(GLint mipIndex);
static ImageIndex MakeRectangle(GLint mipIndex);
static ImageIndex MakeCube(TextureTarget target, GLint mipIndex);
static ImageIndex Make2DArray(GLint mipIndex, GLint layerIndex);
static ImageIndex Make2DArrayRange(GLint mipIndex, GLint layerIndex, GLint numLayers);
static ImageIndex Make3D(GLint mipIndex, GLint layerIndex = ENTIRE_LEVEL);
static ImageIndex MakeGeneric(TextureTarget target, GLint mipIndex);
static ImageIndex Make2D(GLint levelIndex);
static ImageIndex MakeRectangle(GLint levelIndex);
static ImageIndex MakeCube(TextureTarget target, GLint levelIndex);
static ImageIndex Make2DArray(GLint levelIndex, GLint layerIndex);
static ImageIndex Make2DArrayRange(GLint levelIndex, GLint layerIndex, GLint layerCount);
static ImageIndex Make3D(GLint levelIndex, GLint layerIndex = kEntireLevel);
static ImageIndex MakeFromTarget(TextureTarget target, GLint levelIndex);
static ImageIndex MakeFromType(TextureType type,
GLint levelIndex,
GLint layerIndex = kEntireLevel,
GLint layerCount = 1);
static ImageIndex Make2DMultisample();
static ImageIndex MakeInvalid();
static constexpr GLint kEntireLevel = static_cast<GLint>(-1);
static const GLint ENTIRE_LEVEL = static_cast<GLint>(-1);
bool operator<(const ImageIndex &b) const;
bool operator==(const ImageIndex &b) const;
bool operator!=(const ImageIndex &b) const;
// Only valid for 3D/Cube textures with layers.
ImageIndexIterator getLayerIterator(GLint layerCount) const;
private:
friend class ImageIndexIterator;
ImageIndex(TextureType typeIn,
TextureTarget targetIn,
GLint mipIndexIn,
GLint layerIndexIn,
GLint numLayersIn);
};
ImageIndex(TextureType type, GLint leveIndex, GLint layerIndex, GLint layerCount);
bool operator<(const ImageIndex &a, const ImageIndex &b);
bool operator==(const ImageIndex &a, const ImageIndex &b);
bool operator!=(const ImageIndex &a, const ImageIndex &b);
TextureType mType;
GLint mLevelIndex;
GLint mLayerIndex;
GLint mLayerCount;
};
// To be used like this:
//
@ -82,7 +89,11 @@ class ImageIndexIterator
static ImageIndexIterator Make3D(GLint minMip, GLint maxMip, GLint minLayer, GLint maxLayer);
static ImageIndexIterator Make2DArray(GLint minMip, GLint maxMip, const GLsizei *layerCounts);
static ImageIndexIterator Make2DMultisample();
static ImageIndexIterator MakeGeneric(TextureType type, GLint minMip, GLint maxMip);
static ImageIndexIterator MakeGeneric(TextureType type,
GLint minMip,
GLint maxMip,
GLint minLayer,
GLint maxLayer);
ImageIndex next();
ImageIndex current() const;
@ -90,23 +101,18 @@ class ImageIndexIterator
private:
ImageIndexIterator(TextureType type,
angle::EnumIterator<TextureTarget> targetLow,
angle::EnumIterator<TextureTarget> targetHigh,
const Range<GLint> &mipRange,
const Range<GLint> &layerRange,
const GLsizei *layerCounts);
GLint maxLayer() const;
const angle::EnumIterator<TextureTarget> mTargetLow;
const angle::EnumIterator<TextureTarget> mTargetHigh;
const Range<GLint> mMipRange;
const Range<GLint> mLayerRange;
const GLsizei *const mLayerCounts;
ImageIndex mCurrentIndex;
};
}
} // namespace gl
#endif // LIBANGLE_IMAGE_INDEX_H_

View file

@ -30,6 +30,7 @@ enum class SubjectMessage
{
CONTENTS_CHANGED,
STORAGE_CHANGED,
BINDING_CHANGED,
DEPENDENT_DIRTY_BITS,
};

View file

@ -0,0 +1,50 @@
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_packed_gl_enums.py using data from packed_egl_enums.json.
//
// Copyright 2018 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.
//
// PackedEGLEnums_autogen.cpp:
// Implements ANGLE-specific enums classes for EGLenums and functions operating
// on them.
#include "libANGLE/PackedEGLEnums_autogen.h"
#include "common/debug.h"
namespace egl
{
template <>
TextureFormat FromEGLenum<TextureFormat>(EGLenum from)
{
switch (from)
{
case EGL_NO_TEXTURE:
return TextureFormat::NoTexture;
case EGL_TEXTURE_RGB:
return TextureFormat::RGB;
case EGL_TEXTURE_RGBA:
return TextureFormat::RGBA;
default:
return TextureFormat::InvalidEnum;
}
}
EGLenum ToEGLenum(TextureFormat from)
{
switch (from)
{
case TextureFormat::NoTexture:
return EGL_NO_TEXTURE;
case TextureFormat::RGB:
return EGL_TEXTURE_RGB;
case TextureFormat::RGBA:
return EGL_TEXTURE_RGBA;
default:
UNREACHABLE();
return 0;
}
}
} // namespace egl

View file

@ -0,0 +1,43 @@
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_packed_gl_enums.py using data from packed_egl_enums.json.
//
// Copyright 2018 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.
//
// PackedEGLEnums_autogen.h:
// Declares ANGLE-specific enums classes for EGLenums and functions operating
// on them.
#ifndef LIBANGLE_PACKEDEGLENUMS_AUTOGEN_H_
#define LIBANGLE_PACKEDEGLENUMS_AUTOGEN_H_
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <angle_gl.h>
#include <cstdint>
namespace egl
{
template <typename Enum>
Enum FromEGLenum(EGLenum from);
enum class TextureFormat : uint8_t
{
NoTexture = 0,
RGB = 1,
RGBA = 2,
InvalidEnum = 3,
EnumCount = 3,
};
template <>
TextureFormat FromEGLenum<TextureFormat>(EGLenum from);
EGLenum ToEGLenum(TextureFormat from);
} // namespace egl
#endif // LIBANGLE_PACKEDEGLENUMS_AUTOGEN_H_

View file

@ -6,7 +6,7 @@
// Declares ANGLE-specific enums classes for GLEnum and functions operating
// on them.
#include "libANGLE/PackedGLEnums.h"
#include "libANGLE/PackedEnums.h"
#include "common/utilities.h"

View file

@ -9,6 +9,7 @@
#ifndef LIBANGLE_PACKEDGLENUMS_H_
#define LIBANGLE_PACKEDGLENUMS_H_
#include "libANGLE/PackedEGLEnums_autogen.h"
#include "libANGLE/PackedGLEnums_autogen.h"
#include <array>
@ -70,8 +71,8 @@ template <typename E, typename T>
class PackedEnumMap
{
private:
using UnderlyingType = typename std::underlying_type<E>::type;
using Storage = std::array<T, EnumSize<E>()>;
using UnderlyingType = typename std::underlying_type<E>::type;
using Storage = std::array<T, EnumSize<E>()>;
Storage mData;
@ -172,8 +173,16 @@ struct AllShaderTypes
angle::EnumIterator<ShaderType> end() const { return kAfterShaderTypeMax; }
};
constexpr size_t kGraphicsShaderCount = static_cast<size_t>(ShaderType::EnumCount) - 1u;
// Arrange the shader types in the order of rendering pipeline
constexpr std::array<ShaderType, kGraphicsShaderCount> kAllGraphicsShaderTypes = {
ShaderType::Vertex, ShaderType::Geometry, ShaderType::Fragment};
using ShaderBitSet = angle::PackedEnumBitSet<ShaderType>;
template <typename T>
using ShaderMap = angle::PackedEnumMap<ShaderType, T>;
TextureType SamplerTypeToTextureType(GLenum samplerType);
} // namespace gl

View file

@ -6,7 +6,7 @@
// found in the LICENSE file.
//
// PackedGLEnums_autogen.cpp:
// Implements ANGLE-specific enums classes for GLEnum and functions operating
// Implements ANGLE-specific enums classes for GLenums and functions operating
// on them.
#include "libANGLE/PackedGLEnums_autogen.h"
@ -63,7 +63,7 @@ GLenum ToGLenum(AlphaTestFunc from)
return GL_NOTEQUAL;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
@ -131,7 +131,7 @@ GLenum ToGLenum(BufferBinding from)
return GL_UNIFORM_BUFFER;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
@ -187,7 +187,47 @@ GLenum ToGLenum(BufferUsage from)
return GL_STREAM_READ;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
template <>
ClientVertexArrayType FromGLenum<ClientVertexArrayType>(GLenum from)
{
switch (from)
{
case GL_COLOR_ARRAY:
return ClientVertexArrayType::Color;
case GL_NORMAL_ARRAY:
return ClientVertexArrayType::Normal;
case GL_POINT_SIZE_ARRAY_OES:
return ClientVertexArrayType::PointSize;
case GL_TEXTURE_COORD_ARRAY:
return ClientVertexArrayType::TextureCoord;
case GL_VERTEX_ARRAY:
return ClientVertexArrayType::Vertex;
default:
return ClientVertexArrayType::InvalidEnum;
}
}
GLenum ToGLenum(ClientVertexArrayType from)
{
switch (from)
{
case ClientVertexArrayType::Color:
return GL_COLOR_ARRAY;
case ClientVertexArrayType::Normal:
return GL_NORMAL_ARRAY;
case ClientVertexArrayType::PointSize:
return GL_POINT_SIZE_ARRAY_OES;
case ClientVertexArrayType::TextureCoord:
return GL_TEXTURE_COORD_ARRAY;
case ClientVertexArrayType::Vertex:
return GL_VERTEX_ARRAY;
default:
UNREACHABLE();
return 0;
}
}
@ -219,7 +259,7 @@ GLenum ToGLenum(CullFaceMode from)
return GL_FRONT_AND_BACK;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
@ -251,7 +291,7 @@ GLenum ToGLenum(FogMode from)
return GL_LINEAR;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
@ -283,7 +323,71 @@ GLenum ToGLenum(HintSetting from)
return GL_NICEST;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
template <>
LightParameter FromGLenum<LightParameter>(GLenum from)
{
switch (from)
{
case GL_AMBIENT:
return LightParameter::Ambient;
case GL_AMBIENT_AND_DIFFUSE:
return LightParameter::AmbientAndDiffuse;
case GL_CONSTANT_ATTENUATION:
return LightParameter::ConstantAttenuation;
case GL_DIFFUSE:
return LightParameter::Diffuse;
case GL_LINEAR_ATTENUATION:
return LightParameter::LinearAttenuation;
case GL_POSITION:
return LightParameter::Position;
case GL_QUADRATIC_ATTENUATION:
return LightParameter::QuadraticAttenuation;
case GL_SPECULAR:
return LightParameter::Specular;
case GL_SPOT_CUTOFF:
return LightParameter::SpotCutoff;
case GL_SPOT_DIRECTION:
return LightParameter::SpotDirection;
case GL_SPOT_EXPONENT:
return LightParameter::SpotExponent;
default:
return LightParameter::InvalidEnum;
}
}
GLenum ToGLenum(LightParameter from)
{
switch (from)
{
case LightParameter::Ambient:
return GL_AMBIENT;
case LightParameter::AmbientAndDiffuse:
return GL_AMBIENT_AND_DIFFUSE;
case LightParameter::ConstantAttenuation:
return GL_CONSTANT_ATTENUATION;
case LightParameter::Diffuse:
return GL_DIFFUSE;
case LightParameter::LinearAttenuation:
return GL_LINEAR_ATTENUATION;
case LightParameter::Position:
return GL_POSITION;
case LightParameter::QuadraticAttenuation:
return GL_QUADRATIC_ATTENUATION;
case LightParameter::Specular:
return GL_SPECULAR;
case LightParameter::SpotCutoff:
return GL_SPOT_CUTOFF;
case LightParameter::SpotDirection:
return GL_SPOT_DIRECTION;
case LightParameter::SpotExponent:
return GL_SPOT_EXPONENT;
default:
UNREACHABLE();
return 0;
}
}
@ -367,7 +471,51 @@ GLenum ToGLenum(LogicalOperation from)
return GL_XOR;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
template <>
MaterialParameter FromGLenum<MaterialParameter>(GLenum from)
{
switch (from)
{
case GL_AMBIENT:
return MaterialParameter::Ambient;
case GL_AMBIENT_AND_DIFFUSE:
return MaterialParameter::AmbientAndDiffuse;
case GL_DIFFUSE:
return MaterialParameter::Diffuse;
case GL_EMISSION:
return MaterialParameter::Emission;
case GL_SHININESS:
return MaterialParameter::Shininess;
case GL_SPECULAR:
return MaterialParameter::Specular;
default:
return MaterialParameter::InvalidEnum;
}
}
GLenum ToGLenum(MaterialParameter from)
{
switch (from)
{
case MaterialParameter::Ambient:
return GL_AMBIENT;
case MaterialParameter::AmbientAndDiffuse:
return GL_AMBIENT_AND_DIFFUSE;
case MaterialParameter::Diffuse:
return GL_DIFFUSE;
case MaterialParameter::Emission:
return GL_EMISSION;
case MaterialParameter::Shininess:
return GL_SHININESS;
case MaterialParameter::Specular:
return GL_SPECULAR;
default:
UNREACHABLE();
return 0;
}
}
@ -399,7 +547,55 @@ GLenum ToGLenum(MatrixType from)
return GL_TEXTURE;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
template <>
QueryType FromGLenum<QueryType>(GLenum from)
{
switch (from)
{
case GL_ANY_SAMPLES_PASSED:
return QueryType::AnySamples;
case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
return QueryType::AnySamplesConservative;
case GL_COMMANDS_COMPLETED_CHROMIUM:
return QueryType::CommandsCompleted;
case GL_PRIMITIVES_GENERATED_EXT:
return QueryType::PrimitivesGenerated;
case GL_TIME_ELAPSED_EXT:
return QueryType::TimeElapsed;
case GL_TIMESTAMP_EXT:
return QueryType::Timestamp;
case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
return QueryType::TransformFeedbackPrimitivesWritten;
default:
return QueryType::InvalidEnum;
}
}
GLenum ToGLenum(QueryType from)
{
switch (from)
{
case QueryType::AnySamples:
return GL_ANY_SAMPLES_PASSED;
case QueryType::AnySamplesConservative:
return GL_ANY_SAMPLES_PASSED_CONSERVATIVE;
case QueryType::CommandsCompleted:
return GL_COMMANDS_COMPLETED_CHROMIUM;
case QueryType::PrimitivesGenerated:
return GL_PRIMITIVES_GENERATED_EXT;
case QueryType::TimeElapsed:
return GL_TIME_ELAPSED_EXT;
case QueryType::Timestamp:
return GL_TIMESTAMP_EXT;
case QueryType::TransformFeedbackPrimitivesWritten:
return GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN;
default:
UNREACHABLE();
return 0;
}
}
@ -435,7 +631,7 @@ GLenum ToGLenum(ShaderType from)
return GL_COMPUTE_SHADER;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
@ -463,7 +659,7 @@ GLenum ToGLenum(ShadingModel from)
return GL_SMOOTH;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
@ -515,7 +711,7 @@ GLenum ToGLenum(TextureCombine from)
return GL_SUBTRACT;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
@ -559,7 +755,7 @@ GLenum ToGLenum(TextureEnvMode from)
return GL_REPLACE;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
@ -595,7 +791,7 @@ GLenum ToGLenum(TextureOp from)
return GL_SRC_COLOR;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
@ -631,7 +827,7 @@ GLenum ToGLenum(TextureSrc from)
return GL_TEXTURE;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
@ -699,7 +895,7 @@ GLenum ToGLenum(TextureTarget from)
return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
@ -747,7 +943,7 @@ GLenum ToGLenum(TextureType from)
return GL_TEXTURE_CUBE_MAP;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}
@ -787,7 +983,7 @@ GLenum ToGLenum(VertexArrayType from)
return GL_VERTEX_ARRAY;
default:
UNREACHABLE();
return GL_NONE;
return 0;
}
}

View file

@ -6,12 +6,14 @@
// found in the LICENSE file.
//
// PackedGLEnums_autogen.h:
// Declares ANGLE-specific enums classes for GLEnum and functions operating
// Declares ANGLE-specific enums classes for GLenums and functions operating
// on them.
#ifndef LIBANGLE_PACKEDGLENUMS_AUTOGEN_H_
#define LIBANGLE_PACKEDGLENUMS_AUTOGEN_H_
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <angle_gl.h>
#include <cstdint>
@ -84,6 +86,22 @@ template <>
BufferUsage FromGLenum<BufferUsage>(GLenum from);
GLenum ToGLenum(BufferUsage from);
enum class ClientVertexArrayType : uint8_t
{
Color = 0,
Normal = 1,
PointSize = 2,
TextureCoord = 3,
Vertex = 4,
InvalidEnum = 5,
EnumCount = 5,
};
template <>
ClientVertexArrayType FromGLenum<ClientVertexArrayType>(GLenum from);
GLenum ToGLenum(ClientVertexArrayType from);
enum class CullFaceMode : uint8_t
{
Back = 0,
@ -126,6 +144,28 @@ template <>
HintSetting FromGLenum<HintSetting>(GLenum from);
GLenum ToGLenum(HintSetting from);
enum class LightParameter : uint8_t
{
Ambient = 0,
AmbientAndDiffuse = 1,
ConstantAttenuation = 2,
Diffuse = 3,
LinearAttenuation = 4,
Position = 5,
QuadraticAttenuation = 6,
Specular = 7,
SpotCutoff = 8,
SpotDirection = 9,
SpotExponent = 10,
InvalidEnum = 11,
EnumCount = 11,
};
template <>
LightParameter FromGLenum<LightParameter>(GLenum from);
GLenum ToGLenum(LightParameter from);
enum class LogicalOperation : uint8_t
{
And = 0,
@ -153,6 +193,23 @@ template <>
LogicalOperation FromGLenum<LogicalOperation>(GLenum from);
GLenum ToGLenum(LogicalOperation from);
enum class MaterialParameter : uint8_t
{
Ambient = 0,
AmbientAndDiffuse = 1,
Diffuse = 2,
Emission = 3,
Shininess = 4,
Specular = 5,
InvalidEnum = 6,
EnumCount = 6,
};
template <>
MaterialParameter FromGLenum<MaterialParameter>(GLenum from);
GLenum ToGLenum(MaterialParameter from);
enum class MatrixType : uint8_t
{
Modelview = 0,
@ -167,6 +224,24 @@ template <>
MatrixType FromGLenum<MatrixType>(GLenum from);
GLenum ToGLenum(MatrixType from);
enum class QueryType : uint8_t
{
AnySamples = 0,
AnySamplesConservative = 1,
CommandsCompleted = 2,
PrimitivesGenerated = 3,
TimeElapsed = 4,
Timestamp = 5,
TransformFeedbackPrimitivesWritten = 6,
InvalidEnum = 7,
EnumCount = 7,
};
template <>
QueryType FromGLenum<QueryType>(GLenum from);
GLenum ToGLenum(QueryType from);
enum class ShaderType : uint8_t
{
Vertex = 0,

File diff suppressed because it is too large Load diff

View file

@ -286,6 +286,7 @@ class ProgramState final : angle::NonCopyable
const std::string &getLabel();
Shader *getAttachedShader(ShaderType shaderType) const;
const gl::ShaderMap<Shader *> &getAttachedShaders() const { return mAttachedShaders; }
const std::vector<std::string> &getTransformFeedbackVaryingNames() const
{
return mTransformFeedbackVaryingNames;
@ -352,6 +353,8 @@ class ProgramState final : angle::NonCopyable
const ShaderBitSet &getLinkedShaderStages() const { return mLinkedShaderStages; }
bool hasAttachedShader() const;
private:
friend class MemoryProgramCache;
friend class Program;
@ -362,10 +365,7 @@ class ProgramState final : angle::NonCopyable
sh::WorkGroupSize mComputeShaderLocalSize;
Shader *mAttachedFragmentShader;
Shader *mAttachedVertexShader;
Shader *mAttachedComputeShader;
Shader *mAttachedGeometryShader;
ShaderMap<Shader *> mAttachedShaders;
std::vector<std::string> mTransformFeedbackVaryingNames;
std::vector<TransformFeedbackVarying> mLinkedTransformFeedbackVaryings;
@ -404,10 +404,10 @@ class ProgramState final : angle::NonCopyable
RangeUI mAtomicCounterUniformRange;
// An array of the samplers that are used by the program
std::vector<gl::SamplerBinding> mSamplerBindings;
std::vector<SamplerBinding> mSamplerBindings;
// An array of the images that are used by the program
std::vector<gl::ImageBinding> mImageBindings;
std::vector<ImageBinding> mImageBindings;
// Names and mapped names of output variables that are arrays include [0] in the end, similarly
// to uniforms.
@ -494,8 +494,8 @@ class Program final : angle::NonCopyable, public LabeledObject
GLint components,
const GLfloat *coeffs);
Error link(const gl::Context *context);
bool isLinked() const;
Error link(const Context *context);
bool isLinked() const { return mLinked; }
bool hasLinkedShaderStage(ShaderType shaderType) const;
@ -552,8 +552,16 @@ class Program final : angle::NonCopyable, public LabeledObject
bool isValidUniformLocation(GLint location) const;
const LinkedUniform &getUniformByLocation(GLint location) const;
const VariableLocation &getUniformLocation(GLint location) const;
const std::vector<VariableLocation> &getUniformLocations() const;
const LinkedUniform &getUniformByIndex(GLuint index) const;
const std::vector<VariableLocation> &getUniformLocations() const
{
return mState.mUniformLocations;
}
const LinkedUniform &getUniformByIndex(GLuint index) const
{
ASSERT(index < static_cast<size_t>(mState.mUniforms.size()));
return mState.mUniforms[index];
}
const BufferVariable &getBufferVariableByIndex(GLuint index) const;
@ -632,7 +640,7 @@ class Program final : angle::NonCopyable, public LabeledObject
void validate(const Caps &caps);
bool validateSamplers(InfoLog *infoLog, const Caps &caps);
bool isValidated() const;
bool samplesFromTexture(const gl::State &state, GLuint textureID) const;
bool samplesFromTexture(const State &state, GLuint textureID) const;
const AttributesMask &getActiveAttribLocationsMask() const
{
@ -705,13 +713,16 @@ class Program final : angle::NonCopyable, public LabeledObject
bool linkValidateShaders(const Context *context, InfoLog &infoLog);
bool linkAttributes(const Context *context, InfoLog &infoLog);
bool linkInterfaceBlocks(const Context *context, InfoLog &infoLog);
bool linkInterfaceBlocks(const Context *context,
InfoLog &infoLog,
GLuint *combinedShaderStorageBlocksCount);
bool linkVaryings(const Context *context, InfoLog &infoLog) const;
bool linkUniforms(const Context *context,
InfoLog &infoLog,
const ProgramBindings &uniformLocationBindings);
void linkSamplerAndImageBindings();
const ProgramBindings &uniformLocationBindings,
GLuint *combinedImageUniformsCount);
void linkSamplerAndImageBindings(GLuint *combinedImageUniformsCount);
bool linkAtomicCounterBuffers();
void updateLinkedShaderStages();
@ -732,7 +743,7 @@ class Program final : angle::NonCopyable, public LabeledObject
bool linkValidateFragmentInputBindings(const Context *context, InfoLog &infoLog) const;
bool linkValidateBuiltInVaryings(const Context *context, InfoLog &infoLog) const;
bool linkValidateTransformFeedback(const gl::Context *context,
bool linkValidateTransformFeedback(const Context *context,
InfoLog &infoLog,
const ProgramMergedVaryings &linkedVaryings,
const Caps &caps) const;
@ -741,7 +752,9 @@ class Program final : angle::NonCopyable, public LabeledObject
void gatherTransformFeedbackVaryings(const ProgramMergedVaryings &varyings);
ProgramMergedVaryings getMergedVaryings(const Context *context) const;
void linkOutputVariables(const Context *context);
bool linkOutputVariables(const Context *context,
GLuint combinedImageUniformsCount,
GLuint combinedShaderStorageBlocksCount);
void setUniformValuesFromBindingQualifiers();

Some files were not shown because too many files have changed in this diff Show more