Official feedback on OpenGL 4.1 thread

That is what I’m doing right now, but a debug context doesn’t have to have the GL_ARB_debug_output extension, it could have other debug functionality. A core GL inspection would be useful in that case.

Referance Pages for 4.1 does not work on IE (there is an error when selecting any function).

Looking into this issue. Seems there are other issues in Safari and Firefox also. We are working on this.

and Chrome :stuck_out_tongue:

This is great news.
Imo even better than the actual features introduced by new spec.

Great job.

Now to port spec’s to xml and we are pretty much set ;).

Is there any chance to restore creating man pages for Unix systems? I’ve been trying unsuccessfully to generate man pages from the the sources, the current state of the GL wiki: http://www.opengl.org/wiki/Getting_started/XML_Toolchain_and_Man_Pages gives how to generate the xml, mentions man pages, but, does not have an entry in the makefile. I follow the instructions to setup the catalog stuff, but running


docbook2x-man something.xml

or for bash lovers:


for i in *.xml; do docbook2x-man "$i"; done

generates bad man pages at times [glTexImage2D comes out really bad on me]. Is there a possibility to add to the makefile “make man”? Sometimes I just want to type man glSomething.

I really like that glGet family has hyperlinks to the function that sets the value, that is really nice, similar for glGetShader too.

One suggestion, though potentially a great deal of work: to add a reference (chapter(s), section(s) and subsection(s)) where a given API point is named, so that one can get the quickly where in the spec it is described.

Something I just noticed for the GL3 man pages:

glFramebufferTextureLayer — attach a face of a cube map texture as a logical buffer to the currently bound framebuffer

That is the description of glFramebufferTextureFace, I guess the text should be “glFramebufferTextureLayer — attach a face of a texture array as a logical buffer to the currently bound framebuffer” In all honesty, kind of nitpicking I am there.

@Khronos

GJ for the new specs / man pages and all.

I want to comment on the spec versioning. Hardware brands are named under the version of DirectX (either we like it or not). So we have PreDx10HW, DX10HW, DX10.1HW and DX11HW.
Some of the specs released on 4.1 (especially multiple viewports) exists on DX10.1HW and some specs on 3.3 (sampler objects, GLSL33 attrib location layout …) can be implemented on DX10HW.

When I want to release a product I try to handle the balance between graphics quality and spectrum of hardware supported. If OpenGL continue to release specs this way we are forced to think the worst and always try to check whether an extension is supported, implement both ways etc. It could be nice if we have some revision number on OpenGL versions so we may select a version with a revision. I guess minor version was there for this purpose but it is not being used this way.

@kRogue

Actually, I cannot find any FramebufferTextureFace in specs, instead the FramebufferTextureLayer does the job for cubemaps (in specs, Table 4.12). Additionally, FramebufferTextureLayer can also attach level of a 2d-array or a 3d texture level.

For OpenGL 3 capable hardware, these new extensions are provided:

ARB_viewport_array (also in core OpenGL 4.1)

viewport array is DX10HW.


bash$ grep FramebufferTextureFace /usr/include/GL3/gl3.h 
GLAPI void APIENTRY glFramebufferTextureFace (GLenum, GLenum, GLuint, GLint, GLenum);

I could not find FramebufferTextureFace is not in the specification either. For FramebufferTextureLayer, to use a face of a cube map you provide an integer 0<=i<=5, for the Face, it looks like you use one of the enums from the family GL_TEXTURE_CUBE_MAP_POSITIVE/NEAGTIVE_X/Y/Z

Oh well, spec bug or manpage bug?

some specs on 3.3 (sampler objects, GLSL33 attrib location layout …) can be implemented on DX10HW.

All of GL 3.x should be implementable on DX10 hardware. That’s the dividing line between GL 3.x and 4.x.

If OpenGL continue to release specs this way we are forced to think the worst and always try to check whether an extension is supported, implement both ways etc. It could be nice if we have some revision number on OpenGL versions so we may select a version with a revision.

Does it really matter? If the implementation didn’t support a hypothetical GL 3.4, wouldn’t you need to support a different codepath anyway? What’s the difference between checking a version number and an extension?

Ultimately, all GL 3.3-capable hardware will support the various extensions they can. The only reason to create a version 3.4 would be to push a lazy implementer (I’m looking at you, ATI) to support something they should have been supporting.

I was not aware that all features of DX10.1 is implementable on DX10HW (such as viewport arrays or blend state for each color attachment).

Versioning instead of extensions is favorable since we will have numVersion paths instead of numExtension^2 paths. That is we target a brand of hardware instead of vendor specific implementations. This was Microsoft’s marketing for Dx10 (No Hardware Caps)

I was not aware that all features of DX10.1 is implementable on DX10HW (such as viewport arrays or blend state for each color attachment).

Which is why DX10.1-specific features are provided via extensions to 3.x. NVIDIA DX10 hardware can’t handle 10.1, so in OpenGL those are extensions.

Versioning instead of extensions is favorable since we will have numVersion paths instead of numExtension^2 paths.

That assumes a combinatorial explosion of paths based on the number of extensions, which is not necessarily the case. Extensions that directly affect shaders may indeed have this problem.

Because an extension generally affects a small, localized section of code, the path for one extension generally does not intersect with the path for another extension. Take viewport arrays and separate shader objects. In general, these things don’t directly interact. Your code for dealing with rendering to multiple attachments doesn’t generally care about the shader objects.

The presence or absence of viewport arrays will allow you to render things in a certain way. But this will not affect the paths you have written for separate shader objects. The only difference between this and a hypothetical GL 3.4 is that it is theoretically possible to have one and not the other. But you don’t code one specifically so that it requires the other, so the presence or absence of the other is irrelevant.

So while you do indeed have 4 potential paths, you did not specifically code 4 paths for each eventuality. You coded 2 paths dealing with program objects, based on whether separation was possible. And you coded 2 paths dealing with viewports and rendering to attachments, based on whether that functionality is available.

Literally, the only difference is what your paths check for. In the extension case, you have two separate if-statements, one for each extension. In the hypothetical 3.4 case, you still have two separate if-statements (or some other form of dynamic decision making, like virtual function calls), because the code for the paths is in two separate locations. It’s just that in both cases, you’re checking the version number.

This was Microsoft’s marketing for Dx10 (No Hardware Caps)

Yeah, and we saw how well that worked out, what with DX10.1 and all. DX10.1 may as well be called, “Features we wanted in DX10, but NVIDIA wasn’t supporting.”

could someone please update the glext.h and gl3.h headers? or is there something more planned for the update (saw some mention of a glplatform.h)…

Would appreciate it if the web site guys could update the site menu so you can get to the 4.1/3.3 man pages.

From http://www.opengl.org, click Coding Resources -> OpenGL SDK. From here, select Documentation -> Reference Pages.

You always get OpenGL 2.1 ref pages now. Thanks to this post, I know the trick to “hack the URL”, but it would be helpful (especially those not in-the-know) if there were an option for the newer versions.

Thanks.

Would appreciate it if the web site guys could update the site menu so you can get to the 4.1/3.3 man pages.

You can, but only from the main site menu. Under Documentation, you can see the three sets of documentation. For some reason, this doesn’t extend to the forum Documentation menu.

Actually, neither was the case until just a few hours ago. Khronos_webmaster fixed the former, but yes I noticed the latter as well – seems the Forums have their own menu that doesn’t have the GL3/4 man page links.

I’ve been browsing the GL4 man pages, some appear to be missing, for example glUseShaderPrograms.

Maybe we should create a new thread “GL man page feedback”?

The menus in the forums are now working as expected. Thanks for pointing that out also. For feedback on the spec, please follow the instructions on the homepage of each spec. We have either a feedback form, or preferably, bugzilla. Trying to track feedback in the forums is a bit difficult to do properly.

Many thanks for understanding.

I am sorry, but i have to ask again: What about the headers?

-chris

I agree Chris, working out the header ourselves is really not a great thing to do. :stuck_out_tongue:

If it helps, my header:

// Declare OpenGL 4.1 enums
#define GL_VERTEX_SHADER_BIT                      0x00000001
#define GL_FRAGMENT_SHADER_BIT                    0x00000002
#define GL_GEOMETRY_SHADER_BIT                    0x00000004
#define GL_TESS_CONTROL_SHADER_BIT                0x00000008
#define GL_TESS_EVALUATION_SHADER_BIT             0x00000010
#define GL_ALL_SHADER_BITS                        0xFFFFFFFF
#define GL_PROGRAM_SEPARABLE                      0x8258
#define GL_ACTIVE_PROGRAM                         0x8259
#define GL_PROGRAM_PIPELINE_BINDING               0x825A

// Declare OpenGL 4.1 functions
typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);

typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);

typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAM) (GLuint pipeline, GLuint program);
typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMV) (GLenum type, GLsizei count, const GLchar **strings);
typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINE) (GLuint pipeline);
typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINES) (GLsizei n, const GLuint *pipelines);
typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINES) (GLsizei n, GLuint *pipelines);
typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINE) (GLuint pipeline);
typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERI) (GLuint program, GLenum pname, GLint value);
typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIV) (GLuint pipeline, GLenum pname, GLint *params);
typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINE) (GLuint pipeline);
typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOG) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);

typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYV) (GLuint first, GLsizei count, const GLfloat * v);
typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDF) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFV) (GLuint index, const GLfloat * v);
typedef void (GLAPIENTRY * PFNGLSCISSORARRAYV) (GLuint first, GLsizei count, const GLint * v);
typedef void (GLAPIENTRY * PFNGLSCISSORINDEXED) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDV) (GLuint index, const GLint * v);
typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYV) (GLuint first, GLsizei count, const GLclampd * v);
typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXED) (GLuint index, GLclampd n, GLclampd f);
typedef void (GLAPIENTRY * PFNGLGETFLOATI_V) (GLenum target, GLuint index, GLfloat *data);
typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_V) (GLenum target, GLuint index, GLdouble *data);

PFNGLVERTEXATTRIBLPOINTERPROC glVertexAttribLPointer = 0;

PFNGLPROGRAMUNIFORM1FPROC glProgramUniform1f = 0;
PFNGLPROGRAMUNIFORM1FVPROC glProgramUniform1fv = 0;
PFNGLPROGRAMUNIFORM2FPROC glProgramUniform2f = 0;
PFNGLPROGRAMUNIFORM2FVPROC glProgramUniform2fv = 0;
PFNGLPROGRAMUNIFORM3FPROC glProgramUniform3f = 0;
PFNGLPROGRAMUNIFORM3FVPROC glProgramUniform3fv = 0;
PFNGLPROGRAMUNIFORM4FPROC glProgramUniform4f = 0;
PFNGLPROGRAMUNIFORM4FVPROC glProgramUniform4fv = 0;

PFNGLPROGRAMUNIFORM1DPROC glProgramUniform1d = 0;
PFNGLPROGRAMUNIFORM1DVPROC glProgramUniform1dv = 0;
PFNGLPROGRAMUNIFORM2DPROC glProgramUniform2d = 0;
PFNGLPROGRAMUNIFORM2DVPROC glProgramUniform2dv = 0;
PFNGLPROGRAMUNIFORM3DPROC glProgramUniform3d = 0;
PFNGLPROGRAMUNIFORM3DVPROC glProgramUniform3dv = 0;
PFNGLPROGRAMUNIFORM4DPROC glProgramUniform4d = 0;
PFNGLPROGRAMUNIFORM4DVPROC glProgramUniform4dv = 0;

PFNGLPROGRAMUNIFORM1IPROC glProgramUniform1i = 0;
PFNGLPROGRAMUNIFORM1IVPROC glProgramUniform1iv = 0;
PFNGLPROGRAMUNIFORM2IPROC glProgramUniform2i = 0;
PFNGLPROGRAMUNIFORM2IVPROC glProgramUniform2iv = 0;
PFNGLPROGRAMUNIFORM3IPROC glProgramUniform3i = 0;
PFNGLPROGRAMUNIFORM3IVPROC glProgramUniform3iv = 0;
PFNGLPROGRAMUNIFORM4IPROC glProgramUniform4i = 0;
PFNGLPROGRAMUNIFORM4IVPROC glProgramUniform4iv = 0;

PFNGLPROGRAMUNIFORM1UIPROC glProgramUniform1ui = 0;
PFNGLPROGRAMUNIFORM1UIVPROC glProgramUniform1uiv = 0;
PFNGLPROGRAMUNIFORM2UIPROC glProgramUniform2ui = 0;
PFNGLPROGRAMUNIFORM2UIVPROC glProgramUniform2uiv = 0;
PFNGLPROGRAMUNIFORM3UIPROC glProgramUniform3ui = 0;
PFNGLPROGRAMUNIFORM3UIVPROC glProgramUniform3uiv = 0;
PFNGLPROGRAMUNIFORM4UIPROC glProgramUniform4ui = 0;
PFNGLPROGRAMUNIFORM4UIVPROC glProgramUniform4uiv = 0;

PFNGLPROGRAMUNIFORMMATRIX2FVPROC glProgramUniformMatrix2fv = 0;
PFNGLPROGRAMUNIFORMMATRIX3FVPROC glProgramUniformMatrix3fv = 0;
PFNGLPROGRAMUNIFORMMATRIX4FVPROC glProgramUniformMatrix4fv = 0;
PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glProgramUniformMatrix2x3fv = 0;
PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glProgramUniformMatrix2x4fv = 0;
PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glProgramUniformMatrix3x2fv = 0;
PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glProgramUniformMatrix3x4fv = 0;
PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glProgramUniformMatrix4x2fv = 0;
PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glProgramUniformMatrix4x3fv = 0;

PFNGLPROGRAMUNIFORMMATRIX2DVPROC glProgramUniformMatrix2dv = 0;
PFNGLPROGRAMUNIFORMMATRIX3DVPROC glProgramUniformMatrix3dv = 0;
PFNGLPROGRAMUNIFORMMATRIX4DVPROC glProgramUniformMatrix4dv = 0;
PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glProgramUniformMatrix2x3dv = 0;
PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glProgramUniformMatrix2x4dv = 0;
PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glProgramUniformMatrix3x2dv = 0;
PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glProgramUniformMatrix3x4dv = 0;
PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glProgramUniformMatrix4x2dv = 0;
PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glProgramUniformMatrix4x3dv = 0;

PFNGLUSEPROGRAMSTAGESPROC glUseProgramStages = 0;
PFNGLACTIVESHADERPROGRAM glActiveShaderProgram = 0;
PFNGLCREATESHADERPROGRAMV glCreateShaderProgramv = 0;
PFNGLBINDPROGRAMPIPELINE glBindProgramPipeline = 0;
PFNGLDELETEPROGRAMPIPELINES glDeleteProgramPipelines = 0;
PFNGLGENPROGRAMPIPELINES glGenProgramPipelines = 0;
PFNGLISPROGRAMPIPELINE glIsProgramPipeline = 0;
PFNGLPROGRAMPARAMETERI glProgramParameteri = 0;
PFNGLGETPROGRAMPIPELINEIV glGetProgramPipelineiv = 0;
PFNGLVALIDATEPROGRAMPIPELINE glValidateProgramPipeline = 0;
PFNGLGETPROGRAMPIPELINEINFOLOG glGetProgramPipelineInfoLog = 0;

PFNGLVIEWPORTARRAYV glViewportArrayv = 0;
PFNGLVIEWPORTINDEXEDF glViewportIndexedf = 0;
PFNGLVIEWPORTINDEXEDFV glViewportIndexedfv = 0;
PFNGLSCISSORARRAYV glScissorArrayv = 0;
PFNGLSCISSORINDEXED glScissorIndexed = 0;
PFNGLSCISSORINDEXEDV glScissorIndexedv = 0;
PFNGLDEPTHRANGEARRAYV glDepthRangeArrayv = 0;
PFNGLDEPTHRANGEINDEXED glDepthRangeIndexed = 0;
PFNGLGETFLOATI_V glGetFloati_v = 0;
PFNGLGETDOUBLEI_V glGetDoublei_v = 0;