]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_shared.c
fix typo in last commit
[xonotic/darkplaces.git] / vid_shared.c
index c091d824e02b678543bd7d22438a2965f8082c4a..d4da46941760a3c7dce2ddc6569acf96f2b76644 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;
 
@@ -56,6 +60,9 @@ cvar_t vid_minwidth = {0, "vid_minwidth", "0", "minimum vid_width that is accept
 cvar_t vid_minheight = {0, "vid_minheight", "0", "minimum vid_height that is acceptable (to be set in default.cfg in mods)"};
 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" };
@@ -161,22 +168,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);
 
@@ -198,8 +205,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);
@@ -226,8 +233,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);
@@ -355,6 +362,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);
@@ -416,7 +425,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))
                {
@@ -432,13 +442,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;
                }
        }
@@ -500,22 +507,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,14 +535,14 @@ static dllfunction_t opengl110funcs[] =
        {"glTexParameterfv", (void **) &qglTexParameterfv},
        {"glTexParameteri", (void **) &qglTexParameteri},
        {"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},
@@ -548,8 +555,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}
 };
 
@@ -772,6 +779,12 @@ static dllfunction_t occlusionqueryfuncs[] =
        {NULL, NULL}
 };
 
+static dllfunction_t drawbuffersfuncs[] =
+{
+       {"glDrawBuffersARB",             (void **) &qglDrawBuffersARB},
+       {NULL, NULL}
+};
+
 void VID_CheckExtensions(void)
 {
        // clear the extension flags
@@ -788,6 +801,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);
@@ -812,16 +826,14 @@ void VID_CheckExtensions(void)
        vid.support.ext_texture_3d = GL_CheckExtension("GL_EXT_texture3D", texture3dextfuncs, "-notexture3d", 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: -nodot3 disables use of GL_ARB_texture_env_dot3
+// 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
@@ -849,6 +861,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)
@@ -896,6 +912,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);
@@ -1003,6 +1029,7 @@ void VID_UpdateGamma(qboolean force, int rampsize)
        switch(vid.renderpath)
        {
        case RENDERPATH_GL20:
+       case RENDERPATH_CGGL:
                if (v_glslgamma.integer)
                        wantgamma = 0;
                break;
@@ -1182,6 +1209,9 @@ void VID_Shared_Init(void)
        Cvar_RegisterVariable(&vid_minheight);
        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)");