GLExtensions 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
  2. *
  3. * This library is open source and may be redistributed and/or modified under
  4. * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
  5. * (at your option) any later version. The full license is in LICENSE file
  6. * included with this distribution, and on the openscenegraph.org website.
  7. *
  8. * This library is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * OpenSceneGraph Public License for more details.
  12. */
  13. #ifndef OSG_GLEXTENSIONS
  14. #define OSG_GLEXTENSIONS 1
  15. #include <osg/Export>
  16. #include <osg/GLDefines>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <string>
  20. #include <vector>
  21. #include <map>
  22. namespace osg {
  23. /** Return floating-point OpenGL/GLES version number.
  24. * Note: Must only be called within a valid OpenGL context,
  25. * undefined behavior may occur otherwise.
  26. */
  27. extern OSG_EXPORT float getGLVersionNumber();
  28. /** Return true if "extension" is contained in "extensionString".
  29. */
  30. extern OSG_EXPORT bool isExtensionInExtensionString(const char *extension, const char *extensionString);
  31. /** Return true if OpenGL/GLES "extension" is supported.
  32. * Note: Must only be called within a valid OpenGL context,
  33. * undefined behavior may occur otherwise.
  34. */
  35. extern OSG_EXPORT bool isGLExtensionSupported(unsigned int contextID, const char *extension);
  36. /** Return true if either OpenGL/GLES "extension1" or "extension2" is supported.
  37. * Note: Must only be called within a valid OpenGL context,
  38. * undefined behavior may occur otherwise.
  39. */
  40. extern OSG_EXPORT bool isGLExtensionSupported(unsigned int contextID, const char *extension1, const char *extension2);
  41. /** Return true if OpenGL/GLES "extension" or minimum OpenGL version number is supported.
  42. * Note: Must only be called within a valid OpenGL context,
  43. * undefined behavior may occur otherwise.
  44. */
  45. extern OSG_EXPORT bool isGLExtensionOrVersionSupported(unsigned int contextID, const char *extension, float requiredGlVersion);
  46. /** Return the address of the specified OpenGL/GLES function.
  47. * Return NULL if function not supported by OpenGL library.
  48. * Note, glGLExtensionFuncPtr is declared inline so that the code
  49. * is compiled locally to the calling code. This should get by Windows'
  50. * dumb implementation of having different GL function ptr's for each
  51. * library when linked to it.
  52. */
  53. extern OSG_EXPORT void* getGLExtensionFuncPtr(const char *funcName);
  54. /** Set a list of extensions to disable for different OpenGL renderers. This allows
  55. * OSG applications to work around OpenGL drivers' bugs which are due to problematic extension support.
  56. * The format of the string is:
  57. * "GLRendererString : ExtensionName, ExtensionName; GLRenderString2 : ExtensionName;"
  58. * An example of is : "SUN_XVR1000:GL_EXT_texture_filter_anisotropic"
  59. * The default setting of GLExtensionDisableString is obtained from the OSG_GL_EXTENSION_DISABLE
  60. * environmental variable.
  61. */
  62. extern OSG_EXPORT void setGLExtensionDisableString(const std::string& disableString);
  63. /** Get the list of extensions that are disabled for various OpenGL renderers. */
  64. extern OSG_EXPORT std::string& getGLExtensionDisableString();
  65. /** Return the address of the specified OpenGL function. If not found then
  66. * check a second function name, if this fails then return NULL as function is
  67. * not supported by OpenGL library. This is used for checking something
  68. * like glActiveTexture (which is in OGL1.3) or glActiveTextureARB.
  69. */
  70. inline void* getGLExtensionFuncPtr(const char *funcName, const char *fallbackFuncName)
  71. {
  72. void* ptr = getGLExtensionFuncPtr(funcName);
  73. return (ptr!=0) ? ptr : getGLExtensionFuncPtr(fallbackFuncName);
  74. }
  75. /** Return the address of the specified OpenGL function. If not found then
  76. * check a second function name, if this fails then return NULL as function is
  77. * not supported by OpenGL library. This is used for checking something
  78. * like glActiveTexture (which is in OGL1.3) or glActiveTextureARB.
  79. */
  80. inline void* getGLExtensionFuncPtr(const char *funcName1, const char *funcName2, const char *funcName3)
  81. {
  82. void* ptr = getGLExtensionFuncPtr(funcName1);
  83. return (ptr!=0) ? ptr : getGLExtensionFuncPtr(funcName2, funcName3);
  84. }
  85. template<typename T, typename R>
  86. bool convertPointer(T& dest, R src)
  87. {
  88. memcpy(&dest, &src, sizeof(src));
  89. return src!=0;
  90. }
  91. template<typename T, typename R>
  92. T convertPointerType(R src)
  93. {
  94. T dest;
  95. memcpy(&dest, &src, sizeof(src));
  96. return dest;
  97. }
  98. template<typename T>
  99. bool setGLExtensionFuncPtr(T& t, const char* str1, bool validContext=true)
  100. {
  101. return convertPointer(t, validContext ? osg::getGLExtensionFuncPtr(str1) : 0);
  102. }
  103. template<typename T>
  104. bool setGLExtensionFuncPtr(T& t, const char* str1, const char* str2, bool validContext=true)
  105. {
  106. return convertPointer(t, validContext ? osg::getGLExtensionFuncPtr(str1, str2) : 0);
  107. }
  108. template<typename T>
  109. bool setGLExtensionFuncPtr(T& t, const char* str1, const char* str2, const char* str3, bool validContext=true)
  110. {
  111. return convertPointer(t, validContext ? osg::getGLExtensionFuncPtr(str1, str2, str3) : 0);
  112. }
  113. class VertexAttribAlias
  114. {
  115. public:
  116. VertexAttribAlias():
  117. _location(0) {}
  118. VertexAttribAlias(const VertexAttribAlias& rhs):
  119. _location(rhs._location),
  120. _glName(rhs._glName),
  121. _osgName(rhs._osgName),
  122. _declaration(rhs._declaration) {}
  123. VertexAttribAlias(GLuint location, const std::string glName, const std::string osgName, const std::string& declaration):
  124. _location(location),
  125. _glName(glName),
  126. _osgName(osgName),
  127. _declaration(declaration) {}
  128. GLuint _location;
  129. std::string _glName;
  130. std::string _osgName;
  131. std::string _declaration;
  132. };
  133. /** Main GLExtensions class for managing OpenGL extensions per graphics context.*/
  134. class OSG_EXPORT GLExtensions : public osg::Referenced
  135. {
  136. public:
  137. GLExtensions(unsigned int in_contextID);
  138. /** Function to call to get the extension of a specified context.
  139. * If the Exentsion object for that context has not yet been created then
  140. * and the 'createIfNotInitalized' flag been set to false then returns NULL.
  141. * If 'createIfNotInitalized' is true then the Extensions object is
  142. * automatically created. However, in this case the extension object
  143. * only be created with the graphics context associated with ContextID..*/
  144. static GLExtensions* Get(unsigned int in_contextID,bool createIfNotInitalized);
  145. /** allows users to override the extensions across graphics contexts.
  146. * typically used when you have different extensions supported across graphics pipes
  147. * but need to ensure that they all use the same low common denominator extensions.*/
  148. static void Set(unsigned int in_contextID, GLExtensions* extensions);
  149. // C++-friendly convenience wrapper methods
  150. GLuint getCurrentProgram() const;
  151. bool getProgramInfoLog( GLuint program, std::string& result ) const;
  152. bool getShaderInfoLog( GLuint shader, std::string& result ) const;
  153. bool getAttribLocation( const char* attribName, GLuint& slot ) const;
  154. bool getFragDataLocation( const char* fragDataName, GLuint& slot) const;
  155. unsigned int contextID;
  156. float glVersion;
  157. float glslLanguageVersion;
  158. bool isGlslSupported;
  159. bool isShaderObjectsSupported;
  160. bool isVertexShaderSupported;
  161. bool isFragmentShaderSupported;
  162. bool isLanguage100Supported;
  163. bool isGeometryShader4Supported;
  164. bool areTessellationShadersSupported;
  165. bool isGpuShader4Supported;
  166. bool isUniformBufferObjectSupported;
  167. bool isGetProgramBinarySupported;
  168. bool isGpuShaderFp64Supported;
  169. bool isShaderAtomicCountersSupported;
  170. bool isRectangleSupported;
  171. bool isCubeMapSupported;
  172. bool isClipControlSupported;
  173. void (GL_APIENTRY * glDrawBuffers)(GLsizei n, const GLenum *bufs);
  174. void (GL_APIENTRY * glAttachShader)(GLuint program, GLuint shader);
  175. void (GL_APIENTRY * glBindAttribLocation)(GLuint program, GLuint index, const GLchar *name);
  176. void (GL_APIENTRY * glCompileShader)(GLuint shader);
  177. GLuint (GL_APIENTRY * glCreateProgram)(void);
  178. GLuint (GL_APIENTRY * glCreateShader)(GLenum type);
  179. void (GL_APIENTRY * glDeleteProgram)(GLuint program);
  180. void (GL_APIENTRY * glDeleteObjectARB)(GLuint program);
  181. void (GL_APIENTRY * glDeleteShader)(GLuint shader);
  182. void (GL_APIENTRY * glDetachShader)(GLuint program, GLuint shader);
  183. void (GL_APIENTRY * glDisableVertexAttribArray)(GLuint index);
  184. void (GL_APIENTRY * glEnableVertexAttribArray)(GLuint index);
  185. void (GL_APIENTRY * glGetActiveAttrib)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
  186. void (GL_APIENTRY * glGetActiveUniform)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
  187. void (GL_APIENTRY * glGetAttachedShaders)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
  188. GLint (GL_APIENTRY * glGetAttribLocation)(GLuint program, const GLchar *name);
  189. void (GL_APIENTRY * glGetProgramiv)(GLuint program, GLenum pname, GLint *params);
  190. void (GL_APIENTRY * glGetObjectParameterivARB)(GLuint program, GLenum pname, GLint *params);
  191. void (GL_APIENTRY * glGetProgramInfoLog)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
  192. void (GL_APIENTRY * glGetInfoLogARB)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
  193. void (GL_APIENTRY * glGetShaderiv)(GLuint shader, GLenum pname, GLint *params);
  194. void (GL_APIENTRY * glGetShaderInfoLog)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
  195. void (GL_APIENTRY * glGetShaderSource)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
  196. GLint (GL_APIENTRY * glGetUniformLocation)(GLuint program, const GLchar *name);
  197. void (GL_APIENTRY * glGetUniformfv)(GLuint program, GLint location, GLfloat *params);
  198. void (GL_APIENTRY * glGetUniformiv)(GLuint program, GLint location, GLint *params);
  199. void (GL_APIENTRY * glGetVertexAttribdv)(GLuint index, GLenum pname, GLdouble *params);
  200. void (GL_APIENTRY * glGetVertexAttribfv)(GLuint index, GLenum pname, GLfloat *params);
  201. void (GL_APIENTRY * glGetVertexAttribiv)(GLuint index, GLenum pname, GLint *params);
  202. void (GL_APIENTRY * glGetVertexAttribPointerv)(GLuint index, GLenum pname, GLvoid* *pointer);
  203. GLboolean (GL_APIENTRY * glIsProgram)(GLuint program);
  204. GLboolean (GL_APIENTRY * glIsShader)(GLuint shader);
  205. void (GL_APIENTRY * glLinkProgram)(GLuint program);
  206. void (GL_APIENTRY * glShaderSource)(GLuint shader, GLsizei count, const GLchar* *string, const GLint *length);
  207. void (GL_APIENTRY * glUseProgram)(GLuint program);
  208. void (GL_APIENTRY * glUniform1f)(GLint location, GLfloat v0);
  209. void (GL_APIENTRY * glUniform2f)(GLint location, GLfloat v0, GLfloat v1);
  210. void (GL_APIENTRY * glUniform3f)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
  211. void (GL_APIENTRY * glUniform4f)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
  212. void (GL_APIENTRY * glUniform1i)(GLint location, GLint v0);
  213. void (GL_APIENTRY * glUniform2i)(GLint location, GLint v0, GLint v1);
  214. void (GL_APIENTRY * glUniform3i)(GLint location, GLint v0, GLint v1, GLint v2);
  215. void (GL_APIENTRY * glUniform4i)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
  216. void (GL_APIENTRY * glUniform1fv)(GLint location, GLsizei count, const GLfloat *value);
  217. void (GL_APIENTRY * glUniform2fv)(GLint location, GLsizei count, const GLfloat *value);
  218. void (GL_APIENTRY * glUniform3fv)(GLint location, GLsizei count, const GLfloat *value);
  219. void (GL_APIENTRY * glUniform4fv)(GLint location, GLsizei count, const GLfloat *value);
  220. void (GL_APIENTRY * glUniform1iv)(GLint location, GLsizei count, const GLint *value);
  221. void (GL_APIENTRY * glUniform2iv)(GLint location, GLsizei count, const GLint *value);
  222. void (GL_APIENTRY * glUniform3iv)(GLint location, GLsizei count, const GLint *value);
  223. void (GL_APIENTRY * glUniform4iv)(GLint location, GLsizei count, const GLint *value);
  224. void (GL_APIENTRY * glUniformMatrix2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  225. void (GL_APIENTRY * glUniformMatrix3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  226. void (GL_APIENTRY * glUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
  227. void (GL_APIENTRY * glValidateProgram)(GLuint program);
  228. void (GL_APIENTRY * glVertexAttrib1d)(GLuint index, GLdouble x);
  229. void (GL_APIENTRY * glVertexAttrib1dv)(GLuint index, const GLdouble *v);
  230. void (GL_APIENTRY * glVertexAttrib1f)(GLuint index, GLfloat x);
  231. void (GL_APIENTRY * glVertexAttrib1fv)(GLuint index, const GLfloat *v);
  232. void (GL_APIENTRY * glVertexAttrib1s)(GLuint index, GLshort x);
  233. void (GL_APIENTRY * glVertexAttrib1sv)(GLuint index, const GLshort *v);
  234. void (GL_APIENTRY * glVertexAttrib2d)(GLuint index, GLdouble x, GLdouble y);
  235. void (GL_APIENTRY * glVertexAttrib2dv)(GLuint index, const GLdouble *v);
  236. void (GL_APIENTRY * glVertexAttrib2f)(GLuint index, GLfloat x, GLfloat y);
  237. void (GL_APIENTRY * glVertexAttrib2fv)(GLuint index, const GLfloat *v);
  238. void (GL_APIENTRY * glVertexAttrib2s)(GLuint index, GLshort x, GLshort y);
  239. void (GL_APIENTRY * glVertexAttrib2sv)(GLuint index, const GLshort *v);
  240. void (GL_APIENTRY * glVertexAttrib3d)(GLuint index, GLdouble x, GLdouble y, GLdouble z);
  241. void (GL_APIENTRY * glVertexAttrib3dv)(GLuint index, const GLdouble *v);
  242. void (GL_APIENTRY * glVertexAttrib3f)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
  243. void (GL_APIENTRY * glVertexAttrib3fv)(GLuint index, const GLfloat *v);
  244. void (GL_APIENTRY * glVertexAttrib3s)(GLuint index, GLshort x, GLshort y, GLshort z);
  245. void (GL_APIENTRY * glVertexAttrib3sv)(GLuint index, const GLshort *v);
  246. void (GL_APIENTRY * glVertexAttrib4Nbv)(GLuint index, const GLbyte *v);
  247. void (GL_APIENTRY * glVertexAttrib4Niv)(GLuint index, const GLint *v);
  248. void (GL_APIENTRY * glVertexAttrib4Nsv)(GLuint index, const GLshort *v);
  249. void (GL_APIENTRY * glVertexAttrib4Nub)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
  250. void (GL_APIENTRY * glVertexAttrib4Nubv)(GLuint index, const GLubyte *v);
  251. void (GL_APIENTRY * glVertexAttrib4Nuiv)(GLuint index, const GLuint *v);
  252. void (GL_APIENTRY * glVertexAttrib4Nusv)(GLuint index, const GLushort *v);
  253. void (GL_APIENTRY * glVertexAttrib4bv)(GLuint index, const GLbyte *v);
  254. void (GL_APIENTRY * glVertexAttrib4d)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
  255. void (GL_APIENTRY * glVertexAttrib4dv)(GLuint index, const GLdouble *v);
  256. void (GL_APIENTRY * glVertexAttrib4f)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
  257. void (GL_APIENTRY * glVertexAttrib4fv)(GLuint index, const GLfloat *v);
  258. void (GL_APIENTRY * glVertexAttrib4iv)(GLuint index, const GLint *v);
  259. void (GL_APIENTRY * glVertexAttrib4s)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
  260. void (GL_APIENTRY * glVertexAttrib4sv)(GLuint index, const GLshort *v);
  261. void (GL_APIENTRY * glVertexAttrib4ubv)(GLuint index, const GLubyte *v);
  262. void (GL_APIENTRY * glVertexAttrib4uiv)(GLuint index, const GLuint *v);
  263. void (GL_APIENTRY * glVertexAttrib4usv)(GLuint index, const GLushort *v);
  264. void (GL_APIENTRY * glVertexAttribPointer) (unsigned int, GLint, GLenum, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
  265. void (GL_APIENTRY * glVertexAttribIPointer) (unsigned int, GLint, GLenum, GLsizei stride, const GLvoid *pointer);
  266. void (GL_APIENTRY * glVertexAttribLPointer) (unsigned int, GLint, GLenum, GLsizei stride, const GLvoid *pointer);
  267. void (GL_APIENTRY * glVertexAttribDivisor)(GLuint index, GLuint divisor);
  268. void (GL_APIENTRY * glUniformMatrix2x3fv)( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value );
  269. void (GL_APIENTRY * glUniformMatrix3x2fv)( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value );
  270. void (GL_APIENTRY * glUniformMatrix2x4fv)( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value );
  271. void (GL_APIENTRY * glUniformMatrix4x2fv)( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value );
  272. void (GL_APIENTRY * glUniformMatrix3x4fv)( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value );
  273. void (GL_APIENTRY * glUniformMatrix4x3fv)( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value );
  274. void (GL_APIENTRY * glClipControl)( GLenum origin, GLenum depthMode );
  275. void (GL_APIENTRY * glProgramParameteri)( GLuint program, GLenum pname, GLint value );
  276. void (GL_APIENTRY * glPatchParameteri)( GLenum pname, GLint value );
  277. void (GL_APIENTRY * glPatchParameterfv)( GLenum pname, const GLfloat* values );
  278. void (GL_APIENTRY * glGetUniformuiv)( GLuint program, GLint location, GLuint* params );
  279. void (GL_APIENTRY * glBindFragDataLocation)( GLuint program, GLuint color, const GLchar* name );
  280. void (GL_APIENTRY * glBindFragDataLocationIndexed) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name);
  281. GLint (GL_APIENTRY * glGetFragDataIndex) (GLuint program, const GLchar * name);
  282. GLint (GL_APIENTRY * glGetFragDataLocation)( GLuint program, const GLchar* name);
  283. void (GL_APIENTRY * glUniform1ui)( GLint location, GLuint v0 );
  284. void (GL_APIENTRY * glUniform2ui)( GLint location, GLuint v0, GLuint v1 );
  285. void (GL_APIENTRY * glUniform3ui)( GLint location, GLuint v0, GLuint v1, GLuint v2 );
  286. void (GL_APIENTRY * glUniform4ui)( GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3 );
  287. void (GL_APIENTRY * glUniform1uiv)( GLint location, GLsizei count, const GLuint *value );
  288. void (GL_APIENTRY * glUniform2uiv)( GLint location, GLsizei count, const GLuint *value );
  289. void (GL_APIENTRY * glUniform3uiv)( GLint location, GLsizei count, const GLuint *value );
  290. void (GL_APIENTRY * glUniform4uiv)( GLint location, GLsizei count, const GLuint *value );
  291. void (GL_APIENTRY * glUniform1i64 )(GLint location, GLint64 x) ;
  292. void (GL_APIENTRY * glUniform1i64v )(GLint location, GLsizei count, const GLint64* value) ;
  293. void (GL_APIENTRY * glUniform1ui64 )(GLint location, GLuint64 x) ;
  294. void (GL_APIENTRY * glUniform1ui64v)(GLint location, GLsizei count, const GLuint64* value) ;
  295. void (GL_APIENTRY * glUniform2i64 )(GLint location, GLint64 x, GLint64 y) ;
  296. void (GL_APIENTRY * glUniform2i64v )(GLint location, GLsizei count, const GLint64* value) ;
  297. void (GL_APIENTRY * glUniform2ui64 )(GLint location, GLuint64 x, GLuint64 y) ;
  298. void (GL_APIENTRY * glUniform2ui64v)(GLint location, GLsizei count, const GLuint64* value) ;
  299. void (GL_APIENTRY * glUniform3i64 )(GLint location, GLint64 x, GLint64 y, GLint64 z) ;
  300. void (GL_APIENTRY * glUniform3i64v )(GLint location, GLsizei count, const GLint64* value) ;
  301. void (GL_APIENTRY * glUniform3ui64 )(GLint location, GLuint64 x, GLuint64 y, GLuint64 z) ;
  302. void (GL_APIENTRY * glUniform3ui64v)(GLint location, GLsizei count, const GLuint64* value) ;
  303. void (GL_APIENTRY * glUniform4i64 )(GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w) ;
  304. void (GL_APIENTRY * glUniform4i64v )(GLint location, GLsizei count, const GLint64* value) ;
  305. void (GL_APIENTRY * glUniform4ui64 )(GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w) ;
  306. void (GL_APIENTRY * glUniform4ui64v)(GLint location, GLsizei count, const GLuint64* value) ;
  307. GLuint (GL_APIENTRY * glGetHandleARB) (GLenum pname);
  308. void (GL_APIENTRY * glGetUniformIndices)(GLuint program, GLsizei uniformCount, const GLchar* *uniformNames, GLuint *uniformIndices);
  309. void (GL_APIENTRY * glGetActiveUniformsiv)(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
  310. void (GL_APIENTRY * glGetActiveUniformName)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
  311. GLuint (GL_APIENTRY * glGetUniformBlockIndex)(GLuint program, const GLchar *uniformBlockName);
  312. void (GL_APIENTRY * glGetActiveUniformBlockiv)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
  313. void (GL_APIENTRY * glGetActiveUniformBlockName)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
  314. void (GL_APIENTRY * glUniformBlockBinding)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
  315. void (GL_APIENTRY * glGetProgramBinary)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
  316. void (GL_APIENTRY * glProgramBinary)(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
  317. void (GL_APIENTRY * glUniform1d)(GLint location, GLdouble v0);
  318. void (GL_APIENTRY * glUniform2d)(GLint location, GLdouble v0, GLdouble v1);
  319. void (GL_APIENTRY * glUniform3d)(GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
  320. void (GL_APIENTRY * glUniform4d)(GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
  321. void (GL_APIENTRY * glUniform1dv)(GLint location, GLsizei count, const GLdouble *value);
  322. void (GL_APIENTRY * glUniform2dv)(GLint location, GLsizei count, const GLdouble *value);
  323. void (GL_APIENTRY * glUniform3dv)(GLint location, GLsizei count, const GLdouble *value);
  324. void (GL_APIENTRY * glUniform4dv)(GLint location, GLsizei count, const GLdouble *value);
  325. void (GL_APIENTRY * glUniformMatrix2dv)(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
  326. void (GL_APIENTRY * glUniformMatrix3dv)(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
  327. void (GL_APIENTRY * glUniformMatrix4dv)(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
  328. void (GL_APIENTRY * glUniformMatrix2x3dv)( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value );
  329. void (GL_APIENTRY * glUniformMatrix3x2dv)( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value );
  330. void (GL_APIENTRY * glUniformMatrix2x4dv)( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value );
  331. void (GL_APIENTRY * glUniformMatrix4x2dv)( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value );
  332. void (GL_APIENTRY * glUniformMatrix3x4dv)( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value );
  333. void (GL_APIENTRY * glUniformMatrix4x3dv)( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value );
  334. void (GL_APIENTRY * glGetActiveAtomicCounterBufferiv)( GLuint program, GLuint bufferIndex, GLenum pname, GLint* params );
  335. void (GL_APIENTRY * glDispatchCompute)( GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ );
  336. // ARB_bindless_texture
  337. GLuint64 (GL_APIENTRY* glGetTextureHandle)(GLuint texture);
  338. GLuint64 (GL_APIENTRY* glGetTextureSamplerHandle)(GLuint texture, GLuint sampler);
  339. void (GL_APIENTRY* glMakeTextureHandleResident)(GLuint64 handle);
  340. void (GL_APIENTRY* glMakeTextureHandleNonResident)(GLuint64 handle);
  341. GLboolean (GL_APIENTRY* glIsTextureHandleResident)(GLuint64 handle);
  342. GLuint64 (GL_APIENTRY* glGetImageHandle)(GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);
  343. void (GL_APIENTRY* glMakeImageHandleResident)(GLuint64 handle);
  344. void (GL_APIENTRY* glMakeImageHandleNonResident)(GLuint64 handle);
  345. GLboolean (GL_APIENTRY* glIsImageHandleResident)(GLuint64 handle);
  346. void (GL_APIENTRY* glUniformHandleui64)(GLint location, GLuint64 handle);
  347. void (GL_APIENTRY* glUniformHandleuiv64)(GLint location, GLsizei count, GLuint64 *handles);
  348. void (GL_APIENTRY* glProgramUniformHandleui64)(GLuint program, GLint location, GLuint64 handle);
  349. void (GL_APIENTRY* glProgramUniformHandleuiv64)(GLuint program, GLint location, GLsizei count, GLuint64 *handles);
  350. // Buffer Object extensions
  351. bool isBufferObjectSupported;
  352. bool isVBOSupported;
  353. bool isPBOSupported;
  354. bool isTBOSupported;
  355. bool isVAOSupported;
  356. bool isTransformFeedbackSupported;
  357. void (GL_APIENTRY * glGenBuffers) (GLsizei n, GLuint *buffers);
  358. void (GL_APIENTRY * glBindBuffer) (GLenum target, GLuint buffer);
  359. void (GL_APIENTRY * glBufferData) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
  360. void (GL_APIENTRY * glBufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
  361. void (GL_APIENTRY * glDeleteBuffers) (GLsizei n, const GLuint *buffers);
  362. GLboolean (GL_APIENTRY * glIsBuffer) (GLuint buffer);
  363. void (GL_APIENTRY * glGetBufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
  364. GLvoid* (GL_APIENTRY * glBufferStorage) (GLenum target, GLintptr size, const GLvoid * data, GLbitfield flags);
  365. GLvoid* (GL_APIENTRY * glNamedBufferStorage) (GLuint buffer, GLsizei size, const void * data, GLbitfield flags);
  366. GLvoid* (GL_APIENTRY * glMapBuffer) (GLenum target, GLenum access);
  367. GLvoid* (GL_APIENTRY * glMapBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
  368. GLboolean (GL_APIENTRY * glUnmapBuffer) (GLenum target);
  369. void (GL_APIENTRY * glGetBufferParameteriv) (GLenum target, GLenum pname, GLint *params);
  370. void (GL_APIENTRY * glGetBufferPointerv) (GLenum target, GLenum pname, GLvoid* *params);
  371. void (GL_APIENTRY * glBindBufferRange) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
  372. void (GL_APIENTRY * glBindBufferBase) (GLenum target, GLuint index, GLuint buffer);
  373. void (GL_APIENTRY * glTexBuffer) (GLenum target, GLenum internalFormat, GLuint buffer);
  374. void (GL_APIENTRY * glMemoryBarrier)( GLbitfield barriers );
  375. // BlendFunc extensions
  376. bool isBlendFuncSeparateSupported;
  377. void (GL_APIENTRY * glBlendFuncSeparate) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) ;
  378. void (GL_APIENTRY * glBlendFunci) (GLuint buf, GLenum src, GLenum dst);
  379. void (GL_APIENTRY * glBlendFuncSeparatei) (GLuint buf, GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) ;
  380. // Vertex Array extensions
  381. bool isSecondaryColorSupported;
  382. bool isFogCoordSupported;
  383. bool isMultiTexSupported;
  384. bool isOcclusionQuerySupported;
  385. bool isARBOcclusionQuerySupported;
  386. bool isTimerQuerySupported;
  387. bool isARBTimerQuerySupported;
  388. void (GL_APIENTRY * glDrawArraysInstanced)( GLenum mode, GLint first, GLsizei count, GLsizei primcount );
  389. void (GL_APIENTRY * glDrawElementsInstanced)( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount );
  390. void (GL_APIENTRY * glSecondaryColor3ubv) (const GLubyte* coord);
  391. void (GL_APIENTRY * glSecondaryColor3fv) (const GLfloat* coord);
  392. void (GL_APIENTRY * glFogCoordfv) (const GLfloat* coord);
  393. void (GL_APIENTRY * glMultiTexCoord1f) (GLenum target,GLfloat coord);
  394. void (GL_APIENTRY * glMultiTexCoord4f) (GLenum target, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
  395. void (GL_APIENTRY * glMultiTexCoord1fv) (GLenum target,const GLfloat* coord);
  396. void (GL_APIENTRY * glMultiTexCoord2fv) (GLenum target,const GLfloat* coord);
  397. void (GL_APIENTRY * glMultiTexCoord3fv) (GLenum target,const GLfloat* coord);
  398. void (GL_APIENTRY * glMultiTexCoord4fv) (GLenum target,const GLfloat* coord);
  399. void (GL_APIENTRY * glMultiTexCoord1d) (GLenum target,GLdouble coord);
  400. void (GL_APIENTRY * glMultiTexCoord1dv) (GLenum target,const GLdouble* coord);
  401. void (GL_APIENTRY * glMultiTexCoord2dv) (GLenum target,const GLdouble* coord);
  402. void (GL_APIENTRY * glMultiTexCoord3dv) (GLenum target,const GLdouble* coord);
  403. void (GL_APIENTRY * glMultiTexCoord4dv) (GLenum target,const GLdouble* coord);
  404. // Occlusion Query extensions
  405. void (GL_APIENTRY * glGenOcclusionQueries) ( GLsizei n, GLuint *ids );
  406. void (GL_APIENTRY * glDeleteOcclusionQueries) ( GLsizei n, const GLuint *ids );
  407. GLboolean (GL_APIENTRY * glIsOcclusionQuery) ( GLuint id );
  408. void (GL_APIENTRY * glBeginOcclusionQuery) ( GLuint id );
  409. void (GL_APIENTRY * glEndOcclusionQuery) ();
  410. void (GL_APIENTRY * glGetOcclusionQueryiv) ( GLuint id, GLenum pname, GLint *params );
  411. void (GL_APIENTRY * glGetOcclusionQueryuiv) ( GLuint id, GLenum pname, GLuint *params );
  412. void (GL_APIENTRY * glGetQueryiv) (GLenum target, GLenum pname, GLint *params);
  413. void (GL_APIENTRY * glGenQueries) (GLsizei n, GLuint *ids);
  414. void (GL_APIENTRY * glBeginQuery) (GLenum target, GLuint id);
  415. void (GL_APIENTRY * glEndQuery) (GLenum target);
  416. void (GL_APIENTRY * glBeginQueryIndexed) (GLenum target, GLuint index, GLuint id);
  417. void (GL_APIENTRY * glEndQueryIndexed) (GLenum target, GLuint index);
  418. void (GL_APIENTRY * glQueryCounter) (GLuint id, GLenum target);
  419. GLboolean (GL_APIENTRY * glIsQuery) (GLuint id);
  420. void (GL_APIENTRY * glDeleteQueries) (GLsizei n, const GLuint *ids);
  421. void (GL_APIENTRY * glGetQueryObjectiv) (GLuint id, GLenum pname, GLint *params);
  422. void (GL_APIENTRY * glGetQueryObjectuiv) (GLuint id, GLenum pname, GLuint *params);
  423. void (GL_APIENTRY * glGetQueryObjectui64v) (GLuint id, GLenum pname, GLuint64 *params);
  424. void (GL_APIENTRY * glGetInteger64v) (GLenum pname, GLint64 *params);
  425. // SampleMaski functionality
  426. bool isOpenGL32upported;
  427. bool isTextureMultisampleSupported;
  428. bool isSampleMaskiSupported;
  429. void (GL_APIENTRY * glSampleMaski) (GLuint maskNumber, GLbitfield mask);
  430. // Vertex/Fragment Programs
  431. bool isVertexProgramSupported;
  432. bool isFragmentProgramSupported;
  433. void (GL_APIENTRY * glBindProgram) (GLenum target, GLuint id);
  434. void (GL_APIENTRY * glGenPrograms) (GLsizei n, GLuint *programs);
  435. void (GL_APIENTRY * glDeletePrograms) (GLsizei n, GLuint *programs);
  436. void (GL_APIENTRY * glProgramString) (GLenum target, GLenum format, GLsizei len, const void *string);
  437. void (GL_APIENTRY * glProgramLocalParameter4fv) (GLenum target, GLuint index, const GLfloat *params);
  438. // Sample Extensions (OpenGL>=3.3)
  439. void (GL_APIENTRY * glSamplerParameteri)(GLuint sampler, GLenum param, GLint value);
  440. void (GL_APIENTRY * glSamplerParameterf)(GLuint sampler, GLenum param, GLfloat value);
  441. void (GL_APIENTRY * glSamplerParameteriv)(GLuint sampler, GLenum param, GLint *value);
  442. void (GL_APIENTRY * glSamplerParameterfv)(GLuint sampler, GLenum param, GLfloat *value);
  443. void (GL_APIENTRY * glSamplerParameterIiv)(GLuint sampler, GLenum param, GLint *value);
  444. void (GL_APIENTRY * glSamplerParameterIuiv)(GLuint sampler, GLenum param, GLuint *value);
  445. void (GL_APIENTRY * glGetSamplerParameteriv)(GLuint sampler, GLenum param, GLint *value);
  446. void (GL_APIENTRY * glGetSamplerParameterfv)(GLuint sampler, GLenum param, GLfloat *value);
  447. void (GL_APIENTRY * glGetSamplerParameterIiv)(GLuint sampler, GLenum param, GLint *value);
  448. void (GL_APIENTRY * glGetSamplerParameterIuiv)(GLuint sampler, GLenum param, GLuint *value);
  449. void (GL_APIENTRY * glGenSamplers)(GLsizei size,GLuint * samplers);
  450. void (GL_APIENTRY * glDeleteSamplers)(GLsizei size,const GLuint * samplers);
  451. void (GL_APIENTRY * glBindSampler)(GLuint tu, GLuint sampler);
  452. GLboolean (GL_APIENTRY * glIsSampler)(GLuint id);
  453. // Texture Extensions
  454. bool isMultiTexturingSupported;
  455. bool isTextureFilterAnisotropicSupported;
  456. bool isTextureSwizzleSupported;
  457. bool isTextureCompressionARBSupported;
  458. bool isTextureCompressionS3TCSupported;
  459. bool isTextureCompressionPVRTC2BPPSupported;
  460. bool isTextureCompressionPVRTC4BPPSupported;
  461. bool isTextureCompressionETCSupported;
  462. bool isTextureCompressionETC2Supported;
  463. bool isTextureCompressionRGTCSupported;
  464. bool isTextureCompressionPVRTCSupported;
  465. bool isTextureMirroredRepeatSupported;
  466. bool isTextureEdgeClampSupported;
  467. bool isTextureBorderClampSupported;
  468. bool isGenerateMipMapSupported;
  469. bool preferGenerateMipmapSGISForPowerOfTwo;
  470. bool isTextureMultisampledSupported;
  471. bool isShadowSupported;
  472. bool isShadowAmbientSupported;
  473. bool isTextureMaxLevelSupported;
  474. GLint maxTextureSize;
  475. bool isClientStorageSupported;
  476. bool isTextureIntegerEXTSupported;
  477. bool isTextureStorageEnabled;
  478. bool isTexStorage2DSupported() const { return glTexStorage2D != 0; }
  479. bool isCompressedTexImage2DSupported() const { return glCompressedTexImage2D!=0; }
  480. bool isCompressedTexSubImage2DSupported() const { return glCompressedTexSubImage2D!=0; }
  481. bool isBindImageTextureSupported() const { return glBindImageTexture!=0; }
  482. bool isNonPowerOfTwoTextureMipMappedSupported;
  483. bool isNonPowerOfTwoTextureNonMipMappedSupported;
  484. bool isNonPowerOfTwoTextureSupported(GLenum filter) const
  485. {
  486. return (filter==GL_LINEAR || filter==GL_NEAREST) ?
  487. isNonPowerOfTwoTextureNonMipMappedSupported :
  488. isNonPowerOfTwoTextureMipMappedSupported;
  489. }
  490. ///immutable texture storage and texture view
  491. void (GL_APIENTRY * glTexStorage1D) (GLenum target, GLsizei numMipmapLevels, GLenum internalformat, GLsizei width);
  492. void (GL_APIENTRY * glTextureStorage1D) (GLuint texture, GLsizei numMipmapLevels, GLenum internalformat, GLsizei width);
  493. void (GL_APIENTRY * glTexStorage2D) (GLenum target, GLsizei numMipmapLevels, GLenum internalformat, GLsizei width, GLsizei height);
  494. void (GL_APIENTRY * glTextureStorage2D) (GLuint texture, GLsizei numMipmapLevels, GLenum internalformat, GLsizei width, GLsizei height);
  495. void (GL_APIENTRY * glTexStorage3D) ( GLenum target, GLsizei numMipmapLevels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
  496. void (GL_APIENTRY * glTextureStorage3D) ( GLuint texture, GLsizei numMipmapLevels,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth);
  497. void (GL_APIENTRY * glTexStorage2DMultisample) ( GLenum target, GLsizei numSamples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
  498. void (GL_APIENTRY * glTexStorage3DMultisample) ( GLenum target, GLsizei numSamples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
  499. void (GL_APIENTRY * glTextureView) ( GLuint texture, GLenum target, GLuint orig, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
  500. void (GL_APIENTRY * glCompressedTexImage2D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
  501. void (GL_APIENTRY * glCompressedTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
  502. void (GL_APIENTRY * glGetCompressedTexImage) (GLenum target, GLint level, GLvoid *data);
  503. void (GL_APIENTRY * glTexImage2DMultisample) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
  504. void (GL_APIENTRY * glTexParameterIiv) (GLenum target, GLenum pname, const GLint* data);
  505. void (GL_APIENTRY * glTexParameterIuiv) (GLenum target, GLenum pname, const GLuint* data);
  506. void (GL_APIENTRY * glBindImageTexture) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
  507. // Texture3D extensions
  508. bool isTexture3DSupported;
  509. bool isTexture3DFast;
  510. GLint maxTexture3DSize;
  511. bool isCompressedTexImage3DSupported() const { return glCompressedTexImage3D!=0; }
  512. bool isCompressedTexSubImage3DSupported() const { return glCompressedTexSubImage3D!=0; }
  513. void (GL_APIENTRY * glTexImage3D) ( GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
  514. void (GL_APIENTRY * glTexSubImage3D) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
  515. void (GL_APIENTRY * glCopyTexSubImage3D) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height );
  516. void (GL_APIENTRY * glCompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
  517. void (GL_APIENTRY * glCompressedTexSubImage3D) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data );
  518. void (GL_APIENTRY *glTexImage3DMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
  519. void (GL_APIENTRY *glGetMultisamplefv) (GLenum pname, GLuint index, GLfloat *val);
  520. // Texture2DArray extensions
  521. bool isTexture2DArraySupported;
  522. GLint maxLayerCount;
  523. GLint max2DSize;
  524. // Blending
  525. bool isBlendColorSupported;
  526. bool isBlendEquationSupported;
  527. bool isBlendEquationSeparateSupported;
  528. bool isSGIXMinMaxSupported;
  529. bool isLogicOpSupported;
  530. void (GL_APIENTRY * glBlendColor) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
  531. void (GL_APIENTRY * glBlendEquation)(GLenum mode);
  532. void (GL_APIENTRY * glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha);
  533. void (GL_APIENTRY * glBlendEquationi)(GLuint buf, GLenum mode);
  534. void (GL_APIENTRY * glBlendEquationSeparatei)(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
  535. // glEnablei/glDisabeli
  536. void (GL_APIENTRY * glEnablei) (GLenum capability, GLuint buf);
  537. void (GL_APIENTRY * glDisablei) (GLenum capability, GLuint buf);
  538. // Stencil
  539. bool isStencilWrapSupported;
  540. bool isStencilTwoSidedSupported;
  541. bool isOpenGL20Supported;
  542. bool isSeparateStencilSupported;
  543. void (GL_APIENTRY * glActiveStencilFace) (GLenum face);
  544. void (GL_APIENTRY * glStencilOpSeparate) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
  545. void (GL_APIENTRY * glStencilMaskSeparate) (GLenum face, GLuint mask);
  546. void (GL_APIENTRY * glStencilFuncSeparate) (GLenum face, GLenum func, GLint ref, GLuint mask);
  547. void (GL_APIENTRY * glStencilFuncSeparateATI) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
  548. // ColorMask
  549. void (GL_APIENTRY * glColorMaski)(GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
  550. // ClampColor
  551. bool isClampColorSupported;
  552. void (GL_APIENTRY * glClampColor) (GLenum target, GLenum mode);
  553. // PrimitiveRestartIndex
  554. void (GL_APIENTRY * glPrimitiveRestartIndex) ( GLuint index );
  555. // Mutlisample
  556. bool isMultisampleSupported;
  557. bool isMultisampleFilterHintSupported;
  558. void (GL_APIENTRY * glSampleCoverage) (GLfloat value, GLboolean invert);
  559. // Point
  560. bool isPointParametersSupported;
  561. bool isPointSpriteSupported;
  562. bool isPointSpriteModeSupported;
  563. bool isPointSpriteCoordOriginSupported;
  564. void (GL_APIENTRY * glPointParameteri) (GLenum pname, GLint param);
  565. void (GL_APIENTRY * glPointParameterf) (GLenum pname, GLfloat param);
  566. void (GL_APIENTRY * glPointParameterfv) (GLenum pname, const GLfloat *params);
  567. // FrameBuferObject
  568. bool isFrameBufferObjectSupported;
  569. bool isPackedDepthStencilSupported;
  570. bool isMultisampledRenderToTextureSupported;
  571. bool isInvalidateFramebufferSupported;
  572. bool isRenderbufferMultisampleSupported() const { return glRenderbufferStorageMultisample != 0; }
  573. bool isRenderbufferMultisampleCoverageSupported() const { return glRenderbufferStorageMultisampleCoverageNV != 0; }
  574. void (GL_APIENTRY * glBindRenderbuffer) (GLenum, GLuint);
  575. void (GL_APIENTRY * glDeleteRenderbuffers) (GLsizei n, const GLuint *renderbuffers);
  576. void (GL_APIENTRY * glGenRenderbuffers) (GLsizei, GLuint *);
  577. void (GL_APIENTRY * glRenderbufferStorage) (GLenum, GLenum, GLsizei, GLsizei);
  578. void (GL_APIENTRY * glRenderbufferStorageMultisample) (GLenum, GLsizei, GLenum, GLsizei, GLsizei);
  579. void (GL_APIENTRY * glRenderbufferStorageMultisampleCoverageNV) (GLenum, GLsizei, GLsizei, GLenum, GLsizei, GLsizei);
  580. void (GL_APIENTRY * glBindFramebuffer) (GLenum, GLuint);
  581. void (GL_APIENTRY * glDeleteFramebuffers) (GLsizei n, const GLuint *framebuffers);
  582. void (GL_APIENTRY * glGenFramebuffers) (GLsizei, GLuint *);
  583. GLenum (GL_APIENTRY * glCheckFramebufferStatus) (GLenum);
  584. void (GL_APIENTRY * glFramebufferTexture1D) (GLenum, GLenum, GLenum, GLuint, GLint);
  585. void (GL_APIENTRY * glFramebufferTexture2D) (GLenum, GLenum, GLenum, GLuint, GLint);
  586. void (GL_APIENTRY * glFramebufferTexture2DMultisample) (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei);
  587. void (GL_APIENTRY * glFramebufferTexture3D) (GLenum, GLenum, GLenum, GLuint, GLint, GLint);
  588. void (GL_APIENTRY * glFramebufferTexture) (GLenum, GLenum, GLint, GLint);
  589. void (GL_APIENTRY * glFramebufferTextureLayer) (GLenum, GLenum, GLuint, GLint, GLint);
  590. void (GL_APIENTRY * glFramebufferTextureFace)( GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face );
  591. void (GL_APIENTRY * glFramebufferRenderbuffer) (GLenum, GLenum, GLenum, GLuint);
  592. void (GL_APIENTRY * glGenerateMipmap) (GLenum);
  593. void (GL_APIENTRY * glBlitFramebuffer) (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum);
  594. void (GL_APIENTRY * glInvalidateFramebuffer) (GLenum, GLsizei, const GLenum*); // GL_ARB_invalidate_subdata or GL 4.3 or GLES 3
  595. void (GL_APIENTRY * glGetRenderbufferParameteriv) (GLenum, GLenum, GLint*);
  596. //ARB_framebuffer_no_attachments
  597. void (GL_APIENTRY * glFramebufferParameteri)(GLenum target, GLenum pname, GLint param);
  598. void (GL_APIENTRY * glGetFramebufferParameteriv)(GLenum target, GLenum pname, GLint *params);
  599. void (GL_APIENTRY * glNamedFramebufferParameteri)(GLuint fbo, GLenum pname, GLint param);
  600. void (GL_APIENTRY * glGetNamedFramebufferParameteriv)(GLuint fbo, GLenum pname, GLint *params);
  601. //subroutine
  602. GLint(GL_APIENTRY* glGetSubroutineUniformLocation) (GLuint program, GLenum shadertype, const GLchar *name);
  603. void (GL_APIENTRY * glGetActiveSubroutineUniformName) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
  604. void (GL_APIENTRY * glGetActiveSubroutineUniformiv) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
  605. GLuint (GL_APIENTRY * glGetSubroutineIndex) (GLuint program, GLenum shadertype, const GLchar *name);
  606. void (GL_APIENTRY * glGetActiveSubroutineName) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
  607. void (GL_APIENTRY * glGetProgramStageiv) (GLuint program, GLenum shadertype, GLenum pname, GLint *values);
  608. void (GL_APIENTRY *glUniformSubroutinesuiv) (GLenum shadertype, GLsizei count,const GLuint * indices);
  609. void (GL_APIENTRY * glGetUniformSubroutineuiv) (GLenum shadertype, GLint location, GLuint *params);
  610. // Sync
  611. GLsync (GL_APIENTRY * glFenceSync) (GLenum condition, GLbitfield flags);
  612. GLboolean (GL_APIENTRY * glIsSync) (GLsync sync);
  613. void (GL_APIENTRY * glDeleteSync) (GLsync sync);
  614. GLenum (GL_APIENTRY * glClientWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
  615. void (GL_APIENTRY * glWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
  616. void (GL_APIENTRY * glGetSynciv) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
  617. // Indirect Rendering
  618. void (GL_APIENTRY * glDrawArraysIndirect) (GLenum mode, const void * indirect);
  619. void (GL_APIENTRY * glMultiDrawArraysIndirect) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
  620. void (GL_APIENTRY * glDrawElementsIndirect) (GLenum mode, GLenum type, const void *indirect);
  621. void (GL_APIENTRY * glMultiDrawElementsIndirect)(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
  622. // ARB_sparse_texture
  623. void (GL_APIENTRY * glTexPageCommitment) (GLenum target, GLint level,GLint xoffset,GLint yoffset,GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,GLboolean commit);
  624. // Transform feedback
  625. void (GL_APIENTRY * glBeginTransformFeedback) (GLenum primitiveMode);
  626. void (GL_APIENTRY * glEndTransformFeedback) (void);
  627. void (GL_APIENTRY * glTransformFeedbackVaryings) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
  628. void (GL_APIENTRY * glGetTransformFeedbackVarying) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
  629. void (GL_APIENTRY * glBindTransformFeedback) (GLenum target, GLuint id);
  630. void (GL_APIENTRY * glDeleteTransformFeedbacks) (GLsizei n, const GLuint *ids);
  631. void (GL_APIENTRY * glGenTransformFeedbacks) (GLsizei n, GLuint *ids);
  632. GLboolean (GL_APIENTRY * glIsTransformFeedback) (GLuint id);
  633. void (GL_APIENTRY * glPauseTransformFeedback) (void);
  634. void (GL_APIENTRY * glResumeTransformFeedback) (void);
  635. void (GL_APIENTRY * glDrawTransformFeedback) (GLenum mode, GLuint id);
  636. void (GL_APIENTRY * glDrawTransformFeedbackStream) (GLenum mode, GLuint id, GLuint stream);
  637. void (GL_APIENTRY * glDrawTransformFeedbackInstanced) (GLenum mode, GLuint id, GLsizei instancecount);
  638. void (GL_APIENTRY * glDrawTransformFeedbackStreamInstanced) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
  639. void (GL_APIENTRY * glCreateTransformFeedbacks) (GLsizei n, GLuint *ids);
  640. void (GL_APIENTRY * glTransformFeedbackBufferBase) (GLuint xfb, GLuint index, GLuint buffer);
  641. void (GL_APIENTRY * glTransformFeedbackBufferRange) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size);
  642. void (GL_APIENTRY * glGetTransformFeedbackiv) (GLuint xfb, GLenum pname, GLint *param);
  643. void (GL_APIENTRY * glGetTransformFeedbacki_v) (GLuint xfb, GLenum pname, GLuint index, GLint *param);
  644. void (GL_APIENTRY * glGetTransformFeedbacki64_v) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param);
  645. // Vertex Array Object
  646. void (GL_APIENTRY * glDeleteVertexArrays) (GLsizei size,const GLuint *handles);
  647. void (GL_APIENTRY * glGenVertexArrays) (GLsizei size, GLuint *handles);
  648. GLboolean (GL_APIENTRY * glIsVertexArray) (GLuint handle);
  649. void (GL_APIENTRY * glBindVertexArray) (GLuint handle);
  650. // OpenGL 4.3 / ARB_vertex_attrib_binding
  651. bool isVertexAttribBindingSupported;
  652. void (GL_APIENTRY * glBindVertexBuffer)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLintptr stride);
  653. void (GL_APIENTRY * glVertexArrayVertexBuffer)(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
  654. void (GL_APIENTRY * glVertexAttribBinding)(GLuint attribindex, GLuint bindingindex);
  655. void (GL_APIENTRY * glVertexArrayAttribBinding)(GLuint vaobj, GLuint attribindex, GLuint bindingindex);
  656. void (GL_APIENTRY * glVertexAttribFormat)( GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
  657. void (GL_APIENTRY * glVertexAttribIFormat)( GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
  658. void (GL_APIENTRY * glVertexAttribLFormat)( GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
  659. void (GL_APIENTRY * glVertexArrayAttribFormat)( GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
  660. void (GL_APIENTRY * glVertexArrayAttribIFormat)( GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
  661. void (GL_APIENTRY * glVertexArrayAttribLFormat)( GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
  662. // MultiDrawArrays
  663. void (GL_APIENTRY * glMultiDrawArrays) (GLenum mode, const GLint * first, const GLsizei * count, GLsizei primcount);
  664. void (GL_APIENTRY * glMultiDrawElements) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount);
  665. void (GL_APIENTRY * glMultiDrawElementsBaseVertex) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex);
  666. void (GL_APIENTRY * glDrawRangeElements) ( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices );
  667. void (GL_APIENTRY * glDrawElementsBaseVertex) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
  668. void (GL_APIENTRY * glDrawElementsInstancedBaseVertex) (GLenum mode, GLsizei count, GLenum type, const void *indices,GLsizei primcount, GLint basevertex);
  669. void (GL_APIENTRY * glDrawRangeElementsBaseVertex) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
  670. void (GL_APIENTRY * glProvokingVertex) (GLenum mode);
  671. void (GL_APIENTRY * glBeginConditionalRender) (GLuint id, GLenum mode);
  672. void (GL_APIENTRY * glEndConditionalRender) (void);
  673. void (GL_APIENTRY *glDrawArraysInstancedBaseInstance) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
  674. void (GL_APIENTRY * glDrawElementsInstancedBaseInstance) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
  675. void (GL_APIENTRY *glDrawElementsInstancedBaseVertexBaseInstance) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
  676. // ViewportArray
  677. bool isViewportArraySupported;
  678. void (GL_APIENTRY * glViewportArrayv) (GLuint first, GLsizei count, const GLfloat * v);
  679. void (GL_APIENTRY * glViewportIndexedf) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
  680. void (GL_APIENTRY * glViewportIndexedfv) (GLuint index, const GLfloat * v);
  681. void (GL_APIENTRY * glScissorArrayv) (GLuint first, GLsizei count, const GLint * v);
  682. void (GL_APIENTRY * glScissorIndexed) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
  683. void (GL_APIENTRY * glScissorIndexedv) (GLuint index, const GLint * v);
  684. void (GL_APIENTRY * glDepthRangeArrayv) (GLuint first, GLsizei count, const GLdouble * v);
  685. void (GL_APIENTRY * glDepthRangeIndexed) (GLuint index, GLdouble n, GLdouble f);
  686. void (GL_APIENTRY * glDepthRangeIndexedf) (GLuint index, GLfloat n, GLfloat f);
  687. void (GL_APIENTRY * glGetFloati_v) (GLenum target, GLuint index, GLfloat *data);
  688. void (GL_APIENTRY * glGetDoublei_v) (GLenum target, GLuint index, GLdouble *data);
  689. //introduced by other OpenGL extensions such as EXT_draw_buffers2
  690. void (GL_APIENTRY * glGetIntegerIndexedvEXT) (GLenum target, GLuint index, int * v);
  691. void (GL_APIENTRY * glEnableIndexedEXT) (GLenum target, GLuint index);
  692. void (GL_APIENTRY * glDisableIndexedEXT) (GLenum target, GLuint index);
  693. GLboolean (GL_APIENTRY * glIsEnabledIndexedEXT) (GLenum target, GLuint index);
  694. void (GL_APIENTRY * glClientActiveTexture) (GLenum texture);
  695. void (GL_APIENTRY * glActiveTexture) (GLenum texture);
  696. void (GL_APIENTRY * glFogCoordPointer) (GLenum type, GLsizei stride, const GLvoid *pointer);
  697. void (GL_APIENTRY * glSecondaryColorPointer) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
  698. GLint glMaxTextureCoords;
  699. GLint glMaxTextureUnits;
  700. // debug extensions
  701. void (GL_APIENTRY * glObjectLabel) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label);
  702. /** convenience wrapper around glObjectLabel that calls glObjectLabel if it's supported and using std::string as a label parameter.*/
  703. void debugObjectLabel(GLenum identifier, GLuint name, const std::string& label) const { if (glObjectLabel && !label.empty()) glObjectLabel(identifier, name, label.size(), label.c_str()); }
  704. protected:
  705. virtual ~GLExtensions();
  706. };
  707. }
  708. #endif