[iortcw] 88/152: All: Rend2: Require OpenGL 2.0 / Add new GL function loader

Simon McVittie smcv at debian.org
Fri Sep 8 10:40:15 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 e46356a18ecf791481cf37f8791057df4b81d8c9
Author: MAN-AT-ARMS <M4N4T4RMS at gmail.com>
Date:   Mon Jul 25 17:35:56 2016 -0400

    All: Rend2: Require OpenGL 2.0 / Add new GL function loader
---
 MP/code/rend2/qgl.h            | 183 +++++++------------
 MP/code/rend2/tr_backend.c     |   6 +-
 MP/code/rend2/tr_dsa.c         |  38 ++--
 MP/code/rend2/tr_dsa.h         |   2 +-
 MP/code/rend2/tr_extensions.c  | 400 ++++-------------------------------------
 MP/code/rend2/tr_glsl.c        | 126 ++++++-------
 MP/code/rend2/tr_init.c        |   8 +-
 MP/code/rend2/tr_local.h       |  10 +-
 MP/code/rend2/tr_postprocess.c |   4 +-
 MP/code/rend2/tr_shade.c       |   6 +-
 MP/code/rend2/tr_surface.c     |  16 +-
 MP/code/rend2/tr_vbo.c         |  68 +++----
 SP/code/rend2/qgl.h            | 183 +++++++------------
 SP/code/rend2/tr_backend.c     |   6 +-
 SP/code/rend2/tr_dsa.c         |  38 ++--
 SP/code/rend2/tr_dsa.h         |   2 +-
 SP/code/rend2/tr_extensions.c  | 400 ++++-------------------------------------
 SP/code/rend2/tr_glsl.c        | 126 ++++++-------
 SP/code/rend2/tr_init.c        |   8 +-
 SP/code/rend2/tr_local.h       |  10 +-
 SP/code/rend2/tr_postprocess.c |   4 +-
 SP/code/rend2/tr_shade.c       |   6 +-
 SP/code/rend2/tr_surface.c     |  16 +-
 SP/code/rend2/tr_vbo.c         |  68 +++----
 24 files changed, 486 insertions(+), 1248 deletions(-)

diff --git a/MP/code/rend2/qgl.h b/MP/code/rend2/qgl.h
index 1c73e40..351e6ae 100644
--- a/MP/code/rend2/qgl.h
+++ b/MP/code/rend2/qgl.h
@@ -453,104 +453,76 @@ extern void ( APIENTRY * qglPNTrianglesfATI )( GLenum pname, GLfloat param );
 #define qglVertexPointer glVertexPointer
 #define qglViewport glViewport
 
-// GL_EXT_draw_range_elements
-extern void     (APIENTRY * qglDrawRangeElementsEXT) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
-
-// GL_EXT_multi_draw_arrays
-extern void (APIENTRY * qglMultiDrawArraysEXT) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
-extern void (APIENTRY * qglMultiDrawElementsEXT) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount);
-
 // rend2
 
-// GL_ARB_shading_language_100
-#ifndef GL_ARB_shading_language_100
-#define GL_ARB_shading_language_100
-#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
-#endif
-
-// GL_ARB_vertex_program
-extern void     (APIENTRY * qglVertexAttrib4fARB) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
-extern void     (APIENTRY * qglVertexAttrib4fvARB) (GLuint, const GLfloat *);
-extern void     (APIENTRY * qglVertexAttribPointerARB) (GLuint index, GLint size, GLenum type, GLboolean normalized,
-														GLsizei stride, const GLvoid * pointer);
-extern void     (APIENTRY * qglEnableVertexAttribArrayARB) (GLuint index);
-extern void     (APIENTRY * qglDisableVertexAttribArrayARB) (GLuint index);
-
-// GL_ARB_vertex_buffer_object
-extern void     (APIENTRY * qglBindBufferARB) (GLenum target, GLuint buffer);
-extern void     (APIENTRY * qglDeleteBuffersARB) (GLsizei n, const GLuint * buffers);
-extern void     (APIENTRY * qglGenBuffersARB) (GLsizei n, GLuint * buffers);
-extern          GLboolean(APIENTRY * qglIsBufferARB) (GLuint buffer);
-extern void     (APIENTRY * qglBufferDataARB) (GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage);
-extern void     (APIENTRY * qglBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data);
-extern void     (APIENTRY * qglGetBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data);
-extern void     (APIENTRY * qglGetBufferParameterivARB) (GLenum target, GLenum pname, GLint * params);
-extern void     (APIENTRY * qglGetBufferPointervARB) (GLenum target, GLenum pname, GLvoid * *params);
-
-// GL_ARB_shader_objects
-extern void     (APIENTRY * qglDeleteObjectARB) (GLhandleARB obj);
-extern          GLhandleARB(APIENTRY * qglGetHandleARB) (GLenum pname);
-extern void     (APIENTRY * qglDetachObjectARB) (GLhandleARB containerObj, GLhandleARB attachedObj);
-extern          GLhandleARB(APIENTRY * qglCreateShaderObjectARB) (GLenum shaderType);
-extern void     (APIENTRY * qglShaderSourceARB) (GLhandleARB shaderObj, GLsizei count, const GLcharARB * *string,
-												 const GLint * length);
-extern void     (APIENTRY * qglCompileShaderARB) (GLhandleARB shaderObj);
-extern          GLhandleARB(APIENTRY * qglCreateProgramObjectARB) (void);
-extern void     (APIENTRY * qglAttachObjectARB) (GLhandleARB containerObj, GLhandleARB obj);
-extern void     (APIENTRY * qglLinkProgramARB) (GLhandleARB programObj);
-extern void     (APIENTRY * qglUseProgramObjectARB) (GLhandleARB programObj);
-extern void     (APIENTRY * qglValidateProgramARB) (GLhandleARB programObj);
-extern void     (APIENTRY * qglUniform1fARB) (GLint location, GLfloat v0);
-extern void     (APIENTRY * qglUniform2fARB) (GLint location, GLfloat v0, GLfloat v1);
-extern void     (APIENTRY * qglUniform3fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-extern void     (APIENTRY * qglUniform4fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-extern void     (APIENTRY * qglUniform1iARB) (GLint location, GLint v0);
-extern void     (APIENTRY * qglUniform2iARB) (GLint location, GLint v0, GLint v1);
-extern void     (APIENTRY * qglUniform3iARB) (GLint location, GLint v0, GLint v1, GLint v2);
-extern void     (APIENTRY * qglUniform4iARB) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-extern void     (APIENTRY * qglUniform1fvARB) (GLint location, GLsizei count, const GLfloat * value);
-extern void     (APIENTRY * qglUniform2fvARB) (GLint location, GLsizei count, const GLfloat * value);
-extern void     (APIENTRY * qglUniform3fvARB) (GLint location, GLsizei count, const GLfloat * value);
-extern void     (APIENTRY * qglUniform4fvARB) (GLint location, GLsizei count, const GLfloat * value);
-extern void     (APIENTRY * qglUniform2ivARB) (GLint location, GLsizei count, const GLint * value);
-extern void     (APIENTRY * qglUniform3ivARB) (GLint location, GLsizei count, const GLint * value);
-extern void     (APIENTRY * qglUniform4ivARB) (GLint location, GLsizei count, const GLint * value);
-extern void     (APIENTRY * qglUniformMatrix2fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-extern void     (APIENTRY * qglUniformMatrix3fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-extern void     (APIENTRY * qglUniformMatrix4fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-extern void     (APIENTRY * qglGetObjectParameterfvARB) (GLhandleARB obj, GLenum pname, GLfloat * params);
-extern void     (APIENTRY * qglGetObjectParameterivARB) (GLhandleARB obj, GLenum pname, GLint * params);
-extern void     (APIENTRY * qglGetInfoLogARB) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog);
-extern void     (APIENTRY * qglGetAttachedObjectsARB) (GLhandleARB containerObj, GLsizei maxCount, GLsizei * count,
-													   GLhandleARB * obj);
-extern          GLint(APIENTRY * qglGetUniformLocationARB) (GLhandleARB programObj, const GLcharARB * name);
-extern void     (APIENTRY * qglGetActiveUniformARB) (GLhandleARB programObj, GLuint index, GLsizei maxIndex, GLsizei * length,
-													 GLint * size, GLenum * type, GLcharARB * name);
-extern void     (APIENTRY * qglGetUniformfvARB) (GLhandleARB programObj, GLint location, GLfloat * params);
-extern void     (APIENTRY * qglGetUniformivARB) (GLhandleARB programObj, GLint location, GLint * params);
-extern void     (APIENTRY * qglGetShaderSourceARB) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source);
-
-// GL_ARB_vertex_shader
-extern void     (APIENTRY * qglBindAttribLocationARB) (GLhandleARB programObj, GLuint index, const GLcharARB * name);
-extern void     (APIENTRY * qglGetActiveAttribARB) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length,
-													GLint * size, GLenum * type, GLcharARB * name);
-extern          GLint(APIENTRY * qglGetAttribLocationARB) (GLhandleARB programObj, const GLcharARB * name);
-
-// GL_ARB_texture_compression
-extern void (APIENTRY * qglCompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, 
-	GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
-	GLint border, GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border,
-	GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
-	GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
-	GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, 
-	GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglGetCompressedTexImageARB)(GLenum target, GLint lod,
-	GLvoid *img);
+// GL function loader, based on https://gist.github.com/rygorous/16796a0c876cf8a5f542caddb55bce8a
+
+// OpenGL 1.2, was GL_EXT_draw_range_elements
+#define QGL_1_2_PROCS \
+	GLE(void, DrawRangeElements, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices) \
+
+// OpenGL 1.3, was GL_ARB_texture_compression
+#define QGL_1_3_PROCS \
+	GLE(void, CompressedTexImage2D, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data) \
+	GLE(void, CompressedTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data) \
+
+// OpenGL 1.4, was GL_EXT_multi_draw_arrays
+#define QGL_1_4_PROCS \
+	GLE(void, MultiDrawElements, GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount) \
+
+// OpenGL 1.5, was GL_ARB_vertex_buffer_object and GL_ARB_occlusion_query
+#define QGL_1_5_PROCS \
+	GLE(void, GenQueries, GLsizei n, GLuint *ids) \
+	GLE(void, DeleteQueries, GLsizei n, const GLuint *ids) \
+	GLE(void, BeginQuery, GLenum target, GLuint id) \
+	GLE(void, EndQuery, GLenum target) \
+	GLE(void, GetQueryObjectiv, GLuint id, GLenum pname, GLint *params) \
+	GLE(void, GetQueryObjectuiv, GLuint id, GLenum pname, GLuint *params) \
+	GLE(void, BindBuffer, GLenum target, GLuint buffer) \
+	GLE(void, DeleteBuffers, GLsizei n, const GLuint *buffers) \
+	GLE(void, GenBuffers, GLsizei n, GLuint *buffers) \
+	GLE(void, BufferData, GLenum target, GLsizeiptr size, const void *data, GLenum usage) \
+	GLE(void, BufferSubData, GLenum target, GLintptr offset, GLsizeiptr size, const void *data) \
+
+// OpenGL 2.0, was GL_ARB_shading_language_100, GL_ARB_vertex_program, GL_ARB_shader_objects, and GL_ARB_vertex_shader
+#define QGL_2_0_PROCS \
+	GLE(void, AttachShader, GLuint program, GLuint shader) \
+	GLE(void, BindAttribLocation, GLuint program, GLuint index, const GLchar *name) \
+	GLE(void, CompileShader, GLuint shader) \
+	GLE(GLuint, CreateProgram, void) \
+	GLE(GLuint, CreateShader, GLenum type) \
+	GLE(void, DeleteProgram, GLuint program) \
+	GLE(void, DeleteShader, GLuint shader) \
+	GLE(void, DetachShader, GLuint program, GLuint shader) \
+	GLE(void, DisableVertexAttribArray, GLuint index) \
+	GLE(void, EnableVertexAttribArray, GLuint index) \
+	GLE(void, GetActiveUniform, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) \
+	GLE(void, GetProgramiv, GLuint program, GLenum pname, GLint *params) \
+	GLE(void, GetProgramInfoLog, GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) \
+	GLE(void, GetShaderiv, GLuint shader, GLenum pname, GLint *params) \
+	GLE(void, GetShaderInfoLog, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) \
+	GLE(void, GetShaderSource, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source) \
+	GLE(GLint, GetUniformLocation, GLuint program, const GLchar *name) \
+	GLE(void, LinkProgram, GLuint program) \
+	GLE(void, ShaderSource, GLuint shader, GLsizei count, const GLchar* *string, const GLint *length) \
+	GLE(void, UseProgram, GLuint program) \
+	GLE(void, Uniform1f, GLint location, GLfloat v0) \
+	GLE(void, Uniform2f, GLint location, GLfloat v0, GLfloat v1) \
+	GLE(void, Uniform3f, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) \
+	GLE(void, Uniform4f, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) \
+	GLE(void, Uniform1i, GLint location, GLint v0) \
+	GLE(void, Uniform1fv, GLint location, GLsizei count, const GLfloat *value) \
+	GLE(void, UniformMatrix4fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) \
+	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
@@ -687,25 +659,6 @@ extern void (APIENTRY * qglGenerateMipmapEXT)(GLenum target);
 #define GL_TEXTURE_STENCIL_SIZE_EXT                       0x88F1
 #endif
 
-// GL_ARB_occlusion_query
-extern void (APIENTRY * qglGenQueriesARB)(GLsizei n, GLuint *ids);
-extern void (APIENTRY * qglDeleteQueriesARB)(GLsizei n, const GLuint *ids);
-extern GLboolean (APIENTRY * qglIsQueryARB)(GLuint id);
-extern void (APIENTRY * qglBeginQueryARB)(GLenum target, GLuint id);
-extern void (APIENTRY * qglEndQueryARB)(GLenum target);
-extern void (APIENTRY * qglGetQueryivARB)(GLenum target, GLenum pname, GLint *params);
-extern void (APIENTRY * qglGetQueryObjectivARB)(GLuint id, GLenum pname, GLint *params);
-extern void (APIENTRY * qglGetQueryObjectuivARB)(GLuint id, GLenum pname, GLuint *params);
-
-#ifndef GL_ARB_occlusion_query
-#define GL_ARB_occlusion_query
-#define GL_SAMPLES_PASSED_ARB                             0x8914
-#define GL_QUERY_COUNTER_BITS_ARB                         0x8864
-#define GL_CURRENT_QUERY_ARB                              0x8865
-#define GL_QUERY_RESULT_ARB                               0x8866
-#define GL_QUERY_RESULT_AVAILABLE_ARB                     0x8867
-#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,
diff --git a/MP/code/rend2/tr_backend.c b/MP/code/rend2/tr_backend.c
index 3ce6fbd..2334f1f 100644
--- a/MP/code/rend2/tr_backend.c
+++ b/MP/code/rend2/tr_backend.c
@@ -718,7 +718,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
 	R_TransformDlights( backEnd.refdef.num_dlights, backEnd.refdef.dlights, &backEnd.or );
 
 	if (inQuery) {
-		qglEndQueryARB(GL_SAMPLES_PASSED_ARB);
+		qglEndQuery(GL_SAMPLES_PASSED);
 	}
 
 	if (glRefConfig.framebufferObject)
@@ -1463,14 +1463,14 @@ const void  *RB_DrawSurfs( const void *data ) {
 			if (glRefConfig.occlusionQuery)
 			{
 				tr.sunFlareQueryActive[tr.sunFlareQueryIndex] = qtrue;
-				qglBeginQueryARB(GL_SAMPLES_PASSED_ARB, tr.sunFlareQuery[tr.sunFlareQueryIndex]);
+				qglBeginQuery(GL_SAMPLES_PASSED, tr.sunFlareQuery[tr.sunFlareQueryIndex]);
 			}
 
 			RB_DrawSun(0.3, tr.sunFlareShader);
 
 			if (glRefConfig.occlusionQuery)
 			{
-				qglEndQueryARB(GL_SAMPLES_PASSED_ARB);
+				qglEndQuery(GL_SAMPLES_PASSED);
 			}
 
 			FBO_Bind(oldFbo);
diff --git a/MP/code/rend2/tr_dsa.c b/MP/code/rend2/tr_dsa.c
index 9cd481b..4ea7699 100644
--- a/MP/code/rend2/tr_dsa.c
+++ b/MP/code/rend2/tr_dsa.c
@@ -124,7 +124,7 @@ GLvoid APIENTRY  GLDSA_CompressedTextureImage2D(GLuint texture, GLenum target, G
 	GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
-	qglCompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, data);
+	qglCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
 }
 
 GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLint level,
@@ -132,7 +132,7 @@ GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target,
 	GLsizei imageSize, const GLvoid *data)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
-	qglCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+	qglCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
 }
 
 GLvoid APIENTRY GLDSA_GenerateTextureMipmap(GLuint texture, GLenum target)
@@ -143,66 +143,66 @@ GLvoid APIENTRY GLDSA_GenerateTextureMipmap(GLuint texture, GLenum target)
 
 void GL_BindNullProgram()
 {
-	qglUseProgramObjectARB(0);
+	qglUseProgram(0);
 	glDsaState.program = 0;
 }
 
-int GL_UseProgramObject(GLuint program)
+int GL_UseProgram(GLuint program)
 {
 	if (glDsaState.program == program)
 		return 0;
 
-	qglUseProgramObjectARB(program);
+	qglUseProgram(program);
 	glDsaState.program = program;
 	return 1;
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniform1i(GLuint program, GLint location, GLint v0)
 {
-	GL_UseProgramObject(program);
-	qglUniform1iARB(location, v0);
+	GL_UseProgram(program);
+	qglUniform1i(location, v0);
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniform1f(GLuint program, GLint location, GLfloat v0)
 {
-	GL_UseProgramObject(program);
-	qglUniform1fARB(location, v0);
+	GL_UseProgram(program);
+	qglUniform1f(location, v0);
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniform2f(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1)
 {
-	GL_UseProgramObject(program);
-	qglUniform2fARB(location, v0, v1);
+	GL_UseProgram(program);
+	qglUniform2f(location, v0, v1);
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniform3f(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1, GLfloat v2)
 {
-	GL_UseProgramObject(program);
-	qglUniform3fARB(location, v0, v1, v2);
+	GL_UseProgram(program);
+	qglUniform3f(location, v0, v1, v2);
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniform4f(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
 {
-	GL_UseProgramObject(program);
-	qglUniform4fARB(location, v0, v1, v2, v3);
+	GL_UseProgram(program);
+	qglUniform4f(location, v0, v1, v2, v3);
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniform1fv(GLuint program, GLint location,
 	GLsizei count, const GLfloat *value)
 {
-	GL_UseProgramObject(program);
-	qglUniform1fvARB(location, count, value);
+	GL_UseProgram(program);
+	qglUniform1fv(location, count, value);
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniformMatrix4fv(GLuint program, GLint location,
 	GLsizei count, GLboolean transpose,
 	const GLfloat *value)
 {
-	GL_UseProgramObject(program);
-	qglUniformMatrix4fvARB(location, count, transpose, value);
+	GL_UseProgram(program);
+	qglUniformMatrix4fv(location, count, transpose, value);
 }
 
 void GL_BindNullFramebuffers()
diff --git a/MP/code/rend2/tr_dsa.h b/MP/code/rend2/tr_dsa.h
index 9d610ef..f57944d 100644
--- a/MP/code/rend2/tr_dsa.h
+++ b/MP/code/rend2/tr_dsa.h
@@ -44,7 +44,7 @@ GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target,
 GLvoid APIENTRY GLDSA_GenerateTextureMipmap(GLuint texture, GLenum target);
 
 void GL_BindNullProgram(void);
-int GL_UseProgramObject(GLuint program);
+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);
diff --git a/MP/code/rend2/tr_extensions.c b/MP/code/rend2/tr_extensions.c
index 9c3b7a4..3aa6ecc 100644
--- a/MP/code/rend2/tr_extensions.c
+++ b/MP/code/rend2/tr_extensions.c
@@ -30,101 +30,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include "tr_local.h"
 #include "tr_dsa.h"
 
-// GL_EXT_draw_range_elements
-void            (APIENTRY * qglDrawRangeElementsEXT) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
-
-// GL_EXT_multi_draw_arrays
-void            (APIENTRY * qglMultiDrawArraysEXT) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
-void            (APIENTRY * qglMultiDrawElementsEXT) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount);
-
-// GL_ARB_vertex_shader
-void            (APIENTRY * qglBindAttribLocationARB) (GLhandleARB programObj, GLuint index, const GLcharARB * name);
-void            (APIENTRY * qglGetActiveAttribARB) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length,
-													GLint * size, GLenum * type, GLcharARB * name);
-GLint(APIENTRY * qglGetAttribLocationARB) (GLhandleARB programObj, const GLcharARB * name);
-
-// GL_ARB_vertex_program
-void            (APIENTRY * qglVertexAttrib4fARB) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
-void            (APIENTRY * qglVertexAttrib4fvARB) (GLuint, const GLfloat *);
-void            (APIENTRY * qglVertexAttribPointerARB) (GLuint index, GLint size, GLenum type, GLboolean normalized,
-														GLsizei stride, const GLvoid * pointer);
-void            (APIENTRY * qglEnableVertexAttribArrayARB) (GLuint index);
-void            (APIENTRY * qglDisableVertexAttribArrayARB) (GLuint index);
-
-// GL_ARB_vertex_buffer_object
-void (APIENTRY * qglBindBufferARB) (GLenum target, GLuint buffer);
-void (APIENTRY * qglDeleteBuffersARB) (GLsizei n, const GLuint * buffers);
-void (APIENTRY * qglGenBuffersARB) (GLsizei n, GLuint * buffers);
-
-GLboolean(APIENTRY * qglIsBufferARB) (GLuint buffer);
-void (APIENTRY * qglBufferDataARB) (GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage);
-void (APIENTRY * qglBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data);
-void (APIENTRY * qglGetBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data);
-
-void (APIENTRY * qglGetBufferParameterivARB) (GLenum target, GLenum pname, GLint * params);
-void (APIENTRY * qglGetBufferPointervARB) (GLenum target, GLenum pname, GLvoid * *params);
-
-// GL_ARB_shader_objects
-void            (APIENTRY * qglDeleteObjectARB) (GLhandleARB obj);
-
-GLhandleARB(APIENTRY * qglGetHandleARB) (GLenum pname);
-void            (APIENTRY * qglDetachObjectARB) (GLhandleARB containerObj, GLhandleARB attachedObj);
-
-GLhandleARB(APIENTRY * qglCreateShaderObjectARB) (GLenum shaderType);
-void            (APIENTRY * qglShaderSourceARB) (GLhandleARB shaderObj, GLsizei count, const GLcharARB * *string,
-												 const GLint * length);
-void            (APIENTRY * qglCompileShaderARB) (GLhandleARB shaderObj);
-
-GLhandleARB(APIENTRY * qglCreateProgramObjectARB) (void);
-void            (APIENTRY * qglAttachObjectARB) (GLhandleARB containerObj, GLhandleARB obj);
-void            (APIENTRY * qglLinkProgramARB) (GLhandleARB programObj);
-void            (APIENTRY * qglUseProgramObjectARB) (GLhandleARB programObj);
-void            (APIENTRY * qglValidateProgramARB) (GLhandleARB programObj);
-void            (APIENTRY * qglUniform1fARB) (GLint location, GLfloat v0);
-void            (APIENTRY * qglUniform2fARB) (GLint location, GLfloat v0, GLfloat v1);
-void            (APIENTRY * qglUniform3fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-void            (APIENTRY * qglUniform4fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-void            (APIENTRY * qglUniform1iARB) (GLint location, GLint v0);
-void            (APIENTRY * qglUniform2iARB) (GLint location, GLint v0, GLint v1);
-void            (APIENTRY * qglUniform3iARB) (GLint location, GLint v0, GLint v1, GLint v2);
-void            (APIENTRY * qglUniform4iARB) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-void            (APIENTRY * qglUniform1fvARB) (GLint location, GLsizei count, const GLfloat * value);
-void            (APIENTRY * qglUniform2fvARB) (GLint location, GLsizei count, const GLfloat * value);
-void            (APIENTRY * qglUniform3fvARB) (GLint location, GLsizei count, const GLfloat * value);
-void            (APIENTRY * qglUniform4fvARB) (GLint location, GLsizei count, const GLfloat * value);
-void            (APIENTRY * qglUniform2ivARB) (GLint location, GLsizei count, const GLint * value);
-void            (APIENTRY * qglUniform3ivARB) (GLint location, GLsizei count, const GLint * value);
-void            (APIENTRY * qglUniform4ivARB) (GLint location, GLsizei count, const GLint * value);
-void            (APIENTRY * qglUniformMatrix2fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-void            (APIENTRY * qglUniformMatrix3fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-void            (APIENTRY * qglUniformMatrix4fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-void            (APIENTRY * qglGetObjectParameterfvARB) (GLhandleARB obj, GLenum pname, GLfloat * params);
-void            (APIENTRY * qglGetObjectParameterivARB) (GLhandleARB obj, GLenum pname, GLint * params);
-void            (APIENTRY * qglGetInfoLogARB) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog);
-void            (APIENTRY * qglGetAttachedObjectsARB) (GLhandleARB containerObj, GLsizei maxCount, GLsizei * count,
-													   GLhandleARB * obj);
-GLint(APIENTRY * qglGetUniformLocationARB) (GLhandleARB programObj, const GLcharARB * name);
-void            (APIENTRY * qglGetActiveUniformARB) (GLhandleARB programObj, GLuint index, GLsizei maxIndex, GLsizei * length,
-													 GLint * size, GLenum * type, GLcharARB * name);
-void            (APIENTRY * qglGetUniformfvARB) (GLhandleARB programObj, GLint location, GLfloat * params);
-void            (APIENTRY * qglGetUniformivARB) (GLhandleARB programObj, GLint location, GLint * params);
-void            (APIENTRY * qglGetShaderSourceARB) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source);
-
-// GL_ARB_texture_compression
-void (APIENTRY * qglCompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, 
-	GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
-void (APIENTRY * qglCompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
-	GLint border, GLsizei imageSize, const GLvoid *data);
-void (APIENTRY * qglCompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border,
-	GLsizei imageSize, const GLvoid *data);
-void (APIENTRY * qglCompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
-	GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
-void (APIENTRY * qglCompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
-	GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
-void (APIENTRY * qglCompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, 
-	GLsizei imageSize, const GLvoid *data);
-void (APIENTRY * qglGetCompressedTexImageARB)(GLenum target, GLint lod,
-	GLvoid *img);
+#define GLE(ret, name, ...) 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_EXT_framebuffer_object
 GLboolean (APIENTRY * qglIsRenderbufferEXT)(GLuint renderbuffer);
@@ -157,16 +69,6 @@ void (APIENTRY * qglGetFramebufferAttachmentParameterivEXT)(GLenum target, GLenu
 
 void (APIENTRY * qglGenerateMipmapEXT)(GLenum target);
 
-// GL_ARB_occlusion_query
-void (APIENTRY * qglGenQueriesARB)(GLsizei n, GLuint *ids);
-void (APIENTRY * qglDeleteQueriesARB)(GLsizei n, const GLuint *ids);
-GLboolean (APIENTRY * qglIsQueryARB)(GLuint id);
-void (APIENTRY * qglBeginQueryARB)(GLenum target, GLuint id);
-void (APIENTRY * qglEndQueryARB)(GLenum target);
-void (APIENTRY * qglGetQueryivARB)(GLenum target, GLenum pname, GLint *params);
-void (APIENTRY * qglGetQueryObjectivARB)(GLuint id, GLenum pname, GLint *params);
-void (APIENTRY * qglGetQueryObjectuivARB)(GLuint id, GLenum pname, GLuint *params);
-
 // GL_EXT_framebuffer_blit
 void (APIENTRY * qglBlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
                             GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
@@ -240,248 +142,47 @@ void GLimp_InitExtraExtensions()
 	char *extension;
 	const char* result[3] = { "...ignoring %s\n", "...using %s\n", "...%s not found\n" };
 
-	// GL_EXT_draw_range_elements
-	extension = "GL_EXT_draw_range_elements";
-	glRefConfig.drawRangeElements = qfalse;
-	qglMultiDrawArraysEXT = NULL;
-	qglMultiDrawElementsEXT = NULL;
-	if( GLimp_HaveExtension( extension ) )
-	{
-		qglDrawRangeElementsEXT = (void *) SDL_GL_GetProcAddress("glDrawRangeElementsEXT");
-
-		if ( r_ext_draw_range_elements->integer)
-			glRefConfig.drawRangeElements = qtrue;
-
-		ri.Printf(PRINT_ALL, result[glRefConfig.drawRangeElements], extension);
-	}
-	else
-	{
-		ri.Printf(PRINT_ALL, result[2], extension);
-	}
-
-	// GL_EXT_multi_draw_arrays
-	extension = "GL_EXT_multi_draw_arrays";
-	glRefConfig.multiDrawArrays = qfalse;
-	qglMultiDrawArraysEXT = NULL;
-	qglMultiDrawElementsEXT = NULL;
-	if( GLimp_HaveExtension( extension ) )
-	{
-		qglMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC) SDL_GL_GetProcAddress("glMultiDrawArraysEXT");
-		qglMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC) SDL_GL_GetProcAddress("glMultiDrawElementsEXT");
-
-		if ( r_ext_multi_draw_arrays->integer )
-			glRefConfig.multiDrawArrays = qtrue;
-
-		ri.Printf(PRINT_ALL, result[glRefConfig.multiDrawArrays], extension);
-	}
-	else
-	{
-		ri.Printf(PRINT_ALL, result[2], extension);
-	}
+	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_ARB_vertex_program
-	//glRefConfig.vertexProgram = qfalse;
-	extension = "GL_ARB_vertex_program";
-	qglVertexAttrib4fARB = NULL;
-	qglVertexAttrib4fvARB = NULL;
-	qglVertexAttribPointerARB = NULL;
-	qglEnableVertexAttribArrayARB = NULL;
-	qglDisableVertexAttribArrayARB = NULL;
-	if( GLimp_HaveExtension( extension ) )
-	{
-		qglVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) SDL_GL_GetProcAddress("glVertexAttrib4fARB");
-		qglVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) SDL_GL_GetProcAddress("glVertexAttrib4fvARB");
-		qglVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) SDL_GL_GetProcAddress("glVertexAttribPointerARB");
-		qglEnableVertexAttribArrayARB =
-			(PFNGLENABLEVERTEXATTRIBARRAYARBPROC) SDL_GL_GetProcAddress("glEnableVertexAttribArrayARB");
-		qglDisableVertexAttribArrayARB =
-			(PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) SDL_GL_GetProcAddress("glDisableVertexAttribArrayARB");
-
-		ri.Printf(PRINT_ALL, result[1], extension);
-		//glRefConfig.vertexProgram = qtrue;
-	}
-	else
-	{
-		ri.Error(ERR_FATAL, result[2], extension);
-	}
-	
-	// GL_ARB_vertex_buffer_object
-	//glRefConfig.vertexBufferObject = qfalse;
-	extension = "GL_ARB_vertex_buffer_object";
-	qglBindBufferARB = NULL;
-	qglDeleteBuffersARB = NULL;
-	qglGenBuffersARB = NULL;
-	qglIsBufferARB = NULL;
-	qglBufferDataARB = NULL;
-	qglBufferSubDataARB = NULL;
-	qglGetBufferSubDataARB = NULL;
-	qglGetBufferParameterivARB = NULL;
-	qglGetBufferPointervARB = NULL;
-	if( GLimp_HaveExtension( extension ) )
-	{
-		qglBindBufferARB = (PFNGLBINDBUFFERARBPROC) SDL_GL_GetProcAddress("glBindBufferARB");
-		qglDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) SDL_GL_GetProcAddress("glDeleteBuffersARB");
-		qglGenBuffersARB = (PFNGLGENBUFFERSARBPROC) SDL_GL_GetProcAddress("glGenBuffersARB");
-		qglIsBufferARB = (PFNGLISBUFFERARBPROC) SDL_GL_GetProcAddress("glIsBufferARB");
-		qglBufferDataARB = (PFNGLBUFFERDATAARBPROC) SDL_GL_GetProcAddress("glBufferDataARB");
-		qglBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) SDL_GL_GetProcAddress("glBufferSubDataARB");
-		qglGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) SDL_GL_GetProcAddress("glGetBufferSubDataARB");
-		qglGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC) SDL_GL_GetProcAddress("glGetBufferParameterivARB");
-		qglGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC) SDL_GL_GetProcAddress("glGetBufferPointervARB");
-		ri.Printf(PRINT_ALL, result[1], extension);
-		//glRefConfig.vertexBufferObject = qtrue;
-	}
-	else
-	{
-		ri.Error(ERR_FATAL, result[2], extension);
-	}
-
-	// GL_ARB_shader_objects
-	extension = "GL_ARB_shader_objects";
-	//glRefConfig.shaderObjects = qfalse;
-	qglDeleteObjectARB = NULL;
-	qglGetHandleARB = NULL;
-	qglDetachObjectARB = NULL;
-	qglCreateShaderObjectARB = NULL;
-	qglShaderSourceARB = NULL;
-	qglCompileShaderARB = NULL;
-	qglCreateProgramObjectARB = NULL;
-	qglAttachObjectARB = NULL;
-	qglLinkProgramARB = NULL;
-	qglUseProgramObjectARB = NULL;
-	qglValidateProgramARB = NULL;
-	qglUniform1fARB = NULL;
-	qglUniform2fARB = NULL;
-	qglUniform3fARB = NULL;
-	qglUniform4fARB = NULL;
-	qglUniform1iARB = NULL;
-	qglUniform2iARB = NULL;
-	qglUniform3iARB = NULL;
-	qglUniform4iARB = NULL;
-	qglUniform1fvARB = NULL;
-	qglUniform2fvARB = NULL;
-	qglUniform3fvARB = NULL;
-	qglUniform4fvARB = NULL;
-	qglUniform2ivARB = NULL;
-	qglUniform3ivARB = NULL;
-	qglUniform4ivARB = NULL;
-	qglUniformMatrix2fvARB = NULL;
-	qglUniformMatrix3fvARB = NULL;
-	qglUniformMatrix4fvARB = NULL;
-	qglGetObjectParameterfvARB = NULL;
-	qglGetObjectParameterivARB = NULL;
-	qglGetInfoLogARB = NULL;
-	qglGetAttachedObjectsARB = NULL;
-	qglGetUniformLocationARB = NULL;
-	qglGetActiveUniformARB = NULL;
-	qglGetUniformfvARB = NULL;
-	qglGetUniformivARB = NULL;
-	qglGetShaderSourceARB = NULL;
-	if( GLimp_HaveExtension( extension ) )
-	{
-		qglDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) SDL_GL_GetProcAddress("glDeleteObjectARB");
-		qglGetHandleARB = (PFNGLGETHANDLEARBPROC) SDL_GL_GetProcAddress("glGetHandleARB");
-		qglDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) SDL_GL_GetProcAddress("glDetachObjectARB");
-		qglCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) SDL_GL_GetProcAddress("glCreateShaderObjectARB");
-		qglShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) SDL_GL_GetProcAddress("glShaderSourceARB");
-		qglCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) SDL_GL_GetProcAddress("glCompileShaderARB");
-		qglCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glCreateProgramObjectARB");
-		qglAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) SDL_GL_GetProcAddress("glAttachObjectARB");
-		qglLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) SDL_GL_GetProcAddress("glLinkProgramARB");
-		qglUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glUseProgramObjectARB");
-		qglValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) SDL_GL_GetProcAddress("glValidateProgramARB");
-		qglUniform1fARB = (PFNGLUNIFORM1FARBPROC) SDL_GL_GetProcAddress("glUniform1fARB");
-		qglUniform2fARB = (PFNGLUNIFORM2FARBPROC) SDL_GL_GetProcAddress("glUniform2fARB");
-		qglUniform3fARB = (PFNGLUNIFORM3FARBPROC) SDL_GL_GetProcAddress("glUniform3fARB");
-		qglUniform4fARB = (PFNGLUNIFORM4FARBPROC) SDL_GL_GetProcAddress("glUniform4fARB");
-		qglUniform1iARB = (PFNGLUNIFORM1IARBPROC) SDL_GL_GetProcAddress("glUniform1iARB");
-		qglUniform2iARB = (PFNGLUNIFORM2IARBPROC) SDL_GL_GetProcAddress("glUniform2iARB");
-		qglUniform3iARB = (PFNGLUNIFORM3IARBPROC) SDL_GL_GetProcAddress("glUniform3iARB");
-		qglUniform4iARB = (PFNGLUNIFORM4IARBPROC) SDL_GL_GetProcAddress("glUniform4iARB");
-		qglUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) SDL_GL_GetProcAddress("glUniform1fvARB");
-		qglUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) SDL_GL_GetProcAddress("glUniform2fvARB");
-		qglUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) SDL_GL_GetProcAddress("glUniform3fvARB");
-		qglUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) SDL_GL_GetProcAddress("glUniform4fvARB");
-		qglUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) SDL_GL_GetProcAddress("glUniform2ivARB");
-		qglUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) SDL_GL_GetProcAddress("glUniform3ivARB");
-		qglUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) SDL_GL_GetProcAddress("glUniform4ivARB");
-		qglUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) SDL_GL_GetProcAddress("glUniformMatrix2fvARB");
-		qglUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) SDL_GL_GetProcAddress("glUniformMatrix3fvARB");
-		qglUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) SDL_GL_GetProcAddress("glUniformMatrix4fvARB");
-		qglGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) SDL_GL_GetProcAddress("glGetObjectParameterfvARB");
-		qglGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) SDL_GL_GetProcAddress("glGetObjectParameterivARB");
-		qglGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) SDL_GL_GetProcAddress("glGetInfoLogARB");
-		qglGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) SDL_GL_GetProcAddress("glGetAttachedObjectsARB");
-		qglGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) SDL_GL_GetProcAddress("glGetUniformLocationARB");
-		qglGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) SDL_GL_GetProcAddress("glGetActiveUniformARB");
-		qglGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) SDL_GL_GetProcAddress("glGetUniformfvARB");
-		qglGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) SDL_GL_GetProcAddress("glGetUniformivARB");
-		qglGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) SDL_GL_GetProcAddress("glGetShaderSourceARB");
-		ri.Printf(PRINT_ALL, result[1], extension);
-		//glRefConfig.shaderObjects = qtrue;
-	}
-	else
-	{
-		ri.Error(ERR_FATAL, result[2], extension);
-	}
+	// GL function loader, based on https://gist.github.com/rygorous/16796a0c876cf8a5f542caddb55bce8a
 
-	// GL_ARB_vertex_shader
-	//glRefConfig.vertexShader = qfalse;
-	extension = "GL_ARB_vertex_shader";
-	qglBindAttribLocationARB = NULL;
-	qglGetActiveAttribARB = NULL;
-	qglGetAttribLocationARB = NULL;
-	if( GLimp_HaveExtension( extension ) )
-	{
-		//int				reservedComponents;
+#define GLE(ret, name, ...) qgl##name = (name##proc *) SDL_GL_GetProcAddress("gl" #name);
 
-		//qglGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &glConfig.maxVertexUniforms);
-		//qglGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, &glConfig.maxVaryingFloats);
-		//qglGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &glConfig.maxVertexAttribs);
+	// OpenGL 1.2, was GL_EXT_draw_range_elements
+	QGL_1_2_PROCS;
+	glRefConfig.drawRangeElements = r_ext_draw_range_elements->integer ? qtrue : qfalse;
+	ri.Printf(PRINT_ALL, result[glRefConfig.drawRangeElements], "glDrawRangeElements()");
 
-		//reservedComponents = 16 * 10; // approximation how many uniforms we have besides the bone matrices
+	// OpenGL 1.3, was GL_ARB_texture_compression
+	QGL_1_3_PROCS;
 
-#if 0
-		if(glConfig.driverType == GLDRV_MESA)
-		{
-			// HACK
-			// restrict to number of vertex uniforms to 512 because of:
-			// xreal.x86_64: nv50_program.c:4181: nv50_program_validate_data: Assertion `p->param_nr <= 512' failed
+	// 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()");
 
-			glConfig.maxVertexUniforms = Q_bound(0, glConfig.maxVertexUniforms, 512);
-		}
-#endif
+	// OpenGL 1.5, was GL_ARB_vertex_buffer_object and GL_ARB_occlusion_query
+	QGL_1_5_PROCS;
+	glRefConfig.occlusionQuery = qtrue;
 
-		//glConfig.maxVertexSkinningBones = (int) Q_bound(0.0, (Q_max(glConfig.maxVertexUniforms - reservedComponents, 0) / 16), MAX_BONES);
-		//glConfig.vboVertexSkinningAvailable = r_vboVertexSkinning->integer && ((glConfig.maxVertexSkinningBones >= 12) ? qtrue : qfalse);
+	// 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;
 
-		qglBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) SDL_GL_GetProcAddress("glBindAttribLocationARB");
-		qglGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) SDL_GL_GetProcAddress("glGetActiveAttribARB");
-		qglGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) SDL_GL_GetProcAddress("glGetAttribLocationARB");
-		ri.Printf(PRINT_ALL, result[1], extension);
-		//glRefConfig.vertexShader = qtrue;
-	}
-	else
-	{
-		ri.Error(ERR_FATAL, result[2], extension);
-	}
+#undef GLE
 
-	// GL_ARB_shading_language_100
-	extension = "GL_ARB_shading_language_100";
-	if( GLimp_HaveExtension( extension ) )
+	if (1)
 	{
 		char version[256];
 
-		Q_strncpyz( version, (char *) qglGetString (GL_SHADING_LANGUAGE_VERSION_ARB), sizeof( version ) );
+		Q_strncpyz(version, (char *)qglGetString(GL_SHADING_LANGUAGE_VERSION), sizeof(version));
 
 		sscanf(version, "%d.%d", &glRefConfig.glslMajorVersion, &glRefConfig.glslMinorVersion);
 
 		ri.Printf(PRINT_ALL, "...using GLSL version %s\n", version);
 	}
-	else
-	{
-		ri.Error(ERR_FATAL, result[2], extension);
-	}
 
 	glRefConfig.memInfo = MI_NONE;
 
@@ -591,27 +292,6 @@ void GLimp_InitExtraExtensions()
 		ri.Printf(PRINT_ALL, result[2], extension);
 	}
 
-	// GL_ARB_occlusion_query
-	extension = "GL_ARB_occlusion_query";
-	glRefConfig.occlusionQuery = qfalse;
-	if (GLimp_HaveExtension(extension))
-	{
-		qglGenQueriesARB = (PFNGLGENQUERIESARBPROC) SDL_GL_GetProcAddress("glGenQueriesARB");
-		qglDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC) SDL_GL_GetProcAddress("glDeleteQueriesARB");
-		qglIsQueryARB = (PFNGLISQUERYARBPROC) SDL_GL_GetProcAddress("glIsQueryARB");
-		qglBeginQueryARB = (PFNGLBEGINQUERYARBPROC) SDL_GL_GetProcAddress("glBeginQueryARB");
-		qglEndQueryARB = (PFNGLENDQUERYARBPROC) SDL_GL_GetProcAddress("glEndQueryARB");
-		qglGetQueryivARB = (PFNGLGETQUERYIVARBPROC) SDL_GL_GetProcAddress("glGetQueryivARB");
-		qglGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC) SDL_GL_GetProcAddress("glGetQueryObjectivARB");
-		qglGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC) SDL_GL_GetProcAddress("glGetQueryObjectuivARB");
-		glRefConfig.occlusionQuery = qtrue;
-		ri.Printf(PRINT_ALL, result[glRefConfig.occlusionQuery], extension);
-	}
-	else
-	{
-		ri.Printf(PRINT_ALL, result[2], extension);
-	}
-
 	// GL_EXT_framebuffer_blit
 	extension = "GL_EXT_framebuffer_blit";
 	glRefConfig.framebufferBlit = qfalse;
@@ -626,22 +306,6 @@ void GLimp_InitExtraExtensions()
 		ri.Printf(PRINT_ALL, result[2], extension);
 	}
 
-	// GL_ARB_texture_compression
-	extension = "GL_ARB_texture_compression";
-	glRefConfig.arbTextureCompression = qfalse;
-	if (GLimp_HaveExtension(extension))
-	{
-		qglCompressedTexImage3DARB = (void *)SDL_GL_GetProcAddress("glCompressedTexImage3DARB");
-		qglCompressedTexImage2DARB = (void *)SDL_GL_GetProcAddress("glCompressedTexImage2DARB");
-		qglCompressedTexImage1DARB = (void *)SDL_GL_GetProcAddress("glCompressedTexImage1DARB");
-		qglCompressedTexSubImage3DARB = (void *)SDL_GL_GetProcAddress("glCompressedTexSubImage3DARB");
-		qglCompressedTexSubImage2DARB = (void *)SDL_GL_GetProcAddress("glCompressedTexSubImage2DARB");
-		qglCompressedTexSubImage1DARB = (void *)SDL_GL_GetProcAddress("glCompressedTexSubImage1DARB");
-		qglGetCompressedTexImageARB = (void *)SDL_GL_GetProcAddress("glGetCompressedTexImageARB");
-		glRefConfig.arbTextureCompression = qtrue;
-		ri.Printf(PRINT_ALL, result[glRefConfig.arbTextureCompression], extension);
-	}
-
 	// GL_EXT_framebuffer_multisample
 	extension = "GL_EXT_framebuffer_multisample";
 	glRefConfig.framebufferMultisample = qfalse;
@@ -662,7 +326,7 @@ void GLimp_InitExtraExtensions()
 	extension = "GL_ARB_texture_compression_rgtc";
 	if (GLimp_HaveExtension(extension))
 	{
-		if (r_ext_compressed_textures->integer && glRefConfig.arbTextureCompression)
+		if (r_ext_compressed_textures->integer)
 			glRefConfig.textureCompression |= TCR_RGTC;
 
 		ri.Printf(PRINT_ALL, result[r_ext_compressed_textures->integer ? 1 : 0], extension);
diff --git a/MP/code/rend2/tr_glsl.c b/MP/code/rend2/tr_glsl.c
index cf2a514..318853a 100644
--- a/MP/code/rend2/tr_glsl.c
+++ b/MP/code/rend2/tr_glsl.c
@@ -153,7 +153,7 @@ static uniformInfo_t uniformsInfo[] =
 };
 
 
-static void GLSL_PrintInfoLog(GLhandleARB object, qboolean developerOnly)
+static void GLSL_PrintInfoLog(GLuint program, qboolean developerOnly)
 {
 	char           *msg;
 	static char     msgPart[1024];
@@ -161,7 +161,7 @@ static void GLSL_PrintInfoLog(GLhandleARB object, qboolean developerOnly)
 	int             i;
 	int             printLevel = developerOnly ? PRINT_DEVELOPER : PRINT_ALL;
 
-	qglGetObjectParameterivARB(object, GL_OBJECT_INFO_LOG_LENGTH_ARB, &maxLength);
+	qglGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
 
 	if (maxLength <= 0)
 	{
@@ -173,7 +173,7 @@ static void GLSL_PrintInfoLog(GLhandleARB object, qboolean developerOnly)
 
 	if (maxLength < 1023)
 	{
-		qglGetInfoLogARB(object, maxLength, &maxLength, msgPart);
+		qglGetProgramInfoLog(program, maxLength, &maxLength, msgPart);
 
 		msgPart[maxLength + 1] = '\0';
 
@@ -183,7 +183,7 @@ static void GLSL_PrintInfoLog(GLhandleARB object, qboolean developerOnly)
 	{
 		msg = ri.Z_Malloc(maxLength);
 
-		qglGetInfoLogARB(object, maxLength, &maxLength, msg);
+		qglGetProgramInfoLog(program, maxLength, &maxLength, msg);
 
 		for(i = 0; i < maxLength; i += 1024)
 		{
@@ -196,18 +196,18 @@ static void GLSL_PrintInfoLog(GLhandleARB object, qboolean developerOnly)
 	}
 }
 
-static void GLSL_PrintShaderSource(GLhandleARB object)
+static void GLSL_PrintShaderSource(GLuint shader)
 {
 	char           *msg;
 	static char     msgPart[1024];
 	int             maxLength = 0;
 	int             i;
 
-	qglGetObjectParameterivARB(object, GL_OBJECT_SHADER_SOURCE_LENGTH_ARB, &maxLength);
+	qglGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &maxLength);
 
 	msg = ri.Z_Malloc(maxLength);
 
-	qglGetShaderSourceARB(object, maxLength, &maxLength, msg);
+	qglShaderSource(shader, 1, (const GLchar **)&msg, &maxLength);
 
 	for(i = 0; i < maxLength; i += 1024)
 	{
@@ -218,7 +218,7 @@ static void GLSL_PrintShaderSource(GLhandleARB object)
 	ri.Free(msg);
 }
 
-static void GLSL_GetShaderHeader( GLenum shaderType, const GLcharARB *extra, char *dest, int size )
+static void GLSL_GetShaderHeader( GLenum shaderType, const GLchar *extra, char *dest, int size )
 {
 	float fbufWidthScale, fbufHeightScale;
 
@@ -229,7 +229,7 @@ static void GLSL_GetShaderHeader( GLenum shaderType, const GLcharARB *extra, cha
 	{
 		Q_strcat(dest, size, "#version 130\n");
 
-		if(shaderType == GL_VERTEX_SHADER_ARB)
+		if(shaderType == GL_VERTEX_SHADER)
 		{
 			Q_strcat(dest, size, "#define attribute in\n");
 			Q_strcat(dest, size, "#define varying out\n");
@@ -355,20 +355,20 @@ static void GLSL_GetShaderHeader( GLenum shaderType, const GLcharARB *extra, cha
 	Q_strcat(dest, size, "#line 0\n");
 }
 
-static int GLSL_CompileGPUShader(GLhandleARB program, GLhandleARB *prevShader, const GLcharARB *buffer, int size, GLenum shaderType)
+static int GLSL_CompileGPUShader(GLuint program, GLuint *prevShader, const GLchar *buffer, int size, GLenum shaderType)
 {
 	GLint           compiled;
-	GLhandleARB     shader;
+	GLuint          shader;
 
-	shader = qglCreateShaderObjectARB(shaderType);
+	shader = qglCreateShader(shaderType);
 
-	qglShaderSourceARB(shader, 1, (const GLcharARB **)&buffer, &size);
+	qglShaderSource(shader, 1, (const GLchar **)&buffer, &size);
 
 	// compile shader
-	qglCompileShaderARB(shader);
+	qglCompileShader(shader);
 
 	// check if shader compiled
-	qglGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &compiled);
+	qglGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
 	if(!compiled)
 	{
 		GLSL_PrintShaderSource(shader);
@@ -382,12 +382,12 @@ static int GLSL_CompileGPUShader(GLhandleARB program, GLhandleARB *prevShader, c
 
 	if (*prevShader)
 	{
-		qglDetachObjectARB(program, *prevShader);
-		qglDeleteObjectARB(*prevShader);
+		qglDetachShader(program, *prevShader);
+		qglDeleteShader(*prevShader);
 	}
 
 	// attach shader to program
-	qglAttachObjectARB(program, shader);
+	qglAttachShader(program, shader);
 
 	*prevShader = shader;
 
@@ -398,12 +398,12 @@ static int GLSL_LoadGPUShaderText(const char *name, const char *fallback,
 	GLenum shaderType, char *dest, int destSize)
 {
 	char            filename[MAX_QPATH];
-	GLcharARB      *buffer = NULL;
-	const GLcharARB *shaderText = NULL;
+	GLchar      *buffer = NULL;
+	const GLchar *shaderText = NULL;
 	int             size;
 	int             result;
 
-	if(shaderType == GL_VERTEX_SHADER_ARB)
+	if(shaderType == GL_VERTEX_SHADER)
 	{
 		Com_sprintf(filename, sizeof(filename), "glsl/%s_vp.glsl", name);
 	}
@@ -457,13 +457,13 @@ static int GLSL_LoadGPUShaderText(const char *name, const char *fallback,
 	return result;
 }
 
-static void GLSL_LinkProgram(GLhandleARB program)
+static void GLSL_LinkProgram(GLuint program)
 {
 	GLint           linked;
 
-	qglLinkProgramARB(program);
+	qglLinkProgram(program);
 
-	qglGetObjectParameterivARB(program, GL_OBJECT_LINK_STATUS_ARB, &linked);
+	qglGetProgramiv(program, GL_LINK_STATUS, &linked);
 	if(!linked)
 	{
 		GLSL_PrintInfoLog(program, qfalse);
@@ -472,13 +472,13 @@ static void GLSL_LinkProgram(GLhandleARB program)
 	}
 }
 
-static void GLSL_ValidateProgram(GLhandleARB program)
+static void GLSL_ValidateProgram(GLuint program)
 {
 	GLint           validated;
 
-	qglValidateProgramARB(program);
+	qglValidateProgram(program);
 
-	qglGetObjectParameterivARB(program, GL_OBJECT_VALIDATE_STATUS_ARB, &validated);
+	qglGetProgramiv(program, GL_VALIDATE_STATUS, &validated);
 	if(!validated)
 	{
 		GLSL_PrintInfoLog(program, qfalse);
@@ -487,19 +487,19 @@ static void GLSL_ValidateProgram(GLhandleARB program)
 	}
 }
 
-static void GLSL_ShowProgramUniforms(GLhandleARB program)
+static void GLSL_ShowProgramUniforms(GLuint program)
 {
 	int             i, count, size;
 	GLenum			type;
 	char            uniformName[1000];
 
 	// query the number of active uniforms
-	qglGetObjectParameterivARB(program, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &count);
+	qglGetProgramiv(program, GL_ACTIVE_UNIFORMS, &count);
 
 	// Loop over each of the active uniforms, and set their value
 	for(i = 0; i < count; i++)
 	{
-		qglGetActiveUniformARB(program, i, sizeof(uniformName), NULL, &size, &type, uniformName);
+		qglGetActiveUniform(program, i, sizeof(uniformName), NULL, &size, &type, uniformName);
 
 		ri.Printf(PRINT_DEVELOPER, "active uniform: '%s'\n", uniformName);
 	}
@@ -516,64 +516,64 @@ static int GLSL_InitGPUShader2(shaderProgram_t * program, const char *name, int
 
 	Q_strncpyz(program->name, name, sizeof(program->name));
 
-	program->program = qglCreateProgramObjectARB();
+	program->program = qglCreateProgram();
 	program->attribs = attribs;
 
-	if (!(GLSL_CompileGPUShader(program->program, &program->vertexShader, vpCode, strlen(vpCode), GL_VERTEX_SHADER_ARB)))
+	if (!(GLSL_CompileGPUShader(program->program, &program->vertexShader, vpCode, strlen(vpCode), GL_VERTEX_SHADER)))
 	{
-		ri.Printf(PRINT_ALL, "GLSL_InitGPUShader2: Unable to load \"%s\" as GL_VERTEX_SHADER_ARB\n", name);
-		qglDeleteObjectARB(program->program);
+		ri.Printf(PRINT_ALL, "GLSL_InitGPUShader2: Unable to load \"%s\" as GL_VERTEX_SHADER\n", name);
+		qglDeleteProgram(program->program);
 		return 0;
 	}
 
 	if(fpCode)
 	{
-		if(!(GLSL_CompileGPUShader(program->program, &program->fragmentShader, fpCode, strlen(fpCode), GL_FRAGMENT_SHADER_ARB)))
+		if(!(GLSL_CompileGPUShader(program->program, &program->fragmentShader, fpCode, strlen(fpCode), GL_FRAGMENT_SHADER)))
 		{
-			ri.Printf(PRINT_ALL, "GLSL_InitGPUShader2: Unable to load \"%s\" as GL_FRAGMENT_SHADER_ARB\n", name);
-			qglDeleteObjectARB(program->program);
+			ri.Printf(PRINT_ALL, "GLSL_InitGPUShader2: Unable to load \"%s\" as GL_FRAGMENT_SHADER\n", name);
+			qglDeleteProgram(program->program);
 			return 0;
 		}
 	}
 
 	if(attribs & ATTR_POSITION)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_POSITION, "attr_Position");
+		qglBindAttribLocation(program->program, ATTR_INDEX_POSITION, "attr_Position");
 
 	if(attribs & ATTR_TEXCOORD)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_TEXCOORD, "attr_TexCoord0");
+		qglBindAttribLocation(program->program, ATTR_INDEX_TEXCOORD, "attr_TexCoord0");
 
 	if(attribs & ATTR_LIGHTCOORD)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_LIGHTCOORD, "attr_TexCoord1");
+		qglBindAttribLocation(program->program, ATTR_INDEX_LIGHTCOORD, "attr_TexCoord1");
 
 //  if(attribs & ATTR_TEXCOORD2)
-//      qglBindAttribLocationARB(program->program, ATTR_INDEX_TEXCOORD2, "attr_TexCoord2");
+//      qglBindAttribLocation(program->program, ATTR_INDEX_TEXCOORD2, "attr_TexCoord2");
 
 //  if(attribs & ATTR_TEXCOORD3)
-//      qglBindAttribLocationARB(program->program, ATTR_INDEX_TEXCOORD3, "attr_TexCoord3");
+//      qglBindAttribLocation(program->program, ATTR_INDEX_TEXCOORD3, "attr_TexCoord3");
 
 	if(attribs & ATTR_TANGENT)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_TANGENT, "attr_Tangent");
+		qglBindAttribLocation(program->program, ATTR_INDEX_TANGENT, "attr_Tangent");
 
 	if(attribs & ATTR_NORMAL)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_NORMAL, "attr_Normal");
+		qglBindAttribLocation(program->program, ATTR_INDEX_NORMAL, "attr_Normal");
 
 	if(attribs & ATTR_COLOR)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_COLOR, "attr_Color");
+		qglBindAttribLocation(program->program, ATTR_INDEX_COLOR, "attr_Color");
 
 	if(attribs & ATTR_PAINTCOLOR)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_PAINTCOLOR, "attr_PaintColor");
+		qglBindAttribLocation(program->program, ATTR_INDEX_PAINTCOLOR, "attr_PaintColor");
 
 	if(attribs & ATTR_LIGHTDIRECTION)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_LIGHTDIRECTION, "attr_LightDirection");
+		qglBindAttribLocation(program->program, ATTR_INDEX_LIGHTDIRECTION, "attr_LightDirection");
 
 	if(attribs & ATTR_POSITION2)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_POSITION2, "attr_Position2");
+		qglBindAttribLocation(program->program, ATTR_INDEX_POSITION2, "attr_Position2");
 
 	if(attribs & ATTR_NORMAL2)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_NORMAL2, "attr_Normal2");
+		qglBindAttribLocation(program->program, ATTR_INDEX_NORMAL2, "attr_Normal2");
 
 	if(attribs & ATTR_TANGENT2)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_TANGENT2, "attr_Tangent2");
+		qglBindAttribLocation(program->program, ATTR_INDEX_TANGENT2, "attr_Tangent2");
 
 	GLSL_LinkProgram(program->program);
 
@@ -581,7 +581,7 @@ static int GLSL_InitGPUShader2(shaderProgram_t * program, const char *name, int
 }
 
 static int GLSL_InitGPUShader(shaderProgram_t * program, const char *name,
-	int attribs, qboolean fragmentShader, const GLcharARB *extra, qboolean addHeader,
+	int attribs, qboolean fragmentShader, const GLchar *extra, qboolean addHeader,
 	const char *fallback_vp, const char *fallback_fp)
 {
 	char vpCode[32000];
@@ -593,7 +593,7 @@ static int GLSL_InitGPUShader(shaderProgram_t * program, const char *name,
 	size = sizeof(vpCode);
 	if (addHeader)
 	{
-		GLSL_GetShaderHeader(GL_VERTEX_SHADER_ARB, extra, vpCode, size);
+		GLSL_GetShaderHeader(GL_VERTEX_SHADER, extra, vpCode, size);
 		postHeader = &vpCode[strlen(vpCode)];
 		size -= strlen(vpCode);
 	}
@@ -602,7 +602,7 @@ static int GLSL_InitGPUShader(shaderProgram_t * program, const char *name,
 		postHeader = &vpCode[0];
 	}
 
-	if (!GLSL_LoadGPUShaderText(name, fallback_vp, GL_VERTEX_SHADER_ARB, postHeader, size))
+	if (!GLSL_LoadGPUShaderText(name, fallback_vp, GL_VERTEX_SHADER, postHeader, size))
 	{
 		return 0;
 	}
@@ -612,7 +612,7 @@ static int GLSL_InitGPUShader(shaderProgram_t * program, const char *name,
 		size = sizeof(fpCode);
 		if (addHeader)
 		{
-			GLSL_GetShaderHeader(GL_FRAGMENT_SHADER_ARB, extra, fpCode, size);
+			GLSL_GetShaderHeader(GL_FRAGMENT_SHADER, extra, fpCode, size);
 			postHeader = &fpCode[strlen(fpCode)];
 			size -= strlen(fpCode);
 		}
@@ -621,7 +621,7 @@ static int GLSL_InitGPUShader(shaderProgram_t * program, const char *name,
 			postHeader = &fpCode[0];
 		}
 
-		if (!GLSL_LoadGPUShaderText(name, fallback_fp, GL_FRAGMENT_SHADER_ARB, postHeader, size))
+		if (!GLSL_LoadGPUShaderText(name, fallback_fp, GL_FRAGMENT_SHADER, postHeader, size))
 		{
 			return 0;
 		}
@@ -641,7 +641,7 @@ void GLSL_InitUniforms(shaderProgram_t *program)
 	size = 0;
 	for (i = 0; i < UNIFORM_COUNT; i++)
 	{
-		uniforms[i] = qglGetUniformLocationARB(program->program, uniformsInfo[i].name);
+		uniforms[i] = qglGetUniformLocation(program->program, uniformsInfo[i].name);
 
 		if (uniforms[i] == -1)
 			continue;
@@ -861,17 +861,17 @@ void GLSL_DeleteGPUShader(shaderProgram_t *program)
 	{
 		if (program->vertexShader)
 		{
-			qglDetachObjectARB(program->program, program->vertexShader);
-			qglDeleteObjectARB(program->vertexShader);
+			qglDetachShader(program->program, program->vertexShader);
+			qglDeleteShader(program->vertexShader);
 		}
 
 		if (program->fragmentShader)
 		{
-			qglDetachObjectARB(program->program, program->fragmentShader);
-			qglDeleteObjectARB(program->fragmentShader);
+			qglDetachShader(program->program, program->fragmentShader);
+			qglDeleteShader(program->fragmentShader);
 		}
 
-		qglDeleteObjectARB(program->program);
+		qglDeleteProgram(program->program);
 
 		if (program->uniformBuffer)
 		{
@@ -1378,7 +1378,7 @@ void GLSL_ShutdownGPUShaders(void)
 	ri.Printf(PRINT_ALL, "------- GLSL_ShutdownGPUShaders -------\n");
 
 	for (i = 0; i < ATTR_INDEX_COUNT; i++)
-		qglDisableVertexAttribArrayARB(i);
+		qglDisableVertexAttribArray(i);
 
 	GL_BindNullProgram();
 
@@ -1424,7 +1424,7 @@ void GLSL_BindProgram(shaderProgram_t * program)
 		GLimp_LogComment(va("--- GLSL_BindProgram( %s ) ---\n", name));
 	}
 
-	if (GL_UseProgramObject(programObject))
+	if (GL_UseProgram(programObject))
 		backEnd.pc.c_glslShaderBinds++;
 }
 
diff --git a/MP/code/rend2/tr_init.c b/MP/code/rend2/tr_init.c
index 7c50aaa..84aba6c 100644
--- a/MP/code/rend2/tr_init.c
+++ b/MP/code/rend2/tr_init.c
@@ -1046,8 +1046,8 @@ void GL_SetDefaultState( void ) {
 	if (glRefConfig.vertexArrayObject)
 		qglBindVertexArrayARB(0);
 
-	qglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
-	qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+	qglBindBuffer(GL_ARRAY_BUFFER, 0);
+	qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 	glState.currentVao = NULL;
 	glState.vertexAttribsEnabled = 0;
 
@@ -1532,7 +1532,7 @@ void R_InitQueries(void)
 		return;
 
 	if (r_drawSunRays->integer)
-		qglGenQueriesARB(ARRAY_LEN(tr.sunFlareQuery), tr.sunFlareQuery);
+		qglGenQueries(ARRAY_LEN(tr.sunFlareQuery), tr.sunFlareQuery);
 }
 
 void R_ShutDownQueries(void)
@@ -1541,7 +1541,7 @@ void R_ShutDownQueries(void)
 		return;
 
 	if (r_drawSunRays->integer)
-		qglDeleteQueriesARB(ARRAY_LEN(tr.sunFlareQuery), tr.sunFlareQuery);
+		qglDeleteQueries(ARRAY_LEN(tr.sunFlareQuery), tr.sunFlareQuery);
 }
 
 /*
diff --git a/MP/code/rend2/tr_local.h b/MP/code/rend2/tr_local.h
index 7f8264b..af96bba 100644
--- a/MP/code/rend2/tr_local.h
+++ b/MP/code/rend2/tr_local.h
@@ -796,9 +796,9 @@ typedef struct shaderProgram_s
 {
 	char            name[MAX_QPATH];
 
-	GLhandleARB     program;
-	GLhandleARB     vertexShader;
-	GLhandleARB     fragmentShader;
+	GLuint          program;
+	GLuint          vertexShader;
+	GLuint          fragmentShader;
 	uint32_t        attribs;	// vertex array attributes
 
 	// uniform parameters
@@ -1515,6 +1515,9 @@ typedef enum {
 // We can't change glConfig_t without breaking DLL/vms compatibility, so
 // store extensions we have here.
 typedef struct {
+	int openglMajorVersion;
+	int openglMinorVersion;
+
 	qboolean    drawRangeElements;
 	qboolean    multiDrawArrays;
 	qboolean	occlusionQuery;
@@ -1532,7 +1535,6 @@ typedef struct {
 	qboolean textureFloat;
 	qboolean halfFloatPixel;
 	qboolean packedDepthStencil;
-	qboolean arbTextureCompression;
 	textureCompressionRef_t textureCompression;
 	qboolean swizzleNormalmap;
 	
diff --git a/MP/code/rend2/tr_postprocess.c b/MP/code/rend2/tr_postprocess.c
index c4e5155..ade9ebf 100644
--- a/MP/code/rend2/tr_postprocess.c
+++ b/MP/code/rend2/tr_postprocess.c
@@ -282,7 +282,7 @@ static qboolean RB_UpdateSunFlareVis(void)
 		for (iter=0 ; ; ++iter)
 		{
 			GLint available = 0;
-			qglGetQueryObjectivARB(tr.sunFlareQuery[tr.sunFlareQueryIndex], GL_QUERY_RESULT_AVAILABLE_ARB, &available);
+			qglGetQueryObjectiv(tr.sunFlareQuery[tr.sunFlareQueryIndex], GL_QUERY_RESULT_AVAILABLE, &available);
 			if (available)
 				break;
 		}
@@ -290,7 +290,7 @@ static qboolean RB_UpdateSunFlareVis(void)
 		ri.Printf(PRINT_DEVELOPER, "Waited %d iterations\n", iter);
 	}
 	
-	qglGetQueryObjectuivARB(tr.sunFlareQuery[tr.sunFlareQueryIndex], GL_QUERY_RESULT_ARB, &sampleCount);
+	qglGetQueryObjectuiv(tr.sunFlareQuery[tr.sunFlareQueryIndex], GL_QUERY_RESULT, &sampleCount);
 	return sampleCount > 0;
 }
 
diff --git a/MP/code/rend2/tr_shade.c b/MP/code/rend2/tr_shade.c
index 23e0d42..0b93ddd 100644
--- a/MP/code/rend2/tr_shade.c
+++ b/MP/code/rend2/tr_shade.c
@@ -50,7 +50,7 @@ R_DrawElements
 void R_DrawElementsVao( int numIndexes, glIndex_t firstIndex, glIndex_t minIndex, glIndex_t maxIndex )
 {
 	if (glRefConfig.drawRangeElements)
-		qglDrawRangeElementsEXT(GL_TRIANGLES, minIndex, maxIndex, numIndexes, GL_INDEX_TYPE, BUFFER_OFFSET(firstIndex * sizeof(glIndex_t)));
+		qglDrawRangeElements(GL_TRIANGLES, minIndex, maxIndex, numIndexes, GL_INDEX_TYPE, BUFFER_OFFSET(firstIndex * sizeof(glIndex_t)));
 	else
 		qglDrawElements(GL_TRIANGLES, numIndexes, GL_INDEX_TYPE, BUFFER_OFFSET(firstIndex * sizeof(glIndex_t)));
 	
@@ -62,7 +62,7 @@ static void R_DrawMultiElementsVao( int multiDrawPrimitives, glIndex_t *multiDra
 {
 	if (glRefConfig.multiDrawArrays && multiDrawPrimitives > 1)
 	{
-		qglMultiDrawElementsEXT(GL_TRIANGLES, multiDrawNumIndexes, GL_INDEX_TYPE, (const GLvoid **)multiDrawFirstIndex, multiDrawPrimitives);
+		qglMultiDrawElements(GL_TRIANGLES, multiDrawNumIndexes, GL_INDEX_TYPE, (const GLvoid **)multiDrawFirstIndex, multiDrawPrimitives);
 	}
 	else
 	{
@@ -72,7 +72,7 @@ static void R_DrawMultiElementsVao( int multiDrawPrimitives, glIndex_t *multiDra
 		{
 			for (i = 0; i < multiDrawPrimitives; i++)
 			{
-				qglDrawRangeElementsEXT(GL_TRIANGLES, multiDrawMinIndex[i], multiDrawMaxIndex[i], multiDrawNumIndexes[i], GL_INDEX_TYPE, multiDrawFirstIndex[i]);
+				qglDrawRangeElements(GL_TRIANGLES, multiDrawMinIndex[i], multiDrawMaxIndex[i], multiDrawNumIndexes[i], GL_INDEX_TYPE, multiDrawFirstIndex[i]);
 			}
 		}
 		else
diff --git a/MP/code/rend2/tr_surface.c b/MP/code/rend2/tr_surface.c
index 3b3769a..864ace5 100644
--- a/MP/code/rend2/tr_surface.c
+++ b/MP/code/rend2/tr_surface.c
@@ -1880,43 +1880,43 @@ void RB_SurfaceVaoMdvMesh(srfVaoMdvMesh_t * surface)
 
 		if (glRefConfig.vertexArrayObject)
 		{
-			qglBindBufferARB(GL_ARRAY_BUFFER_ARB, surface->vao->vertexesVBO);
+			qglBindBuffer(GL_ARRAY_BUFFER, surface->vao->vertexesVBO);
 		}
 
 		frameOffset    = refEnt->frame * surface->vao->frameSize;
 
 		attribIndex = ATTR_INDEX_POSITION;
 		vAtb = &surface->vao->attribs[attribIndex];
-		qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
+		qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
 
 		attribIndex = ATTR_INDEX_NORMAL;
 		vAtb = &surface->vao->attribs[attribIndex];
-		qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
+		qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
 
 		attribIndex = ATTR_INDEX_TANGENT;
 		vAtb = &surface->vao->attribs[attribIndex];
-		qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
+		qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
 
 		frameOffset = refEnt->oldframe * surface->vao->frameSize;
 
 		attribIndex = ATTR_INDEX_POSITION2;
 		vAtb = &surface->vao->attribs[attribIndex];
-		qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
+		qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
 
 		attribIndex = ATTR_INDEX_NORMAL2;
 		vAtb = &surface->vao->attribs[attribIndex];
-		qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
+		qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
 
 		attribIndex = ATTR_INDEX_TANGENT2;
 		vAtb = &surface->vao->attribs[attribIndex];
-		qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
+		qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
 
 
 		if (!glRefConfig.vertexArrayObject)
 		{
 			attribIndex = ATTR_INDEX_TEXCOORD;
 			vAtb = &surface->vao->attribs[attribIndex];
-			qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset));
+			qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset));
 		}
 	}
 
diff --git a/MP/code/rend2/tr_vbo.c b/MP/code/rend2/tr_vbo.c
index 8f9ba66..61ede4e 100644
--- a/MP/code/rend2/tr_vbo.c
+++ b/MP/code/rend2/tr_vbo.c
@@ -196,9 +196,9 @@ void Vao_SetVertexPointers(vao_t *vao)
 
 		if (vAtb->enabled)
 		{
-			qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset));
+			qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset));
 			if (glRefConfig.vertexArrayObject || !(glState.vertexAttribsEnabled & attribBit))
-				qglEnableVertexAttribArrayARB(attribIndex);
+				qglEnableVertexAttribArray(attribIndex);
 
 			if (!glRefConfig.vertexArrayObject || vao == tess.vao)
 				glState.vertexAttribsEnabled |= attribBit;
@@ -208,7 +208,7 @@ void Vao_SetVertexPointers(vao_t *vao)
 			// don't disable vertex attribs when using vertex array objects
 			// Vao_SetVertexPointers is only called during init when using VAOs, and vertex attribs start disabled anyway
 			if (!glRefConfig.vertexArrayObject && (glState.vertexAttribsEnabled & attribBit))
-				qglDisableVertexAttribArrayARB(attribIndex);
+				qglDisableVertexAttribArray(attribIndex);
 
 			if (!glRefConfig.vertexArrayObject || vao == tess.vao)
 				glState.vertexAttribsEnabled &= ~attribBit;
@@ -229,11 +229,11 @@ vao_t *R_CreateVao(const char *name, byte *vertexes, int vertexesSize, byte *ind
 	switch (usage)
 	{
 		case VAO_USAGE_STATIC:
-			glUsage = GL_STATIC_DRAW_ARB;
+			glUsage = GL_STATIC_DRAW;
 			break;
 
 		case VAO_USAGE_DYNAMIC:
-			glUsage = GL_DYNAMIC_DRAW_ARB;
+			glUsage = GL_DYNAMIC_DRAW;
 			break;
 
 		default:
@@ -269,18 +269,18 @@ vao_t *R_CreateVao(const char *name, byte *vertexes, int vertexesSize, byte *ind
 
 	vao->vertexesSize = vertexesSize;
 
-	qglGenBuffersARB(1, &vao->vertexesVBO);
+	qglGenBuffers(1, &vao->vertexesVBO);
 
-	qglBindBufferARB(GL_ARRAY_BUFFER_ARB, vao->vertexesVBO);
-	qglBufferDataARB(GL_ARRAY_BUFFER_ARB, vertexesSize, vertexes, glUsage);
+	qglBindBuffer(GL_ARRAY_BUFFER, vao->vertexesVBO);
+	qglBufferData(GL_ARRAY_BUFFER, vertexesSize, vertexes, glUsage);
 
 
 	vao->indexesSize = indexesSize;
 
-	qglGenBuffersARB(1, &vao->indexesIBO);
+	qglGenBuffers(1, &vao->indexesIBO);
 
-	qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vao->indexesIBO);
-	qglBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indexesSize, indexes, glUsage);
+	qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vao->indexesIBO);
+	qglBufferData(GL_ELEMENT_ARRAY_BUFFER, indexesSize, indexes, glUsage);
 
 
 	glState.currentVao = vao;
@@ -304,7 +304,7 @@ vao_t *R_CreateVao2(const char *name, int numVertexes, srfVert_t *verts, int num
 	int             dataSize;
 	int             dataOfs;
 
-	int				glUsage = GL_STATIC_DRAW_ARB;
+	int				glUsage = GL_STATIC_DRAW;
 
 	if(!numVertexes || !numIndexes)
 		return NULL;
@@ -422,19 +422,19 @@ vao_t *R_CreateVao2(const char *name, int numVertexes, srfVert_t *verts, int num
 
 	vao->vertexesSize = dataSize;
 
-	qglGenBuffersARB(1, &vao->vertexesVBO);
+	qglGenBuffers(1, &vao->vertexesVBO);
 
-	qglBindBufferARB(GL_ARRAY_BUFFER_ARB, vao->vertexesVBO);
-	qglBufferDataARB(GL_ARRAY_BUFFER_ARB, vao->vertexesSize, data, glUsage);
+	qglBindBuffer(GL_ARRAY_BUFFER, vao->vertexesVBO);
+	qglBufferData(GL_ARRAY_BUFFER, vao->vertexesSize, data, glUsage);
 
 
 	// create IBO
 	vao->indexesSize = numIndexes * sizeof(glIndex_t);
 
-	qglGenBuffersARB(1, &vao->indexesIBO);
+	qglGenBuffers(1, &vao->indexesIBO);
 
-	qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vao->indexesIBO);
-	qglBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vao->indexesSize, indexes, glUsage);
+	qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vao->indexesIBO);
+	qglBufferData(GL_ELEMENT_ARRAY_BUFFER, vao->indexesSize, indexes, glUsage);
 
 
 	Vao_SetVertexPointers(vao);
@@ -484,16 +484,16 @@ void R_BindVao(vao_t * vao)
 
 			// why you no save GL_ELEMENT_ARRAY_BUFFER binding, Intel?
 			if (1)
-				qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, vao->indexesIBO);
+				qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vao->indexesIBO);
 
 			// tess VAO always has buffers bound
 			if (vao == tess.vao)
-				qglBindBufferARB(GL_ARRAY_BUFFER_ARB, vao->vertexesVBO);
+				qglBindBuffer(GL_ARRAY_BUFFER, vao->vertexesVBO);
 		}
 		else
 		{
-			qglBindBufferARB(GL_ARRAY_BUFFER_ARB, vao->vertexesVBO);
-			qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vao->indexesIBO);
+			qglBindBuffer(GL_ARRAY_BUFFER, vao->vertexesVBO);
+			qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vao->indexesIBO);
 
 			// tess VAO doesn't have vertex pointers set until data is uploaded
 			if (vao != tess.vao)
@@ -518,12 +518,12 @@ void R_BindNullVao(void)
 			qglBindVertexArrayARB(0);
 
 			// why you no save GL_ELEMENT_ARRAY_BUFFER binding, Intel?
-			if (1) qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+			if (1) qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 		}
 		else
 		{
-			qglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
-			qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+			qglBindBuffer(GL_ARRAY_BUFFER, 0);
+			qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 		}
 		glState.currentVao = NULL;
 	}
@@ -658,12 +658,12 @@ void R_ShutdownVaos(void)
 
 		if(vao->vertexesVBO)
 		{
-			qglDeleteBuffersARB(1, &vao->vertexesVBO);
+			qglDeleteBuffers(1, &vao->vertexesVBO);
 		}
 
 		if(vao->indexesIBO)
 		{
-			qglDeleteBuffersARB(1, &vao->indexesIBO);
+			qglDeleteBuffers(1, &vao->indexesIBO);
 		}
 	}
 
@@ -737,7 +737,7 @@ void RB_UpdateTessVao(unsigned int attribBits)
 		R_BindVao(tess.vao);
 
 		// orphan old vertex buffer so we don't stall on it
-		qglBufferDataARB(GL_ARRAY_BUFFER_ARB, tess.vao->vertexesSize, NULL, GL_DYNAMIC_DRAW_ARB);
+		qglBufferData(GL_ARRAY_BUFFER, tess.vao->vertexesSize, NULL, GL_DYNAMIC_DRAW);
 
 		// if nothing to set, set everything
 		if(!(attribBits & ATTR_BITS))
@@ -761,17 +761,17 @@ void RB_UpdateTessVao(unsigned int attribBits)
 			if (attribUpload & attribBit)
 			{
 				// note: tess has a VBO where stride == size
-				qglBufferSubDataARB(GL_ARRAY_BUFFER_ARB, vAtb->offset, tess.numVertexes * vAtb->stride, tess.attribPointers[attribIndex]);
+				qglBufferSubData(GL_ARRAY_BUFFER, vAtb->offset, tess.numVertexes * vAtb->stride, tess.attribPointers[attribIndex]);
 			}
 
 			if (attribBits & attribBit)
 			{
 				if (!glRefConfig.vertexArrayObject)
-					qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset));
+					qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset));
 
 				if (!(glState.vertexAttribsEnabled & attribBit))
 				{
-					qglEnableVertexAttribArrayARB(attribIndex);
+					qglEnableVertexAttribArray(attribIndex);
 					glState.vertexAttribsEnabled |= attribBit;
 				}
 			}
@@ -779,15 +779,15 @@ void RB_UpdateTessVao(unsigned int attribBits)
 			{
 				if ((glState.vertexAttribsEnabled & attribBit))
 				{
-					qglDisableVertexAttribArrayARB(attribIndex);
+					qglDisableVertexAttribArray(attribIndex);
 					glState.vertexAttribsEnabled &= ~attribBit;
 				}
 			}
 		}
 
 		// orphan old index buffer so we don't stall on it
-		qglBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, tess.vao->indexesSize, NULL, GL_DYNAMIC_DRAW_ARB);
+		qglBufferData(GL_ELEMENT_ARRAY_BUFFER, tess.vao->indexesSize, NULL, GL_DYNAMIC_DRAW);
 
-		qglBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, tess.numIndexes * sizeof(tess.indexes[0]), tess.indexes);
+		qglBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, tess.numIndexes * sizeof(tess.indexes[0]), tess.indexes);
 	}
 }
diff --git a/SP/code/rend2/qgl.h b/SP/code/rend2/qgl.h
index 7a7898d..b47372e 100644
--- a/SP/code/rend2/qgl.h
+++ b/SP/code/rend2/qgl.h
@@ -453,104 +453,76 @@ extern void ( APIENTRY * qglPNTrianglesfATI )( GLenum pname, GLfloat param );
 #define qglVertexPointer glVertexPointer
 #define qglViewport glViewport
 
-// GL_EXT_draw_range_elements
-extern void     (APIENTRY * qglDrawRangeElementsEXT) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
-
-// GL_EXT_multi_draw_arrays
-extern void (APIENTRY * qglMultiDrawArraysEXT) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
-extern void (APIENTRY * qglMultiDrawElementsEXT) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount);
-
 // rend2
 
-// GL_ARB_shading_language_100
-#ifndef GL_ARB_shading_language_100
-#define GL_ARB_shading_language_100
-#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
-#endif
-
-// GL_ARB_vertex_program
-extern void     (APIENTRY * qglVertexAttrib4fARB) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
-extern void     (APIENTRY * qglVertexAttrib4fvARB) (GLuint, const GLfloat *);
-extern void     (APIENTRY * qglVertexAttribPointerARB) (GLuint index, GLint size, GLenum type, GLboolean normalized,
-														GLsizei stride, const GLvoid * pointer);
-extern void     (APIENTRY * qglEnableVertexAttribArrayARB) (GLuint index);
-extern void     (APIENTRY * qglDisableVertexAttribArrayARB) (GLuint index);
-
-// GL_ARB_vertex_buffer_object
-extern void     (APIENTRY * qglBindBufferARB) (GLenum target, GLuint buffer);
-extern void     (APIENTRY * qglDeleteBuffersARB) (GLsizei n, const GLuint * buffers);
-extern void     (APIENTRY * qglGenBuffersARB) (GLsizei n, GLuint * buffers);
-extern          GLboolean(APIENTRY * qglIsBufferARB) (GLuint buffer);
-extern void     (APIENTRY * qglBufferDataARB) (GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage);
-extern void     (APIENTRY * qglBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data);
-extern void     (APIENTRY * qglGetBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data);
-extern void     (APIENTRY * qglGetBufferParameterivARB) (GLenum target, GLenum pname, GLint * params);
-extern void     (APIENTRY * qglGetBufferPointervARB) (GLenum target, GLenum pname, GLvoid * *params);
-
-// GL_ARB_shader_objects
-extern void     (APIENTRY * qglDeleteObjectARB) (GLhandleARB obj);
-extern          GLhandleARB(APIENTRY * qglGetHandleARB) (GLenum pname);
-extern void     (APIENTRY * qglDetachObjectARB) (GLhandleARB containerObj, GLhandleARB attachedObj);
-extern          GLhandleARB(APIENTRY * qglCreateShaderObjectARB) (GLenum shaderType);
-extern void     (APIENTRY * qglShaderSourceARB) (GLhandleARB shaderObj, GLsizei count, const GLcharARB * *string,
-												 const GLint * length);
-extern void     (APIENTRY * qglCompileShaderARB) (GLhandleARB shaderObj);
-extern          GLhandleARB(APIENTRY * qglCreateProgramObjectARB) (void);
-extern void     (APIENTRY * qglAttachObjectARB) (GLhandleARB containerObj, GLhandleARB obj);
-extern void     (APIENTRY * qglLinkProgramARB) (GLhandleARB programObj);
-extern void     (APIENTRY * qglUseProgramObjectARB) (GLhandleARB programObj);
-extern void     (APIENTRY * qglValidateProgramARB) (GLhandleARB programObj);
-extern void     (APIENTRY * qglUniform1fARB) (GLint location, GLfloat v0);
-extern void     (APIENTRY * qglUniform2fARB) (GLint location, GLfloat v0, GLfloat v1);
-extern void     (APIENTRY * qglUniform3fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-extern void     (APIENTRY * qglUniform4fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-extern void     (APIENTRY * qglUniform1iARB) (GLint location, GLint v0);
-extern void     (APIENTRY * qglUniform2iARB) (GLint location, GLint v0, GLint v1);
-extern void     (APIENTRY * qglUniform3iARB) (GLint location, GLint v0, GLint v1, GLint v2);
-extern void     (APIENTRY * qglUniform4iARB) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-extern void     (APIENTRY * qglUniform1fvARB) (GLint location, GLsizei count, const GLfloat * value);
-extern void     (APIENTRY * qglUniform2fvARB) (GLint location, GLsizei count, const GLfloat * value);
-extern void     (APIENTRY * qglUniform3fvARB) (GLint location, GLsizei count, const GLfloat * value);
-extern void     (APIENTRY * qglUniform4fvARB) (GLint location, GLsizei count, const GLfloat * value);
-extern void     (APIENTRY * qglUniform2ivARB) (GLint location, GLsizei count, const GLint * value);
-extern void     (APIENTRY * qglUniform3ivARB) (GLint location, GLsizei count, const GLint * value);
-extern void     (APIENTRY * qglUniform4ivARB) (GLint location, GLsizei count, const GLint * value);
-extern void     (APIENTRY * qglUniformMatrix2fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-extern void     (APIENTRY * qglUniformMatrix3fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-extern void     (APIENTRY * qglUniformMatrix4fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-extern void     (APIENTRY * qglGetObjectParameterfvARB) (GLhandleARB obj, GLenum pname, GLfloat * params);
-extern void     (APIENTRY * qglGetObjectParameterivARB) (GLhandleARB obj, GLenum pname, GLint * params);
-extern void     (APIENTRY * qglGetInfoLogARB) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog);
-extern void     (APIENTRY * qglGetAttachedObjectsARB) (GLhandleARB containerObj, GLsizei maxCount, GLsizei * count,
-													   GLhandleARB * obj);
-extern          GLint(APIENTRY * qglGetUniformLocationARB) (GLhandleARB programObj, const GLcharARB * name);
-extern void     (APIENTRY * qglGetActiveUniformARB) (GLhandleARB programObj, GLuint index, GLsizei maxIndex, GLsizei * length,
-													 GLint * size, GLenum * type, GLcharARB * name);
-extern void     (APIENTRY * qglGetUniformfvARB) (GLhandleARB programObj, GLint location, GLfloat * params);
-extern void     (APIENTRY * qglGetUniformivARB) (GLhandleARB programObj, GLint location, GLint * params);
-extern void     (APIENTRY * qglGetShaderSourceARB) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source);
-
-// GL_ARB_vertex_shader
-extern void     (APIENTRY * qglBindAttribLocationARB) (GLhandleARB programObj, GLuint index, const GLcharARB * name);
-extern void     (APIENTRY * qglGetActiveAttribARB) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length,
-													GLint * size, GLenum * type, GLcharARB * name);
-extern          GLint(APIENTRY * qglGetAttribLocationARB) (GLhandleARB programObj, const GLcharARB * name);
-
-// GL_ARB_texture_compression
-extern void (APIENTRY * qglCompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, 
-	GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
-	GLint border, GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border,
-	GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
-	GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
-	GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglCompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, 
-	GLsizei imageSize, const GLvoid *data);
-extern void (APIENTRY * qglGetCompressedTexImageARB)(GLenum target, GLint lod,
-	GLvoid *img);
+// GL function loader, based on https://gist.github.com/rygorous/16796a0c876cf8a5f542caddb55bce8a
+
+ // OpenGL 1.2, was GL_EXT_draw_range_elements
+#define QGL_1_2_PROCS \
+	GLE(void, DrawRangeElements, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices) \
+ 
+ // OpenGL 1.3, was GL_ARB_texture_compression
+#define QGL_1_3_PROCS \
+	GLE(void, CompressedTexImage2D, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data) \
+	GLE(void, CompressedTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data) \
+ 
+ // OpenGL 1.4, was GL_EXT_multi_draw_arrays
+#define QGL_1_4_PROCS \
+	GLE(void, MultiDrawElements, GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount) \
+ 
+ // OpenGL 1.5, was GL_ARB_vertex_buffer_object and GL_ARB_occlusion_query
+#define QGL_1_5_PROCS \
+	GLE(void, GenQueries, GLsizei n, GLuint *ids) \
+	GLE(void, DeleteQueries, GLsizei n, const GLuint *ids) \
+	GLE(void, BeginQuery, GLenum target, GLuint id) \
+	GLE(void, EndQuery, GLenum target) \
+	GLE(void, GetQueryObjectiv, GLuint id, GLenum pname, GLint *params) \
+	GLE(void, GetQueryObjectuiv, GLuint id, GLenum pname, GLuint *params) \
+	GLE(void, BindBuffer, GLenum target, GLuint buffer) \
+	GLE(void, DeleteBuffers, GLsizei n, const GLuint *buffers) \
+	GLE(void, GenBuffers, GLsizei n, GLuint *buffers) \
+	GLE(void, BufferData, GLenum target, GLsizeiptr size, const void *data, GLenum usage) \
+	GLE(void, BufferSubData, GLenum target, GLintptr offset, GLsizeiptr size, const void *data) \
+ 
+ // OpenGL 2.0, was GL_ARB_shading_language_100, GL_ARB_vertex_program, GL_ARB_shader_objects, and GL_ARB_vertex_shader
+#define QGL_2_0_PROCS \
+	GLE(void, AttachShader, GLuint program, GLuint shader) \
+	GLE(void, BindAttribLocation, GLuint program, GLuint index, const GLchar *name) \
+	GLE(void, CompileShader, GLuint shader) \
+	GLE(GLuint, CreateProgram, void) \
+	GLE(GLuint, CreateShader, GLenum type) \
+	GLE(void, DeleteProgram, GLuint program) \
+	GLE(void, DeleteShader, GLuint shader) \
+	GLE(void, DetachShader, GLuint program, GLuint shader) \
+	GLE(void, DisableVertexAttribArray, GLuint index) \
+	GLE(void, EnableVertexAttribArray, GLuint index) \
+	GLE(void, GetActiveUniform, GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) \
+	GLE(void, GetProgramiv, GLuint program, GLenum pname, GLint *params) \
+	GLE(void, GetProgramInfoLog, GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) \
+	GLE(void, GetShaderiv, GLuint shader, GLenum pname, GLint *params) \
+	GLE(void, GetShaderInfoLog, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) \
+	GLE(void, GetShaderSource, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source) \
+	GLE(GLint, GetUniformLocation, GLuint program, const GLchar *name) \
+	GLE(void, LinkProgram, GLuint program) \
+	GLE(void, ShaderSource, GLuint shader, GLsizei count, const GLchar* *string, const GLint *length) \
+	GLE(void, UseProgram, GLuint program) \
+	GLE(void, Uniform1f, GLint location, GLfloat v0) \
+	GLE(void, Uniform2f, GLint location, GLfloat v0, GLfloat v1) \
+	GLE(void, Uniform3f, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) \
+	GLE(void, Uniform4f, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) \
+	GLE(void, Uniform1i, GLint location, GLint v0) \
+	GLE(void, Uniform1fv, GLint location, GLsizei count, const GLfloat *value) \
+	GLE(void, UniformMatrix4fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) \
+	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
@@ -687,25 +659,6 @@ extern void (APIENTRY * qglGenerateMipmapEXT)(GLenum target);
 #define GL_TEXTURE_STENCIL_SIZE_EXT                       0x88F1
 #endif
 
-// GL_ARB_occlusion_query
-extern void (APIENTRY * qglGenQueriesARB)(GLsizei n, GLuint *ids);
-extern void (APIENTRY * qglDeleteQueriesARB)(GLsizei n, const GLuint *ids);
-extern GLboolean (APIENTRY * qglIsQueryARB)(GLuint id);
-extern void (APIENTRY * qglBeginQueryARB)(GLenum target, GLuint id);
-extern void (APIENTRY * qglEndQueryARB)(GLenum target);
-extern void (APIENTRY * qglGetQueryivARB)(GLenum target, GLenum pname, GLint *params);
-extern void (APIENTRY * qglGetQueryObjectivARB)(GLuint id, GLenum pname, GLint *params);
-extern void (APIENTRY * qglGetQueryObjectuivARB)(GLuint id, GLenum pname, GLuint *params);
-
-#ifndef GL_ARB_occlusion_query
-#define GL_ARB_occlusion_query
-#define GL_SAMPLES_PASSED_ARB                             0x8914
-#define GL_QUERY_COUNTER_BITS_ARB                         0x8864
-#define GL_CURRENT_QUERY_ARB                              0x8865
-#define GL_QUERY_RESULT_ARB                               0x8866
-#define GL_QUERY_RESULT_AVAILABLE_ARB                     0x8867
-#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,
diff --git a/SP/code/rend2/tr_backend.c b/SP/code/rend2/tr_backend.c
index 0fcc537..e5b7ca3 100644
--- a/SP/code/rend2/tr_backend.c
+++ b/SP/code/rend2/tr_backend.c
@@ -1069,7 +1069,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
 	R_TransformDlights( backEnd.refdef.num_dlights, backEnd.refdef.dlights, &backEnd.or );
 
 	if (inQuery) {
-		qglEndQueryARB(GL_SAMPLES_PASSED_ARB);
+		qglEndQuery(GL_SAMPLES_PASSED);
 	}
 
 	if (glRefConfig.framebufferObject)
@@ -1715,14 +1715,14 @@ const void  *RB_DrawSurfs( const void *data ) {
 			if (glRefConfig.occlusionQuery)
 			{
 				tr.sunFlareQueryActive[tr.sunFlareQueryIndex] = qtrue;
-				qglBeginQueryARB(GL_SAMPLES_PASSED_ARB, tr.sunFlareQuery[tr.sunFlareQueryIndex]);
+				qglBeginQuery(GL_SAMPLES_PASSED, tr.sunFlareQuery[tr.sunFlareQueryIndex]);
 			}
 
 			RB_DrawSun(0.3, tr.sunFlareShader);
 
 			if (glRefConfig.occlusionQuery)
 			{
-				qglEndQueryARB(GL_SAMPLES_PASSED_ARB);
+				qglEndQuery(GL_SAMPLES_PASSED);
 			}
 
 			FBO_Bind(oldFbo);
diff --git a/SP/code/rend2/tr_dsa.c b/SP/code/rend2/tr_dsa.c
index 9cd481b..4ea7699 100644
--- a/SP/code/rend2/tr_dsa.c
+++ b/SP/code/rend2/tr_dsa.c
@@ -124,7 +124,7 @@ GLvoid APIENTRY  GLDSA_CompressedTextureImage2D(GLuint texture, GLenum target, G
 	GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
-	qglCompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, data);
+	qglCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
 }
 
 GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLint level,
@@ -132,7 +132,7 @@ GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target,
 	GLsizei imageSize, const GLvoid *data)
 {
 	GL_BindMultiTexture(glDsaState.texunit, target, texture);
-	qglCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+	qglCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
 }
 
 GLvoid APIENTRY GLDSA_GenerateTextureMipmap(GLuint texture, GLenum target)
@@ -143,66 +143,66 @@ GLvoid APIENTRY GLDSA_GenerateTextureMipmap(GLuint texture, GLenum target)
 
 void GL_BindNullProgram()
 {
-	qglUseProgramObjectARB(0);
+	qglUseProgram(0);
 	glDsaState.program = 0;
 }
 
-int GL_UseProgramObject(GLuint program)
+int GL_UseProgram(GLuint program)
 {
 	if (glDsaState.program == program)
 		return 0;
 
-	qglUseProgramObjectARB(program);
+	qglUseProgram(program);
 	glDsaState.program = program;
 	return 1;
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniform1i(GLuint program, GLint location, GLint v0)
 {
-	GL_UseProgramObject(program);
-	qglUniform1iARB(location, v0);
+	GL_UseProgram(program);
+	qglUniform1i(location, v0);
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniform1f(GLuint program, GLint location, GLfloat v0)
 {
-	GL_UseProgramObject(program);
-	qglUniform1fARB(location, v0);
+	GL_UseProgram(program);
+	qglUniform1f(location, v0);
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniform2f(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1)
 {
-	GL_UseProgramObject(program);
-	qglUniform2fARB(location, v0, v1);
+	GL_UseProgram(program);
+	qglUniform2f(location, v0, v1);
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniform3f(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1, GLfloat v2)
 {
-	GL_UseProgramObject(program);
-	qglUniform3fARB(location, v0, v1, v2);
+	GL_UseProgram(program);
+	qglUniform3f(location, v0, v1, v2);
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniform4f(GLuint program, GLint location,
 	GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
 {
-	GL_UseProgramObject(program);
-	qglUniform4fARB(location, v0, v1, v2, v3);
+	GL_UseProgram(program);
+	qglUniform4f(location, v0, v1, v2, v3);
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniform1fv(GLuint program, GLint location,
 	GLsizei count, const GLfloat *value)
 {
-	GL_UseProgramObject(program);
-	qglUniform1fvARB(location, count, value);
+	GL_UseProgram(program);
+	qglUniform1fv(location, count, value);
 }
 
 GLvoid APIENTRY GLDSA_ProgramUniformMatrix4fv(GLuint program, GLint location,
 	GLsizei count, GLboolean transpose,
 	const GLfloat *value)
 {
-	GL_UseProgramObject(program);
-	qglUniformMatrix4fvARB(location, count, transpose, value);
+	GL_UseProgram(program);
+	qglUniformMatrix4fv(location, count, transpose, value);
 }
 
 void GL_BindNullFramebuffers()
diff --git a/SP/code/rend2/tr_dsa.h b/SP/code/rend2/tr_dsa.h
index 9d610ef..f57944d 100644
--- a/SP/code/rend2/tr_dsa.h
+++ b/SP/code/rend2/tr_dsa.h
@@ -44,7 +44,7 @@ GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target,
 GLvoid APIENTRY GLDSA_GenerateTextureMipmap(GLuint texture, GLenum target);
 
 void GL_BindNullProgram(void);
-int GL_UseProgramObject(GLuint program);
+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);
diff --git a/SP/code/rend2/tr_extensions.c b/SP/code/rend2/tr_extensions.c
index 9c3b7a4..3aa6ecc 100644
--- a/SP/code/rend2/tr_extensions.c
+++ b/SP/code/rend2/tr_extensions.c
@@ -30,101 +30,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include "tr_local.h"
 #include "tr_dsa.h"
 
-// GL_EXT_draw_range_elements
-void            (APIENTRY * qglDrawRangeElementsEXT) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
-
-// GL_EXT_multi_draw_arrays
-void            (APIENTRY * qglMultiDrawArraysEXT) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
-void            (APIENTRY * qglMultiDrawElementsEXT) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount);
-
-// GL_ARB_vertex_shader
-void            (APIENTRY * qglBindAttribLocationARB) (GLhandleARB programObj, GLuint index, const GLcharARB * name);
-void            (APIENTRY * qglGetActiveAttribARB) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length,
-													GLint * size, GLenum * type, GLcharARB * name);
-GLint(APIENTRY * qglGetAttribLocationARB) (GLhandleARB programObj, const GLcharARB * name);
-
-// GL_ARB_vertex_program
-void            (APIENTRY * qglVertexAttrib4fARB) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
-void            (APIENTRY * qglVertexAttrib4fvARB) (GLuint, const GLfloat *);
-void            (APIENTRY * qglVertexAttribPointerARB) (GLuint index, GLint size, GLenum type, GLboolean normalized,
-														GLsizei stride, const GLvoid * pointer);
-void            (APIENTRY * qglEnableVertexAttribArrayARB) (GLuint index);
-void            (APIENTRY * qglDisableVertexAttribArrayARB) (GLuint index);
-
-// GL_ARB_vertex_buffer_object
-void (APIENTRY * qglBindBufferARB) (GLenum target, GLuint buffer);
-void (APIENTRY * qglDeleteBuffersARB) (GLsizei n, const GLuint * buffers);
-void (APIENTRY * qglGenBuffersARB) (GLsizei n, GLuint * buffers);
-
-GLboolean(APIENTRY * qglIsBufferARB) (GLuint buffer);
-void (APIENTRY * qglBufferDataARB) (GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage);
-void (APIENTRY * qglBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data);
-void (APIENTRY * qglGetBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data);
-
-void (APIENTRY * qglGetBufferParameterivARB) (GLenum target, GLenum pname, GLint * params);
-void (APIENTRY * qglGetBufferPointervARB) (GLenum target, GLenum pname, GLvoid * *params);
-
-// GL_ARB_shader_objects
-void            (APIENTRY * qglDeleteObjectARB) (GLhandleARB obj);
-
-GLhandleARB(APIENTRY * qglGetHandleARB) (GLenum pname);
-void            (APIENTRY * qglDetachObjectARB) (GLhandleARB containerObj, GLhandleARB attachedObj);
-
-GLhandleARB(APIENTRY * qglCreateShaderObjectARB) (GLenum shaderType);
-void            (APIENTRY * qglShaderSourceARB) (GLhandleARB shaderObj, GLsizei count, const GLcharARB * *string,
-												 const GLint * length);
-void            (APIENTRY * qglCompileShaderARB) (GLhandleARB shaderObj);
-
-GLhandleARB(APIENTRY * qglCreateProgramObjectARB) (void);
-void            (APIENTRY * qglAttachObjectARB) (GLhandleARB containerObj, GLhandleARB obj);
-void            (APIENTRY * qglLinkProgramARB) (GLhandleARB programObj);
-void            (APIENTRY * qglUseProgramObjectARB) (GLhandleARB programObj);
-void            (APIENTRY * qglValidateProgramARB) (GLhandleARB programObj);
-void            (APIENTRY * qglUniform1fARB) (GLint location, GLfloat v0);
-void            (APIENTRY * qglUniform2fARB) (GLint location, GLfloat v0, GLfloat v1);
-void            (APIENTRY * qglUniform3fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
-void            (APIENTRY * qglUniform4fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-void            (APIENTRY * qglUniform1iARB) (GLint location, GLint v0);
-void            (APIENTRY * qglUniform2iARB) (GLint location, GLint v0, GLint v1);
-void            (APIENTRY * qglUniform3iARB) (GLint location, GLint v0, GLint v1, GLint v2);
-void            (APIENTRY * qglUniform4iARB) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
-void            (APIENTRY * qglUniform1fvARB) (GLint location, GLsizei count, const GLfloat * value);
-void            (APIENTRY * qglUniform2fvARB) (GLint location, GLsizei count, const GLfloat * value);
-void            (APIENTRY * qglUniform3fvARB) (GLint location, GLsizei count, const GLfloat * value);
-void            (APIENTRY * qglUniform4fvARB) (GLint location, GLsizei count, const GLfloat * value);
-void            (APIENTRY * qglUniform2ivARB) (GLint location, GLsizei count, const GLint * value);
-void            (APIENTRY * qglUniform3ivARB) (GLint location, GLsizei count, const GLint * value);
-void            (APIENTRY * qglUniform4ivARB) (GLint location, GLsizei count, const GLint * value);
-void            (APIENTRY * qglUniformMatrix2fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-void            (APIENTRY * qglUniformMatrix3fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-void            (APIENTRY * qglUniformMatrix4fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);
-void            (APIENTRY * qglGetObjectParameterfvARB) (GLhandleARB obj, GLenum pname, GLfloat * params);
-void            (APIENTRY * qglGetObjectParameterivARB) (GLhandleARB obj, GLenum pname, GLint * params);
-void            (APIENTRY * qglGetInfoLogARB) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog);
-void            (APIENTRY * qglGetAttachedObjectsARB) (GLhandleARB containerObj, GLsizei maxCount, GLsizei * count,
-													   GLhandleARB * obj);
-GLint(APIENTRY * qglGetUniformLocationARB) (GLhandleARB programObj, const GLcharARB * name);
-void            (APIENTRY * qglGetActiveUniformARB) (GLhandleARB programObj, GLuint index, GLsizei maxIndex, GLsizei * length,
-													 GLint * size, GLenum * type, GLcharARB * name);
-void            (APIENTRY * qglGetUniformfvARB) (GLhandleARB programObj, GLint location, GLfloat * params);
-void            (APIENTRY * qglGetUniformivARB) (GLhandleARB programObj, GLint location, GLint * params);
-void            (APIENTRY * qglGetShaderSourceARB) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source);
-
-// GL_ARB_texture_compression
-void (APIENTRY * qglCompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, 
-	GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
-void (APIENTRY * qglCompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
-	GLint border, GLsizei imageSize, const GLvoid *data);
-void (APIENTRY * qglCompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border,
-	GLsizei imageSize, const GLvoid *data);
-void (APIENTRY * qglCompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
-	GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
-void (APIENTRY * qglCompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
-	GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
-void (APIENTRY * qglCompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, 
-	GLsizei imageSize, const GLvoid *data);
-void (APIENTRY * qglGetCompressedTexImageARB)(GLenum target, GLint lod,
-	GLvoid *img);
+#define GLE(ret, name, ...) 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_EXT_framebuffer_object
 GLboolean (APIENTRY * qglIsRenderbufferEXT)(GLuint renderbuffer);
@@ -157,16 +69,6 @@ void (APIENTRY * qglGetFramebufferAttachmentParameterivEXT)(GLenum target, GLenu
 
 void (APIENTRY * qglGenerateMipmapEXT)(GLenum target);
 
-// GL_ARB_occlusion_query
-void (APIENTRY * qglGenQueriesARB)(GLsizei n, GLuint *ids);
-void (APIENTRY * qglDeleteQueriesARB)(GLsizei n, const GLuint *ids);
-GLboolean (APIENTRY * qglIsQueryARB)(GLuint id);
-void (APIENTRY * qglBeginQueryARB)(GLenum target, GLuint id);
-void (APIENTRY * qglEndQueryARB)(GLenum target);
-void (APIENTRY * qglGetQueryivARB)(GLenum target, GLenum pname, GLint *params);
-void (APIENTRY * qglGetQueryObjectivARB)(GLuint id, GLenum pname, GLint *params);
-void (APIENTRY * qglGetQueryObjectuivARB)(GLuint id, GLenum pname, GLuint *params);
-
 // GL_EXT_framebuffer_blit
 void (APIENTRY * qglBlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
                             GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
@@ -240,248 +142,47 @@ void GLimp_InitExtraExtensions()
 	char *extension;
 	const char* result[3] = { "...ignoring %s\n", "...using %s\n", "...%s not found\n" };
 
-	// GL_EXT_draw_range_elements
-	extension = "GL_EXT_draw_range_elements";
-	glRefConfig.drawRangeElements = qfalse;
-	qglMultiDrawArraysEXT = NULL;
-	qglMultiDrawElementsEXT = NULL;
-	if( GLimp_HaveExtension( extension ) )
-	{
-		qglDrawRangeElementsEXT = (void *) SDL_GL_GetProcAddress("glDrawRangeElementsEXT");
-
-		if ( r_ext_draw_range_elements->integer)
-			glRefConfig.drawRangeElements = qtrue;
-
-		ri.Printf(PRINT_ALL, result[glRefConfig.drawRangeElements], extension);
-	}
-	else
-	{
-		ri.Printf(PRINT_ALL, result[2], extension);
-	}
-
-	// GL_EXT_multi_draw_arrays
-	extension = "GL_EXT_multi_draw_arrays";
-	glRefConfig.multiDrawArrays = qfalse;
-	qglMultiDrawArraysEXT = NULL;
-	qglMultiDrawElementsEXT = NULL;
-	if( GLimp_HaveExtension( extension ) )
-	{
-		qglMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC) SDL_GL_GetProcAddress("glMultiDrawArraysEXT");
-		qglMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC) SDL_GL_GetProcAddress("glMultiDrawElementsEXT");
-
-		if ( r_ext_multi_draw_arrays->integer )
-			glRefConfig.multiDrawArrays = qtrue;
-
-		ri.Printf(PRINT_ALL, result[glRefConfig.multiDrawArrays], extension);
-	}
-	else
-	{
-		ri.Printf(PRINT_ALL, result[2], extension);
-	}
+	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_ARB_vertex_program
-	//glRefConfig.vertexProgram = qfalse;
-	extension = "GL_ARB_vertex_program";
-	qglVertexAttrib4fARB = NULL;
-	qglVertexAttrib4fvARB = NULL;
-	qglVertexAttribPointerARB = NULL;
-	qglEnableVertexAttribArrayARB = NULL;
-	qglDisableVertexAttribArrayARB = NULL;
-	if( GLimp_HaveExtension( extension ) )
-	{
-		qglVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) SDL_GL_GetProcAddress("glVertexAttrib4fARB");
-		qglVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) SDL_GL_GetProcAddress("glVertexAttrib4fvARB");
-		qglVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) SDL_GL_GetProcAddress("glVertexAttribPointerARB");
-		qglEnableVertexAttribArrayARB =
-			(PFNGLENABLEVERTEXATTRIBARRAYARBPROC) SDL_GL_GetProcAddress("glEnableVertexAttribArrayARB");
-		qglDisableVertexAttribArrayARB =
-			(PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) SDL_GL_GetProcAddress("glDisableVertexAttribArrayARB");
-
-		ri.Printf(PRINT_ALL, result[1], extension);
-		//glRefConfig.vertexProgram = qtrue;
-	}
-	else
-	{
-		ri.Error(ERR_FATAL, result[2], extension);
-	}
-	
-	// GL_ARB_vertex_buffer_object
-	//glRefConfig.vertexBufferObject = qfalse;
-	extension = "GL_ARB_vertex_buffer_object";
-	qglBindBufferARB = NULL;
-	qglDeleteBuffersARB = NULL;
-	qglGenBuffersARB = NULL;
-	qglIsBufferARB = NULL;
-	qglBufferDataARB = NULL;
-	qglBufferSubDataARB = NULL;
-	qglGetBufferSubDataARB = NULL;
-	qglGetBufferParameterivARB = NULL;
-	qglGetBufferPointervARB = NULL;
-	if( GLimp_HaveExtension( extension ) )
-	{
-		qglBindBufferARB = (PFNGLBINDBUFFERARBPROC) SDL_GL_GetProcAddress("glBindBufferARB");
-		qglDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) SDL_GL_GetProcAddress("glDeleteBuffersARB");
-		qglGenBuffersARB = (PFNGLGENBUFFERSARBPROC) SDL_GL_GetProcAddress("glGenBuffersARB");
-		qglIsBufferARB = (PFNGLISBUFFERARBPROC) SDL_GL_GetProcAddress("glIsBufferARB");
-		qglBufferDataARB = (PFNGLBUFFERDATAARBPROC) SDL_GL_GetProcAddress("glBufferDataARB");
-		qglBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) SDL_GL_GetProcAddress("glBufferSubDataARB");
-		qglGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) SDL_GL_GetProcAddress("glGetBufferSubDataARB");
-		qglGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC) SDL_GL_GetProcAddress("glGetBufferParameterivARB");
-		qglGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC) SDL_GL_GetProcAddress("glGetBufferPointervARB");
-		ri.Printf(PRINT_ALL, result[1], extension);
-		//glRefConfig.vertexBufferObject = qtrue;
-	}
-	else
-	{
-		ri.Error(ERR_FATAL, result[2], extension);
-	}
-
-	// GL_ARB_shader_objects
-	extension = "GL_ARB_shader_objects";
-	//glRefConfig.shaderObjects = qfalse;
-	qglDeleteObjectARB = NULL;
-	qglGetHandleARB = NULL;
-	qglDetachObjectARB = NULL;
-	qglCreateShaderObjectARB = NULL;
-	qglShaderSourceARB = NULL;
-	qglCompileShaderARB = NULL;
-	qglCreateProgramObjectARB = NULL;
-	qglAttachObjectARB = NULL;
-	qglLinkProgramARB = NULL;
-	qglUseProgramObjectARB = NULL;
-	qglValidateProgramARB = NULL;
-	qglUniform1fARB = NULL;
-	qglUniform2fARB = NULL;
-	qglUniform3fARB = NULL;
-	qglUniform4fARB = NULL;
-	qglUniform1iARB = NULL;
-	qglUniform2iARB = NULL;
-	qglUniform3iARB = NULL;
-	qglUniform4iARB = NULL;
-	qglUniform1fvARB = NULL;
-	qglUniform2fvARB = NULL;
-	qglUniform3fvARB = NULL;
-	qglUniform4fvARB = NULL;
-	qglUniform2ivARB = NULL;
-	qglUniform3ivARB = NULL;
-	qglUniform4ivARB = NULL;
-	qglUniformMatrix2fvARB = NULL;
-	qglUniformMatrix3fvARB = NULL;
-	qglUniformMatrix4fvARB = NULL;
-	qglGetObjectParameterfvARB = NULL;
-	qglGetObjectParameterivARB = NULL;
-	qglGetInfoLogARB = NULL;
-	qglGetAttachedObjectsARB = NULL;
-	qglGetUniformLocationARB = NULL;
-	qglGetActiveUniformARB = NULL;
-	qglGetUniformfvARB = NULL;
-	qglGetUniformivARB = NULL;
-	qglGetShaderSourceARB = NULL;
-	if( GLimp_HaveExtension( extension ) )
-	{
-		qglDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) SDL_GL_GetProcAddress("glDeleteObjectARB");
-		qglGetHandleARB = (PFNGLGETHANDLEARBPROC) SDL_GL_GetProcAddress("glGetHandleARB");
-		qglDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) SDL_GL_GetProcAddress("glDetachObjectARB");
-		qglCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) SDL_GL_GetProcAddress("glCreateShaderObjectARB");
-		qglShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) SDL_GL_GetProcAddress("glShaderSourceARB");
-		qglCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) SDL_GL_GetProcAddress("glCompileShaderARB");
-		qglCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glCreateProgramObjectARB");
-		qglAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) SDL_GL_GetProcAddress("glAttachObjectARB");
-		qglLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) SDL_GL_GetProcAddress("glLinkProgramARB");
-		qglUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glUseProgramObjectARB");
-		qglValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) SDL_GL_GetProcAddress("glValidateProgramARB");
-		qglUniform1fARB = (PFNGLUNIFORM1FARBPROC) SDL_GL_GetProcAddress("glUniform1fARB");
-		qglUniform2fARB = (PFNGLUNIFORM2FARBPROC) SDL_GL_GetProcAddress("glUniform2fARB");
-		qglUniform3fARB = (PFNGLUNIFORM3FARBPROC) SDL_GL_GetProcAddress("glUniform3fARB");
-		qglUniform4fARB = (PFNGLUNIFORM4FARBPROC) SDL_GL_GetProcAddress("glUniform4fARB");
-		qglUniform1iARB = (PFNGLUNIFORM1IARBPROC) SDL_GL_GetProcAddress("glUniform1iARB");
-		qglUniform2iARB = (PFNGLUNIFORM2IARBPROC) SDL_GL_GetProcAddress("glUniform2iARB");
-		qglUniform3iARB = (PFNGLUNIFORM3IARBPROC) SDL_GL_GetProcAddress("glUniform3iARB");
-		qglUniform4iARB = (PFNGLUNIFORM4IARBPROC) SDL_GL_GetProcAddress("glUniform4iARB");
-		qglUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) SDL_GL_GetProcAddress("glUniform1fvARB");
-		qglUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) SDL_GL_GetProcAddress("glUniform2fvARB");
-		qglUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) SDL_GL_GetProcAddress("glUniform3fvARB");
-		qglUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) SDL_GL_GetProcAddress("glUniform4fvARB");
-		qglUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) SDL_GL_GetProcAddress("glUniform2ivARB");
-		qglUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) SDL_GL_GetProcAddress("glUniform3ivARB");
-		qglUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) SDL_GL_GetProcAddress("glUniform4ivARB");
-		qglUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) SDL_GL_GetProcAddress("glUniformMatrix2fvARB");
-		qglUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) SDL_GL_GetProcAddress("glUniformMatrix3fvARB");
-		qglUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) SDL_GL_GetProcAddress("glUniformMatrix4fvARB");
-		qglGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) SDL_GL_GetProcAddress("glGetObjectParameterfvARB");
-		qglGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) SDL_GL_GetProcAddress("glGetObjectParameterivARB");
-		qglGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) SDL_GL_GetProcAddress("glGetInfoLogARB");
-		qglGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) SDL_GL_GetProcAddress("glGetAttachedObjectsARB");
-		qglGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) SDL_GL_GetProcAddress("glGetUniformLocationARB");
-		qglGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) SDL_GL_GetProcAddress("glGetActiveUniformARB");
-		qglGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) SDL_GL_GetProcAddress("glGetUniformfvARB");
-		qglGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) SDL_GL_GetProcAddress("glGetUniformivARB");
-		qglGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) SDL_GL_GetProcAddress("glGetShaderSourceARB");
-		ri.Printf(PRINT_ALL, result[1], extension);
-		//glRefConfig.shaderObjects = qtrue;
-	}
-	else
-	{
-		ri.Error(ERR_FATAL, result[2], extension);
-	}
+	// GL function loader, based on https://gist.github.com/rygorous/16796a0c876cf8a5f542caddb55bce8a
 
-	// GL_ARB_vertex_shader
-	//glRefConfig.vertexShader = qfalse;
-	extension = "GL_ARB_vertex_shader";
-	qglBindAttribLocationARB = NULL;
-	qglGetActiveAttribARB = NULL;
-	qglGetAttribLocationARB = NULL;
-	if( GLimp_HaveExtension( extension ) )
-	{
-		//int				reservedComponents;
+#define GLE(ret, name, ...) qgl##name = (name##proc *) SDL_GL_GetProcAddress("gl" #name);
 
-		//qglGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &glConfig.maxVertexUniforms);
-		//qglGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, &glConfig.maxVaryingFloats);
-		//qglGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &glConfig.maxVertexAttribs);
+	// OpenGL 1.2, was GL_EXT_draw_range_elements
+	QGL_1_2_PROCS;
+	glRefConfig.drawRangeElements = r_ext_draw_range_elements->integer ? qtrue : qfalse;
+	ri.Printf(PRINT_ALL, result[glRefConfig.drawRangeElements], "glDrawRangeElements()");
 
-		//reservedComponents = 16 * 10; // approximation how many uniforms we have besides the bone matrices
+	// OpenGL 1.3, was GL_ARB_texture_compression
+	QGL_1_3_PROCS;
 
-#if 0
-		if(glConfig.driverType == GLDRV_MESA)
-		{
-			// HACK
-			// restrict to number of vertex uniforms to 512 because of:
-			// xreal.x86_64: nv50_program.c:4181: nv50_program_validate_data: Assertion `p->param_nr <= 512' failed
+	// 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()");
 
-			glConfig.maxVertexUniforms = Q_bound(0, glConfig.maxVertexUniforms, 512);
-		}
-#endif
+	// OpenGL 1.5, was GL_ARB_vertex_buffer_object and GL_ARB_occlusion_query
+	QGL_1_5_PROCS;
+	glRefConfig.occlusionQuery = qtrue;
 
-		//glConfig.maxVertexSkinningBones = (int) Q_bound(0.0, (Q_max(glConfig.maxVertexUniforms - reservedComponents, 0) / 16), MAX_BONES);
-		//glConfig.vboVertexSkinningAvailable = r_vboVertexSkinning->integer && ((glConfig.maxVertexSkinningBones >= 12) ? qtrue : qfalse);
+	// 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;
 
-		qglBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) SDL_GL_GetProcAddress("glBindAttribLocationARB");
-		qglGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) SDL_GL_GetProcAddress("glGetActiveAttribARB");
-		qglGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) SDL_GL_GetProcAddress("glGetAttribLocationARB");
-		ri.Printf(PRINT_ALL, result[1], extension);
-		//glRefConfig.vertexShader = qtrue;
-	}
-	else
-	{
-		ri.Error(ERR_FATAL, result[2], extension);
-	}
+#undef GLE
 
-	// GL_ARB_shading_language_100
-	extension = "GL_ARB_shading_language_100";
-	if( GLimp_HaveExtension( extension ) )
+	if (1)
 	{
 		char version[256];
 
-		Q_strncpyz( version, (char *) qglGetString (GL_SHADING_LANGUAGE_VERSION_ARB), sizeof( version ) );
+		Q_strncpyz(version, (char *)qglGetString(GL_SHADING_LANGUAGE_VERSION), sizeof(version));
 
 		sscanf(version, "%d.%d", &glRefConfig.glslMajorVersion, &glRefConfig.glslMinorVersion);
 
 		ri.Printf(PRINT_ALL, "...using GLSL version %s\n", version);
 	}
-	else
-	{
-		ri.Error(ERR_FATAL, result[2], extension);
-	}
 
 	glRefConfig.memInfo = MI_NONE;
 
@@ -591,27 +292,6 @@ void GLimp_InitExtraExtensions()
 		ri.Printf(PRINT_ALL, result[2], extension);
 	}
 
-	// GL_ARB_occlusion_query
-	extension = "GL_ARB_occlusion_query";
-	glRefConfig.occlusionQuery = qfalse;
-	if (GLimp_HaveExtension(extension))
-	{
-		qglGenQueriesARB = (PFNGLGENQUERIESARBPROC) SDL_GL_GetProcAddress("glGenQueriesARB");
-		qglDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC) SDL_GL_GetProcAddress("glDeleteQueriesARB");
-		qglIsQueryARB = (PFNGLISQUERYARBPROC) SDL_GL_GetProcAddress("glIsQueryARB");
-		qglBeginQueryARB = (PFNGLBEGINQUERYARBPROC) SDL_GL_GetProcAddress("glBeginQueryARB");
-		qglEndQueryARB = (PFNGLENDQUERYARBPROC) SDL_GL_GetProcAddress("glEndQueryARB");
-		qglGetQueryivARB = (PFNGLGETQUERYIVARBPROC) SDL_GL_GetProcAddress("glGetQueryivARB");
-		qglGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC) SDL_GL_GetProcAddress("glGetQueryObjectivARB");
-		qglGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC) SDL_GL_GetProcAddress("glGetQueryObjectuivARB");
-		glRefConfig.occlusionQuery = qtrue;
-		ri.Printf(PRINT_ALL, result[glRefConfig.occlusionQuery], extension);
-	}
-	else
-	{
-		ri.Printf(PRINT_ALL, result[2], extension);
-	}
-
 	// GL_EXT_framebuffer_blit
 	extension = "GL_EXT_framebuffer_blit";
 	glRefConfig.framebufferBlit = qfalse;
@@ -626,22 +306,6 @@ void GLimp_InitExtraExtensions()
 		ri.Printf(PRINT_ALL, result[2], extension);
 	}
 
-	// GL_ARB_texture_compression
-	extension = "GL_ARB_texture_compression";
-	glRefConfig.arbTextureCompression = qfalse;
-	if (GLimp_HaveExtension(extension))
-	{
-		qglCompressedTexImage3DARB = (void *)SDL_GL_GetProcAddress("glCompressedTexImage3DARB");
-		qglCompressedTexImage2DARB = (void *)SDL_GL_GetProcAddress("glCompressedTexImage2DARB");
-		qglCompressedTexImage1DARB = (void *)SDL_GL_GetProcAddress("glCompressedTexImage1DARB");
-		qglCompressedTexSubImage3DARB = (void *)SDL_GL_GetProcAddress("glCompressedTexSubImage3DARB");
-		qglCompressedTexSubImage2DARB = (void *)SDL_GL_GetProcAddress("glCompressedTexSubImage2DARB");
-		qglCompressedTexSubImage1DARB = (void *)SDL_GL_GetProcAddress("glCompressedTexSubImage1DARB");
-		qglGetCompressedTexImageARB = (void *)SDL_GL_GetProcAddress("glGetCompressedTexImageARB");
-		glRefConfig.arbTextureCompression = qtrue;
-		ri.Printf(PRINT_ALL, result[glRefConfig.arbTextureCompression], extension);
-	}
-
 	// GL_EXT_framebuffer_multisample
 	extension = "GL_EXT_framebuffer_multisample";
 	glRefConfig.framebufferMultisample = qfalse;
@@ -662,7 +326,7 @@ void GLimp_InitExtraExtensions()
 	extension = "GL_ARB_texture_compression_rgtc";
 	if (GLimp_HaveExtension(extension))
 	{
-		if (r_ext_compressed_textures->integer && glRefConfig.arbTextureCompression)
+		if (r_ext_compressed_textures->integer)
 			glRefConfig.textureCompression |= TCR_RGTC;
 
 		ri.Printf(PRINT_ALL, result[r_ext_compressed_textures->integer ? 1 : 0], extension);
diff --git a/SP/code/rend2/tr_glsl.c b/SP/code/rend2/tr_glsl.c
index cf2a514..318853a 100644
--- a/SP/code/rend2/tr_glsl.c
+++ b/SP/code/rend2/tr_glsl.c
@@ -153,7 +153,7 @@ static uniformInfo_t uniformsInfo[] =
 };
 
 
-static void GLSL_PrintInfoLog(GLhandleARB object, qboolean developerOnly)
+static void GLSL_PrintInfoLog(GLuint program, qboolean developerOnly)
 {
 	char           *msg;
 	static char     msgPart[1024];
@@ -161,7 +161,7 @@ static void GLSL_PrintInfoLog(GLhandleARB object, qboolean developerOnly)
 	int             i;
 	int             printLevel = developerOnly ? PRINT_DEVELOPER : PRINT_ALL;
 
-	qglGetObjectParameterivARB(object, GL_OBJECT_INFO_LOG_LENGTH_ARB, &maxLength);
+	qglGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
 
 	if (maxLength <= 0)
 	{
@@ -173,7 +173,7 @@ static void GLSL_PrintInfoLog(GLhandleARB object, qboolean developerOnly)
 
 	if (maxLength < 1023)
 	{
-		qglGetInfoLogARB(object, maxLength, &maxLength, msgPart);
+		qglGetProgramInfoLog(program, maxLength, &maxLength, msgPart);
 
 		msgPart[maxLength + 1] = '\0';
 
@@ -183,7 +183,7 @@ static void GLSL_PrintInfoLog(GLhandleARB object, qboolean developerOnly)
 	{
 		msg = ri.Z_Malloc(maxLength);
 
-		qglGetInfoLogARB(object, maxLength, &maxLength, msg);
+		qglGetProgramInfoLog(program, maxLength, &maxLength, msg);
 
 		for(i = 0; i < maxLength; i += 1024)
 		{
@@ -196,18 +196,18 @@ static void GLSL_PrintInfoLog(GLhandleARB object, qboolean developerOnly)
 	}
 }
 
-static void GLSL_PrintShaderSource(GLhandleARB object)
+static void GLSL_PrintShaderSource(GLuint shader)
 {
 	char           *msg;
 	static char     msgPart[1024];
 	int             maxLength = 0;
 	int             i;
 
-	qglGetObjectParameterivARB(object, GL_OBJECT_SHADER_SOURCE_LENGTH_ARB, &maxLength);
+	qglGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &maxLength);
 
 	msg = ri.Z_Malloc(maxLength);
 
-	qglGetShaderSourceARB(object, maxLength, &maxLength, msg);
+	qglShaderSource(shader, 1, (const GLchar **)&msg, &maxLength);
 
 	for(i = 0; i < maxLength; i += 1024)
 	{
@@ -218,7 +218,7 @@ static void GLSL_PrintShaderSource(GLhandleARB object)
 	ri.Free(msg);
 }
 
-static void GLSL_GetShaderHeader( GLenum shaderType, const GLcharARB *extra, char *dest, int size )
+static void GLSL_GetShaderHeader( GLenum shaderType, const GLchar *extra, char *dest, int size )
 {
 	float fbufWidthScale, fbufHeightScale;
 
@@ -229,7 +229,7 @@ static void GLSL_GetShaderHeader( GLenum shaderType, const GLcharARB *extra, cha
 	{
 		Q_strcat(dest, size, "#version 130\n");
 
-		if(shaderType == GL_VERTEX_SHADER_ARB)
+		if(shaderType == GL_VERTEX_SHADER)
 		{
 			Q_strcat(dest, size, "#define attribute in\n");
 			Q_strcat(dest, size, "#define varying out\n");
@@ -355,20 +355,20 @@ static void GLSL_GetShaderHeader( GLenum shaderType, const GLcharARB *extra, cha
 	Q_strcat(dest, size, "#line 0\n");
 }
 
-static int GLSL_CompileGPUShader(GLhandleARB program, GLhandleARB *prevShader, const GLcharARB *buffer, int size, GLenum shaderType)
+static int GLSL_CompileGPUShader(GLuint program, GLuint *prevShader, const GLchar *buffer, int size, GLenum shaderType)
 {
 	GLint           compiled;
-	GLhandleARB     shader;
+	GLuint          shader;
 
-	shader = qglCreateShaderObjectARB(shaderType);
+	shader = qglCreateShader(shaderType);
 
-	qglShaderSourceARB(shader, 1, (const GLcharARB **)&buffer, &size);
+	qglShaderSource(shader, 1, (const GLchar **)&buffer, &size);
 
 	// compile shader
-	qglCompileShaderARB(shader);
+	qglCompileShader(shader);
 
 	// check if shader compiled
-	qglGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &compiled);
+	qglGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
 	if(!compiled)
 	{
 		GLSL_PrintShaderSource(shader);
@@ -382,12 +382,12 @@ static int GLSL_CompileGPUShader(GLhandleARB program, GLhandleARB *prevShader, c
 
 	if (*prevShader)
 	{
-		qglDetachObjectARB(program, *prevShader);
-		qglDeleteObjectARB(*prevShader);
+		qglDetachShader(program, *prevShader);
+		qglDeleteShader(*prevShader);
 	}
 
 	// attach shader to program
-	qglAttachObjectARB(program, shader);
+	qglAttachShader(program, shader);
 
 	*prevShader = shader;
 
@@ -398,12 +398,12 @@ static int GLSL_LoadGPUShaderText(const char *name, const char *fallback,
 	GLenum shaderType, char *dest, int destSize)
 {
 	char            filename[MAX_QPATH];
-	GLcharARB      *buffer = NULL;
-	const GLcharARB *shaderText = NULL;
+	GLchar      *buffer = NULL;
+	const GLchar *shaderText = NULL;
 	int             size;
 	int             result;
 
-	if(shaderType == GL_VERTEX_SHADER_ARB)
+	if(shaderType == GL_VERTEX_SHADER)
 	{
 		Com_sprintf(filename, sizeof(filename), "glsl/%s_vp.glsl", name);
 	}
@@ -457,13 +457,13 @@ static int GLSL_LoadGPUShaderText(const char *name, const char *fallback,
 	return result;
 }
 
-static void GLSL_LinkProgram(GLhandleARB program)
+static void GLSL_LinkProgram(GLuint program)
 {
 	GLint           linked;
 
-	qglLinkProgramARB(program);
+	qglLinkProgram(program);
 
-	qglGetObjectParameterivARB(program, GL_OBJECT_LINK_STATUS_ARB, &linked);
+	qglGetProgramiv(program, GL_LINK_STATUS, &linked);
 	if(!linked)
 	{
 		GLSL_PrintInfoLog(program, qfalse);
@@ -472,13 +472,13 @@ static void GLSL_LinkProgram(GLhandleARB program)
 	}
 }
 
-static void GLSL_ValidateProgram(GLhandleARB program)
+static void GLSL_ValidateProgram(GLuint program)
 {
 	GLint           validated;
 
-	qglValidateProgramARB(program);
+	qglValidateProgram(program);
 
-	qglGetObjectParameterivARB(program, GL_OBJECT_VALIDATE_STATUS_ARB, &validated);
+	qglGetProgramiv(program, GL_VALIDATE_STATUS, &validated);
 	if(!validated)
 	{
 		GLSL_PrintInfoLog(program, qfalse);
@@ -487,19 +487,19 @@ static void GLSL_ValidateProgram(GLhandleARB program)
 	}
 }
 
-static void GLSL_ShowProgramUniforms(GLhandleARB program)
+static void GLSL_ShowProgramUniforms(GLuint program)
 {
 	int             i, count, size;
 	GLenum			type;
 	char            uniformName[1000];
 
 	// query the number of active uniforms
-	qglGetObjectParameterivARB(program, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &count);
+	qglGetProgramiv(program, GL_ACTIVE_UNIFORMS, &count);
 
 	// Loop over each of the active uniforms, and set their value
 	for(i = 0; i < count; i++)
 	{
-		qglGetActiveUniformARB(program, i, sizeof(uniformName), NULL, &size, &type, uniformName);
+		qglGetActiveUniform(program, i, sizeof(uniformName), NULL, &size, &type, uniformName);
 
 		ri.Printf(PRINT_DEVELOPER, "active uniform: '%s'\n", uniformName);
 	}
@@ -516,64 +516,64 @@ static int GLSL_InitGPUShader2(shaderProgram_t * program, const char *name, int
 
 	Q_strncpyz(program->name, name, sizeof(program->name));
 
-	program->program = qglCreateProgramObjectARB();
+	program->program = qglCreateProgram();
 	program->attribs = attribs;
 
-	if (!(GLSL_CompileGPUShader(program->program, &program->vertexShader, vpCode, strlen(vpCode), GL_VERTEX_SHADER_ARB)))
+	if (!(GLSL_CompileGPUShader(program->program, &program->vertexShader, vpCode, strlen(vpCode), GL_VERTEX_SHADER)))
 	{
-		ri.Printf(PRINT_ALL, "GLSL_InitGPUShader2: Unable to load \"%s\" as GL_VERTEX_SHADER_ARB\n", name);
-		qglDeleteObjectARB(program->program);
+		ri.Printf(PRINT_ALL, "GLSL_InitGPUShader2: Unable to load \"%s\" as GL_VERTEX_SHADER\n", name);
+		qglDeleteProgram(program->program);
 		return 0;
 	}
 
 	if(fpCode)
 	{
-		if(!(GLSL_CompileGPUShader(program->program, &program->fragmentShader, fpCode, strlen(fpCode), GL_FRAGMENT_SHADER_ARB)))
+		if(!(GLSL_CompileGPUShader(program->program, &program->fragmentShader, fpCode, strlen(fpCode), GL_FRAGMENT_SHADER)))
 		{
-			ri.Printf(PRINT_ALL, "GLSL_InitGPUShader2: Unable to load \"%s\" as GL_FRAGMENT_SHADER_ARB\n", name);
-			qglDeleteObjectARB(program->program);
+			ri.Printf(PRINT_ALL, "GLSL_InitGPUShader2: Unable to load \"%s\" as GL_FRAGMENT_SHADER\n", name);
+			qglDeleteProgram(program->program);
 			return 0;
 		}
 	}
 
 	if(attribs & ATTR_POSITION)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_POSITION, "attr_Position");
+		qglBindAttribLocation(program->program, ATTR_INDEX_POSITION, "attr_Position");
 
 	if(attribs & ATTR_TEXCOORD)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_TEXCOORD, "attr_TexCoord0");
+		qglBindAttribLocation(program->program, ATTR_INDEX_TEXCOORD, "attr_TexCoord0");
 
 	if(attribs & ATTR_LIGHTCOORD)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_LIGHTCOORD, "attr_TexCoord1");
+		qglBindAttribLocation(program->program, ATTR_INDEX_LIGHTCOORD, "attr_TexCoord1");
 
 //  if(attribs & ATTR_TEXCOORD2)
-//      qglBindAttribLocationARB(program->program, ATTR_INDEX_TEXCOORD2, "attr_TexCoord2");
+//      qglBindAttribLocation(program->program, ATTR_INDEX_TEXCOORD2, "attr_TexCoord2");
 
 //  if(attribs & ATTR_TEXCOORD3)
-//      qglBindAttribLocationARB(program->program, ATTR_INDEX_TEXCOORD3, "attr_TexCoord3");
+//      qglBindAttribLocation(program->program, ATTR_INDEX_TEXCOORD3, "attr_TexCoord3");
 
 	if(attribs & ATTR_TANGENT)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_TANGENT, "attr_Tangent");
+		qglBindAttribLocation(program->program, ATTR_INDEX_TANGENT, "attr_Tangent");
 
 	if(attribs & ATTR_NORMAL)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_NORMAL, "attr_Normal");
+		qglBindAttribLocation(program->program, ATTR_INDEX_NORMAL, "attr_Normal");
 
 	if(attribs & ATTR_COLOR)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_COLOR, "attr_Color");
+		qglBindAttribLocation(program->program, ATTR_INDEX_COLOR, "attr_Color");
 
 	if(attribs & ATTR_PAINTCOLOR)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_PAINTCOLOR, "attr_PaintColor");
+		qglBindAttribLocation(program->program, ATTR_INDEX_PAINTCOLOR, "attr_PaintColor");
 
 	if(attribs & ATTR_LIGHTDIRECTION)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_LIGHTDIRECTION, "attr_LightDirection");
+		qglBindAttribLocation(program->program, ATTR_INDEX_LIGHTDIRECTION, "attr_LightDirection");
 
 	if(attribs & ATTR_POSITION2)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_POSITION2, "attr_Position2");
+		qglBindAttribLocation(program->program, ATTR_INDEX_POSITION2, "attr_Position2");
 
 	if(attribs & ATTR_NORMAL2)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_NORMAL2, "attr_Normal2");
+		qglBindAttribLocation(program->program, ATTR_INDEX_NORMAL2, "attr_Normal2");
 
 	if(attribs & ATTR_TANGENT2)
-		qglBindAttribLocationARB(program->program, ATTR_INDEX_TANGENT2, "attr_Tangent2");
+		qglBindAttribLocation(program->program, ATTR_INDEX_TANGENT2, "attr_Tangent2");
 
 	GLSL_LinkProgram(program->program);
 
@@ -581,7 +581,7 @@ static int GLSL_InitGPUShader2(shaderProgram_t * program, const char *name, int
 }
 
 static int GLSL_InitGPUShader(shaderProgram_t * program, const char *name,
-	int attribs, qboolean fragmentShader, const GLcharARB *extra, qboolean addHeader,
+	int attribs, qboolean fragmentShader, const GLchar *extra, qboolean addHeader,
 	const char *fallback_vp, const char *fallback_fp)
 {
 	char vpCode[32000];
@@ -593,7 +593,7 @@ static int GLSL_InitGPUShader(shaderProgram_t * program, const char *name,
 	size = sizeof(vpCode);
 	if (addHeader)
 	{
-		GLSL_GetShaderHeader(GL_VERTEX_SHADER_ARB, extra, vpCode, size);
+		GLSL_GetShaderHeader(GL_VERTEX_SHADER, extra, vpCode, size);
 		postHeader = &vpCode[strlen(vpCode)];
 		size -= strlen(vpCode);
 	}
@@ -602,7 +602,7 @@ static int GLSL_InitGPUShader(shaderProgram_t * program, const char *name,
 		postHeader = &vpCode[0];
 	}
 
-	if (!GLSL_LoadGPUShaderText(name, fallback_vp, GL_VERTEX_SHADER_ARB, postHeader, size))
+	if (!GLSL_LoadGPUShaderText(name, fallback_vp, GL_VERTEX_SHADER, postHeader, size))
 	{
 		return 0;
 	}
@@ -612,7 +612,7 @@ static int GLSL_InitGPUShader(shaderProgram_t * program, const char *name,
 		size = sizeof(fpCode);
 		if (addHeader)
 		{
-			GLSL_GetShaderHeader(GL_FRAGMENT_SHADER_ARB, extra, fpCode, size);
+			GLSL_GetShaderHeader(GL_FRAGMENT_SHADER, extra, fpCode, size);
 			postHeader = &fpCode[strlen(fpCode)];
 			size -= strlen(fpCode);
 		}
@@ -621,7 +621,7 @@ static int GLSL_InitGPUShader(shaderProgram_t * program, const char *name,
 			postHeader = &fpCode[0];
 		}
 
-		if (!GLSL_LoadGPUShaderText(name, fallback_fp, GL_FRAGMENT_SHADER_ARB, postHeader, size))
+		if (!GLSL_LoadGPUShaderText(name, fallback_fp, GL_FRAGMENT_SHADER, postHeader, size))
 		{
 			return 0;
 		}
@@ -641,7 +641,7 @@ void GLSL_InitUniforms(shaderProgram_t *program)
 	size = 0;
 	for (i = 0; i < UNIFORM_COUNT; i++)
 	{
-		uniforms[i] = qglGetUniformLocationARB(program->program, uniformsInfo[i].name);
+		uniforms[i] = qglGetUniformLocation(program->program, uniformsInfo[i].name);
 
 		if (uniforms[i] == -1)
 			continue;
@@ -861,17 +861,17 @@ void GLSL_DeleteGPUShader(shaderProgram_t *program)
 	{
 		if (program->vertexShader)
 		{
-			qglDetachObjectARB(program->program, program->vertexShader);
-			qglDeleteObjectARB(program->vertexShader);
+			qglDetachShader(program->program, program->vertexShader);
+			qglDeleteShader(program->vertexShader);
 		}
 
 		if (program->fragmentShader)
 		{
-			qglDetachObjectARB(program->program, program->fragmentShader);
-			qglDeleteObjectARB(program->fragmentShader);
+			qglDetachShader(program->program, program->fragmentShader);
+			qglDeleteShader(program->fragmentShader);
 		}
 
-		qglDeleteObjectARB(program->program);
+		qglDeleteProgram(program->program);
 
 		if (program->uniformBuffer)
 		{
@@ -1378,7 +1378,7 @@ void GLSL_ShutdownGPUShaders(void)
 	ri.Printf(PRINT_ALL, "------- GLSL_ShutdownGPUShaders -------\n");
 
 	for (i = 0; i < ATTR_INDEX_COUNT; i++)
-		qglDisableVertexAttribArrayARB(i);
+		qglDisableVertexAttribArray(i);
 
 	GL_BindNullProgram();
 
@@ -1424,7 +1424,7 @@ void GLSL_BindProgram(shaderProgram_t * program)
 		GLimp_LogComment(va("--- GLSL_BindProgram( %s ) ---\n", name));
 	}
 
-	if (GL_UseProgramObject(programObject))
+	if (GL_UseProgram(programObject))
 		backEnd.pc.c_glslShaderBinds++;
 }
 
diff --git a/SP/code/rend2/tr_init.c b/SP/code/rend2/tr_init.c
index f0b1949..cf00d00 100644
--- a/SP/code/rend2/tr_init.c
+++ b/SP/code/rend2/tr_init.c
@@ -1050,8 +1050,8 @@ void GL_SetDefaultState( void ) {
 	if (glRefConfig.vertexArrayObject)
 		qglBindVertexArrayARB(0);
 
-	qglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
-	qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+	qglBindBuffer(GL_ARRAY_BUFFER, 0);
+	qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 	glState.currentVao = NULL;
 	glState.vertexAttribsEnabled = 0;
 
@@ -1554,7 +1554,7 @@ void R_InitQueries(void)
 		return;
 
 	if (r_drawSunRays->integer)
-		qglGenQueriesARB(ARRAY_LEN(tr.sunFlareQuery), tr.sunFlareQuery);
+		qglGenQueries(ARRAY_LEN(tr.sunFlareQuery), tr.sunFlareQuery);
 }
 
 void R_ShutDownQueries(void)
@@ -1563,7 +1563,7 @@ void R_ShutDownQueries(void)
 		return;
 
 	if (r_drawSunRays->integer)
-		qglDeleteQueriesARB(ARRAY_LEN(tr.sunFlareQuery), tr.sunFlareQuery);
+		qglDeleteQueries(ARRAY_LEN(tr.sunFlareQuery), tr.sunFlareQuery);
 }
 
 /*
diff --git a/SP/code/rend2/tr_local.h b/SP/code/rend2/tr_local.h
index 38bb85a..f6d342b 100644
--- a/SP/code/rend2/tr_local.h
+++ b/SP/code/rend2/tr_local.h
@@ -801,9 +801,9 @@ typedef struct shaderProgram_s
 {
 	char            name[MAX_QPATH];
 
-	GLhandleARB     program;
-	GLhandleARB     vertexShader;
-	GLhandleARB     fragmentShader;
+	GLuint          program;
+	GLuint          vertexShader;
+	GLuint          fragmentShader;
 	uint32_t        attribs;	// vertex array attributes
 
 	// uniform parameters
@@ -1528,6 +1528,9 @@ typedef enum {
 // We can't change glConfig_t without breaking DLL/vms compatibility, so
 // store extensions we have here.
 typedef struct {
+	int openglMajorVersion;
+	int openglMinorVersion;
+
 	qboolean    drawRangeElements;
 	qboolean    multiDrawArrays;
 	qboolean	occlusionQuery;
@@ -1545,7 +1548,6 @@ typedef struct {
 	qboolean textureFloat;
 	qboolean halfFloatPixel;
 	qboolean packedDepthStencil;
-	qboolean arbTextureCompression;
 	textureCompressionRef_t textureCompression;
 	qboolean swizzleNormalmap;
 	
diff --git a/SP/code/rend2/tr_postprocess.c b/SP/code/rend2/tr_postprocess.c
index c4e5155..ade9ebf 100644
--- a/SP/code/rend2/tr_postprocess.c
+++ b/SP/code/rend2/tr_postprocess.c
@@ -282,7 +282,7 @@ static qboolean RB_UpdateSunFlareVis(void)
 		for (iter=0 ; ; ++iter)
 		{
 			GLint available = 0;
-			qglGetQueryObjectivARB(tr.sunFlareQuery[tr.sunFlareQueryIndex], GL_QUERY_RESULT_AVAILABLE_ARB, &available);
+			qglGetQueryObjectiv(tr.sunFlareQuery[tr.sunFlareQueryIndex], GL_QUERY_RESULT_AVAILABLE, &available);
 			if (available)
 				break;
 		}
@@ -290,7 +290,7 @@ static qboolean RB_UpdateSunFlareVis(void)
 		ri.Printf(PRINT_DEVELOPER, "Waited %d iterations\n", iter);
 	}
 	
-	qglGetQueryObjectuivARB(tr.sunFlareQuery[tr.sunFlareQueryIndex], GL_QUERY_RESULT_ARB, &sampleCount);
+	qglGetQueryObjectuiv(tr.sunFlareQuery[tr.sunFlareQueryIndex], GL_QUERY_RESULT, &sampleCount);
 	return sampleCount > 0;
 }
 
diff --git a/SP/code/rend2/tr_shade.c b/SP/code/rend2/tr_shade.c
index 4a1ef8f..ec1981b 100644
--- a/SP/code/rend2/tr_shade.c
+++ b/SP/code/rend2/tr_shade.c
@@ -43,7 +43,7 @@ If you have questions concerning this license or the applicable additional terms
 void R_DrawElementsVao( int numIndexes, glIndex_t firstIndex, glIndex_t minIndex, glIndex_t maxIndex )
 {
 	if (glRefConfig.drawRangeElements)
-		qglDrawRangeElementsEXT(GL_TRIANGLES, minIndex, maxIndex, numIndexes, GL_INDEX_TYPE, BUFFER_OFFSET(firstIndex * sizeof(glIndex_t)));
+		qglDrawRangeElements(GL_TRIANGLES, minIndex, maxIndex, numIndexes, GL_INDEX_TYPE, BUFFER_OFFSET(firstIndex * sizeof(glIndex_t)));
 	else
 		qglDrawElements(GL_TRIANGLES, numIndexes, GL_INDEX_TYPE, BUFFER_OFFSET(firstIndex * sizeof(glIndex_t)));
 	
@@ -55,7 +55,7 @@ static void R_DrawMultiElementsVao( int multiDrawPrimitives, glIndex_t *multiDra
 {
 	if (glRefConfig.multiDrawArrays && multiDrawPrimitives > 1)
 	{
-		qglMultiDrawElementsEXT(GL_TRIANGLES, multiDrawNumIndexes, GL_INDEX_TYPE, (const GLvoid **)multiDrawFirstIndex, multiDrawPrimitives);
+		qglMultiDrawElements(GL_TRIANGLES, multiDrawNumIndexes, GL_INDEX_TYPE, (const GLvoid **)multiDrawFirstIndex, multiDrawPrimitives);
 	}
 	else
 	{
@@ -65,7 +65,7 @@ static void R_DrawMultiElementsVao( int multiDrawPrimitives, glIndex_t *multiDra
 		{
 			for (i = 0; i < multiDrawPrimitives; i++)
 			{
-				qglDrawRangeElementsEXT(GL_TRIANGLES, multiDrawMinIndex[i], multiDrawMaxIndex[i], multiDrawNumIndexes[i], GL_INDEX_TYPE, multiDrawFirstIndex[i]);
+				qglDrawRangeElements(GL_TRIANGLES, multiDrawMinIndex[i], multiDrawMaxIndex[i], multiDrawNumIndexes[i], GL_INDEX_TYPE, multiDrawFirstIndex[i]);
 			}
 		}
 		else
diff --git a/SP/code/rend2/tr_surface.c b/SP/code/rend2/tr_surface.c
index dfd0f8d..c06a743 100644
--- a/SP/code/rend2/tr_surface.c
+++ b/SP/code/rend2/tr_surface.c
@@ -1877,43 +1877,43 @@ void RB_SurfaceVaoMdvMesh(srfVaoMdvMesh_t * surface)
 
 		if (glRefConfig.vertexArrayObject)
 		{
-			qglBindBufferARB(GL_ARRAY_BUFFER_ARB, surface->vao->vertexesVBO);
+			qglBindBuffer(GL_ARRAY_BUFFER, surface->vao->vertexesVBO);
 		}
 
 		frameOffset    = refEnt->frame * surface->vao->frameSize;
 
 		attribIndex = ATTR_INDEX_POSITION;
 		vAtb = &surface->vao->attribs[attribIndex];
-		qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
+		qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
 
 		attribIndex = ATTR_INDEX_NORMAL;
 		vAtb = &surface->vao->attribs[attribIndex];
-		qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
+		qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
 
 		attribIndex = ATTR_INDEX_TANGENT;
 		vAtb = &surface->vao->attribs[attribIndex];
-		qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
+		qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
 
 		frameOffset = refEnt->oldframe * surface->vao->frameSize;
 
 		attribIndex = ATTR_INDEX_POSITION2;
 		vAtb = &surface->vao->attribs[attribIndex];
-		qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
+		qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
 
 		attribIndex = ATTR_INDEX_NORMAL2;
 		vAtb = &surface->vao->attribs[attribIndex];
-		qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
+		qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
 
 		attribIndex = ATTR_INDEX_TANGENT2;
 		vAtb = &surface->vao->attribs[attribIndex];
-		qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
+		qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset + frameOffset));
 
 
 		if (!glRefConfig.vertexArrayObject)
 		{
 			attribIndex = ATTR_INDEX_TEXCOORD;
 			vAtb = &surface->vao->attribs[attribIndex];
-			qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset));
+			qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset));
 		}
 	}
 
diff --git a/SP/code/rend2/tr_vbo.c b/SP/code/rend2/tr_vbo.c
index 8f9ba66..61ede4e 100644
--- a/SP/code/rend2/tr_vbo.c
+++ b/SP/code/rend2/tr_vbo.c
@@ -196,9 +196,9 @@ void Vao_SetVertexPointers(vao_t *vao)
 
 		if (vAtb->enabled)
 		{
-			qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset));
+			qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset));
 			if (glRefConfig.vertexArrayObject || !(glState.vertexAttribsEnabled & attribBit))
-				qglEnableVertexAttribArrayARB(attribIndex);
+				qglEnableVertexAttribArray(attribIndex);
 
 			if (!glRefConfig.vertexArrayObject || vao == tess.vao)
 				glState.vertexAttribsEnabled |= attribBit;
@@ -208,7 +208,7 @@ void Vao_SetVertexPointers(vao_t *vao)
 			// don't disable vertex attribs when using vertex array objects
 			// Vao_SetVertexPointers is only called during init when using VAOs, and vertex attribs start disabled anyway
 			if (!glRefConfig.vertexArrayObject && (glState.vertexAttribsEnabled & attribBit))
-				qglDisableVertexAttribArrayARB(attribIndex);
+				qglDisableVertexAttribArray(attribIndex);
 
 			if (!glRefConfig.vertexArrayObject || vao == tess.vao)
 				glState.vertexAttribsEnabled &= ~attribBit;
@@ -229,11 +229,11 @@ vao_t *R_CreateVao(const char *name, byte *vertexes, int vertexesSize, byte *ind
 	switch (usage)
 	{
 		case VAO_USAGE_STATIC:
-			glUsage = GL_STATIC_DRAW_ARB;
+			glUsage = GL_STATIC_DRAW;
 			break;
 
 		case VAO_USAGE_DYNAMIC:
-			glUsage = GL_DYNAMIC_DRAW_ARB;
+			glUsage = GL_DYNAMIC_DRAW;
 			break;
 
 		default:
@@ -269,18 +269,18 @@ vao_t *R_CreateVao(const char *name, byte *vertexes, int vertexesSize, byte *ind
 
 	vao->vertexesSize = vertexesSize;
 
-	qglGenBuffersARB(1, &vao->vertexesVBO);
+	qglGenBuffers(1, &vao->vertexesVBO);
 
-	qglBindBufferARB(GL_ARRAY_BUFFER_ARB, vao->vertexesVBO);
-	qglBufferDataARB(GL_ARRAY_BUFFER_ARB, vertexesSize, vertexes, glUsage);
+	qglBindBuffer(GL_ARRAY_BUFFER, vao->vertexesVBO);
+	qglBufferData(GL_ARRAY_BUFFER, vertexesSize, vertexes, glUsage);
 
 
 	vao->indexesSize = indexesSize;
 
-	qglGenBuffersARB(1, &vao->indexesIBO);
+	qglGenBuffers(1, &vao->indexesIBO);
 
-	qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vao->indexesIBO);
-	qglBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indexesSize, indexes, glUsage);
+	qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vao->indexesIBO);
+	qglBufferData(GL_ELEMENT_ARRAY_BUFFER, indexesSize, indexes, glUsage);
 
 
 	glState.currentVao = vao;
@@ -304,7 +304,7 @@ vao_t *R_CreateVao2(const char *name, int numVertexes, srfVert_t *verts, int num
 	int             dataSize;
 	int             dataOfs;
 
-	int				glUsage = GL_STATIC_DRAW_ARB;
+	int				glUsage = GL_STATIC_DRAW;
 
 	if(!numVertexes || !numIndexes)
 		return NULL;
@@ -422,19 +422,19 @@ vao_t *R_CreateVao2(const char *name, int numVertexes, srfVert_t *verts, int num
 
 	vao->vertexesSize = dataSize;
 
-	qglGenBuffersARB(1, &vao->vertexesVBO);
+	qglGenBuffers(1, &vao->vertexesVBO);
 
-	qglBindBufferARB(GL_ARRAY_BUFFER_ARB, vao->vertexesVBO);
-	qglBufferDataARB(GL_ARRAY_BUFFER_ARB, vao->vertexesSize, data, glUsage);
+	qglBindBuffer(GL_ARRAY_BUFFER, vao->vertexesVBO);
+	qglBufferData(GL_ARRAY_BUFFER, vao->vertexesSize, data, glUsage);
 
 
 	// create IBO
 	vao->indexesSize = numIndexes * sizeof(glIndex_t);
 
-	qglGenBuffersARB(1, &vao->indexesIBO);
+	qglGenBuffers(1, &vao->indexesIBO);
 
-	qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vao->indexesIBO);
-	qglBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vao->indexesSize, indexes, glUsage);
+	qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vao->indexesIBO);
+	qglBufferData(GL_ELEMENT_ARRAY_BUFFER, vao->indexesSize, indexes, glUsage);
 
 
 	Vao_SetVertexPointers(vao);
@@ -484,16 +484,16 @@ void R_BindVao(vao_t * vao)
 
 			// why you no save GL_ELEMENT_ARRAY_BUFFER binding, Intel?
 			if (1)
-				qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, vao->indexesIBO);
+				qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vao->indexesIBO);
 
 			// tess VAO always has buffers bound
 			if (vao == tess.vao)
-				qglBindBufferARB(GL_ARRAY_BUFFER_ARB, vao->vertexesVBO);
+				qglBindBuffer(GL_ARRAY_BUFFER, vao->vertexesVBO);
 		}
 		else
 		{
-			qglBindBufferARB(GL_ARRAY_BUFFER_ARB, vao->vertexesVBO);
-			qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vao->indexesIBO);
+			qglBindBuffer(GL_ARRAY_BUFFER, vao->vertexesVBO);
+			qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vao->indexesIBO);
 
 			// tess VAO doesn't have vertex pointers set until data is uploaded
 			if (vao != tess.vao)
@@ -518,12 +518,12 @@ void R_BindNullVao(void)
 			qglBindVertexArrayARB(0);
 
 			// why you no save GL_ELEMENT_ARRAY_BUFFER binding, Intel?
-			if (1) qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+			if (1) qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 		}
 		else
 		{
-			qglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
-			qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+			qglBindBuffer(GL_ARRAY_BUFFER, 0);
+			qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 		}
 		glState.currentVao = NULL;
 	}
@@ -658,12 +658,12 @@ void R_ShutdownVaos(void)
 
 		if(vao->vertexesVBO)
 		{
-			qglDeleteBuffersARB(1, &vao->vertexesVBO);
+			qglDeleteBuffers(1, &vao->vertexesVBO);
 		}
 
 		if(vao->indexesIBO)
 		{
-			qglDeleteBuffersARB(1, &vao->indexesIBO);
+			qglDeleteBuffers(1, &vao->indexesIBO);
 		}
 	}
 
@@ -737,7 +737,7 @@ void RB_UpdateTessVao(unsigned int attribBits)
 		R_BindVao(tess.vao);
 
 		// orphan old vertex buffer so we don't stall on it
-		qglBufferDataARB(GL_ARRAY_BUFFER_ARB, tess.vao->vertexesSize, NULL, GL_DYNAMIC_DRAW_ARB);
+		qglBufferData(GL_ARRAY_BUFFER, tess.vao->vertexesSize, NULL, GL_DYNAMIC_DRAW);
 
 		// if nothing to set, set everything
 		if(!(attribBits & ATTR_BITS))
@@ -761,17 +761,17 @@ void RB_UpdateTessVao(unsigned int attribBits)
 			if (attribUpload & attribBit)
 			{
 				// note: tess has a VBO where stride == size
-				qglBufferSubDataARB(GL_ARRAY_BUFFER_ARB, vAtb->offset, tess.numVertexes * vAtb->stride, tess.attribPointers[attribIndex]);
+				qglBufferSubData(GL_ARRAY_BUFFER, vAtb->offset, tess.numVertexes * vAtb->stride, tess.attribPointers[attribIndex]);
 			}
 
 			if (attribBits & attribBit)
 			{
 				if (!glRefConfig.vertexArrayObject)
-					qglVertexAttribPointerARB(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset));
+					qglVertexAttribPointer(attribIndex, vAtb->count, vAtb->type, vAtb->normalized, vAtb->stride, BUFFER_OFFSET(vAtb->offset));
 
 				if (!(glState.vertexAttribsEnabled & attribBit))
 				{
-					qglEnableVertexAttribArrayARB(attribIndex);
+					qglEnableVertexAttribArray(attribIndex);
 					glState.vertexAttribsEnabled |= attribBit;
 				}
 			}
@@ -779,15 +779,15 @@ void RB_UpdateTessVao(unsigned int attribBits)
 			{
 				if ((glState.vertexAttribsEnabled & attribBit))
 				{
-					qglDisableVertexAttribArrayARB(attribIndex);
+					qglDisableVertexAttribArray(attribIndex);
 					glState.vertexAttribsEnabled &= ~attribBit;
 				}
 			}
 		}
 
 		// orphan old index buffer so we don't stall on it
-		qglBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, tess.vao->indexesSize, NULL, GL_DYNAMIC_DRAW_ARB);
+		qglBufferData(GL_ELEMENT_ARRAY_BUFFER, tess.vao->indexesSize, NULL, GL_DYNAMIC_DRAW);
 
-		qglBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, tess.numIndexes * sizeof(tess.indexes[0]), tess.indexes);
+		qglBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, tess.numIndexes * sizeof(tess.indexes[0]), tess.indexes);
 	}
 }

-- 
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