[iortcw] 90/152: All: Rend2: Use loader for all extension funcs

Simon McVittie smcv at debian.org
Fri Sep 8 10:40:16 UTC 2017


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to annotated tag 1.5a
in repository iortcw.

commit b676ddce177f086aef111fffac60d23d781a1270
Author: MAN-AT-ARMS <M4N4T4RMS at gmail.com>
Date:   Fri Jul 29 19:42:23 2016 -0400

    All: Rend2: Use loader for all extension funcs
---
 MP/code/rend2/qgl.h           | 201 ++++++++--------------------
 MP/code/rend2/tr_backend.c    |  22 ++--
 MP/code/rend2/tr_bsp.c        |   2 +-
 MP/code/rend2/tr_dsa.c        |  46 +++----
 MP/code/rend2/tr_dsa.h        |  42 +++---
 MP/code/rend2/tr_extensions.c | 298 ++++++++++++------------------------------
 MP/code/rend2/tr_fbo.c        |  14 +-
 MP/code/rend2/tr_glsl.c       |  14 +-
 MP/code/rend2/tr_image.c      |  55 ++++----
 MP/code/rend2/tr_init.c       |   2 +-
 MP/code/rend2/tr_local.h      |   1 -
 MP/code/rend2/tr_shade.c      |   8 +-
 MP/code/rend2/tr_vbo.c        |  14 +-
 SP/code/rend2/qgl.h           | 200 ++++++++--------------------
 SP/code/rend2/tr_backend.c    |  22 ++--
 SP/code/rend2/tr_bsp.c        |   2 +-
 SP/code/rend2/tr_dsa.c        |  46 +++----
 SP/code/rend2/tr_dsa.h        |  42 +++---
 SP/code/rend2/tr_extensions.c | 298 ++++++++++++------------------------------
 SP/code/rend2/tr_fbo.c        |  14 +-
 SP/code/rend2/tr_glsl.c       |  14 +-
 SP/code/rend2/tr_image.c      |  56 ++++----
 SP/code/rend2/tr_init.c       |   2 +-
 SP/code/rend2/tr_local.h      |   1 -
 SP/code/rend2/tr_shade.c      |   8 +-
 SP/code/rend2/tr_vbo.c        |  14 +-
 26 files changed, 501 insertions(+), 937 deletions(-)

diff --git a/MP/code/rend2/qgl.h b/MP/code/rend2/qgl.h
index 351e6ae..c97bbe4 100644
--- a/MP/code/rend2/qgl.h
+++ b/MP/code/rend2/qgl.h
@@ -516,14 +516,6 @@ extern void ( APIENTRY * qglPNTrianglesfATI )( GLenum pname, GLfloat param );
 	GLE(void, ValidateProgram, GLuint program) \
 	GLE(void, VertexAttribPointer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) \
 
-#define GLE(ret, name, ...) typedef ret APIENTRY name##proc(__VA_ARGS__); extern name##proc * qgl##name;
-QGL_1_2_PROCS
-QGL_1_3_PROCS
-QGL_1_4_PROCS
-QGL_1_5_PROCS
-QGL_2_0_PROCS
-#undef GLE
-
 // GL_NVX_gpu_memory_info
 #ifndef GL_NVX_gpu_memory_info
 #define GL_NVX_gpu_memory_info
@@ -572,28 +564,18 @@ QGL_2_0_PROCS
 #define GL_HALF_FLOAT_ARB                   0x140B
 #endif
 
-// GL_EXT_framebuffer_object
-extern GLboolean (APIENTRY * qglIsRenderbufferEXT)(GLuint renderbuffer);
-extern void (APIENTRY * qglBindRenderbufferEXT)(GLenum target, GLuint renderbuffer);
-extern void (APIENTRY * qglDeleteRenderbuffersEXT)(GLsizei n, const GLuint *renderbuffers);
-extern void (APIENTRY * qglGenRenderbuffersEXT)(GLsizei n, GLuint *renderbuffers);
-extern void (APIENTRY * qglRenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-extern void (APIENTRY * qglGetRenderbufferParameterivEXT)(GLenum target, GLenum pname, GLint *params);
-extern GLboolean (APIENTRY * qglIsFramebufferEXT)(GLuint framebuffer);
-extern void (APIENTRY * qglBindFramebufferEXT)(GLenum target, GLuint framebuffer);
-extern void (APIENTRY * qglDeleteFramebuffersEXT)(GLsizei n, const GLuint *framebuffers);
-extern void (APIENTRY * qglGenFramebuffersEXT)(GLsizei n, GLuint *framebuffers);
-extern GLenum (APIENTRY * qglCheckFramebufferStatusEXT)(GLenum target);
-extern void (APIENTRY * qglFramebufferTexture1DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
-	GLint level);
-extern void (APIENTRY * qglFramebufferTexture2DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
-	GLint level);
-extern void (APIENTRY * qglFramebufferTexture3DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
-	GLint level, GLint zoffset);
-extern void (APIENTRY * qglFramebufferRenderbufferEXT)(GLenum target, GLenum attachment, GLenum renderbuffertarget,
-	GLuint renderbuffer);
-extern void (APIENTRY * qglGetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint *params);
-extern void (APIENTRY * qglGenerateMipmapEXT)(GLenum target);
+#define QGL_EXT_framebuffer_object_PROCS \
+	GLE(void, BindRenderbufferEXT, GLenum target, GLuint renderbuffer) \
+	GLE(void, DeleteRenderbuffersEXT, GLsizei n, const GLuint *renderbuffers) \
+	GLE(void, GenRenderbuffersEXT, GLsizei n, GLuint *renderbuffers) \
+	GLE(void, RenderbufferStorageEXT, GLenum target, GLenum internalformat, GLsizei width, GLsizei height) \
+	GLE(void, BindFramebufferEXT, GLenum target, GLuint framebuffer) \
+	GLE(void, DeleteFramebuffersEXT, GLsizei n, const GLuint *framebuffers) \
+	GLE(void, GenFramebuffersEXT, GLsizei n, GLuint *framebuffers) \
+	GLE(GLenum, CheckFramebufferStatusEXT, GLenum target) \
+	GLE(void, FramebufferTexture2DEXT, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) \
+	GLE(void, FramebufferRenderbufferEXT, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) \
+	GLE(void, GenerateMipmapEXT, GLenum target) \
 
 #ifndef GL_EXT_framebuffer_object
 #define GL_EXT_framebuffer_object
@@ -650,19 +632,9 @@ extern void (APIENTRY * qglGenerateMipmapEXT)(GLenum target);
 #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT   0x0506
 #endif
 
-// GL_EXT_packed_depth_stencil
-#ifndef GL_EXT_packed_depth_stencil
-#define GL_EXT_packed_depth_stencil
-#define GL_DEPTH_STENCIL_EXT                              0x84F9
-#define GL_UNSIGNED_INT_24_8_EXT                          0x84FA
-#define GL_DEPTH24_STENCIL8_EXT                           0x88F0
-#define GL_TEXTURE_STENCIL_SIZE_EXT                       0x88F1
-#endif
-
 // GL_EXT_framebuffer_blit
-extern void (APIENTRY * qglBlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
-                            GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
-                            GLbitfield mask, GLenum filter);
+#define QGL_EXT_framebuffer_blit_PROCS \
+	GLE(void, BlitFramebufferEXT, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) \
 
 #ifndef GL_EXT_framebuffer_blit
 #define GL_EXT_framebuffer_blit
@@ -673,8 +645,8 @@ extern void (APIENTRY * qglBlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint s
 #endif
 
 // GL_EXT_framebuffer_multisample
-extern void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLsizei samples,
-	GLenum internalformat, GLsizei width, GLsizei height);
+#define QGL_EXT_framebuffer_multisample_PROCS \
+	GLE(void, RenderbufferStorageMultisampleEXT, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) \
 
 #ifndef GL_EXT_framebuffer_multisample
 #define GL_EXT_framebuffer_multisample
@@ -683,31 +655,6 @@ extern void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLs
 #define GL_MAX_SAMPLES_EXT                         0x8D57
 #endif
 
-#ifndef GL_EXT_texture_sRGB
-#define GL_EXT_texture_sRGB
-#define GL_SRGB_EXT                                       0x8C40
-#define GL_SRGB8_EXT                                      0x8C41
-#define GL_SRGB_ALPHA_EXT                                 0x8C42
-#define GL_SRGB8_ALPHA8_EXT                               0x8C43
-#define GL_SLUMINANCE_ALPHA_EXT                           0x8C44
-#define GL_SLUMINANCE8_ALPHA8_EXT                         0x8C45
-#define GL_SLUMINANCE_EXT                                 0x8C46
-#define GL_SLUMINANCE8_EXT                                0x8C47
-#define GL_COMPRESSED_SRGB_EXT                            0x8C48
-#define GL_COMPRESSED_SRGB_ALPHA_EXT                      0x8C49
-#define GL_COMPRESSED_SLUMINANCE_EXT                      0x8C4A
-#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT                0x8C4B
-#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT                  0x8C4C
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT            0x8C4D
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT            0x8C4E
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT            0x8C4F
-#endif
-
-#ifndef GL_EXT_framebuffer_sRGB
-#define GL_EXT_framebuffer_sRGB
-#define GL_FRAMEBUFFER_SRGB_EXT                         0x8DB9
-#endif
-
 #ifndef GL_ARB_texture_compression_rgtc
 #define GL_ARB_texture_compression_rgtc
 #define GL_COMPRESSED_RED_RGTC1                       0x8DBB
@@ -735,90 +682,52 @@ extern void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLs
 #endif
 
 // GL_ARB_vertex_array_object
-extern void (APIENTRY * qglBindVertexArrayARB)(GLuint array);
-extern void (APIENTRY * qglDeleteVertexArraysARB)(GLsizei n, const GLuint *arrays);
-extern void (APIENTRY * qglGenVertexArraysARB)(GLsizei n, GLuint *arrays);
-extern GLboolean (APIENTRY * qglIsVertexArrayARB)(GLuint array);
+#define QGL_ARB_vertex_array_object_PROCS \
+	GLE(void, BindVertexArray, GLuint array) \
+	GLE(void, DeleteVertexArrays, GLsizei n, const GLuint *arrays) \
+	GLE(void, GenVertexArrays, GLsizei n, GLuint *arrays) \
+
 #ifndef GL_ARB_vertex_array_object
 #define GL_ARB_vertex_array_object
 #define GL_VERTEX_ARRAY_BINDING_ARB                0x85B5
 #endif
 
 // GL_EXT_direct_state_access
-extern GLvoid(APIENTRY * qglBindMultiTexture)(GLenum texunit, GLenum target, GLuint texture);
-extern GLvoid(APIENTRY * qglTextureParameterf)(GLuint texture, GLenum target, GLenum pname, GLfloat param);
-extern GLvoid(APIENTRY * qglTextureParameteri)(GLuint texture, GLenum target, GLenum pname, GLint param);
-extern GLvoid(APIENTRY * qglTextureImage2D)(GLuint texture, GLenum target, GLint level, GLint internalformat,
-	GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-extern GLvoid(APIENTRY * qglTextureSubImage2D)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,
-	GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
-extern GLvoid(APIENTRY * qglCopyTextureImage2D)(GLuint texture, GLenum target, GLint level, GLenum internalformat,
-	GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-extern GLvoid(APIENTRY * qglCompressedTextureImage2D)(GLuint texture, GLenum target, GLint level, GLenum internalformat,
-	GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
-extern GLvoid(APIENTRY * qglCompressedTextureSubImage2D)(GLuint texture, GLenum target, GLint level,
-	GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format,
-	GLsizei imageSize, const GLvoid *data);
-extern GLvoid(APIENTRY * qglGenerateTextureMipmap)(GLuint texture, GLenum target);
-
-extern GLvoid(APIENTRY * qglProgramUniform1i)(GLuint program, GLint location, GLint v0);
-extern GLvoid(APIENTRY * qglProgramUniform1f)(GLuint program, GLint location, GLfloat v0);
-extern GLvoid(APIENTRY * qglProgramUniform2f)(GLuint program, GLint location,
-	GLfloat v0, GLfloat v1);
-extern GLvoid(APIENTRY * qglProgramUniform3f)(GLuint program, GLint location,
-	GLfloat v0, GLfloat v1, GLfloat v2);
-extern GLvoid(APIENTRY * qglProgramUniform4f)(GLuint program, GLint location,
-	GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-extern GLvoid(APIENTRY * qglProgramUniform1fv)(GLuint program, GLint location,
-	GLsizei count, const GLfloat *value);
-extern GLvoid(APIENTRY * qglProgramUniformMatrix4fv)(GLuint program, GLint location,
-	GLsizei count, GLboolean transpose,
-	const GLfloat *value);
-
-extern GLvoid(APIENTRY * qglNamedRenderbufferStorage)(GLuint renderbuffer,
-	GLenum internalformat, GLsizei width, GLsizei height);
-
-extern GLvoid(APIENTRY * qglNamedRenderbufferStorageMultisample)(GLuint renderbuffer,
-	GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-
-extern GLenum(APIENTRY * qglCheckNamedFramebufferStatus)(GLuint framebuffer, GLenum target);
-extern GLvoid(APIENTRY * qglNamedFramebufferTexture2D)(GLuint framebuffer,
-	GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-extern GLvoid(APIENTRY * qglNamedFramebufferRenderbuffer)(GLuint framebuffer,
-	GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-
-
-#if defined(WIN32)
-// WGL_ARB_create_context
-#ifndef WGL_ARB_create_context
-#define WGL_CONTEXT_MAJOR_VERSION_ARB             0x2091
-#define WGL_CONTEXT_MINOR_VERSION_ARB             0x2092
-#define WGL_CONTEXT_LAYER_PLANE_ARB               0x2093
-#define WGL_CONTEXT_FLAGS_ARB                     0x2094
-#define WGL_CONTEXT_PROFILE_MASK_ARB              0x9126
-#define WGL_CONTEXT_DEBUG_BIT_ARB                 0x0001
-#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB    0x0002
-#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB          0x00000001
-#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
-#define ERROR_INVALID_VERSION_ARB                 0x2095
-#define ERROR_INVALID_PROFILE_ARB                 0x2096
-#endif
+#define QGL_EXT_direct_state_access_PROCS \
+	GLE(GLvoid, BindMultiTextureEXT, GLenum texunit, GLenum target, GLuint texture) \
+	GLE(GLvoid, TextureParameterfEXT, GLuint texture, GLenum target, GLenum pname, GLfloat param) \
+	GLE(GLvoid, TextureParameteriEXT, GLuint texture, GLenum target, GLenum pname, GLint param) \
+	GLE(GLvoid, TextureImage2DEXT, GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) \
+	GLE(GLvoid, TextureSubImage2DEXT, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) \
+	GLE(GLvoid, CopyTextureImage2DEXT, GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) \
+	GLE(GLvoid, CompressedTextureImage2DEXT, GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) \
+	GLE(GLvoid, CompressedTextureSubImage2DEXT, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) \
+	GLE(GLvoid, GenerateTextureMipmapEXT, GLuint texture, GLenum target) \
+	GLE(GLvoid, ProgramUniform1iEXT, GLuint program, GLint location, GLint v0) \
+	GLE(GLvoid, ProgramUniform1fEXT, GLuint program, GLint location, GLfloat v0) \
+	GLE(GLvoid, ProgramUniform2fEXT, GLuint program, GLint location, GLfloat v0, GLfloat v1) \
+	GLE(GLvoid, ProgramUniform3fEXT, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) \
+	GLE(GLvoid, ProgramUniform4fEXT, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) \
+	GLE(GLvoid, ProgramUniform1fvEXT, GLuint program, GLint location, GLsizei count, const GLfloat *value) \
+	GLE(GLvoid, ProgramUniformMatrix4fvEXT, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) \
+	GLE(GLvoid, NamedRenderbufferStorageEXT, GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) \
+	GLE(GLvoid, NamedRenderbufferStorageMultisampleEXT, GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) \
+	GLE(GLenum, CheckNamedFramebufferStatusEXT, GLuint framebuffer, GLenum target) \
+	GLE(GLvoid, NamedFramebufferTexture2DEXT, GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) \
+	GLE(GLvoid, NamedFramebufferRenderbufferEXT, GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) \
 
-extern          HGLRC(APIENTRY * qwglCreateContextAttribsARB) (HDC hdC, HGLRC hShareContext, const int *attribList);
-#endif
-
-#if 0 //defined(__linux__)
-// GLX_ARB_create_context
-#ifndef GLX_ARB_create_context
-#define GLX_CONTEXT_DEBUG_BIT_ARB          0x00000001
-#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
-#define GLX_CONTEXT_MAJOR_VERSION_ARB      0x2091
-#define GLX_CONTEXT_MINOR_VERSION_ARB      0x2092
-#define GLX_CONTEXT_FLAGS_ARB              0x2094
-#endif
-
-extern GLXContext	(APIENTRY * qglXCreateContextAttribsARB) (Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);
-#endif
+#define GLE(ret, name, ...) typedef ret APIENTRY name##proc(__VA_ARGS__); extern name##proc * qgl##name;
+QGL_1_2_PROCS;
+QGL_1_3_PROCS;
+QGL_1_4_PROCS;
+QGL_1_5_PROCS;
+QGL_2_0_PROCS;
+QGL_EXT_framebuffer_object_PROCS;
+QGL_EXT_framebuffer_blit_PROCS;
+QGL_EXT_framebuffer_multisample_PROCS;
+QGL_ARB_vertex_array_object_PROCS;
+QGL_EXT_direct_state_access_PROCS;
+#undef GLE
 
 #endif // __QGL_H__
 
diff --git a/MP/code/rend2/tr_backend.c b/MP/code/rend2/tr_backend.c
index 2334f1f..dcd2a69 100644
--- a/MP/code/rend2/tr_backend.c
+++ b/MP/code/rend2/tr_backend.c
@@ -883,16 +883,16 @@ void RE_UploadCinematic( int w, int h, int cols, int rows, const byte *data, int
 	if ( cols != tr.scratchImage[client]->width || rows != tr.scratchImage[client]->height ) {
 		tr.scratchImage[client]->width = tr.scratchImage[client]->uploadWidth = cols;
 		tr.scratchImage[client]->height = tr.scratchImage[client]->uploadHeight = rows;
-		qglTextureImage2D(texture, GL_TEXTURE_2D, 0, GL_RGB8, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
-		qglTextureParameterf(texture, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-		qglTextureParameterf(texture, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-		qglTextureParameterf(texture, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-		qglTextureParameterf(texture, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+		qglTextureImage2DEXT(texture, GL_TEXTURE_2D, 0, GL_RGB8, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
+		qglTextureParameterfEXT(texture, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+		qglTextureParameterfEXT(texture, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+		qglTextureParameterfEXT(texture, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+		qglTextureParameterfEXT(texture, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 	} else {
 		if ( dirty ) {
 			// otherwise, just subimage upload it so that drivers can tell we are going to be changing
 			// it and don't try and do a texture compression
-			qglTextureSubImage2D(texture, GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, data);
+			qglTextureSubImage2DEXT(texture, GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, data);
 		}
 	}
 }
@@ -1241,7 +1241,7 @@ const void  *RB_DrawSurfs( const void *data ) {
 		else if (tr.renderFbo == NULL && tr.renderDepthImage)
 		{
 			// If we're rendering directly to the screen, copy the depth to a texture
-			qglCopyTextureImage2D(tr.renderDepthImage->texnum, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 0, 0, glConfig.vidWidth, glConfig.vidHeight, 0);
+			qglCopyTextureImage2DEXT(tr.renderDepthImage->texnum, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 0, 0, glConfig.vidWidth, glConfig.vidHeight, 0);
 		}
 
 		if (tr.hdrDepthFbo)
@@ -1452,7 +1452,7 @@ const void  *RB_DrawSurfs( const void *data ) {
 			RB_DrawSun(0.2, tr.sunShader);
 		}
 
-		if (r_drawSunRays->integer)
+		if (glRefConfig.framebufferObject && r_drawSunRays->integer)
 		{
 			FBO_t *oldFbo = glState.currentFBO;
 			FBO_Bind(tr.sunRaysFbo);
@@ -1489,7 +1489,7 @@ const void  *RB_DrawSurfs( const void *data ) {
 
 		FBO_Bind(NULL);
 		if (cubemap && cubemap->image)
-			qglGenerateTextureMipmap(cubemap->image->texnum, GL_TEXTURE_CUBE_MAP);
+			qglGenerateTextureMipmapEXT(cubemap->image->texnum, GL_TEXTURE_CUBE_MAP);
 	}
 
 	return (const void *)( cmd + 1 );
@@ -1747,14 +1747,14 @@ const void *RB_CapShadowMap(const void *data)
 		{
 			if (tr.shadowCubemaps[cmd->map])
 			{
-				qglCopyTextureImage2D(tr.shadowCubemaps[cmd->map]->texnum, GL_TEXTURE_CUBE_MAP_POSITIVE_X + cmd->cubeSide, 0, GL_RGBA8, backEnd.refdef.x, glConfig.vidHeight - ( backEnd.refdef.y + PSHADOW_MAP_SIZE ), PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, 0);
+				qglCopyTextureImage2DEXT(tr.shadowCubemaps[cmd->map]->texnum, GL_TEXTURE_CUBE_MAP_POSITIVE_X + cmd->cubeSide, 0, GL_RGBA8, backEnd.refdef.x, glConfig.vidHeight - ( backEnd.refdef.y + PSHADOW_MAP_SIZE ), PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, 0);
 			}
 		}
 		else
 		{
 			if (tr.pshadowMaps[cmd->map])
 			{
-				qglCopyTextureImage2D(tr.pshadowMaps[cmd->map]->texnum, GL_TEXTURE_2D, 0, GL_RGBA8, backEnd.refdef.x, glConfig.vidHeight - (backEnd.refdef.y + PSHADOW_MAP_SIZE), PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, 0);
+				qglCopyTextureImage2DEXT(tr.pshadowMaps[cmd->map]->texnum, GL_TEXTURE_2D, 0, GL_RGBA8, backEnd.refdef.x, glConfig.vidHeight - (backEnd.refdef.y + PSHADOW_MAP_SIZE), PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, 0);
 			}
 		}
 	}
diff --git a/MP/code/rend2/tr_bsp.c b/MP/code/rend2/tr_bsp.c
index 155ebc9..eef7f0f 100644
--- a/MP/code/rend2/tr_bsp.c
+++ b/MP/code/rend2/tr_bsp.c
@@ -3913,7 +3913,7 @@ void RE_LoadWorldMap( const char *name ) {
 	R_BindNullVao();
 
 	// Render or load all cubemaps
-	if (r_cubeMapping->integer && tr.numCubemaps)
+	if (r_cubeMapping->integer && tr.numCubemaps && glRefConfig.framebufferObject)
 	{
 		R_LoadCubemaps();
 		R_RenderMissingCubemaps();
diff --git a/MP/code/rend2/tr_dsa.c b/MP/code/rend2/tr_dsa.c
index 4ea7699..f738a5d 100644
--- a/MP/code/rend2/tr_dsa.c
+++ b/MP/code/rend2/tr_dsa.c
@@ -43,7 +43,7 @@ void GL_BindNullTextures()
 	{
 		for (i = 0; i < NUM_TEXTURE_BUNDLES; i++)
 		{
-			qglBindMultiTexture(GL_TEXTURE0_ARB + i, GL_TEXTURE_2D, 0);
+			qglBindMultiTextureEXT(GL_TEXTURE0_ARB + i, GL_TEXTURE_2D, 0);
 			glDsaState.textures[i] = 0;
 		}
 	}
@@ -71,12 +71,12 @@ int GL_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture)
 	if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z)
 		target = GL_TEXTURE_CUBE_MAP;
 
-	qglBindMultiTexture(texunit, target, texture);
+	qglBindMultiTextureEXT(texunit, target, texture);
 	glDsaState.textures[tmu] = texture;
 	return 1;
 }
 
-GLvoid APIENTRY GLDSA_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture)
+GLvoid APIENTRY GLDSA_BindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture)
 {
 	if (glDsaState.texunit != texunit)
 	{
@@ -87,47 +87,47 @@ GLvoid APIENTRY GLDSA_BindMultiTexture(GLenum texunit, GLenum target, GLuint tex
 	qglBindTexture(target, texture);
 }
 
-GLvoid APIENTRY GLDSA_TextureParameterf(GLuint texture, GLenum target, GLenum pname, GLfloat param)
+GLvoid APIENTRY GLDSA_TextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglTexParameterf(target, pname, param);
 }
 
-GLvoid APIENTRY GLDSA_TextureParameteri(GLuint texture, GLenum target, GLenum pname, GLint param)
+GLvoid APIENTRY GLDSA_TextureParameteriEXT(GLuint texture, GLenum target, GLenum pname, GLint param)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglTexParameteri(target, pname, param);
 }
 
-GLvoid APIENTRY GLDSA_TextureImage2D(GLuint texture, GLenum target, GLint level, GLint internalformat,
+GLvoid APIENTRY GLDSA_TextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat,
 	GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
 }
 
-GLvoid APIENTRY GLDSA_TextureSubImage2D(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,
+GLvoid APIENTRY GLDSA_TextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,
 	GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
 }
 
-GLvoid APIENTRY GLDSA_CopyTextureImage2D(GLuint texture, GLenum target, GLint level, GLenum internalformat,
+GLvoid APIENTRY GLDSA_CopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat,
 	GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
 }
 
-GLvoid APIENTRY  GLDSA_CompressedTextureImage2D(GLuint texture, GLenum target, GLint level, GLenum internalformat,
+GLvoid APIENTRY  GLDSA_CompressedTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat,
 	GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
 }
 
-GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLint level,
+GLvoid APIENTRY GLDSA_CompressedTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level,
 	GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format,
 	GLsizei imageSize, const GLvoid *data)
 {
@@ -135,7 +135,7 @@ GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target,
 	qglCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
 }
 
-GLvoid APIENTRY GLDSA_GenerateTextureMipmap(GLuint texture, GLenum target)
+GLvoid APIENTRY GLDSA_GenerateTextureMipmapEXT(GLuint texture, GLenum target)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglGenerateMipmapEXT(target);
@@ -157,47 +157,47 @@ int GL_UseProgram(GLuint program)
 	return 1;
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniform1i(GLuint program, GLint location, GLint v0)
+GLvoid APIENTRY GLDSA_ProgramUniform1iEXT(GLuint program, GLint location, GLint v0)
 {
 	GL_UseProgram(program);
 	qglUniform1i(location, v0);
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+GLvoid APIENTRY GLDSA_ProgramUniform1fEXT(GLuint program, GLint location, GLfloat v0)
 {
 	GL_UseProgram(program);
 	qglUniform1f(location, v0);
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniform2f(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform2fEXT(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1)
 {
 	GL_UseProgram(program);
 	qglUniform2f(location, v0, v1);
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniform3f(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform3fEXT(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1, GLfloat v2)
 {
 	GL_UseProgram(program);
 	qglUniform3f(location, v0, v1, v2);
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniform4f(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform4fEXT(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
 {
 	GL_UseProgram(program);
 	qglUniform4f(location, v0, v1, v2, v3);
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniform1fv(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform1fvEXT(GLuint program, GLint location,
 	GLsizei count, const GLfloat *value)
 {
 	GL_UseProgram(program);
 	qglUniform1fv(location, count, value);
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniformMatrix4fv(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniformMatrix4fvEXT(GLuint program, GLint location,
 	GLsizei count, GLboolean transpose,
 	const GLfloat *value)
 {
@@ -252,34 +252,34 @@ void GL_BindRenderbuffer(GLuint renderbuffer)
 	}
 }
 
-GLvoid APIENTRY GLDSA_NamedRenderbufferStorage(GLuint renderbuffer,
+GLvoid APIENTRY GLDSA_NamedRenderbufferStorageEXT(GLuint renderbuffer,
 	GLenum internalformat, GLsizei width, GLsizei height)
 {
 	GL_BindRenderbuffer(renderbuffer);
 	qglRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, internalformat, width, height);
 }
 
-GLvoid APIENTRY GLDSA_NamedRenderbufferStorageMultisample(GLuint renderbuffer,
+GLvoid APIENTRY GLDSA_NamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer,
 	GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
 {
 	GL_BindRenderbuffer(renderbuffer);
 	qglRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, internalformat, width, height);
 }
 
-GLenum APIENTRY GLDSA_CheckNamedFramebufferStatus(GLuint framebuffer, GLenum target)
+GLenum APIENTRY GLDSA_CheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target)
 {
 	GL_BindFramebuffer(target, framebuffer);
 	return qglCheckFramebufferStatusEXT(target);
 }
 
-GLvoid APIENTRY GLDSA_NamedFramebufferTexture2D(GLuint framebuffer,
+GLvoid APIENTRY GLDSA_NamedFramebufferTexture2DEXT(GLuint framebuffer,
 	GLenum attachment, GLenum textarget, GLuint texture, GLint level)
 {
 	GL_BindFramebuffer(GL_FRAMEBUFFER_EXT, framebuffer);
 	qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attachment, textarget, texture, level);
 }
 
-GLvoid APIENTRY GLDSA_NamedFramebufferRenderbuffer(GLuint framebuffer,
+GLvoid APIENTRY GLDSA_NamedFramebufferRenderbufferEXT(GLuint framebuffer,
 	GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
 {
 	GL_BindFramebuffer(GL_FRAMEBUFFER_EXT, framebuffer);
diff --git a/MP/code/rend2/tr_dsa.h b/MP/code/rend2/tr_dsa.h
index f57944d..ea9e0ad 100644
--- a/MP/code/rend2/tr_dsa.h
+++ b/MP/code/rend2/tr_dsa.h
@@ -26,37 +26,37 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 void GL_BindNullTextures(void);
 int GL_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture);
 
-GLvoid APIENTRY GLDSA_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture);
-GLvoid APIENTRY GLDSA_TextureParameterf(GLuint texture, GLenum target, GLenum pname, GLfloat param);
-GLvoid APIENTRY GLDSA_TextureParameteri(GLuint texture, GLenum target, GLenum pname, GLint param);
-GLvoid APIENTRY GLDSA_TextureImage2D(GLuint texture, GLenum target, GLint level, GLint internalformat,
+GLvoid APIENTRY GLDSA_BindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture);
+GLvoid APIENTRY GLDSA_TextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param);
+GLvoid APIENTRY GLDSA_TextureParameteriEXT(GLuint texture, GLenum target, GLenum pname, GLint param);
+GLvoid APIENTRY GLDSA_TextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat,
 	GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-GLvoid APIENTRY GLDSA_TextureSubImage2D(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,
+GLvoid APIENTRY GLDSA_TextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,
 	GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
-GLvoid APIENTRY GLDSA_CopyTextureImage2D(GLuint texture, GLenum target, GLint level, GLenum internalformat,
+GLvoid APIENTRY GLDSA_CopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat,
 	GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-GLvoid APIENTRY GLDSA_CompressedTextureImage2D(GLuint texture, GLenum target, GLint level, GLenum internalformat,
+GLvoid APIENTRY GLDSA_CompressedTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat,
 	GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
-GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLint level,
+GLvoid APIENTRY GLDSA_CompressedTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level,
 	GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format,
 	GLsizei imageSize, const GLvoid *data);
 
-GLvoid APIENTRY GLDSA_GenerateTextureMipmap(GLuint texture, GLenum target);
+GLvoid APIENTRY GLDSA_GenerateTextureMipmapEXT(GLuint texture, GLenum target);
 
 void GL_BindNullProgram(void);
 int GL_UseProgram(GLuint program);
 
-GLvoid APIENTRY GLDSA_ProgramUniform1i(GLuint program, GLint location, GLint v0);
-GLvoid APIENTRY GLDSA_ProgramUniform1f(GLuint program, GLint location, GLfloat v0);
-GLvoid APIENTRY GLDSA_ProgramUniform2f(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform1iEXT(GLuint program, GLint location, GLint v0);
+GLvoid APIENTRY GLDSA_ProgramUniform1fEXT(GLuint program, GLint location, GLfloat v0);
+GLvoid APIENTRY GLDSA_ProgramUniform2fEXT(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1);
-GLvoid APIENTRY GLDSA_ProgramUniform3f(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform3fEXT(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1, GLfloat v2);
-GLvoid APIENTRY GLDSA_ProgramUniform4f(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform4fEXT(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-GLvoid APIENTRY GLDSA_ProgramUniform1fv(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform1fvEXT(GLuint program, GLint location,
 	GLsizei count, const GLfloat *value);
-GLvoid APIENTRY GLDSA_ProgramUniformMatrix4fv(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniformMatrix4fvEXT(GLuint program, GLint location,
 	GLsizei count, GLboolean transpose,
 	const GLfloat *value);
 
@@ -64,16 +64,16 @@ void GL_BindNullFramebuffers(void);
 void GL_BindFramebuffer(GLenum target, GLuint framebuffer);
 void GL_BindRenderbuffer(GLuint renderbuffer);
 
-GLvoid APIENTRY GLDSA_NamedRenderbufferStorage(GLuint renderbuffer,
+GLvoid APIENTRY GLDSA_NamedRenderbufferStorageEXT(GLuint renderbuffer,
 	GLenum internalformat, GLsizei width, GLsizei height);
 
-GLvoid APIENTRY GLDSA_NamedRenderbufferStorageMultisample(GLuint renderbuffer,
+GLvoid APIENTRY GLDSA_NamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer,
 	GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
 
-GLenum APIENTRY GLDSA_CheckNamedFramebufferStatus(GLuint framebuffer, GLenum target);
-GLvoid APIENTRY GLDSA_NamedFramebufferTexture2D(GLuint framebuffer,
+GLenum APIENTRY GLDSA_CheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target);
+GLvoid APIENTRY GLDSA_NamedFramebufferTexture2DEXT(GLuint framebuffer,
 	GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-GLvoid APIENTRY GLDSA_NamedFramebufferRenderbuffer(GLuint framebuffer,
+GLvoid APIENTRY GLDSA_NamedFramebufferRenderbufferEXT(GLuint framebuffer,
 	GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
 
 
diff --git a/MP/code/rend2/tr_extensions.c b/MP/code/rend2/tr_extensions.c
index 3aa6ecc..602310b 100644
--- a/MP/code/rend2/tr_extensions.c
+++ b/MP/code/rend2/tr_extensions.c
@@ -36,98 +36,13 @@ QGL_1_3_PROCS;
 QGL_1_4_PROCS;
 QGL_1_5_PROCS;
 QGL_2_0_PROCS;
+QGL_EXT_framebuffer_object_PROCS;
+QGL_EXT_framebuffer_blit_PROCS;
+QGL_EXT_framebuffer_multisample_PROCS;
+QGL_ARB_vertex_array_object_PROCS;
+QGL_EXT_direct_state_access_PROCS;
 #undef GLE
 
-// GL_EXT_framebuffer_object
-GLboolean (APIENTRY * qglIsRenderbufferEXT)(GLuint renderbuffer);
-void (APIENTRY * qglBindRenderbufferEXT)(GLenum target, GLuint renderbuffer);
-void (APIENTRY * qglDeleteRenderbuffersEXT)(GLsizei n, const GLuint *renderbuffers);
-void (APIENTRY * qglGenRenderbuffersEXT)(GLsizei n, GLuint *renderbuffers);
-
-void (APIENTRY * qglRenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-
-void (APIENTRY * qglGetRenderbufferParameterivEXT)(GLenum target, GLenum pname, GLint *params);
-
-GLboolean (APIENTRY * qglIsFramebufferEXT)(GLuint framebuffer);
-void (APIENTRY * qglBindFramebufferEXT)(GLenum target, GLuint framebuffer);
-void (APIENTRY * qglDeleteFramebuffersEXT)(GLsizei n, const GLuint *framebuffers);
-void (APIENTRY * qglGenFramebuffersEXT)(GLsizei n, GLuint *framebuffers);
-
-GLenum (APIENTRY * qglCheckFramebufferStatusEXT)(GLenum target);
-
-void (APIENTRY * qglFramebufferTexture1DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
-	GLint level);
-void (APIENTRY * qglFramebufferTexture2DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
-	GLint level);
-void (APIENTRY * qglFramebufferTexture3DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
-	GLint level, GLint zoffset);
-
-void (APIENTRY * qglFramebufferRenderbufferEXT)(GLenum target, GLenum attachment, GLenum renderbuffertarget,
-	GLuint renderbuffer);
-
-void (APIENTRY * qglGetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint *params);
-
-void (APIENTRY * qglGenerateMipmapEXT)(GLenum target);
-
-// GL_EXT_framebuffer_blit
-void (APIENTRY * qglBlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
-                            GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
-                            GLbitfield mask, GLenum filter);
-
-// GL_EXT_framebuffer_multisample
-void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLsizei samples,
-	GLenum internalformat, GLsizei width, GLsizei height);
-
-// GL_ARB_vertex_array_object
-void (APIENTRY * qglBindVertexArrayARB)(GLuint array);
-void (APIENTRY * qglDeleteVertexArraysARB)(GLsizei n, const GLuint *arrays);
-void (APIENTRY * qglGenVertexArraysARB)(GLsizei n, GLuint *arrays);
-GLboolean (APIENTRY * qglIsVertexArrayARB)(GLuint array);
-
-// GL_EXT_direct_state_access
-GLvoid (APIENTRY * qglBindMultiTexture)(GLenum texunit, GLenum target, GLuint texture);
-GLvoid (APIENTRY * qglTextureParameterf)(GLuint texture, GLenum target, GLenum pname, GLfloat param);
-GLvoid (APIENTRY * qglTextureParameteri)(GLuint texture, GLenum target, GLenum pname, GLint param);
-GLvoid (APIENTRY * qglTextureImage2D)(GLuint texture, GLenum target, GLint level, GLint internalformat,
-	GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-GLvoid (APIENTRY * qglTextureSubImage2D)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,
-	GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
-GLvoid (APIENTRY * qglCopyTextureImage2D)(GLuint texture, GLenum target, GLint level, GLenum internalformat,
-	GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-GLvoid (APIENTRY * qglCompressedTextureImage2D)(GLuint texture, GLenum target, GLint level, GLenum internalformat,
-	GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
-GLvoid (APIENTRY * qglCompressedTextureSubImage2D)(GLuint texture, GLenum target, GLint level,
-	GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format,
-	GLsizei imageSize, const GLvoid *data);
-GLvoid (APIENTRY * qglGenerateTextureMipmap)(GLuint texture, GLenum target);
-
-GLvoid(APIENTRY * qglProgramUniform1i)(GLuint program, GLint location, GLint v0);
-GLvoid(APIENTRY * qglProgramUniform1f)(GLuint program, GLint location, GLfloat v0);
-GLvoid(APIENTRY * qglProgramUniform2f)(GLuint program, GLint location,
-	GLfloat v0, GLfloat v1);
-GLvoid(APIENTRY * qglProgramUniform3f)(GLuint program, GLint location,
-	GLfloat v0, GLfloat v1, GLfloat v2);
-GLvoid(APIENTRY * qglProgramUniform4f)(GLuint program, GLint location,
-	GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-GLvoid(APIENTRY * qglProgramUniform1fv)(GLuint program, GLint location,
-	GLsizei count, const GLfloat *value);
-GLvoid(APIENTRY * qglProgramUniformMatrix4fv)(GLuint program, GLint location,
-	GLsizei count, GLboolean transpose,
-	const GLfloat *value);
-
-GLvoid(APIENTRY * qglNamedRenderbufferStorage)(GLuint renderbuffer,
-	GLenum internalformat, GLsizei width, GLsizei height);
-
-GLvoid(APIENTRY * qglNamedRenderbufferStorageMultisample)(GLuint renderbuffer,
-	GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-
-GLenum(APIENTRY * qglCheckNamedFramebufferStatus)(GLuint framebuffer, GLenum target);
-GLvoid(APIENTRY * qglNamedFramebufferTexture2D)(GLuint framebuffer,
-	GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-GLvoid(APIENTRY * qglNamedFramebufferRenderbuffer)(GLuint framebuffer,
-	GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-
-
 static qboolean GLimp_HaveExtension(const char *ext)
 {
 	const char *ptr = Q_stristr( (char *)qglGetString(GL_EXTENSIONS), ext );
@@ -142,18 +57,23 @@ void GLimp_InitExtraExtensions()
 	char *extension;
 	const char* result[3] = { "...ignoring %s\n", "...using %s\n", "...%s not found\n" };
 
+	// Check OpenGL version
 	sscanf(glConfig.version_string, "%d.%d", &glRefConfig.openglMajorVersion, &glRefConfig.openglMinorVersion);
 	if (glRefConfig.openglMajorVersion < 2)
 		ri.Error(ERR_FATAL, "OpenGL 2.0 required!");
 	ri.Printf(PRINT_ALL, "...using OpenGL %s\n", glConfig.version_string);
 
-	// GL function loader, based on https://gist.github.com/rygorous/16796a0c876cf8a5f542caddb55bce8a
+	// set DSA fallbacks
+#define GLE(ret, name, ...) qgl##name = GLDSA_##name;
+	QGL_EXT_direct_state_access_PROCS;
+#undef GLE
 
+	// GL function loader, based on https://gist.github.com/rygorous/16796a0c876cf8a5f542caddb55bce8a
 #define GLE(ret, name, ...) qgl##name = (name##proc *) SDL_GL_GetProcAddress("gl" #name);
 
 	// OpenGL 1.2, was GL_EXT_draw_range_elements
 	QGL_1_2_PROCS;
-	glRefConfig.drawRangeElements = r_ext_draw_range_elements->integer ? qtrue : qfalse;
+	glRefConfig.drawRangeElements = !!r_ext_draw_range_elements->integer;
 	ri.Printf(PRINT_ALL, result[glRefConfig.drawRangeElements], "glDrawRangeElements()");
 
 	// OpenGL 1.3, was GL_ARB_texture_compression
@@ -161,8 +81,8 @@ void GLimp_InitExtraExtensions()
 
 	// OpenGL 1.4, was GL_EXT_multi_draw_arrays
 	QGL_1_4_PROCS;
-	glRefConfig.drawRangeElements = r_ext_multi_draw_arrays->integer ? qtrue : qfalse;
-	ri.Printf(PRINT_ALL, result[glRefConfig.drawRangeElements], "glMultiDrawElements()");
+	glRefConfig.multiDrawArrays = !!r_ext_multi_draw_arrays->integer;
+	ri.Printf(PRINT_ALL, result[glRefConfig.multiDrawArrays], "glMultiDrawElements()");
 
 	// OpenGL 1.5, was GL_ARB_vertex_buffer_object and GL_ARB_occlusion_query
 	QGL_1_5_PROCS;
@@ -171,8 +91,7 @@ void GLimp_InitExtraExtensions()
 	// OpenGL 2.0, was GL_ARB_shading_language_100, GL_ARB_vertex_program, GL_ARB_shader_objects, and GL_ARB_vertex_shader
 	QGL_2_0_PROCS;
 
-#undef GLE
-
+	// Determine GLSL version
 	if (1)
 	{
 		char version[256];
@@ -186,23 +105,45 @@ void GLimp_InitExtraExtensions()
 
 	glRefConfig.memInfo = MI_NONE;
 
-	if( GLimp_HaveExtension( "GL_NVX_gpu_memory_info" ) )
+	// GL_NVX_gpu_memory_info
+	extension = "GL_NVX_gpu_memory_info";
+	if( GLimp_HaveExtension( extension ) )
 	{
 		glRefConfig.memInfo = MI_NVX;
+
+		ri.Printf(PRINT_ALL, result[1], extension);
 	}
-	else if( GLimp_HaveExtension( "GL_ATI_meminfo" ) )
+	else
 	{
-		glRefConfig.memInfo = MI_ATI;
+		ri.Printf(PRINT_ALL, result[2], extension);
 	}
 
-	extension = "GL_ARB_texture_non_power_of_two";
-	glRefConfig.textureNonPowerOfTwo = qfalse;
+	// GL_ATI_meminfo
+	extension = "GL_ATI_meminfo";
 	if( GLimp_HaveExtension( extension ) )
 	{
-		if(1) //(r_ext_texture_non_power_of_two->integer)
+		if (glRefConfig.memInfo == MI_NONE)
+		{
+			glRefConfig.memInfo = MI_ATI;
+
+			ri.Printf(PRINT_ALL, result[1], extension);
+		}
+		else
 		{
-			glRefConfig.textureNonPowerOfTwo = qtrue;
+			ri.Printf(PRINT_ALL, result[0], extension);
 		}
+	}
+	else
+	{
+		ri.Printf(PRINT_ALL, result[2], extension);
+	}
+
+	// GL_ARB_texture_non_power_of_two
+	extension = "GL_ARB_texture_non_power_of_two";
+	glRefConfig.textureNonPowerOfTwo = qfalse;
+	if( GLimp_HaveExtension( extension ) )
+	{
+		glRefConfig.textureNonPowerOfTwo = qtrue; // !!r_ext_texture_non_power_of_two->integer
 
 		ri.Printf(PRINT_ALL, result[glRefConfig.textureNonPowerOfTwo], extension);
 	}
@@ -216,10 +157,7 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.textureFloat = qfalse;
 	if( GLimp_HaveExtension( extension ) )
 	{
-		if( r_ext_texture_float->integer )
-		{
-			glRefConfig.textureFloat = qtrue;
-		}
+		glRefConfig.textureFloat = !!r_ext_texture_float->integer;
 
 		ri.Printf(PRINT_ALL, result[glRefConfig.textureFloat], extension);
 	}
@@ -233,8 +171,7 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.halfFloatPixel = qfalse;
 	if( GLimp_HaveExtension( extension ) )
 	{
-		if( r_arb_half_float_pixel->integer )
-			glRefConfig.halfFloatPixel = qtrue;
+		glRefConfig.halfFloatPixel = !!r_arb_half_float_pixel->integer;
 
 		ri.Printf(PRINT_ALL, result[glRefConfig.halfFloatPixel], extension);
 	}
@@ -248,29 +185,12 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.framebufferObject = qfalse;
 	if( GLimp_HaveExtension( extension ) )
 	{
+		glRefConfig.framebufferObject = !!r_ext_framebuffer_object->integer;
+
 		glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &glRefConfig.maxRenderbufferSize);
 		glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &glRefConfig.maxColorAttachments);
 
-		qglIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) SDL_GL_GetProcAddress("glIsRenderbufferEXT");
-		qglBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) SDL_GL_GetProcAddress("glBindRenderbufferEXT");
-		qglDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) SDL_GL_GetProcAddress("glDeleteRenderbuffersEXT");
-		qglGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) SDL_GL_GetProcAddress("glGenRenderbuffersEXT");
-		qglRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) SDL_GL_GetProcAddress("glRenderbufferStorageEXT");
-		qglGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) SDL_GL_GetProcAddress("glGetRenderbufferParameterivEXT");
-		qglIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) SDL_GL_GetProcAddress("glIsFramebufferEXT");
-		qglBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) SDL_GL_GetProcAddress("glBindFramebufferEXT");
-		qglDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) SDL_GL_GetProcAddress("glDeleteFramebuffersEXT");
-		qglGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) SDL_GL_GetProcAddress("glGenFramebuffersEXT");
-		qglCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) SDL_GL_GetProcAddress("glCheckFramebufferStatusEXT");
-		qglFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) SDL_GL_GetProcAddress("glFramebufferTexture1DEXT");
-		qglFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) SDL_GL_GetProcAddress("glFramebufferTexture2DEXT");
-		qglFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) SDL_GL_GetProcAddress("glFramebufferTexture3DEXT");
-		qglFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) SDL_GL_GetProcAddress("glFramebufferRenderbufferEXT");
-		qglGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) SDL_GL_GetProcAddress("glGetFramebufferAttachmentParameterivEXT");
-		qglGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) SDL_GL_GetProcAddress("glGenerateMipmapEXT");
-
-		if(r_ext_framebuffer_object->value)
-			glRefConfig.framebufferObject = qtrue;
+		QGL_EXT_framebuffer_object_PROCS;
 
 		ri.Printf(PRINT_ALL, result[glRefConfig.framebufferObject], extension);
 	}
@@ -279,26 +199,15 @@ void GLimp_InitExtraExtensions()
 		ri.Printf(PRINT_ALL, result[2], extension);
 	}
 
-	// GL_EXT_packed_depth_stencil
-	extension = "GL_EXT_packed_depth_stencil";
-	glRefConfig.packedDepthStencil = qfalse;
-	if( GLimp_HaveExtension(extension))
-	{
-		glRefConfig.packedDepthStencil = qtrue;
-		ri.Printf(PRINT_ALL, result[glRefConfig.packedDepthStencil], extension);
-	}
-	else
-	{
-		ri.Printf(PRINT_ALL, result[2], extension);
-	}
-
 	// GL_EXT_framebuffer_blit
 	extension = "GL_EXT_framebuffer_blit";
 	glRefConfig.framebufferBlit = qfalse;
 	if (GLimp_HaveExtension(extension))
 	{
-		qglBlitFramebufferEXT = (void *)SDL_GL_GetProcAddress("glBlitFramebufferEXT");
 		glRefConfig.framebufferBlit = qtrue;
+
+		QGL_EXT_framebuffer_blit_PROCS;
+
 		ri.Printf(PRINT_ALL, result[glRefConfig.framebufferBlit], extension);
 	}
 	else
@@ -311,8 +220,10 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.framebufferMultisample = qfalse;
 	if (GLimp_HaveExtension(extension))
 	{
-		qglRenderbufferStorageMultisampleEXT = (void *)SDL_GL_GetProcAddress("glRenderbufferStorageMultisampleEXT");
 		glRefConfig.framebufferMultisample = qtrue;
+
+		QGL_EXT_framebuffer_multisample_PROCS;
+
 		ri.Printf(PRINT_ALL, result[glRefConfig.framebufferMultisample], extension);
 	}
 	else
@@ -326,10 +237,12 @@ void GLimp_InitExtraExtensions()
 	extension = "GL_ARB_texture_compression_rgtc";
 	if (GLimp_HaveExtension(extension))
 	{
-		if (r_ext_compressed_textures->integer)
+		qboolean useRgtc = r_ext_compressed_textures->integer >= 1;
+
+		if (useRgtc)
 			glRefConfig.textureCompression |= TCR_RGTC;
 
-		ri.Printf(PRINT_ALL, result[r_ext_compressed_textures->integer ? 1 : 0], extension);
+		ri.Printf(PRINT_ALL, result[useRgtc], extension);
 	}
 	else
 	{
@@ -342,10 +255,12 @@ void GLimp_InitExtraExtensions()
 	extension = "GL_ARB_texture_compression_bptc";
 	if (GLimp_HaveExtension(extension))
 	{
-		if (r_ext_compressed_textures->integer >= 2)
+		qboolean useBptc = r_ext_compressed_textures->integer >= 2;
+
+		if (useBptc)
 			glRefConfig.textureCompression |= TCR_BPTC;
 
-		ri.Printf(PRINT_ALL, result[(r_ext_compressed_textures->integer >= 2) ? 1 : 0], extension);
+		ri.Printf(PRINT_ALL, result[useBptc], extension);
 	}
 	else
 	{
@@ -358,7 +273,8 @@ void GLimp_InitExtraExtensions()
 	if( GLimp_HaveExtension( extension ) )
 	{
 		glRefConfig.depthClamp = qtrue;
-		ri.Printf(PRINT_ALL, result[1], extension);
+
+		ri.Printf(PRINT_ALL, result[glRefConfig.depthClamp], extension);
 	}
 	else
 	{
@@ -370,8 +286,7 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.seamlessCubeMap = qfalse;
 	if( GLimp_HaveExtension( extension ) )
 	{
-		if (r_arb_seamless_cube_map->integer)
-			glRefConfig.seamlessCubeMap = qtrue;
+		glRefConfig.seamlessCubeMap = !!r_arb_seamless_cube_map->integer;
 
 		ri.Printf(PRINT_ALL, result[glRefConfig.seamlessCubeMap], extension);
 	}
@@ -385,10 +300,12 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.packedNormalDataType = GL_BYTE;
 	if( GLimp_HaveExtension( extension ) )
 	{
-		if (r_arb_vertex_type_2_10_10_10_rev->integer)
+		qboolean useExt = !!r_arb_vertex_type_2_10_10_10_rev->integer;
+
+		if (useExt)
 			glRefConfig.packedNormalDataType = GL_INT_2_10_10_10_REV;
 
-		ri.Printf(PRINT_ALL, result[r_arb_vertex_type_2_10_10_10_rev->integer ? 1 : 0], extension);
+		ri.Printf(PRINT_ALL, result[useExt], extension);
 	}
 	else
 	{
@@ -403,15 +320,11 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.vertexArrayObject = qfalse;
 	if( GLimp_HaveExtension( extension ) )
 	{
-		qglBindVertexArrayARB = (void *) SDL_GL_GetProcAddress("glBindVertexArray");
-		qglDeleteVertexArraysARB = (void *) SDL_GL_GetProcAddress("glDeleteVertexArrays");
-		qglGenVertexArraysARB = (void *) SDL_GL_GetProcAddress("glGenVertexArrays");
-		qglIsVertexArrayARB = (void *) SDL_GL_GetProcAddress("glIsVertexArray");
+		glRefConfig.vertexArrayObject = !!r_arb_vertex_array_object->integer;
 
-		if (r_arb_vertex_array_object->integer)
-			glRefConfig.vertexArrayObject = qtrue;
+		QGL_ARB_vertex_array_object_PROCS;
 
-		ri.Printf(PRINT_ALL, result[glRefConfig.vertexArrayObject ? 1 : 0], extension);
+		ri.Printf(PRINT_ALL, result[glRefConfig.vertexArrayObject], extension);
 	}
 	else
 	{
@@ -426,7 +339,9 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.packedColorDataSize    = sizeof(float) * 4;
 	if( GLimp_HaveExtension( extension ) )
 	{
-		if (r_arb_half_float_vertex->integer)
+		qboolean useExt = !!r_arb_half_float_vertex->integer;
+
+		if (useExt)
 		{
 			glRefConfig.packedTexcoordDataType = GL_HALF_FLOAT;
 			glRefConfig.packedTexcoordDataSize = sizeof(uint16_t) * 2;
@@ -434,7 +349,7 @@ void GLimp_InitExtraExtensions()
 			glRefConfig.packedColorDataSize    = sizeof(uint16_t) * 4;
 		}
 
-		ri.Printf(PRINT_ALL, result[r_arb_half_float_vertex->integer ? 1 : 0], extension);
+		ri.Printf(PRINT_ALL, result[useExt], extension);
 	}
 	else
 	{
@@ -443,66 +358,23 @@ void GLimp_InitExtraExtensions()
 
 	// GL_EXT_direct_state_access
 	extension = "GL_EXT_direct_state_access";
-
-	qglBindMultiTexture = GLDSA_BindMultiTexture;
-	qglTextureParameterf = GLDSA_TextureParameterf;
-	qglTextureParameteri = GLDSA_TextureParameteri;
-	qglTextureImage2D = GLDSA_TextureImage2D;
-	qglTextureSubImage2D = GLDSA_TextureSubImage2D;
-	qglCopyTextureImage2D = GLDSA_CopyTextureImage2D;
-	qglCompressedTextureImage2D = GLDSA_CompressedTextureImage2D;
-	qglCompressedTextureSubImage2D = GLDSA_CompressedTextureSubImage2D;
-	qglGenerateTextureMipmap = GLDSA_GenerateTextureMipmap;
-
-	qglProgramUniform1i = GLDSA_ProgramUniform1i;
-	qglProgramUniform1f = GLDSA_ProgramUniform1f;
-	qglProgramUniform2f = GLDSA_ProgramUniform2f;
-	qglProgramUniform3f = GLDSA_ProgramUniform3f;
-	qglProgramUniform4f = GLDSA_ProgramUniform4f;
-	qglProgramUniform1fv = GLDSA_ProgramUniform1fv;
-	qglProgramUniformMatrix4fv = GLDSA_ProgramUniformMatrix4fv;
-
-	qglNamedRenderbufferStorage = GLDSA_NamedRenderbufferStorage;
-	qglNamedRenderbufferStorageMultisample = GLDSA_NamedRenderbufferStorageMultisample;
-	qglCheckNamedFramebufferStatus = GLDSA_CheckNamedFramebufferStatus;
-	qglNamedFramebufferTexture2D = GLDSA_NamedFramebufferTexture2D;
-	qglNamedFramebufferRenderbuffer = GLDSA_NamedFramebufferRenderbuffer;
-
 	glRefConfig.directStateAccess = qfalse;
 	if (GLimp_HaveExtension(extension))
 	{
-		if (r_ext_direct_state_access->integer)
+		glRefConfig.directStateAccess = !!r_ext_direct_state_access->integer;
+
+		// QGL_*_PROCS becomes several functions, do not remove {}
+		if (glRefConfig.directStateAccess)
 		{
-			glRefConfig.directStateAccess = qtrue;
-			qglBindMultiTexture = (void *)SDL_GL_GetProcAddress("glBindMultiTextureEXT");
-			qglTextureParameterf = (void *)SDL_GL_GetProcAddress("glTextureParameterfEXT");
-			qglTextureParameteri = (void *)SDL_GL_GetProcAddress("glTextureParameteriEXT");
-			qglTextureImage2D = (void *)SDL_GL_GetProcAddress("glTextureImage2DEXT");
-			qglTextureSubImage2D = (void *)SDL_GL_GetProcAddress("glTextureSubImage2DEXT");
-			qglCopyTextureImage2D = (void *)SDL_GL_GetProcAddress("glCopyTextureImage2DEXT");
-			qglCompressedTextureImage2D = (void *)SDL_GL_GetProcAddress("glCompressedTextureImage2DEXT");
-			qglCompressedTextureSubImage2D = (void *)SDL_GL_GetProcAddress("glCompressedTextureSubImage2DEXT");
-			qglGenerateTextureMipmap = (void *)SDL_GL_GetProcAddress("glGenerateTextureMipmapEXT");
-
-			qglProgramUniform1i = (void *)SDL_GL_GetProcAddress("glProgramUniform1iEXT");
-			qglProgramUniform1f = (void *)SDL_GL_GetProcAddress("glProgramUniform1fEXT");
-			qglProgramUniform2f = (void *)SDL_GL_GetProcAddress("glProgramUniform2fEXT");
-			qglProgramUniform3f = (void *)SDL_GL_GetProcAddress("glProgramUniform3fEXT");
-			qglProgramUniform4f = (void *)SDL_GL_GetProcAddress("glProgramUniform4fEXT");
-			qglProgramUniform1fv = (void *)SDL_GL_GetProcAddress("glProgramUniform1fvEXT");
-			qglProgramUniformMatrix4fv = (void *)SDL_GL_GetProcAddress("glProgramUniformMatrix4fvEXT");
-
-			qglNamedRenderbufferStorage = (void *)SDL_GL_GetProcAddress("glNamedRenderbufferStorageEXT");
-			qglNamedRenderbufferStorageMultisample = (void *)SDL_GL_GetProcAddress("glNamedRenderbufferStorageMultisampleEXT");
-			qglCheckNamedFramebufferStatus = (void *)SDL_GL_GetProcAddress("glCheckNamedFramebufferStatusEXT");
-			qglNamedFramebufferTexture2D = (void *)SDL_GL_GetProcAddress("glNamedFramebufferTexture2DEXT");
-			qglNamedFramebufferRenderbuffer = (void *)SDL_GL_GetProcAddress("glNamedFramebufferRenderbufferEXT");
+			QGL_EXT_direct_state_access_PROCS;
 		}
 
-		ri.Printf(PRINT_ALL, result[glRefConfig.directStateAccess ? 1 : 0], extension);
+		ri.Printf(PRINT_ALL, result[glRefConfig.directStateAccess], extension);
 	}
 	else
 	{
 		ri.Printf(PRINT_ALL, result[2], extension);
 	}
+
+#undef GLE
 }
diff --git a/MP/code/rend2/tr_fbo.c b/MP/code/rend2/tr_fbo.c
index 9ba6344..41cfdd7 100644
--- a/MP/code/rend2/tr_fbo.c
+++ b/MP/code/rend2/tr_fbo.c
@@ -32,7 +32,7 @@ R_CheckFBO
 */
 qboolean R_CheckFBO(const FBO_t * fbo)
 {
-	GLenum code = qglCheckNamedFramebufferStatus(fbo->frameBuffer, GL_FRAMEBUFFER_EXT);
+	GLenum code = qglCheckNamedFramebufferStatusEXT(fbo->frameBuffer, GL_FRAMEBUFFER_EXT);
 
 	if(code == GL_FRAMEBUFFER_COMPLETE_EXT)
 		return qtrue;
@@ -184,20 +184,20 @@ void FBO_CreateBuffer(FBO_t *fbo, int format, int index, int multisample)
 		qglGenRenderbuffersEXT(1, pRenderBuffer);
 
 	if (multisample && glRefConfig.framebufferMultisample)
-		qglNamedRenderbufferStorageMultisample(*pRenderBuffer, multisample, format, fbo->width, fbo->height);
+		qglNamedRenderbufferStorageMultisampleEXT(*pRenderBuffer, multisample, format, fbo->width, fbo->height);
 	else
-		qglNamedRenderbufferStorage(*pRenderBuffer, format, fbo->width, fbo->height);
+		qglNamedRenderbufferStorageEXT(*pRenderBuffer, format, fbo->width, fbo->height);
 
 	if(absent)
 	{
 		if (attachment == 0)
 		{
-			qglNamedFramebufferRenderbuffer(fbo->frameBuffer, GL_DEPTH_ATTACHMENT_EXT,   GL_RENDERBUFFER_EXT, *pRenderBuffer);
-			qglNamedFramebufferRenderbuffer(fbo->frameBuffer, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, *pRenderBuffer);
+			qglNamedFramebufferRenderbufferEXT(fbo->frameBuffer, GL_DEPTH_ATTACHMENT_EXT,   GL_RENDERBUFFER_EXT, *pRenderBuffer);
+			qglNamedFramebufferRenderbufferEXT(fbo->frameBuffer, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, *pRenderBuffer);
 		}
 		else
 		{
-			qglNamedFramebufferRenderbuffer(fbo->frameBuffer, attachment, GL_RENDERBUFFER_EXT, *pRenderBuffer);
+			qglNamedFramebufferRenderbufferEXT(fbo->frameBuffer, attachment, GL_RENDERBUFFER_EXT, *pRenderBuffer);
 		}
 	}
 }
@@ -216,7 +216,7 @@ void FBO_AttachImage(FBO_t *fbo, image_t *image, GLenum attachment, GLuint cubem
 	if (image->flags & IMGFLAG_CUBEMAP)
 		target = GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + cubemapside;
 
-	qglNamedFramebufferTexture2D(fbo->frameBuffer, attachment, target, image->texnum, 0);
+	qglNamedFramebufferTexture2DEXT(fbo->frameBuffer, attachment, target, image->texnum, 0);
 	index = attachment - GL_COLOR_ATTACHMENT0_EXT;
 	if (index >= 0 && index <= 15)
 		fbo->colorImage[index] = image;
diff --git a/MP/code/rend2/tr_glsl.c b/MP/code/rend2/tr_glsl.c
index 318853a..07e3d94 100644
--- a/MP/code/rend2/tr_glsl.c
+++ b/MP/code/rend2/tr_glsl.c
@@ -707,7 +707,7 @@ void GLSL_SetUniformInt(shaderProgram_t *program, int uniformNum, GLint value)
 
 	*compare = value;
 
-	qglProgramUniform1i(program->program, uniforms[uniformNum], value);
+	qglProgramUniform1iEXT(program->program, uniforms[uniformNum], value);
 }
 
 void GLSL_SetUniformFloat(shaderProgram_t *program, int uniformNum, GLfloat value)
@@ -731,7 +731,7 @@ void GLSL_SetUniformFloat(shaderProgram_t *program, int uniformNum, GLfloat valu
 
 	*compare = value;
 	
-	qglProgramUniform1f(program->program, uniforms[uniformNum], value);
+	qglProgramUniform1fEXT(program->program, uniforms[uniformNum], value);
 }
 
 void GLSL_SetUniformVec2(shaderProgram_t *program, int uniformNum, const vec2_t v)
@@ -756,7 +756,7 @@ void GLSL_SetUniformVec2(shaderProgram_t *program, int uniformNum, const vec2_t
 	compare[0] = v[0];
 	compare[1] = v[1];
 
-	qglProgramUniform2f(program->program, uniforms[uniformNum], v[0], v[1]);
+	qglProgramUniform2fEXT(program->program, uniforms[uniformNum], v[0], v[1]);
 }
 
 void GLSL_SetUniformVec3(shaderProgram_t *program, int uniformNum, const vec3_t v)
@@ -780,7 +780,7 @@ void GLSL_SetUniformVec3(shaderProgram_t *program, int uniformNum, const vec3_t
 
 	VectorCopy(v, compare);
 
-	qglProgramUniform3f(program->program, uniforms[uniformNum], v[0], v[1], v[2]);
+	qglProgramUniform3fEXT(program->program, uniforms[uniformNum], v[0], v[1], v[2]);
 }
 
 void GLSL_SetUniformVec4(shaderProgram_t *program, int uniformNum, const vec4_t v)
@@ -804,7 +804,7 @@ void GLSL_SetUniformVec4(shaderProgram_t *program, int uniformNum, const vec4_t
 
 	VectorCopy4(v, compare);
 
-	qglProgramUniform4f(program->program, uniforms[uniformNum], v[0], v[1], v[2], v[3]);
+	qglProgramUniform4fEXT(program->program, uniforms[uniformNum], v[0], v[1], v[2], v[3]);
 }
 
 void GLSL_SetUniformFloat5(shaderProgram_t *program, int uniformNum, const vec5_t v)
@@ -828,7 +828,7 @@ void GLSL_SetUniformFloat5(shaderProgram_t *program, int uniformNum, const vec5_
 
 	VectorCopy5(v, compare);
 
-	qglProgramUniform1fv(program->program, uniforms[uniformNum], 5, v);
+	qglProgramUniform1fvEXT(program->program, uniforms[uniformNum], 5, v);
 }
 
 void GLSL_SetUniformMat4(shaderProgram_t *program, int uniformNum, const mat4_t matrix)
@@ -852,7 +852,7 @@ void GLSL_SetUniformMat4(shaderProgram_t *program, int uniformNum, const mat4_t
 
 	Mat4Copy(matrix, compare);
 
-	qglProgramUniformMatrix4fv(program->program, uniforms[uniformNum], 1, GL_FALSE, matrix);
+	qglProgramUniformMatrix4fvEXT(program->program, uniforms[uniformNum], 1, GL_FALSE, matrix);
 }
 
 void GLSL_DeleteGPUShader(shaderProgram_t *program)
diff --git a/MP/code/rend2/tr_image.c b/MP/code/rend2/tr_image.c
index 644fe00..54bb371 100644
--- a/MP/code/rend2/tr_image.c
+++ b/MP/code/rend2/tr_image.c
@@ -133,8 +133,8 @@ void GL_TextureMode( const char *string ) {
 	for ( i = 0 ; i < tr.numImages ; i++ ) {
 		glt = tr.images[ i ];
 		if ( glt->flags & IMGFLAG_MIPMAP && !(glt->flags & IMGFLAG_CUBEMAP) ) {
-			qglTextureParameterf(glt->texnum, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min);
-			qglTextureParameterf(glt->texnum, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max);
+			qglTextureParameterfEXT(glt->texnum, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min);
+			qglTextureParameterfEXT(glt->texnum, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max);
 		}
 	}
 }
@@ -2019,7 +2019,7 @@ static void RawImage_UploadToRgtc2Texture(GLuint texture, byte *data, int width,
 		}
 	}
 
-	qglCompressedTextureImage2D(texture, GL_TEXTURE_2D, mip, GL_COMPRESSED_RG_RGTC2, width, height, 0, size, compressedData);
+	qglCompressedTextureImage2DEXT(texture, GL_TEXTURE_2D, mip, GL_COMPRESSED_RG_RGTC2, width, height, 0, size, compressedData);
 
 	ri.Hunk_FreeTempMemory(compressedData);
 }
@@ -2098,7 +2098,7 @@ static void RawImage_UploadTexture(GLuint texture, byte *data, int x, int y, int
 		do
 		{
 			lastMip = (width == 1 && height == 1) || !mipmap;
-			qglTextureImage2D(texture, target, miplevel, internalFormat, width, height, 0, dataFormat, dataType, NULL);
+			qglTextureImage2DEXT(texture, target, miplevel, internalFormat, width, height, 0, dataFormat, dataType, NULL);
 
 			width = MAX(1, width >> 1);
 			height = MAX(1, height >> 1);
@@ -2131,9 +2131,9 @@ static void RawImage_UploadTexture(GLuint texture, byte *data, int x, int y, int
 		if (compressed)
 		{
 			if (subtexture)
-				qglCompressedTextureSubImage2D(texture, target, miplevel, x, y, width, height, picFormat, size, data);
+				qglCompressedTextureSubImage2DEXT(texture, target, miplevel, x, y, width, height, picFormat, size, data);
 			else
-				qglCompressedTextureImage2D(texture, target, miplevel, picFormat, width, height, 0, size, data);
+				qglCompressedTextureImage2DEXT(texture, target, miplevel, picFormat, width, height, 0, size, data);
 		}
 		else
 		{
@@ -2143,9 +2143,9 @@ static void RawImage_UploadTexture(GLuint texture, byte *data, int x, int y, int
 			if (rgtc)
 				RawImage_UploadToRgtc2Texture(texture, data, width, height, miplevel);
 			else if (subtexture)
-				qglTextureSubImage2D(texture, target, miplevel, x, y, width, height, dataFormat, dataType, data);
+				qglTextureSubImage2DEXT(texture, target, miplevel, x, y, width, height, dataFormat, dataType, data);
 			else
-				qglTextureImage2D(texture, target, miplevel, internalFormat, width, height, 0, dataFormat, dataType, data);
+				qglTextureImage2DEXT(texture, target, miplevel, internalFormat, width, height, 0, dataFormat, dataType, data);
 
 			if (!lastMip && numMips < 2)
 			{
@@ -2285,19 +2285,19 @@ done:
 	if (mipmap)
 	{
 		if (textureFilterAnisotropic && !cubemap)
-			qglTextureParameteri(image->texnum, textureTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+			qglTextureParameteriEXT(image->texnum, textureTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT,
 			(GLint)Com_Clamp(1, maxAnisotropy, r_ext_max_anisotropy->integer));
 
-		qglTextureParameterf(image->texnum, textureTarget, GL_TEXTURE_MIN_FILTER, gl_filter_min);
-		qglTextureParameterf(image->texnum, textureTarget, GL_TEXTURE_MAG_FILTER, gl_filter_max);
+		qglTextureParameterfEXT(image->texnum, textureTarget, GL_TEXTURE_MIN_FILTER, gl_filter_min);
+		qglTextureParameterfEXT(image->texnum, textureTarget, GL_TEXTURE_MAG_FILTER, gl_filter_max);
 	}
 	else
 	{
 		if (textureFilterAnisotropic && !cubemap)
-			qglTextureParameteri(image->texnum, textureTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
+			qglTextureParameteriEXT(image->texnum, textureTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
 
-		qglTextureParameterf(image->texnum, textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-		qglTextureParameterf(image->texnum, textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+		qglTextureParameterfEXT(image->texnum, textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+		qglTextureParameterfEXT(image->texnum, textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 	}
 
 	// Fix for sampling depth buffer on old nVidia cards
@@ -2308,9 +2308,9 @@ done:
 		case GL_DEPTH_COMPONENT16_ARB:
 		case GL_DEPTH_COMPONENT24_ARB:
 		case GL_DEPTH_COMPONENT32_ARB:
-			qglTextureParameterf(image->texnum, textureTarget, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
-			qglTextureParameterf(image->texnum, textureTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-			qglTextureParameterf(image->texnum, textureTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+			qglTextureParameterfEXT(image->texnum, textureTarget, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
+			qglTextureParameterfEXT(image->texnum, textureTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+			qglTextureParameterfEXT(image->texnum, textureTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 			break;
 		default:
 			break;
@@ -2371,14 +2371,14 @@ image_t *R_CreateImage2( const char *name, byte *pic, int width, int height, GLe
 
 	if (image->flags & IMGFLAG_CUBEMAP)
 	{
-		qglTextureParameterf(image->texnum, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, glWrapClampMode);
-		qglTextureParameterf(image->texnum, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, glWrapClampMode);
-		qglTextureParameteri(image->texnum, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, glWrapClampMode);
+		qglTextureParameterfEXT(image->texnum, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, glWrapClampMode);
+		qglTextureParameterfEXT(image->texnum, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, glWrapClampMode);
+		qglTextureParameteriEXT(image->texnum, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, glWrapClampMode);
 	}
 	else
 	{
-		qglTextureParameterf(image->texnum, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, glWrapClampMode);
-		qglTextureParameterf(image->texnum, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, glWrapClampMode);
+		qglTextureParameterfEXT(image->texnum, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, glWrapClampMode);
+		qglTextureParameterfEXT(image->texnum, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, glWrapClampMode);
 	}
 
 	hash = generateHashValue( name );
@@ -2936,11 +2936,8 @@ void R_CreateBuiltinImages( void ) {
 		if (r_drawSunRays->integer)
 			tr.sunRaysImage = R_CreateImage("*sunRays", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, rgbFormat);
 
-		if (glRefConfig.framebufferObject)
-		{
-			tr.renderDepthImage  = R_CreateImage("*renderdepth",  NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB);
-			tr.textureDepthImage = R_CreateImage("*texturedepth", NULL, PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB);
-		}
+		tr.renderDepthImage  = R_CreateImage("*renderdepth",  NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB);
+		tr.textureDepthImage = R_CreateImage("*texturedepth", NULL, PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB);
 
 		{
 			unsigned short sdata[4];
@@ -2995,8 +2992,8 @@ void R_CreateBuiltinImages( void ) {
 			for ( x = 0; x < 4; x++)
 			{
 				tr.sunShadowDepthImage[x] = R_CreateImage(va("*sunshadowdepth%i", x), NULL, r_shadowMapSize->integer, r_shadowMapSize->integer, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB);
-				qglTextureParameterf(tr.sunShadowDepthImage[x]->texnum, GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
-				qglTextureParameterf(tr.sunShadowDepthImage[x]->texnum, GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
+				qglTextureParameterfEXT(tr.sunShadowDepthImage[x]->texnum, GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
+				qglTextureParameterfEXT(tr.sunShadowDepthImage[x]->texnum, GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
 			}
 
 			tr.screenShadowImage = R_CreateImage("*screenShadow", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_RGBA8);
diff --git a/MP/code/rend2/tr_init.c b/MP/code/rend2/tr_init.c
index 84aba6c..fb8ac9f 100644
--- a/MP/code/rend2/tr_init.c
+++ b/MP/code/rend2/tr_init.c
@@ -1044,7 +1044,7 @@ void GL_SetDefaultState( void ) {
 	GL_BindNullProgram();
 
 	if (glRefConfig.vertexArrayObject)
-		qglBindVertexArrayARB(0);
+		qglBindVertexArray(0);
 
 	qglBindBuffer(GL_ARRAY_BUFFER, 0);
 	qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
diff --git a/MP/code/rend2/tr_local.h b/MP/code/rend2/tr_local.h
index af96bba..ecd2fd4 100644
--- a/MP/code/rend2/tr_local.h
+++ b/MP/code/rend2/tr_local.h
@@ -1534,7 +1534,6 @@ typedef struct {
 	qboolean textureNonPowerOfTwo;
 	qboolean textureFloat;
 	qboolean halfFloatPixel;
-	qboolean packedDepthStencil;
 	textureCompressionRef_t textureCompression;
 	qboolean swizzleNormalmap;
 	
diff --git a/MP/code/rend2/tr_shade.c b/MP/code/rend2/tr_shade.c
index 0b93ddd..c364638 100644
--- a/MP/code/rend2/tr_shade.c
+++ b/MP/code/rend2/tr_shade.c
@@ -1582,7 +1582,9 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 
 			if (r_sunlightMode->integer && (backEnd.viewParms.flags & VPF_USESUNLIGHT) && (pStage->glslShaderIndex & LIGHTDEF_LIGHTTYPE_MASK))
 			{
-				GL_BindToTMU(tr.screenShadowImage, TB_SHADOWMAP);
+				// FIXME: screenShadowImage is NULL if no framebuffers
+				if (tr.screenShadowImage)
+					GL_BindToTMU(tr.screenShadowImage, TB_SHADOWMAP);
 				GLSL_SetUniformVec3(sp, UNIFORM_PRIMARYLIGHTAMBIENT, backEnd.refdef.sunAmbCol);
 				if (r_pbr->integer)
 				{
@@ -1695,7 +1697,9 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 			vec4_t vec;
 			cubemap_t *cubemap = &tr.cubemaps[input->cubemapIndex - 1];
 
-			GL_BindToTMU( cubemap->image, TB_CUBEMAP);
+			// FIXME: cubemap image could be NULL if cubemap isn't renderer or loaded
+			if (cubemap->image)
+				GL_BindToTMU( cubemap->image, TB_CUBEMAP);
 
 			VectorSubtract(cubemap->origin, backEnd.viewParms.or.origin, vec);
 			vec[3] = 1.0f;
diff --git a/MP/code/rend2/tr_vbo.c b/MP/code/rend2/tr_vbo.c
index 61ede4e..b1ff3d6 100644
--- a/MP/code/rend2/tr_vbo.c
+++ b/MP/code/rend2/tr_vbo.c
@@ -262,8 +262,8 @@ vao_t *R_CreateVao(const char *name, byte *vertexes, int vertexesSize, byte *ind
 
 	if (glRefConfig.vertexArrayObject)
 	{
-		qglGenVertexArraysARB(1, &vao->vao);
-		qglBindVertexArrayARB(vao->vao);
+		qglGenVertexArrays(1, &vao->vao);
+		qglBindVertexArray(vao->vao);
 	}
 
 
@@ -383,8 +383,8 @@ vao_t *R_CreateVao2(const char *name, int numVertexes, srfVert_t *verts, int num
 
 	if (glRefConfig.vertexArrayObject)
 	{
-		qglGenVertexArraysARB(1, &vao->vao);
-		qglBindVertexArrayARB(vao->vao);
+		qglGenVertexArrays(1, &vao->vao);
+		qglBindVertexArray(vao->vao);
 	}
 
 
@@ -480,7 +480,7 @@ void R_BindVao(vao_t * vao)
 
 		if (glRefConfig.vertexArrayObject)
 		{
-			qglBindVertexArrayARB(vao->vao);
+			qglBindVertexArray(vao->vao);
 
 			// why you no save GL_ELEMENT_ARRAY_BUFFER binding, Intel?
 			if (1)
@@ -515,7 +515,7 @@ void R_BindNullVao(void)
 	{
 		if (glRefConfig.vertexArrayObject)
 		{
-			qglBindVertexArrayARB(0);
+			qglBindVertexArray(0);
 
 			// why you no save GL_ELEMENT_ARRAY_BUFFER binding, Intel?
 			if (1) qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
@@ -654,7 +654,7 @@ void R_ShutdownVaos(void)
 		vao = tr.vaos[i];
 
 		if(vao->vao)
-			qglDeleteVertexArraysARB(1, &vao->vao);
+			qglDeleteVertexArrays(1, &vao->vao);
 
 		if(vao->vertexesVBO)
 		{
diff --git a/SP/code/rend2/qgl.h b/SP/code/rend2/qgl.h
index b47372e..aa10c6f 100644
--- a/SP/code/rend2/qgl.h
+++ b/SP/code/rend2/qgl.h
@@ -516,14 +516,6 @@ extern void ( APIENTRY * qglPNTrianglesfATI )( GLenum pname, GLfloat param );
 	GLE(void, ValidateProgram, GLuint program) \
 	GLE(void, VertexAttribPointer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) \
 
-#define GLE(ret, name, ...) typedef ret APIENTRY name##proc(__VA_ARGS__); extern name##proc * qgl##name;
-QGL_1_2_PROCS
-QGL_1_3_PROCS
-QGL_1_4_PROCS
-QGL_1_5_PROCS
-QGL_2_0_PROCS
-#undef GLE
-
 // GL_NVX_gpu_memory_info
 #ifndef GL_NVX_gpu_memory_info
 #define GL_NVX_gpu_memory_info
@@ -573,27 +565,18 @@ QGL_2_0_PROCS
 #endif
 
 // GL_EXT_framebuffer_object
-extern GLboolean (APIENTRY * qglIsRenderbufferEXT)(GLuint renderbuffer);
-extern void (APIENTRY * qglBindRenderbufferEXT)(GLenum target, GLuint renderbuffer);
-extern void (APIENTRY * qglDeleteRenderbuffersEXT)(GLsizei n, const GLuint *renderbuffers);
-extern void (APIENTRY * qglGenRenderbuffersEXT)(GLsizei n, GLuint *renderbuffers);
-extern void (APIENTRY * qglRenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-extern void (APIENTRY * qglGetRenderbufferParameterivEXT)(GLenum target, GLenum pname, GLint *params);
-extern GLboolean (APIENTRY * qglIsFramebufferEXT)(GLuint framebuffer);
-extern void (APIENTRY * qglBindFramebufferEXT)(GLenum target, GLuint framebuffer);
-extern void (APIENTRY * qglDeleteFramebuffersEXT)(GLsizei n, const GLuint *framebuffers);
-extern void (APIENTRY * qglGenFramebuffersEXT)(GLsizei n, GLuint *framebuffers);
-extern GLenum (APIENTRY * qglCheckFramebufferStatusEXT)(GLenum target);
-extern void (APIENTRY * qglFramebufferTexture1DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
-	GLint level);
-extern void (APIENTRY * qglFramebufferTexture2DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
-	GLint level);
-extern void (APIENTRY * qglFramebufferTexture3DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
-	GLint level, GLint zoffset);
-extern void (APIENTRY * qglFramebufferRenderbufferEXT)(GLenum target, GLenum attachment, GLenum renderbuffertarget,
-	GLuint renderbuffer);
-extern void (APIENTRY * qglGetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint *params);
-extern void (APIENTRY * qglGenerateMipmapEXT)(GLenum target);
+#define QGL_EXT_framebuffer_object_PROCS \
+	GLE(void, BindRenderbufferEXT, GLenum target, GLuint renderbuffer) \
+	GLE(void, DeleteRenderbuffersEXT, GLsizei n, const GLuint *renderbuffers) \
+	GLE(void, GenRenderbuffersEXT, GLsizei n, GLuint *renderbuffers) \
+	GLE(void, RenderbufferStorageEXT, GLenum target, GLenum internalformat, GLsizei width, GLsizei height) \
+	GLE(void, BindFramebufferEXT, GLenum target, GLuint framebuffer) \
+	GLE(void, DeleteFramebuffersEXT, GLsizei n, const GLuint *framebuffers) \
+	GLE(void, GenFramebuffersEXT, GLsizei n, GLuint *framebuffers) \
+	GLE(GLenum, CheckFramebufferStatusEXT, GLenum target) \
+	GLE(void, FramebufferTexture2DEXT, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) \
+	GLE(void, FramebufferRenderbufferEXT, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) \
+	GLE(void, GenerateMipmapEXT, GLenum target) \
 
 #ifndef GL_EXT_framebuffer_object
 #define GL_EXT_framebuffer_object
@@ -650,19 +633,9 @@ extern void (APIENTRY * qglGenerateMipmapEXT)(GLenum target);
 #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT   0x0506
 #endif
 
-// GL_EXT_packed_depth_stencil
-#ifndef GL_EXT_packed_depth_stencil
-#define GL_EXT_packed_depth_stencil
-#define GL_DEPTH_STENCIL_EXT                              0x84F9
-#define GL_UNSIGNED_INT_24_8_EXT                          0x84FA
-#define GL_DEPTH24_STENCIL8_EXT                           0x88F0
-#define GL_TEXTURE_STENCIL_SIZE_EXT                       0x88F1
-#endif
-
 // GL_EXT_framebuffer_blit
-extern void (APIENTRY * qglBlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
-                            GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
-                            GLbitfield mask, GLenum filter);
+#define QGL_EXT_framebuffer_blit_PROCS \
+	GLE(void, BlitFramebufferEXT, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) \
 
 #ifndef GL_EXT_framebuffer_blit
 #define GL_EXT_framebuffer_blit
@@ -673,8 +646,8 @@ extern void (APIENTRY * qglBlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint s
 #endif
 
 // GL_EXT_framebuffer_multisample
-extern void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLsizei samples,
-	GLenum internalformat, GLsizei width, GLsizei height);
+#define QGL_EXT_framebuffer_multisample_PROCS \
+	GLE(void, RenderbufferStorageMultisampleEXT, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) \
 
 #ifndef GL_EXT_framebuffer_multisample
 #define GL_EXT_framebuffer_multisample
@@ -683,31 +656,6 @@ extern void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLs
 #define GL_MAX_SAMPLES_EXT                         0x8D57
 #endif
 
-#ifndef GL_EXT_texture_sRGB
-#define GL_EXT_texture_sRGB
-#define GL_SRGB_EXT                                       0x8C40
-#define GL_SRGB8_EXT                                      0x8C41
-#define GL_SRGB_ALPHA_EXT                                 0x8C42
-#define GL_SRGB8_ALPHA8_EXT                               0x8C43
-#define GL_SLUMINANCE_ALPHA_EXT                           0x8C44
-#define GL_SLUMINANCE8_ALPHA8_EXT                         0x8C45
-#define GL_SLUMINANCE_EXT                                 0x8C46
-#define GL_SLUMINANCE8_EXT                                0x8C47
-#define GL_COMPRESSED_SRGB_EXT                            0x8C48
-#define GL_COMPRESSED_SRGB_ALPHA_EXT                      0x8C49
-#define GL_COMPRESSED_SLUMINANCE_EXT                      0x8C4A
-#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT                0x8C4B
-#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT                  0x8C4C
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT            0x8C4D
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT            0x8C4E
-#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT            0x8C4F
-#endif
-
-#ifndef GL_EXT_framebuffer_sRGB
-#define GL_EXT_framebuffer_sRGB
-#define GL_FRAMEBUFFER_SRGB_EXT                         0x8DB9
-#endif
-
 #ifndef GL_ARB_texture_compression_rgtc
 #define GL_ARB_texture_compression_rgtc
 #define GL_COMPRESSED_RED_RGTC1                       0x8DBB
@@ -735,89 +683,51 @@ extern void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLs
 #endif
 
 // GL_ARB_vertex_array_object
-extern void (APIENTRY * qglBindVertexArrayARB)(GLuint array);
-extern void (APIENTRY * qglDeleteVertexArraysARB)(GLsizei n, const GLuint *arrays);
-extern void (APIENTRY * qglGenVertexArraysARB)(GLsizei n, GLuint *arrays);
-extern GLboolean (APIENTRY * qglIsVertexArrayARB)(GLuint array);
+#define QGL_ARB_vertex_array_object_PROCS \
+	GLE(void, BindVertexArray, GLuint array) \
+	GLE(void, DeleteVertexArrays, GLsizei n, const GLuint *arrays) \
+	GLE(void, GenVertexArrays, GLsizei n, GLuint *arrays) \
+
 #ifndef GL_ARB_vertex_array_object
 #define GL_ARB_vertex_array_object
 #define GL_VERTEX_ARRAY_BINDING_ARB                0x85B5
 #endif
 
 // GL_EXT_direct_state_access
-extern GLvoid(APIENTRY * qglBindMultiTexture)(GLenum texunit, GLenum target, GLuint texture);
-extern GLvoid(APIENTRY * qglTextureParameterf)(GLuint texture, GLenum target, GLenum pname, GLfloat param);
-extern GLvoid(APIENTRY * qglTextureParameteri)(GLuint texture, GLenum target, GLenum pname, GLint param);
-extern GLvoid(APIENTRY * qglTextureImage2D)(GLuint texture, GLenum target, GLint level, GLint internalformat,
-	GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-extern GLvoid(APIENTRY * qglTextureSubImage2D)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,
-	GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
-extern GLvoid(APIENTRY * qglCopyTextureImage2D)(GLuint texture, GLenum target, GLint level, GLenum internalformat,
-	GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-extern GLvoid(APIENTRY * qglCompressedTextureImage2D)(GLuint texture, GLenum target, GLint level, GLenum internalformat,
-	GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
-extern GLvoid(APIENTRY * qglCompressedTextureSubImage2D)(GLuint texture, GLenum target, GLint level,
-	GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format,
-	GLsizei imageSize, const GLvoid *data);
-extern GLvoid(APIENTRY * qglGenerateTextureMipmap)(GLuint texture, GLenum target);
-
-extern GLvoid(APIENTRY * qglProgramUniform1i)(GLuint program, GLint location, GLint v0);
-extern GLvoid(APIENTRY * qglProgramUniform1f)(GLuint program, GLint location, GLfloat v0);
-extern GLvoid(APIENTRY * qglProgramUniform2f)(GLuint program, GLint location,
-	GLfloat v0, GLfloat v1);
-extern GLvoid(APIENTRY * qglProgramUniform3f)(GLuint program, GLint location,
-	GLfloat v0, GLfloat v1, GLfloat v2);
-extern GLvoid(APIENTRY * qglProgramUniform4f)(GLuint program, GLint location,
-	GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-extern GLvoid(APIENTRY * qglProgramUniform1fv)(GLuint program, GLint location,
-	GLsizei count, const GLfloat *value);
-extern GLvoid(APIENTRY * qglProgramUniformMatrix4fv)(GLuint program, GLint location,
-	GLsizei count, GLboolean transpose,
-	const GLfloat *value);
-
-extern GLvoid(APIENTRY * qglNamedRenderbufferStorage)(GLuint renderbuffer,
-	GLenum internalformat, GLsizei width, GLsizei height);
-
-extern GLvoid(APIENTRY * qglNamedRenderbufferStorageMultisample)(GLuint renderbuffer,
-	GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-
-extern GLenum(APIENTRY * qglCheckNamedFramebufferStatus)(GLuint framebuffer, GLenum target);
-extern GLvoid(APIENTRY * qglNamedFramebufferTexture2D)(GLuint framebuffer,
-	GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-extern GLvoid(APIENTRY * qglNamedFramebufferRenderbuffer)(GLuint framebuffer,
-	GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-
-
-#if defined(WIN32)
-// WGL_ARB_create_context
-#ifndef WGL_ARB_create_context
-#define WGL_CONTEXT_MAJOR_VERSION_ARB             0x2091
-#define WGL_CONTEXT_MINOR_VERSION_ARB             0x2092
-#define WGL_CONTEXT_LAYER_PLANE_ARB               0x2093
-#define WGL_CONTEXT_FLAGS_ARB                     0x2094
-#define WGL_CONTEXT_PROFILE_MASK_ARB              0x9126
-#define WGL_CONTEXT_DEBUG_BIT_ARB                 0x0001
-#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB    0x0002
-#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB          0x00000001
-#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
-#define ERROR_INVALID_VERSION_ARB                 0x2095
-#define ERROR_INVALID_PROFILE_ARB                 0x2096
-#endif
+#define QGL_EXT_direct_state_access_PROCS \
+	GLE(GLvoid, BindMultiTextureEXT, GLenum texunit, GLenum target, GLuint texture) \
+	GLE(GLvoid, TextureParameterfEXT, GLuint texture, GLenum target, GLenum pname, GLfloat param) \
+	GLE(GLvoid, TextureParameteriEXT, GLuint texture, GLenum target, GLenum pname, GLint param) \
+	GLE(GLvoid, TextureImage2DEXT, GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) \
+	GLE(GLvoid, TextureSubImage2DEXT, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) \
+	GLE(GLvoid, CopyTextureImage2DEXT, GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) \
+	GLE(GLvoid, CompressedTextureImage2DEXT, GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) \
+	GLE(GLvoid, CompressedTextureSubImage2DEXT, GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) \
+	GLE(GLvoid, GenerateTextureMipmapEXT, GLuint texture, GLenum target) \
+	GLE(GLvoid, ProgramUniform1iEXT, GLuint program, GLint location, GLint v0) \
+	GLE(GLvoid, ProgramUniform1fEXT, GLuint program, GLint location, GLfloat v0) \
+	GLE(GLvoid, ProgramUniform2fEXT, GLuint program, GLint location, GLfloat v0, GLfloat v1) \
+	GLE(GLvoid, ProgramUniform3fEXT, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) \
+	GLE(GLvoid, ProgramUniform4fEXT, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) \
+	GLE(GLvoid, ProgramUniform1fvEXT, GLuint program, GLint location, GLsizei count, const GLfloat *value) \
+	GLE(GLvoid, ProgramUniformMatrix4fvEXT, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) \
+	GLE(GLvoid, NamedRenderbufferStorageEXT, GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) \
+	GLE(GLvoid, NamedRenderbufferStorageMultisampleEXT, GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) \
+	GLE(GLenum, CheckNamedFramebufferStatusEXT, GLuint framebuffer, GLenum target) \
+	GLE(GLvoid, NamedFramebufferTexture2DEXT, GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) \
+	GLE(GLvoid, NamedFramebufferRenderbufferEXT, GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) \
 
-extern          HGLRC(APIENTRY * qwglCreateContextAttribsARB) (HDC hdC, HGLRC hShareContext, const int *attribList);
-#endif
-
-#if 0 //defined(__linux__)
-// GLX_ARB_create_context
-#ifndef GLX_ARB_create_context
-#define GLX_CONTEXT_DEBUG_BIT_ARB          0x00000001
-#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
-#define GLX_CONTEXT_MAJOR_VERSION_ARB      0x2091
-#define GLX_CONTEXT_MINOR_VERSION_ARB      0x2092
-#define GLX_CONTEXT_FLAGS_ARB              0x2094
-#endif
-
-extern GLXContext	(APIENTRY * qglXCreateContextAttribsARB) (Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);
-#endif
+#define GLE(ret, name, ...) typedef ret APIENTRY name##proc(__VA_ARGS__); extern name##proc * qgl##name;
+QGL_1_2_PROCS;
+QGL_1_3_PROCS;
+QGL_1_4_PROCS;
+QGL_1_5_PROCS;
+QGL_2_0_PROCS;
+QGL_EXT_framebuffer_object_PROCS;
+QGL_EXT_framebuffer_blit_PROCS;
+QGL_EXT_framebuffer_multisample_PROCS;
+QGL_ARB_vertex_array_object_PROCS;
+QGL_EXT_direct_state_access_PROCS;
+#undef GLE
 
 #endif // __QGL_H__
diff --git a/SP/code/rend2/tr_backend.c b/SP/code/rend2/tr_backend.c
index e5b7ca3..ae3a742 100644
--- a/SP/code/rend2/tr_backend.c
+++ b/SP/code/rend2/tr_backend.c
@@ -1235,16 +1235,16 @@ void RE_UploadCinematic( int w, int h, int cols, int rows, const byte *data, int
 	if ( cols != tr.scratchImage[client]->width || rows != tr.scratchImage[client]->height ) {
 		tr.scratchImage[client]->width = tr.scratchImage[client]->uploadWidth = cols;
 		tr.scratchImage[client]->height = tr.scratchImage[client]->uploadHeight = rows;
-		qglTextureImage2D(texture, GL_TEXTURE_2D, 0, GL_RGB8, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
-		qglTextureParameterf(texture, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-		qglTextureParameterf(texture, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-		qglTextureParameterf(texture, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-		qglTextureParameterf(texture, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+		qglTextureImage2DEXT(texture, GL_TEXTURE_2D, 0, GL_RGB8, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
+		qglTextureParameterfEXT(texture, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+		qglTextureParameterfEXT(texture, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+		qglTextureParameterfEXT(texture, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+		qglTextureParameterfEXT(texture, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 	} else {
 		if ( dirty ) {
 			// otherwise, just subimage upload it so that drivers can tell we are going to be changing
 			// it and don't try and do a texture compression
-			qglTextureSubImage2D(texture, GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, data);
+			qglTextureSubImage2DEXT(texture, GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, data);
 		}
 	}
 }
@@ -1493,7 +1493,7 @@ const void  *RB_DrawSurfs( const void *data ) {
 		else if (tr.renderFbo == NULL && tr.renderDepthImage)
 		{
 			// If we're rendering directly to the screen, copy the depth to a texture
-			qglCopyTextureImage2D(tr.renderDepthImage->texnum, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 0, 0, glConfig.vidWidth, glConfig.vidHeight, 0);
+			qglCopyTextureImage2DEXT(tr.renderDepthImage->texnum, GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 0, 0, glConfig.vidWidth, glConfig.vidHeight, 0);
 		}
 
 		if (tr.hdrDepthFbo)
@@ -1704,7 +1704,7 @@ const void  *RB_DrawSurfs( const void *data ) {
 			RB_DrawSun(0.2, tr.sunShader);
 		}
 
-		if (r_drawSunRays->integer)
+		if (glRefConfig.framebufferObject && r_drawSunRays->integer)
 		{
 			FBO_t *oldFbo = glState.currentFBO;
 			FBO_Bind(tr.sunRaysFbo);
@@ -1741,7 +1741,7 @@ const void  *RB_DrawSurfs( const void *data ) {
 
 		FBO_Bind(NULL);
 		if (cubemap && cubemap->image)
-			qglGenerateTextureMipmap(cubemap->image->texnum, GL_TEXTURE_CUBE_MAP);
+			qglGenerateTextureMipmapEXT(cubemap->image->texnum, GL_TEXTURE_CUBE_MAP);
 	}
 
 	return (const void *)( cmd + 1 );
@@ -1999,14 +1999,14 @@ const void *RB_CapShadowMap(const void *data)
 		{
 			if (tr.shadowCubemaps[cmd->map])
 			{
-				qglCopyTextureImage2D(tr.shadowCubemaps[cmd->map]->texnum, GL_TEXTURE_CUBE_MAP_POSITIVE_X + cmd->cubeSide, 0, GL_RGBA8, backEnd.refdef.x, glConfig.vidHeight - ( backEnd.refdef.y + PSHADOW_MAP_SIZE ), PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, 0);
+				qglCopyTextureImage2DEXT(tr.shadowCubemaps[cmd->map]->texnum, GL_TEXTURE_CUBE_MAP_POSITIVE_X + cmd->cubeSide, 0, GL_RGBA8, backEnd.refdef.x, glConfig.vidHeight - ( backEnd.refdef.y + PSHADOW_MAP_SIZE ), PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, 0);
 			}
 		}
 		else
 		{
 			if (tr.pshadowMaps[cmd->map])
 			{
-				qglCopyTextureImage2D(tr.pshadowMaps[cmd->map]->texnum, GL_TEXTURE_2D, 0, GL_RGBA8, backEnd.refdef.x, glConfig.vidHeight - (backEnd.refdef.y + PSHADOW_MAP_SIZE), PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, 0);
+				qglCopyTextureImage2DEXT(tr.pshadowMaps[cmd->map]->texnum, GL_TEXTURE_2D, 0, GL_RGBA8, backEnd.refdef.x, glConfig.vidHeight - (backEnd.refdef.y + PSHADOW_MAP_SIZE), PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, 0);
 			}
 		}
 	}
diff --git a/SP/code/rend2/tr_bsp.c b/SP/code/rend2/tr_bsp.c
index 5289f3d..06e4e8e 100644
--- a/SP/code/rend2/tr_bsp.c
+++ b/SP/code/rend2/tr_bsp.c
@@ -3902,7 +3902,7 @@ void RE_LoadWorldMap( const char *name ) {
 	R_BindNullVao();
 
 	// Render or load all cubemaps
-	if (r_cubeMapping->integer && tr.numCubemaps)
+	if (r_cubeMapping->integer && tr.numCubemaps && glRefConfig.framebufferObject)
 	{
 		R_LoadCubemaps();
 		R_RenderMissingCubemaps();
diff --git a/SP/code/rend2/tr_dsa.c b/SP/code/rend2/tr_dsa.c
index 4ea7699..f738a5d 100644
--- a/SP/code/rend2/tr_dsa.c
+++ b/SP/code/rend2/tr_dsa.c
@@ -43,7 +43,7 @@ void GL_BindNullTextures()
 	{
 		for (i = 0; i < NUM_TEXTURE_BUNDLES; i++)
 		{
-			qglBindMultiTexture(GL_TEXTURE0_ARB + i, GL_TEXTURE_2D, 0);
+			qglBindMultiTextureEXT(GL_TEXTURE0_ARB + i, GL_TEXTURE_2D, 0);
 			glDsaState.textures[i] = 0;
 		}
 	}
@@ -71,12 +71,12 @@ int GL_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture)
 	if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z)
 		target = GL_TEXTURE_CUBE_MAP;
 
-	qglBindMultiTexture(texunit, target, texture);
+	qglBindMultiTextureEXT(texunit, target, texture);
 	glDsaState.textures[tmu] = texture;
 	return 1;
 }
 
-GLvoid APIENTRY GLDSA_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture)
+GLvoid APIENTRY GLDSA_BindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture)
 {
 	if (glDsaState.texunit != texunit)
 	{
@@ -87,47 +87,47 @@ GLvoid APIENTRY GLDSA_BindMultiTexture(GLenum texunit, GLenum target, GLuint tex
 	qglBindTexture(target, texture);
 }
 
-GLvoid APIENTRY GLDSA_TextureParameterf(GLuint texture, GLenum target, GLenum pname, GLfloat param)
+GLvoid APIENTRY GLDSA_TextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglTexParameterf(target, pname, param);
 }
 
-GLvoid APIENTRY GLDSA_TextureParameteri(GLuint texture, GLenum target, GLenum pname, GLint param)
+GLvoid APIENTRY GLDSA_TextureParameteriEXT(GLuint texture, GLenum target, GLenum pname, GLint param)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglTexParameteri(target, pname, param);
 }
 
-GLvoid APIENTRY GLDSA_TextureImage2D(GLuint texture, GLenum target, GLint level, GLint internalformat,
+GLvoid APIENTRY GLDSA_TextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat,
 	GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
 }
 
-GLvoid APIENTRY GLDSA_TextureSubImage2D(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,
+GLvoid APIENTRY GLDSA_TextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,
 	GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
 }
 
-GLvoid APIENTRY GLDSA_CopyTextureImage2D(GLuint texture, GLenum target, GLint level, GLenum internalformat,
+GLvoid APIENTRY GLDSA_CopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat,
 	GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
 }
 
-GLvoid APIENTRY  GLDSA_CompressedTextureImage2D(GLuint texture, GLenum target, GLint level, GLenum internalformat,
+GLvoid APIENTRY  GLDSA_CompressedTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat,
 	GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
 }
 
-GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLint level,
+GLvoid APIENTRY GLDSA_CompressedTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level,
 	GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format,
 	GLsizei imageSize, const GLvoid *data)
 {
@@ -135,7 +135,7 @@ GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target,
 	qglCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
 }
 
-GLvoid APIENTRY GLDSA_GenerateTextureMipmap(GLuint texture, GLenum target)
+GLvoid APIENTRY GLDSA_GenerateTextureMipmapEXT(GLuint texture, GLenum target)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
 	qglGenerateMipmapEXT(target);
@@ -157,47 +157,47 @@ int GL_UseProgram(GLuint program)
 	return 1;
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniform1i(GLuint program, GLint location, GLint v0)
+GLvoid APIENTRY GLDSA_ProgramUniform1iEXT(GLuint program, GLint location, GLint v0)
 {
 	GL_UseProgram(program);
 	qglUniform1i(location, v0);
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniform1f(GLuint program, GLint location, GLfloat v0)
+GLvoid APIENTRY GLDSA_ProgramUniform1fEXT(GLuint program, GLint location, GLfloat v0)
 {
 	GL_UseProgram(program);
 	qglUniform1f(location, v0);
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniform2f(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform2fEXT(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1)
 {
 	GL_UseProgram(program);
 	qglUniform2f(location, v0, v1);
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniform3f(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform3fEXT(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1, GLfloat v2)
 {
 	GL_UseProgram(program);
 	qglUniform3f(location, v0, v1, v2);
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniform4f(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform4fEXT(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
 {
 	GL_UseProgram(program);
 	qglUniform4f(location, v0, v1, v2, v3);
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniform1fv(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform1fvEXT(GLuint program, GLint location,
 	GLsizei count, const GLfloat *value)
 {
 	GL_UseProgram(program);
 	qglUniform1fv(location, count, value);
 }
 
-GLvoid APIENTRY GLDSA_ProgramUniformMatrix4fv(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniformMatrix4fvEXT(GLuint program, GLint location,
 	GLsizei count, GLboolean transpose,
 	const GLfloat *value)
 {
@@ -252,34 +252,34 @@ void GL_BindRenderbuffer(GLuint renderbuffer)
 	}
 }
 
-GLvoid APIENTRY GLDSA_NamedRenderbufferStorage(GLuint renderbuffer,
+GLvoid APIENTRY GLDSA_NamedRenderbufferStorageEXT(GLuint renderbuffer,
 	GLenum internalformat, GLsizei width, GLsizei height)
 {
 	GL_BindRenderbuffer(renderbuffer);
 	qglRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, internalformat, width, height);
 }
 
-GLvoid APIENTRY GLDSA_NamedRenderbufferStorageMultisample(GLuint renderbuffer,
+GLvoid APIENTRY GLDSA_NamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer,
 	GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
 {
 	GL_BindRenderbuffer(renderbuffer);
 	qglRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, internalformat, width, height);
 }
 
-GLenum APIENTRY GLDSA_CheckNamedFramebufferStatus(GLuint framebuffer, GLenum target)
+GLenum APIENTRY GLDSA_CheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target)
 {
 	GL_BindFramebuffer(target, framebuffer);
 	return qglCheckFramebufferStatusEXT(target);
 }
 
-GLvoid APIENTRY GLDSA_NamedFramebufferTexture2D(GLuint framebuffer,
+GLvoid APIENTRY GLDSA_NamedFramebufferTexture2DEXT(GLuint framebuffer,
 	GLenum attachment, GLenum textarget, GLuint texture, GLint level)
 {
 	GL_BindFramebuffer(GL_FRAMEBUFFER_EXT, framebuffer);
 	qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attachment, textarget, texture, level);
 }
 
-GLvoid APIENTRY GLDSA_NamedFramebufferRenderbuffer(GLuint framebuffer,
+GLvoid APIENTRY GLDSA_NamedFramebufferRenderbufferEXT(GLuint framebuffer,
 	GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
 {
 	GL_BindFramebuffer(GL_FRAMEBUFFER_EXT, framebuffer);
diff --git a/SP/code/rend2/tr_dsa.h b/SP/code/rend2/tr_dsa.h
index f57944d..ea9e0ad 100644
--- a/SP/code/rend2/tr_dsa.h
+++ b/SP/code/rend2/tr_dsa.h
@@ -26,37 +26,37 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 void GL_BindNullTextures(void);
 int GL_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture);
 
-GLvoid APIENTRY GLDSA_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture);
-GLvoid APIENTRY GLDSA_TextureParameterf(GLuint texture, GLenum target, GLenum pname, GLfloat param);
-GLvoid APIENTRY GLDSA_TextureParameteri(GLuint texture, GLenum target, GLenum pname, GLint param);
-GLvoid APIENTRY GLDSA_TextureImage2D(GLuint texture, GLenum target, GLint level, GLint internalformat,
+GLvoid APIENTRY GLDSA_BindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture);
+GLvoid APIENTRY GLDSA_TextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param);
+GLvoid APIENTRY GLDSA_TextureParameteriEXT(GLuint texture, GLenum target, GLenum pname, GLint param);
+GLvoid APIENTRY GLDSA_TextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat,
 	GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-GLvoid APIENTRY GLDSA_TextureSubImage2D(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,
+GLvoid APIENTRY GLDSA_TextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,
 	GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
-GLvoid APIENTRY GLDSA_CopyTextureImage2D(GLuint texture, GLenum target, GLint level, GLenum internalformat,
+GLvoid APIENTRY GLDSA_CopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat,
 	GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-GLvoid APIENTRY GLDSA_CompressedTextureImage2D(GLuint texture, GLenum target, GLint level, GLenum internalformat,
+GLvoid APIENTRY GLDSA_CompressedTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat,
 	GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
-GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLint level,
+GLvoid APIENTRY GLDSA_CompressedTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level,
 	GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format,
 	GLsizei imageSize, const GLvoid *data);
 
-GLvoid APIENTRY GLDSA_GenerateTextureMipmap(GLuint texture, GLenum target);
+GLvoid APIENTRY GLDSA_GenerateTextureMipmapEXT(GLuint texture, GLenum target);
 
 void GL_BindNullProgram(void);
 int GL_UseProgram(GLuint program);
 
-GLvoid APIENTRY GLDSA_ProgramUniform1i(GLuint program, GLint location, GLint v0);
-GLvoid APIENTRY GLDSA_ProgramUniform1f(GLuint program, GLint location, GLfloat v0);
-GLvoid APIENTRY GLDSA_ProgramUniform2f(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform1iEXT(GLuint program, GLint location, GLint v0);
+GLvoid APIENTRY GLDSA_ProgramUniform1fEXT(GLuint program, GLint location, GLfloat v0);
+GLvoid APIENTRY GLDSA_ProgramUniform2fEXT(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1);
-GLvoid APIENTRY GLDSA_ProgramUniform3f(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform3fEXT(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1, GLfloat v2);
-GLvoid APIENTRY GLDSA_ProgramUniform4f(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform4fEXT(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-GLvoid APIENTRY GLDSA_ProgramUniform1fv(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniform1fvEXT(GLuint program, GLint location,
 	GLsizei count, const GLfloat *value);
-GLvoid APIENTRY GLDSA_ProgramUniformMatrix4fv(GLuint program, GLint location,
+GLvoid APIENTRY GLDSA_ProgramUniformMatrix4fvEXT(GLuint program, GLint location,
 	GLsizei count, GLboolean transpose,
 	const GLfloat *value);
 
@@ -64,16 +64,16 @@ void GL_BindNullFramebuffers(void);
 void GL_BindFramebuffer(GLenum target, GLuint framebuffer);
 void GL_BindRenderbuffer(GLuint renderbuffer);
 
-GLvoid APIENTRY GLDSA_NamedRenderbufferStorage(GLuint renderbuffer,
+GLvoid APIENTRY GLDSA_NamedRenderbufferStorageEXT(GLuint renderbuffer,
 	GLenum internalformat, GLsizei width, GLsizei height);
 
-GLvoid APIENTRY GLDSA_NamedRenderbufferStorageMultisample(GLuint renderbuffer,
+GLvoid APIENTRY GLDSA_NamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer,
 	GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
 
-GLenum APIENTRY GLDSA_CheckNamedFramebufferStatus(GLuint framebuffer, GLenum target);
-GLvoid APIENTRY GLDSA_NamedFramebufferTexture2D(GLuint framebuffer,
+GLenum APIENTRY GLDSA_CheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target);
+GLvoid APIENTRY GLDSA_NamedFramebufferTexture2DEXT(GLuint framebuffer,
 	GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-GLvoid APIENTRY GLDSA_NamedFramebufferRenderbuffer(GLuint framebuffer,
+GLvoid APIENTRY GLDSA_NamedFramebufferRenderbufferEXT(GLuint framebuffer,
 	GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
 
 
diff --git a/SP/code/rend2/tr_extensions.c b/SP/code/rend2/tr_extensions.c
index 3aa6ecc..602310b 100644
--- a/SP/code/rend2/tr_extensions.c
+++ b/SP/code/rend2/tr_extensions.c
@@ -36,98 +36,13 @@ QGL_1_3_PROCS;
 QGL_1_4_PROCS;
 QGL_1_5_PROCS;
 QGL_2_0_PROCS;
+QGL_EXT_framebuffer_object_PROCS;
+QGL_EXT_framebuffer_blit_PROCS;
+QGL_EXT_framebuffer_multisample_PROCS;
+QGL_ARB_vertex_array_object_PROCS;
+QGL_EXT_direct_state_access_PROCS;
 #undef GLE
 
-// GL_EXT_framebuffer_object
-GLboolean (APIENTRY * qglIsRenderbufferEXT)(GLuint renderbuffer);
-void (APIENTRY * qglBindRenderbufferEXT)(GLenum target, GLuint renderbuffer);
-void (APIENTRY * qglDeleteRenderbuffersEXT)(GLsizei n, const GLuint *renderbuffers);
-void (APIENTRY * qglGenRenderbuffersEXT)(GLsizei n, GLuint *renderbuffers);
-
-void (APIENTRY * qglRenderbufferStorageEXT)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-
-void (APIENTRY * qglGetRenderbufferParameterivEXT)(GLenum target, GLenum pname, GLint *params);
-
-GLboolean (APIENTRY * qglIsFramebufferEXT)(GLuint framebuffer);
-void (APIENTRY * qglBindFramebufferEXT)(GLenum target, GLuint framebuffer);
-void (APIENTRY * qglDeleteFramebuffersEXT)(GLsizei n, const GLuint *framebuffers);
-void (APIENTRY * qglGenFramebuffersEXT)(GLsizei n, GLuint *framebuffers);
-
-GLenum (APIENTRY * qglCheckFramebufferStatusEXT)(GLenum target);
-
-void (APIENTRY * qglFramebufferTexture1DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
-	GLint level);
-void (APIENTRY * qglFramebufferTexture2DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
-	GLint level);
-void (APIENTRY * qglFramebufferTexture3DEXT)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
-	GLint level, GLint zoffset);
-
-void (APIENTRY * qglFramebufferRenderbufferEXT)(GLenum target, GLenum attachment, GLenum renderbuffertarget,
-	GLuint renderbuffer);
-
-void (APIENTRY * qglGetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint *params);
-
-void (APIENTRY * qglGenerateMipmapEXT)(GLenum target);
-
-// GL_EXT_framebuffer_blit
-void (APIENTRY * qglBlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
-                            GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
-                            GLbitfield mask, GLenum filter);
-
-// GL_EXT_framebuffer_multisample
-void (APIENTRY * qglRenderbufferStorageMultisampleEXT)(GLenum target, GLsizei samples,
-	GLenum internalformat, GLsizei width, GLsizei height);
-
-// GL_ARB_vertex_array_object
-void (APIENTRY * qglBindVertexArrayARB)(GLuint array);
-void (APIENTRY * qglDeleteVertexArraysARB)(GLsizei n, const GLuint *arrays);
-void (APIENTRY * qglGenVertexArraysARB)(GLsizei n, GLuint *arrays);
-GLboolean (APIENTRY * qglIsVertexArrayARB)(GLuint array);
-
-// GL_EXT_direct_state_access
-GLvoid (APIENTRY * qglBindMultiTexture)(GLenum texunit, GLenum target, GLuint texture);
-GLvoid (APIENTRY * qglTextureParameterf)(GLuint texture, GLenum target, GLenum pname, GLfloat param);
-GLvoid (APIENTRY * qglTextureParameteri)(GLuint texture, GLenum target, GLenum pname, GLint param);
-GLvoid (APIENTRY * qglTextureImage2D)(GLuint texture, GLenum target, GLint level, GLint internalformat,
-	GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-GLvoid (APIENTRY * qglTextureSubImage2D)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset,
-	GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
-GLvoid (APIENTRY * qglCopyTextureImage2D)(GLuint texture, GLenum target, GLint level, GLenum internalformat,
-	GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-GLvoid (APIENTRY * qglCompressedTextureImage2D)(GLuint texture, GLenum target, GLint level, GLenum internalformat,
-	GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
-GLvoid (APIENTRY * qglCompressedTextureSubImage2D)(GLuint texture, GLenum target, GLint level,
-	GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format,
-	GLsizei imageSize, const GLvoid *data);
-GLvoid (APIENTRY * qglGenerateTextureMipmap)(GLuint texture, GLenum target);
-
-GLvoid(APIENTRY * qglProgramUniform1i)(GLuint program, GLint location, GLint v0);
-GLvoid(APIENTRY * qglProgramUniform1f)(GLuint program, GLint location, GLfloat v0);
-GLvoid(APIENTRY * qglProgramUniform2f)(GLuint program, GLint location,
-	GLfloat v0, GLfloat v1);
-GLvoid(APIENTRY * qglProgramUniform3f)(GLuint program, GLint location,
-	GLfloat v0, GLfloat v1, GLfloat v2);
-GLvoid(APIENTRY * qglProgramUniform4f)(GLuint program, GLint location,
-	GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-GLvoid(APIENTRY * qglProgramUniform1fv)(GLuint program, GLint location,
-	GLsizei count, const GLfloat *value);
-GLvoid(APIENTRY * qglProgramUniformMatrix4fv)(GLuint program, GLint location,
-	GLsizei count, GLboolean transpose,
-	const GLfloat *value);
-
-GLvoid(APIENTRY * qglNamedRenderbufferStorage)(GLuint renderbuffer,
-	GLenum internalformat, GLsizei width, GLsizei height);
-
-GLvoid(APIENTRY * qglNamedRenderbufferStorageMultisample)(GLuint renderbuffer,
-	GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-
-GLenum(APIENTRY * qglCheckNamedFramebufferStatus)(GLuint framebuffer, GLenum target);
-GLvoid(APIENTRY * qglNamedFramebufferTexture2D)(GLuint framebuffer,
-	GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-GLvoid(APIENTRY * qglNamedFramebufferRenderbuffer)(GLuint framebuffer,
-	GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-
-
 static qboolean GLimp_HaveExtension(const char *ext)
 {
 	const char *ptr = Q_stristr( (char *)qglGetString(GL_EXTENSIONS), ext );
@@ -142,18 +57,23 @@ void GLimp_InitExtraExtensions()
 	char *extension;
 	const char* result[3] = { "...ignoring %s\n", "...using %s\n", "...%s not found\n" };
 
+	// Check OpenGL version
 	sscanf(glConfig.version_string, "%d.%d", &glRefConfig.openglMajorVersion, &glRefConfig.openglMinorVersion);
 	if (glRefConfig.openglMajorVersion < 2)
 		ri.Error(ERR_FATAL, "OpenGL 2.0 required!");
 	ri.Printf(PRINT_ALL, "...using OpenGL %s\n", glConfig.version_string);
 
-	// GL function loader, based on https://gist.github.com/rygorous/16796a0c876cf8a5f542caddb55bce8a
+	// set DSA fallbacks
+#define GLE(ret, name, ...) qgl##name = GLDSA_##name;
+	QGL_EXT_direct_state_access_PROCS;
+#undef GLE
 
+	// GL function loader, based on https://gist.github.com/rygorous/16796a0c876cf8a5f542caddb55bce8a
 #define GLE(ret, name, ...) qgl##name = (name##proc *) SDL_GL_GetProcAddress("gl" #name);
 
 	// OpenGL 1.2, was GL_EXT_draw_range_elements
 	QGL_1_2_PROCS;
-	glRefConfig.drawRangeElements = r_ext_draw_range_elements->integer ? qtrue : qfalse;
+	glRefConfig.drawRangeElements = !!r_ext_draw_range_elements->integer;
 	ri.Printf(PRINT_ALL, result[glRefConfig.drawRangeElements], "glDrawRangeElements()");
 
 	// OpenGL 1.3, was GL_ARB_texture_compression
@@ -161,8 +81,8 @@ void GLimp_InitExtraExtensions()
 
 	// OpenGL 1.4, was GL_EXT_multi_draw_arrays
 	QGL_1_4_PROCS;
-	glRefConfig.drawRangeElements = r_ext_multi_draw_arrays->integer ? qtrue : qfalse;
-	ri.Printf(PRINT_ALL, result[glRefConfig.drawRangeElements], "glMultiDrawElements()");
+	glRefConfig.multiDrawArrays = !!r_ext_multi_draw_arrays->integer;
+	ri.Printf(PRINT_ALL, result[glRefConfig.multiDrawArrays], "glMultiDrawElements()");
 
 	// OpenGL 1.5, was GL_ARB_vertex_buffer_object and GL_ARB_occlusion_query
 	QGL_1_5_PROCS;
@@ -171,8 +91,7 @@ void GLimp_InitExtraExtensions()
 	// OpenGL 2.0, was GL_ARB_shading_language_100, GL_ARB_vertex_program, GL_ARB_shader_objects, and GL_ARB_vertex_shader
 	QGL_2_0_PROCS;
 
-#undef GLE
-
+	// Determine GLSL version
 	if (1)
 	{
 		char version[256];
@@ -186,23 +105,45 @@ void GLimp_InitExtraExtensions()
 
 	glRefConfig.memInfo = MI_NONE;
 
-	if( GLimp_HaveExtension( "GL_NVX_gpu_memory_info" ) )
+	// GL_NVX_gpu_memory_info
+	extension = "GL_NVX_gpu_memory_info";
+	if( GLimp_HaveExtension( extension ) )
 	{
 		glRefConfig.memInfo = MI_NVX;
+
+		ri.Printf(PRINT_ALL, result[1], extension);
 	}
-	else if( GLimp_HaveExtension( "GL_ATI_meminfo" ) )
+	else
 	{
-		glRefConfig.memInfo = MI_ATI;
+		ri.Printf(PRINT_ALL, result[2], extension);
 	}
 
-	extension = "GL_ARB_texture_non_power_of_two";
-	glRefConfig.textureNonPowerOfTwo = qfalse;
+	// GL_ATI_meminfo
+	extension = "GL_ATI_meminfo";
 	if( GLimp_HaveExtension( extension ) )
 	{
-		if(1) //(r_ext_texture_non_power_of_two->integer)
+		if (glRefConfig.memInfo == MI_NONE)
+		{
+			glRefConfig.memInfo = MI_ATI;
+
+			ri.Printf(PRINT_ALL, result[1], extension);
+		}
+		else
 		{
-			glRefConfig.textureNonPowerOfTwo = qtrue;
+			ri.Printf(PRINT_ALL, result[0], extension);
 		}
+	}
+	else
+	{
+		ri.Printf(PRINT_ALL, result[2], extension);
+	}
+
+	// GL_ARB_texture_non_power_of_two
+	extension = "GL_ARB_texture_non_power_of_two";
+	glRefConfig.textureNonPowerOfTwo = qfalse;
+	if( GLimp_HaveExtension( extension ) )
+	{
+		glRefConfig.textureNonPowerOfTwo = qtrue; // !!r_ext_texture_non_power_of_two->integer
 
 		ri.Printf(PRINT_ALL, result[glRefConfig.textureNonPowerOfTwo], extension);
 	}
@@ -216,10 +157,7 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.textureFloat = qfalse;
 	if( GLimp_HaveExtension( extension ) )
 	{
-		if( r_ext_texture_float->integer )
-		{
-			glRefConfig.textureFloat = qtrue;
-		}
+		glRefConfig.textureFloat = !!r_ext_texture_float->integer;
 
 		ri.Printf(PRINT_ALL, result[glRefConfig.textureFloat], extension);
 	}
@@ -233,8 +171,7 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.halfFloatPixel = qfalse;
 	if( GLimp_HaveExtension( extension ) )
 	{
-		if( r_arb_half_float_pixel->integer )
-			glRefConfig.halfFloatPixel = qtrue;
+		glRefConfig.halfFloatPixel = !!r_arb_half_float_pixel->integer;
 
 		ri.Printf(PRINT_ALL, result[glRefConfig.halfFloatPixel], extension);
 	}
@@ -248,29 +185,12 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.framebufferObject = qfalse;
 	if( GLimp_HaveExtension( extension ) )
 	{
+		glRefConfig.framebufferObject = !!r_ext_framebuffer_object->integer;
+
 		glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &glRefConfig.maxRenderbufferSize);
 		glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &glRefConfig.maxColorAttachments);
 
-		qglIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) SDL_GL_GetProcAddress("glIsRenderbufferEXT");
-		qglBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) SDL_GL_GetProcAddress("glBindRenderbufferEXT");
-		qglDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) SDL_GL_GetProcAddress("glDeleteRenderbuffersEXT");
-		qglGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) SDL_GL_GetProcAddress("glGenRenderbuffersEXT");
-		qglRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) SDL_GL_GetProcAddress("glRenderbufferStorageEXT");
-		qglGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) SDL_GL_GetProcAddress("glGetRenderbufferParameterivEXT");
-		qglIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) SDL_GL_GetProcAddress("glIsFramebufferEXT");
-		qglBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) SDL_GL_GetProcAddress("glBindFramebufferEXT");
-		qglDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) SDL_GL_GetProcAddress("glDeleteFramebuffersEXT");
-		qglGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) SDL_GL_GetProcAddress("glGenFramebuffersEXT");
-		qglCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) SDL_GL_GetProcAddress("glCheckFramebufferStatusEXT");
-		qglFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) SDL_GL_GetProcAddress("glFramebufferTexture1DEXT");
-		qglFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) SDL_GL_GetProcAddress("glFramebufferTexture2DEXT");
-		qglFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) SDL_GL_GetProcAddress("glFramebufferTexture3DEXT");
-		qglFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) SDL_GL_GetProcAddress("glFramebufferRenderbufferEXT");
-		qglGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) SDL_GL_GetProcAddress("glGetFramebufferAttachmentParameterivEXT");
-		qglGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) SDL_GL_GetProcAddress("glGenerateMipmapEXT");
-
-		if(r_ext_framebuffer_object->value)
-			glRefConfig.framebufferObject = qtrue;
+		QGL_EXT_framebuffer_object_PROCS;
 
 		ri.Printf(PRINT_ALL, result[glRefConfig.framebufferObject], extension);
 	}
@@ -279,26 +199,15 @@ void GLimp_InitExtraExtensions()
 		ri.Printf(PRINT_ALL, result[2], extension);
 	}
 
-	// GL_EXT_packed_depth_stencil
-	extension = "GL_EXT_packed_depth_stencil";
-	glRefConfig.packedDepthStencil = qfalse;
-	if( GLimp_HaveExtension(extension))
-	{
-		glRefConfig.packedDepthStencil = qtrue;
-		ri.Printf(PRINT_ALL, result[glRefConfig.packedDepthStencil], extension);
-	}
-	else
-	{
-		ri.Printf(PRINT_ALL, result[2], extension);
-	}
-
 	// GL_EXT_framebuffer_blit
 	extension = "GL_EXT_framebuffer_blit";
 	glRefConfig.framebufferBlit = qfalse;
 	if (GLimp_HaveExtension(extension))
 	{
-		qglBlitFramebufferEXT = (void *)SDL_GL_GetProcAddress("glBlitFramebufferEXT");
 		glRefConfig.framebufferBlit = qtrue;
+
+		QGL_EXT_framebuffer_blit_PROCS;
+
 		ri.Printf(PRINT_ALL, result[glRefConfig.framebufferBlit], extension);
 	}
 	else
@@ -311,8 +220,10 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.framebufferMultisample = qfalse;
 	if (GLimp_HaveExtension(extension))
 	{
-		qglRenderbufferStorageMultisampleEXT = (void *)SDL_GL_GetProcAddress("glRenderbufferStorageMultisampleEXT");
 		glRefConfig.framebufferMultisample = qtrue;
+
+		QGL_EXT_framebuffer_multisample_PROCS;
+
 		ri.Printf(PRINT_ALL, result[glRefConfig.framebufferMultisample], extension);
 	}
 	else
@@ -326,10 +237,12 @@ void GLimp_InitExtraExtensions()
 	extension = "GL_ARB_texture_compression_rgtc";
 	if (GLimp_HaveExtension(extension))
 	{
-		if (r_ext_compressed_textures->integer)
+		qboolean useRgtc = r_ext_compressed_textures->integer >= 1;
+
+		if (useRgtc)
 			glRefConfig.textureCompression |= TCR_RGTC;
 
-		ri.Printf(PRINT_ALL, result[r_ext_compressed_textures->integer ? 1 : 0], extension);
+		ri.Printf(PRINT_ALL, result[useRgtc], extension);
 	}
 	else
 	{
@@ -342,10 +255,12 @@ void GLimp_InitExtraExtensions()
 	extension = "GL_ARB_texture_compression_bptc";
 	if (GLimp_HaveExtension(extension))
 	{
-		if (r_ext_compressed_textures->integer >= 2)
+		qboolean useBptc = r_ext_compressed_textures->integer >= 2;
+
+		if (useBptc)
 			glRefConfig.textureCompression |= TCR_BPTC;
 
-		ri.Printf(PRINT_ALL, result[(r_ext_compressed_textures->integer >= 2) ? 1 : 0], extension);
+		ri.Printf(PRINT_ALL, result[useBptc], extension);
 	}
 	else
 	{
@@ -358,7 +273,8 @@ void GLimp_InitExtraExtensions()
 	if( GLimp_HaveExtension( extension ) )
 	{
 		glRefConfig.depthClamp = qtrue;
-		ri.Printf(PRINT_ALL, result[1], extension);
+
+		ri.Printf(PRINT_ALL, result[glRefConfig.depthClamp], extension);
 	}
 	else
 	{
@@ -370,8 +286,7 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.seamlessCubeMap = qfalse;
 	if( GLimp_HaveExtension( extension ) )
 	{
-		if (r_arb_seamless_cube_map->integer)
-			glRefConfig.seamlessCubeMap = qtrue;
+		glRefConfig.seamlessCubeMap = !!r_arb_seamless_cube_map->integer;
 
 		ri.Printf(PRINT_ALL, result[glRefConfig.seamlessCubeMap], extension);
 	}
@@ -385,10 +300,12 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.packedNormalDataType = GL_BYTE;
 	if( GLimp_HaveExtension( extension ) )
 	{
-		if (r_arb_vertex_type_2_10_10_10_rev->integer)
+		qboolean useExt = !!r_arb_vertex_type_2_10_10_10_rev->integer;
+
+		if (useExt)
 			glRefConfig.packedNormalDataType = GL_INT_2_10_10_10_REV;
 
-		ri.Printf(PRINT_ALL, result[r_arb_vertex_type_2_10_10_10_rev->integer ? 1 : 0], extension);
+		ri.Printf(PRINT_ALL, result[useExt], extension);
 	}
 	else
 	{
@@ -403,15 +320,11 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.vertexArrayObject = qfalse;
 	if( GLimp_HaveExtension( extension ) )
 	{
-		qglBindVertexArrayARB = (void *) SDL_GL_GetProcAddress("glBindVertexArray");
-		qglDeleteVertexArraysARB = (void *) SDL_GL_GetProcAddress("glDeleteVertexArrays");
-		qglGenVertexArraysARB = (void *) SDL_GL_GetProcAddress("glGenVertexArrays");
-		qglIsVertexArrayARB = (void *) SDL_GL_GetProcAddress("glIsVertexArray");
+		glRefConfig.vertexArrayObject = !!r_arb_vertex_array_object->integer;
 
-		if (r_arb_vertex_array_object->integer)
-			glRefConfig.vertexArrayObject = qtrue;
+		QGL_ARB_vertex_array_object_PROCS;
 
-		ri.Printf(PRINT_ALL, result[glRefConfig.vertexArrayObject ? 1 : 0], extension);
+		ri.Printf(PRINT_ALL, result[glRefConfig.vertexArrayObject], extension);
 	}
 	else
 	{
@@ -426,7 +339,9 @@ void GLimp_InitExtraExtensions()
 	glRefConfig.packedColorDataSize    = sizeof(float) * 4;
 	if( GLimp_HaveExtension( extension ) )
 	{
-		if (r_arb_half_float_vertex->integer)
+		qboolean useExt = !!r_arb_half_float_vertex->integer;
+
+		if (useExt)
 		{
 			glRefConfig.packedTexcoordDataType = GL_HALF_FLOAT;
 			glRefConfig.packedTexcoordDataSize = sizeof(uint16_t) * 2;
@@ -434,7 +349,7 @@ void GLimp_InitExtraExtensions()
 			glRefConfig.packedColorDataSize    = sizeof(uint16_t) * 4;
 		}
 
-		ri.Printf(PRINT_ALL, result[r_arb_half_float_vertex->integer ? 1 : 0], extension);
+		ri.Printf(PRINT_ALL, result[useExt], extension);
 	}
 	else
 	{
@@ -443,66 +358,23 @@ void GLimp_InitExtraExtensions()
 
 	// GL_EXT_direct_state_access
 	extension = "GL_EXT_direct_state_access";
-
-	qglBindMultiTexture = GLDSA_BindMultiTexture;
-	qglTextureParameterf = GLDSA_TextureParameterf;
-	qglTextureParameteri = GLDSA_TextureParameteri;
-	qglTextureImage2D = GLDSA_TextureImage2D;
-	qglTextureSubImage2D = GLDSA_TextureSubImage2D;
-	qglCopyTextureImage2D = GLDSA_CopyTextureImage2D;
-	qglCompressedTextureImage2D = GLDSA_CompressedTextureImage2D;
-	qglCompressedTextureSubImage2D = GLDSA_CompressedTextureSubImage2D;
-	qglGenerateTextureMipmap = GLDSA_GenerateTextureMipmap;
-
-	qglProgramUniform1i = GLDSA_ProgramUniform1i;
-	qglProgramUniform1f = GLDSA_ProgramUniform1f;
-	qglProgramUniform2f = GLDSA_ProgramUniform2f;
-	qglProgramUniform3f = GLDSA_ProgramUniform3f;
-	qglProgramUniform4f = GLDSA_ProgramUniform4f;
-	qglProgramUniform1fv = GLDSA_ProgramUniform1fv;
-	qglProgramUniformMatrix4fv = GLDSA_ProgramUniformMatrix4fv;
-
-	qglNamedRenderbufferStorage = GLDSA_NamedRenderbufferStorage;
-	qglNamedRenderbufferStorageMultisample = GLDSA_NamedRenderbufferStorageMultisample;
-	qglCheckNamedFramebufferStatus = GLDSA_CheckNamedFramebufferStatus;
-	qglNamedFramebufferTexture2D = GLDSA_NamedFramebufferTexture2D;
-	qglNamedFramebufferRenderbuffer = GLDSA_NamedFramebufferRenderbuffer;
-
 	glRefConfig.directStateAccess = qfalse;
 	if (GLimp_HaveExtension(extension))
 	{
-		if (r_ext_direct_state_access->integer)
+		glRefConfig.directStateAccess = !!r_ext_direct_state_access->integer;
+
+		// QGL_*_PROCS becomes several functions, do not remove {}
+		if (glRefConfig.directStateAccess)
 		{
-			glRefConfig.directStateAccess = qtrue;
-			qglBindMultiTexture = (void *)SDL_GL_GetProcAddress("glBindMultiTextureEXT");
-			qglTextureParameterf = (void *)SDL_GL_GetProcAddress("glTextureParameterfEXT");
-			qglTextureParameteri = (void *)SDL_GL_GetProcAddress("glTextureParameteriEXT");
-			qglTextureImage2D = (void *)SDL_GL_GetProcAddress("glTextureImage2DEXT");
-			qglTextureSubImage2D = (void *)SDL_GL_GetProcAddress("glTextureSubImage2DEXT");
-			qglCopyTextureImage2D = (void *)SDL_GL_GetProcAddress("glCopyTextureImage2DEXT");
-			qglCompressedTextureImage2D = (void *)SDL_GL_GetProcAddress("glCompressedTextureImage2DEXT");
-			qglCompressedTextureSubImage2D = (void *)SDL_GL_GetProcAddress("glCompressedTextureSubImage2DEXT");
-			qglGenerateTextureMipmap = (void *)SDL_GL_GetProcAddress("glGenerateTextureMipmapEXT");
-
-			qglProgramUniform1i = (void *)SDL_GL_GetProcAddress("glProgramUniform1iEXT");
-			qglProgramUniform1f = (void *)SDL_GL_GetProcAddress("glProgramUniform1fEXT");
-			qglProgramUniform2f = (void *)SDL_GL_GetProcAddress("glProgramUniform2fEXT");
-			qglProgramUniform3f = (void *)SDL_GL_GetProcAddress("glProgramUniform3fEXT");
-			qglProgramUniform4f = (void *)SDL_GL_GetProcAddress("glProgramUniform4fEXT");
-			qglProgramUniform1fv = (void *)SDL_GL_GetProcAddress("glProgramUniform1fvEXT");
-			qglProgramUniformMatrix4fv = (void *)SDL_GL_GetProcAddress("glProgramUniformMatrix4fvEXT");
-
-			qglNamedRenderbufferStorage = (void *)SDL_GL_GetProcAddress("glNamedRenderbufferStorageEXT");
-			qglNamedRenderbufferStorageMultisample = (void *)SDL_GL_GetProcAddress("glNamedRenderbufferStorageMultisampleEXT");
-			qglCheckNamedFramebufferStatus = (void *)SDL_GL_GetProcAddress("glCheckNamedFramebufferStatusEXT");
-			qglNamedFramebufferTexture2D = (void *)SDL_GL_GetProcAddress("glNamedFramebufferTexture2DEXT");
-			qglNamedFramebufferRenderbuffer = (void *)SDL_GL_GetProcAddress("glNamedFramebufferRenderbufferEXT");
+			QGL_EXT_direct_state_access_PROCS;
 		}
 
-		ri.Printf(PRINT_ALL, result[glRefConfig.directStateAccess ? 1 : 0], extension);
+		ri.Printf(PRINT_ALL, result[glRefConfig.directStateAccess], extension);
 	}
 	else
 	{
 		ri.Printf(PRINT_ALL, result[2], extension);
 	}
+
+#undef GLE
 }
diff --git a/SP/code/rend2/tr_fbo.c b/SP/code/rend2/tr_fbo.c
index 9ba6344..41cfdd7 100644
--- a/SP/code/rend2/tr_fbo.c
+++ b/SP/code/rend2/tr_fbo.c
@@ -32,7 +32,7 @@ R_CheckFBO
 */
 qboolean R_CheckFBO(const FBO_t * fbo)
 {
-	GLenum code = qglCheckNamedFramebufferStatus(fbo->frameBuffer, GL_FRAMEBUFFER_EXT);
+	GLenum code = qglCheckNamedFramebufferStatusEXT(fbo->frameBuffer, GL_FRAMEBUFFER_EXT);
 
 	if(code == GL_FRAMEBUFFER_COMPLETE_EXT)
 		return qtrue;
@@ -184,20 +184,20 @@ void FBO_CreateBuffer(FBO_t *fbo, int format, int index, int multisample)
 		qglGenRenderbuffersEXT(1, pRenderBuffer);
 
 	if (multisample && glRefConfig.framebufferMultisample)
-		qglNamedRenderbufferStorageMultisample(*pRenderBuffer, multisample, format, fbo->width, fbo->height);
+		qglNamedRenderbufferStorageMultisampleEXT(*pRenderBuffer, multisample, format, fbo->width, fbo->height);
 	else
-		qglNamedRenderbufferStorage(*pRenderBuffer, format, fbo->width, fbo->height);
+		qglNamedRenderbufferStorageEXT(*pRenderBuffer, format, fbo->width, fbo->height);
 
 	if(absent)
 	{
 		if (attachment == 0)
 		{
-			qglNamedFramebufferRenderbuffer(fbo->frameBuffer, GL_DEPTH_ATTACHMENT_EXT,   GL_RENDERBUFFER_EXT, *pRenderBuffer);
-			qglNamedFramebufferRenderbuffer(fbo->frameBuffer, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, *pRenderBuffer);
+			qglNamedFramebufferRenderbufferEXT(fbo->frameBuffer, GL_DEPTH_ATTACHMENT_EXT,   GL_RENDERBUFFER_EXT, *pRenderBuffer);
+			qglNamedFramebufferRenderbufferEXT(fbo->frameBuffer, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, *pRenderBuffer);
 		}
 		else
 		{
-			qglNamedFramebufferRenderbuffer(fbo->frameBuffer, attachment, GL_RENDERBUFFER_EXT, *pRenderBuffer);
+			qglNamedFramebufferRenderbufferEXT(fbo->frameBuffer, attachment, GL_RENDERBUFFER_EXT, *pRenderBuffer);
 		}
 	}
 }
@@ -216,7 +216,7 @@ void FBO_AttachImage(FBO_t *fbo, image_t *image, GLenum attachment, GLuint cubem
 	if (image->flags & IMGFLAG_CUBEMAP)
 		target = GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + cubemapside;
 
-	qglNamedFramebufferTexture2D(fbo->frameBuffer, attachment, target, image->texnum, 0);
+	qglNamedFramebufferTexture2DEXT(fbo->frameBuffer, attachment, target, image->texnum, 0);
 	index = attachment - GL_COLOR_ATTACHMENT0_EXT;
 	if (index >= 0 && index <= 15)
 		fbo->colorImage[index] = image;
diff --git a/SP/code/rend2/tr_glsl.c b/SP/code/rend2/tr_glsl.c
index 318853a..07e3d94 100644
--- a/SP/code/rend2/tr_glsl.c
+++ b/SP/code/rend2/tr_glsl.c
@@ -707,7 +707,7 @@ void GLSL_SetUniformInt(shaderProgram_t *program, int uniformNum, GLint value)
 
 	*compare = value;
 
-	qglProgramUniform1i(program->program, uniforms[uniformNum], value);
+	qglProgramUniform1iEXT(program->program, uniforms[uniformNum], value);
 }
 
 void GLSL_SetUniformFloat(shaderProgram_t *program, int uniformNum, GLfloat value)
@@ -731,7 +731,7 @@ void GLSL_SetUniformFloat(shaderProgram_t *program, int uniformNum, GLfloat valu
 
 	*compare = value;
 	
-	qglProgramUniform1f(program->program, uniforms[uniformNum], value);
+	qglProgramUniform1fEXT(program->program, uniforms[uniformNum], value);
 }
 
 void GLSL_SetUniformVec2(shaderProgram_t *program, int uniformNum, const vec2_t v)
@@ -756,7 +756,7 @@ void GLSL_SetUniformVec2(shaderProgram_t *program, int uniformNum, const vec2_t
 	compare[0] = v[0];
 	compare[1] = v[1];
 
-	qglProgramUniform2f(program->program, uniforms[uniformNum], v[0], v[1]);
+	qglProgramUniform2fEXT(program->program, uniforms[uniformNum], v[0], v[1]);
 }
 
 void GLSL_SetUniformVec3(shaderProgram_t *program, int uniformNum, const vec3_t v)
@@ -780,7 +780,7 @@ void GLSL_SetUniformVec3(shaderProgram_t *program, int uniformNum, const vec3_t
 
 	VectorCopy(v, compare);
 
-	qglProgramUniform3f(program->program, uniforms[uniformNum], v[0], v[1], v[2]);
+	qglProgramUniform3fEXT(program->program, uniforms[uniformNum], v[0], v[1], v[2]);
 }
 
 void GLSL_SetUniformVec4(shaderProgram_t *program, int uniformNum, const vec4_t v)
@@ -804,7 +804,7 @@ void GLSL_SetUniformVec4(shaderProgram_t *program, int uniformNum, const vec4_t
 
 	VectorCopy4(v, compare);
 
-	qglProgramUniform4f(program->program, uniforms[uniformNum], v[0], v[1], v[2], v[3]);
+	qglProgramUniform4fEXT(program->program, uniforms[uniformNum], v[0], v[1], v[2], v[3]);
 }
 
 void GLSL_SetUniformFloat5(shaderProgram_t *program, int uniformNum, const vec5_t v)
@@ -828,7 +828,7 @@ void GLSL_SetUniformFloat5(shaderProgram_t *program, int uniformNum, const vec5_
 
 	VectorCopy5(v, compare);
 
-	qglProgramUniform1fv(program->program, uniforms[uniformNum], 5, v);
+	qglProgramUniform1fvEXT(program->program, uniforms[uniformNum], 5, v);
 }
 
 void GLSL_SetUniformMat4(shaderProgram_t *program, int uniformNum, const mat4_t matrix)
@@ -852,7 +852,7 @@ void GLSL_SetUniformMat4(shaderProgram_t *program, int uniformNum, const mat4_t
 
 	Mat4Copy(matrix, compare);
 
-	qglProgramUniformMatrix4fv(program->program, uniforms[uniformNum], 1, GL_FALSE, matrix);
+	qglProgramUniformMatrix4fvEXT(program->program, uniforms[uniformNum], 1, GL_FALSE, matrix);
 }
 
 void GLSL_DeleteGPUShader(shaderProgram_t *program)
diff --git a/SP/code/rend2/tr_image.c b/SP/code/rend2/tr_image.c
index 65a4f92..9fd2fb5 100644
--- a/SP/code/rend2/tr_image.c
+++ b/SP/code/rend2/tr_image.c
@@ -134,8 +134,8 @@ void GL_TextureMode( const char *string ) {
 	for ( i = 0 ; i < tr.numImages ; i++ ) {
 		glt = tr.images[ i ];
 		if ( glt->flags & IMGFLAG_MIPMAP && !(glt->flags & IMGFLAG_CUBEMAP) ) {
-			qglTextureParameterf(glt->texnum, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min);
-			qglTextureParameterf(glt->texnum, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max);
+			qglTextureParameterfEXT(glt->texnum, GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min);
+			qglTextureParameterfEXT(glt->texnum, GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max);
 		}
 	}
 }
@@ -2014,7 +2014,7 @@ static void RawImage_UploadToRgtc2Texture(GLuint texture, byte *data, int width,
 		}
 	}
 
-	qglCompressedTextureImage2D(texture, GL_TEXTURE_2D, mip, GL_COMPRESSED_RG_RGTC2, width, height, 0, size, compressedData);
+	qglCompressedTextureImage2DEXT(texture, GL_TEXTURE_2D, mip, GL_COMPRESSED_RG_RGTC2, width, height, 0, size, compressedData);
 
 	ri.Hunk_FreeTempMemory(compressedData);
 }
@@ -2093,7 +2093,7 @@ static void RawImage_UploadTexture(GLuint texture, byte *data, int x, int y, int
 		do
 		{
 			lastMip = (width == 1 && height == 1) || !mipmap;
-			qglTextureImage2D(texture, target, miplevel, internalFormat, width, height, 0, dataFormat, dataType, NULL);
+			qglTextureImage2DEXT(texture, target, miplevel, internalFormat, width, height, 0, dataFormat, dataType, NULL);
 
 			width = MAX(1, width >> 1);
 			height = MAX(1, height >> 1);
@@ -2126,9 +2126,9 @@ static void RawImage_UploadTexture(GLuint texture, byte *data, int x, int y, int
 		if (compressed)
 		{
 			if (subtexture)
-				qglCompressedTextureSubImage2D(texture, target, miplevel, x, y, width, height, picFormat, size, data);
+				qglCompressedTextureSubImage2DEXT(texture, target, miplevel, x, y, width, height, picFormat, size, data);
 			else
-				qglCompressedTextureImage2D(texture, target, miplevel, picFormat, width, height, 0, size, data);
+				qglCompressedTextureImage2DEXT(texture, target, miplevel, picFormat, width, height, 0, size, data);
 		}
 		else
 		{
@@ -2138,9 +2138,9 @@ static void RawImage_UploadTexture(GLuint texture, byte *data, int x, int y, int
 			if (rgtc)
 				RawImage_UploadToRgtc2Texture(texture, data, width, height, miplevel);
 			else if (subtexture)
-				qglTextureSubImage2D(texture, target, miplevel, x, y, width, height, dataFormat, dataType, data);
+				qglTextureSubImage2DEXT(texture, target, miplevel, x, y, width, height, dataFormat, dataType, data);
 			else
-				qglTextureImage2D(texture, target, miplevel, internalFormat, width, height, 0, dataFormat, dataType, data);
+				qglTextureImage2DEXT(texture, target, miplevel, internalFormat, width, height, 0, dataFormat, dataType, data);
 
 			if (!lastMip && numMips < 2)
 			{
@@ -2280,19 +2280,19 @@ done:
 	if (mipmap)
 	{
 		if (textureFilterAnisotropic && !cubemap)
-			qglTextureParameteri(image->texnum, textureTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+			qglTextureParameteriEXT(image->texnum, textureTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT,
 			(GLint)Com_Clamp(1, maxAnisotropy, r_ext_max_anisotropy->integer));
 
-		qglTextureParameterf(image->texnum, textureTarget, GL_TEXTURE_MIN_FILTER, gl_filter_min);
-		qglTextureParameterf(image->texnum, textureTarget, GL_TEXTURE_MAG_FILTER, gl_filter_max);
+		qglTextureParameterfEXT(image->texnum, textureTarget, GL_TEXTURE_MIN_FILTER, gl_filter_min);
+		qglTextureParameterfEXT(image->texnum, textureTarget, GL_TEXTURE_MAG_FILTER, gl_filter_max);
 	}
 	else
 	{
 		if (textureFilterAnisotropic && !cubemap)
-			qglTextureParameteri(image->texnum, textureTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
+			qglTextureParameteriEXT(image->texnum, textureTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
 
-		qglTextureParameterf(image->texnum, textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-		qglTextureParameterf(image->texnum, textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+		qglTextureParameterfEXT(image->texnum, textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+		qglTextureParameterfEXT(image->texnum, textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 	}
 
 	// Fix for sampling depth buffer on old nVidia cards
@@ -2303,9 +2303,9 @@ done:
 		case GL_DEPTH_COMPONENT16_ARB:
 		case GL_DEPTH_COMPONENT24_ARB:
 		case GL_DEPTH_COMPONENT32_ARB:
-			qglTextureParameterf(image->texnum, textureTarget, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
-			qglTextureParameterf(image->texnum, textureTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-			qglTextureParameterf(image->texnum, textureTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+			qglTextureParameterfEXT(image->texnum, textureTarget, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
+			qglTextureParameterfEXT(image->texnum, textureTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+			qglTextureParameterfEXT(image->texnum, textureTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 			break;
 		default:
 			break;
@@ -2369,14 +2369,14 @@ image_t *R_CreateImageExt2( const char *name, byte *pic, int width, int height,
 
 	if (image->flags & IMGFLAG_CUBEMAP)
 	{
-		qglTextureParameterf(image->texnum, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, glWrapClampMode);
-		qglTextureParameterf(image->texnum, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, glWrapClampMode);
-		qglTextureParameteri(image->texnum, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, glWrapClampMode);
+		qglTextureParameterfEXT(image->texnum, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, glWrapClampMode);
+		qglTextureParameterfEXT(image->texnum, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, glWrapClampMode);
+		qglTextureParameteriEXT(image->texnum, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, glWrapClampMode);
 	}
 	else
 	{
-		qglTextureParameterf(image->texnum, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, glWrapClampMode);
-		qglTextureParameterf(image->texnum, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, glWrapClampMode);
+		qglTextureParameterfEXT(image->texnum, GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, glWrapClampMode);
+		qglTextureParameterfEXT(image->texnum, GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, glWrapClampMode);
 	}
 
 	hash = generateHashValue( name );
@@ -2945,11 +2945,8 @@ void R_CreateBuiltinImages( void ) {
 		if (r_drawSunRays->integer)
 			tr.sunRaysImage = R_CreateImage("*sunRays", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, rgbFormat);
 
-		if (glRefConfig.framebufferObject)
-		{
-			tr.renderDepthImage  = R_CreateImage("*renderdepth",  NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB);
-			tr.textureDepthImage = R_CreateImage("*texturedepth", NULL, PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB);
-		}
+		tr.renderDepthImage  = R_CreateImage("*renderdepth",  NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB);
+		tr.textureDepthImage = R_CreateImage("*texturedepth", NULL, PSHADOW_MAP_SIZE, PSHADOW_MAP_SIZE, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB);
 
 		{
 			unsigned short sdata[4];
@@ -3004,8 +3001,9 @@ void R_CreateBuiltinImages( void ) {
 			for ( x = 0; x < 4; x++)
 			{
 				tr.sunShadowDepthImage[x] = R_CreateImage(va("*sunshadowdepth%i", x), NULL, r_shadowMapSize->integer, r_shadowMapSize->integer, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_DEPTH_COMPONENT24_ARB);
-				qglTextureParameterf(tr.sunShadowDepthImage[x]->texnum, GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
-				qglTextureParameterf(tr.sunShadowDepthImage[x]->texnum, GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
+
+				qglTextureParameterfEXT(tr.sunShadowDepthImage[x]->texnum, GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
+				qglTextureParameterfEXT(tr.sunShadowDepthImage[x]->texnum, GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
 			}
 
 			tr.screenShadowImage = R_CreateImage("*screenShadow", NULL, width, height, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE, GL_RGBA8);
diff --git a/SP/code/rend2/tr_init.c b/SP/code/rend2/tr_init.c
index cf00d00..267f529 100644
--- a/SP/code/rend2/tr_init.c
+++ b/SP/code/rend2/tr_init.c
@@ -1048,7 +1048,7 @@ void GL_SetDefaultState( void ) {
 	GL_BindNullProgram();
 
 	if (glRefConfig.vertexArrayObject)
-		qglBindVertexArrayARB(0);
+		qglBindVertexArray(0);
 
 	qglBindBuffer(GL_ARRAY_BUFFER, 0);
 	qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
diff --git a/SP/code/rend2/tr_local.h b/SP/code/rend2/tr_local.h
index f6d342b..fd31689 100644
--- a/SP/code/rend2/tr_local.h
+++ b/SP/code/rend2/tr_local.h
@@ -1547,7 +1547,6 @@ typedef struct {
 	qboolean textureNonPowerOfTwo;
 	qboolean textureFloat;
 	qboolean halfFloatPixel;
-	qboolean packedDepthStencil;
 	textureCompressionRef_t textureCompression;
 	qboolean swizzleNormalmap;
 	
diff --git a/SP/code/rend2/tr_shade.c b/SP/code/rend2/tr_shade.c
index ec1981b..9800079 100644
--- a/SP/code/rend2/tr_shade.c
+++ b/SP/code/rend2/tr_shade.c
@@ -1577,7 +1577,9 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 
 			if (r_sunlightMode->integer && (backEnd.viewParms.flags & VPF_USESUNLIGHT) && (pStage->glslShaderIndex & LIGHTDEF_LIGHTTYPE_MASK))
 			{
-				GL_BindToTMU(tr.screenShadowImage, TB_SHADOWMAP);
+				// FIXME: screenShadowImage is NULL if no framebuffers
+				if (tr.screenShadowImage)
+					GL_BindToTMU(tr.screenShadowImage, TB_SHADOWMAP);
 				GLSL_SetUniformVec3(sp, UNIFORM_PRIMARYLIGHTAMBIENT, backEnd.refdef.sunAmbCol);
 				if (r_pbr->integer)
 				{
@@ -1691,7 +1693,9 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 			vec4_t vec;
 			cubemap_t *cubemap = &tr.cubemaps[input->cubemapIndex - 1];
 
-			GL_BindToTMU( cubemap->image, TB_CUBEMAP);
+			// FIXME: cubemap image could be NULL if cubemap isn't renderer or loaded
+			if (cubemap->image)
+				GL_BindToTMU( cubemap->image, TB_CUBEMAP);
 
 			VectorSubtract(cubemap->origin, backEnd.viewParms.or.origin, vec);
 			vec[3] = 1.0f;
diff --git a/SP/code/rend2/tr_vbo.c b/SP/code/rend2/tr_vbo.c
index 61ede4e..b1ff3d6 100644
--- a/SP/code/rend2/tr_vbo.c
+++ b/SP/code/rend2/tr_vbo.c
@@ -262,8 +262,8 @@ vao_t *R_CreateVao(const char *name, byte *vertexes, int vertexesSize, byte *ind
 
 	if (glRefConfig.vertexArrayObject)
 	{
-		qglGenVertexArraysARB(1, &vao->vao);
-		qglBindVertexArrayARB(vao->vao);
+		qglGenVertexArrays(1, &vao->vao);
+		qglBindVertexArray(vao->vao);
 	}
 
 
@@ -383,8 +383,8 @@ vao_t *R_CreateVao2(const char *name, int numVertexes, srfVert_t *verts, int num
 
 	if (glRefConfig.vertexArrayObject)
 	{
-		qglGenVertexArraysARB(1, &vao->vao);
-		qglBindVertexArrayARB(vao->vao);
+		qglGenVertexArrays(1, &vao->vao);
+		qglBindVertexArray(vao->vao);
 	}
 
 
@@ -480,7 +480,7 @@ void R_BindVao(vao_t * vao)
 
 		if (glRefConfig.vertexArrayObject)
 		{
-			qglBindVertexArrayARB(vao->vao);
+			qglBindVertexArray(vao->vao);
 
 			// why you no save GL_ELEMENT_ARRAY_BUFFER binding, Intel?
 			if (1)
@@ -515,7 +515,7 @@ void R_BindNullVao(void)
 	{
 		if (glRefConfig.vertexArrayObject)
 		{
-			qglBindVertexArrayARB(0);
+			qglBindVertexArray(0);
 
 			// why you no save GL_ELEMENT_ARRAY_BUFFER binding, Intel?
 			if (1) qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
@@ -654,7 +654,7 @@ void R_ShutdownVaos(void)
 		vao = tr.vaos[i];
 
 		if(vao->vao)
-			qglDeleteVertexArraysARB(1, &vao->vao);
+			qglDeleteVertexArrays(1, &vao->vao);
 
 		if(vao->vertexesVBO)
 		{

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/iortcw.git



More information about the Pkg-games-commits mailing list