]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_shared.c
remove support for GL_EXT_compiled_vertex_array extension
[xonotic/darkplaces.git] / vid_shared.c
index d3884eaf86e6c6bd2e4e1fa6c7508096ead48bc1..4579c1434a32aaf5d853be81326c10d5ab84cae7 100644 (file)
@@ -2,6 +2,10 @@
 #include "quakedef.h"
 #include "cdaudio.h"
 
+#ifdef SUPPORTCG
+#include <Cg/cgGL.h>
+#endif
+
 // global video state
 viddef_t vid;
 
@@ -54,9 +58,11 @@ cvar_t vid_mouse = {CVAR_SAVE, "vid_mouse", "1", "whether to use the mouse in wi
 cvar_t vid_grabkeyboard = {CVAR_SAVE, "vid_grabkeyboard", "0", "whether to grab the keyboard when mouse is active (prevents use of volume control keys, music player keys, etc on some keyboards)"};
 cvar_t vid_minwidth = {0, "vid_minwidth", "0", "minimum vid_width that is acceptable (to be set in default.cfg in mods)"};
 cvar_t vid_minheight = {0, "vid_minheight", "0", "minimum vid_height that is acceptable (to be set in default.cfg in mods)"};
-cvar_t gl_combine = {0, "gl_combine", "1", "enables faster rendering using GL_ARB_texture_env_combine extension (part of OpenGL 1.3 and above)"};
 cvar_t vid_gl13 = {0, "vid_gl13", "1", "enables faster rendering using OpenGL 1.3 features (such as GL_ARB_texture_env_combine extension)"};
 cvar_t vid_gl20 = {0, "vid_gl20", "1", "enables faster rendering using OpenGL 2.0 features (such as GL_ARB_fragment_shader extension)"};
+#ifdef SUPPORTCG
+cvar_t vid_cggl = {0, "vid_glcg", "1", "enables faster rendering using the Cg shader library"};
+#endif
 cvar_t gl_finish = {0, "gl_finish", "0", "make the cpu wait for the graphics processor at the end of each rendered frame (can help with strange input or video lag problems on some machines)"};
 
 cvar_t vid_stick_mouse = {CVAR_SAVE, "vid_stick_mouse", "0", "have the mouse stuck in the center of the screen" };
@@ -104,10 +110,6 @@ void (GLAPIENTRY *qglMultiTexCoord4f) (GLenum, GLfloat, GLfloat, GLfloat, GLfloa
 void (GLAPIENTRY *qglActiveTexture) (GLenum);
 void (GLAPIENTRY *qglClientActiveTexture) (GLenum);
 
-// GL_EXT_compiled_vertex_array
-void (GLAPIENTRY *qglLockArraysEXT) (GLint first, GLint count);
-void (GLAPIENTRY *qglUnlockArraysEXT) (void);
-
 // general GL functions
 
 void (GLAPIENTRY *qglClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
@@ -162,22 +164,22 @@ void (GLAPIENTRY *qglBegin)(GLenum mode);
 void (GLAPIENTRY *qglEnd)(void);
 
 void (GLAPIENTRY *qglMatrixMode)(GLenum mode);
-void (GLAPIENTRY *qglOrtho)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val);
-void (GLAPIENTRY *qglFrustum)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val);
+//void (GLAPIENTRY *qglOrtho)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val);
+//void (GLAPIENTRY *qglFrustum)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val);
 void (GLAPIENTRY *qglViewport)(GLint x, GLint y, GLsizei width, GLsizei height);
-void (GLAPIENTRY *qglPushMatrix)(void);
-void (GLAPIENTRY *qglPopMatrix)(void);
+//void (GLAPIENTRY *qglPushMatrix)(void);
+//void (GLAPIENTRY *qglPopMatrix)(void);
 void (GLAPIENTRY *qglLoadIdentity)(void);
-void (GLAPIENTRY *qglLoadMatrixd)(const GLdouble *m);
+//void (GLAPIENTRY *qglLoadMatrixd)(const GLdouble *m);
 void (GLAPIENTRY *qglLoadMatrixf)(const GLfloat *m);
-void (GLAPIENTRY *qglMultMatrixd)(const GLdouble *m);
-void (GLAPIENTRY *qglMultMatrixf)(const GLfloat *m);
-void (GLAPIENTRY *qglRotated)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
-void (GLAPIENTRY *qglRotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
-void (GLAPIENTRY *qglScaled)(GLdouble x, GLdouble y, GLdouble z);
-void (GLAPIENTRY *qglScalef)(GLfloat x, GLfloat y, GLfloat z);
-void (GLAPIENTRY *qglTranslated)(GLdouble x, GLdouble y, GLdouble z);
-void (GLAPIENTRY *qglTranslatef)(GLfloat x, GLfloat y, GLfloat z);
+//void (GLAPIENTRY *qglMultMatrixd)(const GLdouble *m);
+//void (GLAPIENTRY *qglMultMatrixf)(const GLfloat *m);
+//void (GLAPIENTRY *qglRotated)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+//void (GLAPIENTRY *qglRotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+//void (GLAPIENTRY *qglScaled)(GLdouble x, GLdouble y, GLdouble z);
+//void (GLAPIENTRY *qglScalef)(GLfloat x, GLfloat y, GLfloat z);
+//void (GLAPIENTRY *qglTranslated)(GLdouble x, GLdouble y, GLdouble z);
+//void (GLAPIENTRY *qglTranslatef)(GLfloat x, GLfloat y, GLfloat z);
 
 void (GLAPIENTRY *qglReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
 
@@ -192,6 +194,11 @@ void (GLAPIENTRY *qglTexEnvi)(GLenum target, GLenum pname, GLint param);
 void (GLAPIENTRY *qglTexParameterf)(GLenum target, GLenum pname, GLfloat param);
 void (GLAPIENTRY *qglTexParameterfv)(GLenum target, GLenum pname, GLfloat *params);
 void (GLAPIENTRY *qglTexParameteri)(GLenum target, GLenum pname, GLint param);
+void (GLAPIENTRY *qglGetTexParameterfv)(GLenum target, GLenum pname, GLfloat *params);
+void (GLAPIENTRY *qglGetTexParameteriv)(GLenum target, GLenum pname, GLint *params);
+void (GLAPIENTRY *qglGetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat *params);
+void (GLAPIENTRY *qglGetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint *params);
+void (GLAPIENTRY *qglGetTexImage)(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
 void (GLAPIENTRY *qglHint)(GLenum target, GLenum mode);
 
 void (GLAPIENTRY *qglGenTextures)(GLsizei n, GLuint *textures);
@@ -199,8 +206,8 @@ void (GLAPIENTRY *qglDeleteTextures)(GLsizei n, const GLuint *textures);
 void (GLAPIENTRY *qglBindTexture)(GLenum target, GLuint texture);
 //void (GLAPIENTRY *qglPrioritizeTextures)(GLsizei n, const GLuint *textures, const GLclampf *priorities);
 //GLboolean (GLAPIENTRY *qglAreTexturesResident)(GLsizei n, const GLuint *textures, GLboolean *residences);
-GLboolean (GLAPIENTRY *qglIsTexture)(GLuint texture);
-void (GLAPIENTRY *qglPixelStoref)(GLenum pname, GLfloat param);
+//GLboolean (GLAPIENTRY *qglIsTexture)(GLuint texture);
+//void (GLAPIENTRY *qglPixelStoref)(GLenum pname, GLfloat param);
 void (GLAPIENTRY *qglPixelStorei)(GLenum pname, GLint param);
 
 //void (GLAPIENTRY *qglTexImage1D)(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
@@ -227,8 +234,8 @@ void (GLAPIENTRY *qglPolygonOffset)(GLfloat factor, GLfloat units);
 void (GLAPIENTRY *qglPolygonMode)(GLenum face, GLenum mode);
 void (GLAPIENTRY *qglPolygonStipple)(const GLubyte *mask);
 
-void (GLAPIENTRY *qglClipPlane)(GLenum plane, const GLdouble *equation);
-void (GLAPIENTRY *qglGetClipPlane)(GLenum plane, GLdouble *equation);
+//void (GLAPIENTRY *qglClipPlane)(GLenum plane, const GLdouble *equation);
+//void (GLAPIENTRY *qglGetClipPlane)(GLenum plane, GLdouble *equation);
 
 //[515]: added on 29.07.2005
 void (GLAPIENTRY *qglLineWidth)(GLfloat width);
@@ -356,6 +363,8 @@ void (GLAPIENTRY *qglFramebufferRenderbufferEXT)(GLenum target, GLenum attachmen
 void (GLAPIENTRY *qglGetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint *params);
 void (GLAPIENTRY *qglGenerateMipmapEXT)(GLenum target);
 
+void (GLAPIENTRY *qglDrawBuffersARB)(GLsizei n, const GLenum *bufs);
+
 void (GLAPIENTRY *qglCompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
 void (GLAPIENTRY *qglCompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border,  GLsizei imageSize, const void *data);
 //void (GLAPIENTRY *qglCompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
@@ -417,7 +426,8 @@ int GL_CheckExtension(const char *minglver_or_ext, const dllfunction_t *funcs, c
 
        if(ext == 0) // opengl version
        {
-               sscanf(gl_version, "%d.%d", &curr_version.major, &curr_version.minor);
+               if (sscanf(gl_version, "%d.%d", &curr_version.major, &curr_version.minor) < 2)
+                       curr_version.major = curr_version.minor = 1;
 
                if (curr_version.major < min_version.major || (curr_version.major == min_version.major && curr_version.minor < min_version.minor))
                {
@@ -433,13 +443,10 @@ int GL_CheckExtension(const char *minglver_or_ext, const dllfunction_t *funcs, c
                // functions are cleared before all the extensions are evaluated
                if (!(*func->funcvariable = (void *) GL_GetProcAddress(func->name)))
                {
-                       if (!silent)
-                       {
-                               if (ext)
-                                       Con_DPrintf("%s is missing function \"%s\" - broken driver!\n", minglver_or_ext, func->name);
-                               else
-                                       Con_DPrintf("OpenGL %s core features are missing function \"%s\" - broken driver!\n", minglver_or_ext, func->name);
-                       }
+                       if (ext && !silent)
+                               Con_DPrintf("%s is missing function \"%s\" - broken driver!\n", minglver_or_ext, func->name);
+                       if (!ext)
+                               Con_Printf("OpenGL %s core features are missing function \"%s\" - broken driver!\n", minglver_or_ext, func->name);
                        failed = true;
                }
        }
@@ -501,22 +508,22 @@ static dllfunction_t opengl110funcs[] =
        {"glPointSize", (void**) &qglPointSize},
 //
        {"glMatrixMode", (void **) &qglMatrixMode},
-       {"glOrtho", (void **) &qglOrtho},
-       {"glFrustum", (void **) &qglFrustum},
+//     {"glOrtho", (void **) &qglOrtho},
+//     {"glFrustum", (void **) &qglFrustum},
        {"glViewport", (void **) &qglViewport},
-       {"glPushMatrix", (void **) &qglPushMatrix},
-       {"glPopMatrix", (void **) &qglPopMatrix},
+//     {"glPushMatrix", (void **) &qglPushMatrix},
+//     {"glPopMatrix", (void **) &qglPopMatrix},
        {"glLoadIdentity", (void **) &qglLoadIdentity},
-       {"glLoadMatrixd", (void **) &qglLoadMatrixd},
+//     {"glLoadMatrixd", (void **) &qglLoadMatrixd},
        {"glLoadMatrixf", (void **) &qglLoadMatrixf},
-       {"glMultMatrixd", (void **) &qglMultMatrixd},
-       {"glMultMatrixf", (void **) &qglMultMatrixf},
-       {"glRotated", (void **) &qglRotated},
-       {"glRotatef", (void **) &qglRotatef},
-       {"glScaled", (void **) &qglScaled},
-       {"glScalef", (void **) &qglScalef},
-       {"glTranslated", (void **) &qglTranslated},
-       {"glTranslatef", (void **) &qglTranslatef},
+//     {"glMultMatrixd", (void **) &qglMultMatrixd},
+//     {"glMultMatrixf", (void **) &qglMultMatrixf},
+//     {"glRotated", (void **) &qglRotated},
+//     {"glRotatef", (void **) &qglRotatef},
+//     {"glScaled", (void **) &qglScaled},
+//     {"glScalef", (void **) &qglScalef},
+//     {"glTranslated", (void **) &qglTranslated},
+//     {"glTranslatef", (void **) &qglTranslatef},
        {"glReadPixels", (void **) &qglReadPixels},
        {"glStencilFunc", (void **) &qglStencilFunc},
        {"glStencilMask", (void **) &qglStencilMask},
@@ -528,15 +535,20 @@ static dllfunction_t opengl110funcs[] =
        {"glTexParameterf", (void **) &qglTexParameterf},
        {"glTexParameterfv", (void **) &qglTexParameterfv},
        {"glTexParameteri", (void **) &qglTexParameteri},
+       {"glGetTexImage", (void **) &qglGetTexImage},
+       {"glGetTexParameterfv", (void **) &qglGetTexParameterfv},
+       {"glGetTexParameteriv", (void **) &qglGetTexParameteriv},
+       {"glGetTexLevelParameterfv", (void **) &qglGetTexLevelParameterfv},
+       {"glGetTexLevelParameteriv", (void **) &qglGetTexLevelParameteriv},
        {"glHint", (void **) &qglHint},
-       {"glPixelStoref", (void **) &qglPixelStoref},
+//     {"glPixelStoref", (void **) &qglPixelStoref},
        {"glPixelStorei", (void **) &qglPixelStorei},
        {"glGenTextures", (void **) &qglGenTextures},
        {"glDeleteTextures", (void **) &qglDeleteTextures},
        {"glBindTexture", (void **) &qglBindTexture},
 //     {"glPrioritizeTextures", (void **) &qglPrioritizeTextures},
 //     {"glAreTexturesResident", (void **) &qglAreTexturesResident},
-       {"glIsTexture", (void **) &qglIsTexture},
+//     {"glIsTexture", (void **) &qglIsTexture},
 //     {"glTexImage1D", (void **) &qglTexImage1D},
        {"glTexImage2D", (void **) &qglTexImage2D},
 //     {"glTexSubImage1D", (void **) &qglTexSubImage1D},
@@ -549,8 +561,8 @@ static dllfunction_t opengl110funcs[] =
        {"glPolygonOffset", (void **) &qglPolygonOffset},
        {"glPolygonMode", (void **) &qglPolygonMode},
        {"glPolygonStipple", (void **) &qglPolygonStipple},
-       {"glClipPlane", (void **) &qglClipPlane},
-       {"glGetClipPlane", (void **) &qglGetClipPlane},
+//     {"glClipPlane", (void **) &qglClipPlane},
+//     {"glGetClipPlane", (void **) &qglGetClipPlane},
        {NULL, NULL}
 };
 
@@ -577,13 +589,6 @@ static dllfunction_t multitexturefuncs[] =
        {NULL, NULL}
 };
 
-static dllfunction_t compiledvertexarrayfuncs[] =
-{
-       {"glLockArraysEXT", (void **) &qglLockArraysEXT},
-       {"glUnlockArraysEXT", (void **) &qglUnlockArraysEXT},
-       {NULL, NULL}
-};
-
 static dllfunction_t texture3dextfuncs[] =
 {
        {"glTexImage3DEXT", (void **) &qglTexImage3D},
@@ -773,6 +778,12 @@ static dllfunction_t occlusionqueryfuncs[] =
        {NULL, NULL}
 };
 
+static dllfunction_t drawbuffersfuncs[] =
+{
+       {"glDrawBuffersARB",             (void **) &qglDrawBuffersARB},
+       {NULL, NULL}
+};
+
 void VID_CheckExtensions(void)
 {
        // clear the extension flags
@@ -789,6 +800,7 @@ void VID_CheckExtensions(void)
 
        vid.support.amd_texture_texture4 = GL_CheckExtension("GL_AMD_texture_texture4", NULL, "-notexture4", false);
        vid.support.arb_depth_texture = GL_CheckExtension("GL_ARB_depth_texture", NULL, "-nodepthtexture", false);
+       vid.support.arb_draw_buffers = GL_CheckExtension("GL_ARB_draw_buffers", drawbuffersfuncs, "-nodrawbuffers", false);
        vid.support.arb_fragment_shader = GL_CheckExtension("GL_ARB_fragment_shader", NULL, "-nofragmentshader", false);
        vid.support.arb_multitexture = GL_CheckExtension("GL_ARB_multitexture", multitexturefuncs, "-nomtex", false);
        vid.support.arb_occlusion_query = GL_CheckExtension("GL_ARB_occlusion_query", occlusionqueryfuncs, "-noocclusionquery", false);
@@ -806,22 +818,20 @@ void VID_CheckExtensions(void)
        vid.support.ati_separate_stencil = GL_CheckExtension("2.0", gl2separatestencilfuncs, "-noseparatestencil", true) || GL_CheckExtension("GL_ATI_separate_stencil", atiseparatestencilfuncs, "-noseparatestencil", false);
        vid.support.ext_blend_minmax = GL_CheckExtension("GL_EXT_blend_minmax", blendequationfuncs, "-noblendminmax", false);
        vid.support.ext_blend_subtract = GL_CheckExtension("GL_EXT_blend_subtract", blendequationfuncs, "-noblendsubtract", false);
-       vid.support.ext_compiled_vertex_array = GL_CheckExtension("GL_EXT_compiled_vertex_array", compiledvertexarrayfuncs, "-nocva", false);
        vid.support.ext_draw_range_elements = GL_CheckExtension("1.2", drawrangeelementsfuncs, "-nodrawrangeelements", true) || GL_CheckExtension("GL_EXT_draw_range_elements", drawrangeelementsextfuncs, "-nodrawrangeelements", false);
        vid.support.ext_framebuffer_object = GL_CheckExtension("GL_EXT_framebuffer_object", fbofuncs, "-nofbo", false);
        vid.support.ext_stencil_two_side = GL_CheckExtension("GL_EXT_stencil_two_side", stenciltwosidefuncs, "-nostenciltwoside", false);
        vid.support.ext_texture_3d = GL_CheckExtension("GL_EXT_texture3D", texture3dextfuncs, "-notexture3d", false);
+       vid.support.ext_texture_compression_s3tc = GL_CheckExtension("GL_EXT_texture_compression_s3tc", NULL, "-nos3tc", false);
        vid.support.ext_texture_edge_clamp = GL_CheckExtension("GL_EXT_texture_edge_clamp", NULL, "-noedgeclamp", false) || GL_CheckExtension("GL_SGIS_texture_edge_clamp", NULL, "-noedgeclamp", false);
        vid.support.ext_texture_filter_anisotropic = GL_CheckExtension("GL_EXT_texture_filter_anisotropic", NULL, "-noanisotropy", false);
-       vid.support.nv_blend_square = GL_CheckExtension("GL_NV_blend_square", NULL, "-noblendsquare", false);
 // COMMANDLINEOPTION: GL: -noanisotropy disables GL_EXT_texture_filter_anisotropic (allows higher quality texturing)
 // COMMANDLINEOPTION: GL: -noblendminmax disables GL_EXT_blend_minmax
-// COMMANDLINEOPTION: GL: -noblendsquare disables GL_NV_blend_square
 // COMMANDLINEOPTION: GL: -noblendsubtract disables GL_EXT_blend_subtract
 // COMMANDLINEOPTION: GL: -nocombine disables GL_ARB_texture_env_combine or GL_EXT_texture_env_combine (required for bumpmapping and faster map rendering)
 // COMMANDLINEOPTION: GL: -nocubemap disables GL_ARB_texture_cube_map (required for bumpmapping)
-// COMMANDLINEOPTION: GL: -nocva disables GL_EXT_compiled_vertex_array (renders faster)
 // COMMANDLINEOPTION: GL: -nodepthtexture disables use of GL_ARB_depth_texture (required for shadowmapping)
+// COMMANDLINEOPTION: GL: -nodrawbuffers disables use of GL_ARB_draw_buffers (required for r_shadow_deferredprepass)
 // COMMANDLINEOPTION: GL: -nodrawrangeelements disables GL_EXT_draw_range_elements (renders faster)
 // COMMANDLINEOPTION: GL: -noedgeclamp disables GL_EXT_texture_edge_clamp or GL_SGIS_texture_edge_clamp (recommended, some cards do not support the other texture clamp method)
 // COMMANDLINEOPTION: GL: -nofbo disables GL_EXT_framebuffer_object (which accelerates rendering), only used if GL_ARB_fragment_shader is also available
@@ -829,6 +839,7 @@ void VID_CheckExtensions(void)
 // COMMANDLINEOPTION: GL: -nomtex disables GL_ARB_multitexture (required for faster map rendering)
 // COMMANDLINEOPTION: GL: -noocclusionquery disables GL_ARB_occlusion_query (which allows coronas to fade according to visibility, and potentially used for rendering optimizations)
 // COMMANDLINEOPTION: GL: -norectangle disables GL_ARB_texture_rectangle (required for bumpmapping)
+// COMMANDLINEOPTION: GL: -nos3tc disables GL_EXT_texture_compression_s3tc (which allows use of .dds texture caching)
 // COMMANDLINEOPTION: GL: -noseparatestencil disables use of OpenGL2.0 glStencilOpSeparate and GL_ATI_separate_stencil extensions (which accelerate shadow rendering)
 // COMMANDLINEOPTION: GL: -noshaderobjects disables GL_ARB_shader_objects (required for vertex shader and fragment shader)
 // COMMANDLINEOPTION: GL: -noshadinglanguage100 disables GL_ARB_shading_language_100 (required for vertex shader and fragment shader)
@@ -849,6 +860,10 @@ void VID_CheckExtensions(void)
        vid.teximageunits = 1;
        vid.texarrayunits = 1;
        vid.max_anisotropy = 1;
+       vid.maxdrawbuffers = 1;
+
+       if (vid.support.arb_draw_buffers)
+               qglGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, (GLint*)&vid.maxdrawbuffers);
 
        // disable non-power-of-two textures on Radeon X1600 and other cards that do not accelerate it with some filtering modes / repeat modes that we use
        // we detect these cards by checking if the hardware supports vertex texture fetch (Geforce6 does, Radeon X1600 does not, all GL3-class hardware does)
@@ -883,7 +898,9 @@ void VID_CheckExtensions(void)
        }
 
        vid.texunits = vid.teximageunits = vid.texarrayunits = 1;
-       if (vid.support.arb_fragment_shader && vid_gl20.integer)
+       if (vid.support.arb_multitexture)
+               qglGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, (GLint*)&vid.texunits);
+       if (vid_gl20.integer && vid.support.arb_fragment_shader && vid.support.arb_vertex_shader && vid.support.arb_shader_objects)
        {
                qglGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, (GLint*)&vid.texunits);
                qglGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, (int *)&vid.teximageunits);CHECKGLERROR
@@ -894,6 +911,16 @@ void VID_CheckExtensions(void)
                Con_DPrintf("Using GL2.0 rendering path - %i texture matrix, %i texture images, %i texcoords%s\n", vid.texunits, vid.teximageunits, vid.texarrayunits, vid.support.ext_framebuffer_object ? ", shadowmapping supported" : "");
                vid.renderpath = RENDERPATH_GL20;
        }
+#ifdef SUPPORTCG
+       else if (vid_cggl.integer && (vid.cgcontext = cgCreateContext()))
+       {
+               vid.texunits = 4;
+               vid.teximageunits = 16;
+               vid.texarrayunits = 8;
+               Con_DPrintf("Using NVIDIA Cg rendering path - %i texture matrix, %i texture images, %i texcoords%s\n", vid.texunits, vid.teximageunits, vid.texarrayunits, vid.support.ext_framebuffer_object ? ", shadowmapping supported" : "");
+               vid.renderpath = RENDERPATH_CGGL;
+       }
+#endif
        else if (vid.support.arb_texture_env_combine && vid.texunits >= 2 && vid_gl13.integer)
        {
                qglGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, (GLint*)&vid.texunits);
@@ -905,8 +932,6 @@ void VID_CheckExtensions(void)
        }
        else
        {
-               if (vid.support.arb_multitexture)
-                       qglGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, (GLint*)&vid.texunits);
                vid.texunits = bound(1, vid.texunits, MAX_TEXTUREUNITS);
                vid.teximageunits = vid.texunits;
                vid.texarrayunits = vid.texunits;
@@ -1000,8 +1025,17 @@ void VID_UpdateGamma(qboolean force, int rampsize)
                return;
 
        wantgamma = v_hwgamma.integer;
-       if(r_glsl.integer && v_glslgamma.integer)
-               wantgamma = 0;
+       switch(vid.renderpath)
+       {
+       case RENDERPATH_GL20:
+       case RENDERPATH_CGGL:
+               if (v_glslgamma.integer)
+                       wantgamma = 0;
+               break;
+       case RENDERPATH_GL13:
+       case RENDERPATH_GL11:
+               break;
+       }
        if(!vid_activewindow)
                wantgamma = 0;
 #define BOUNDCVAR(cvar, m1, m2) c = &(cvar);f = bound(m1, c->value, m2);if (c->value != f) Cvar_SetValueQuick(c, f);
@@ -1172,9 +1206,11 @@ void VID_Shared_Init(void)
        Cvar_RegisterVariable(&vid_resizable);
        Cvar_RegisterVariable(&vid_minwidth);
        Cvar_RegisterVariable(&vid_minheight);
-       Cvar_RegisterVariable(&gl_combine);
        Cvar_RegisterVariable(&vid_gl13);
        Cvar_RegisterVariable(&vid_gl20);
+#ifdef SUPPORTCG
+       Cvar_RegisterVariable(&vid_cggl);
+#endif
        Cvar_RegisterVariable(&gl_finish);
        Cmd_AddCommand("force_centerview", Force_CenterView_f, "recenters view (stops looking up/down)");
        Cmd_AddCommand("vid_restart", VID_Restart_f, "restarts video system (closes and reopens the window, restarts renderer)");