]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_shared.c
now supports GL_EXT_stencil_two_side extension (found on NV30/R300 class cards),...
[xonotic/darkplaces.git] / vid_shared.c
index a6bc8a9f6c8e4ee6a1e538d74de42bb6a209903b..e633c50ad9600c20e408b43577d50d256db29b3c 100644 (file)
@@ -1,9 +1,6 @@
 
 #include "quakedef.h"
 
-// Tell startup code that we have a client
-int cl_available = true;
-
 // global video state
 viddef_t vid;
 
@@ -43,6 +40,8 @@ int gl_support_var2 = false;
 int gl_support_anisotropy = false;
 // GL_NV_texture_shader
 int gl_textureshader = false;
+// GL_EXT_stencil_two_side
+int gl_support_stenciltwoside = false;
 
 // LordHavoc: if window is hidden, don't update screen
 int vid_hidden = true;
@@ -234,6 +233,8 @@ void (GLAPIENTRY *qglScissor)(GLint x, GLint y, GLsizei width, GLsizei height);
 
 void (GLAPIENTRY *qglPolygonOffset)(GLfloat factor, GLfloat units);
 
+void (GLAPIENTRY *qglActiveStencilFaceEXT)(GLenum);
+
 int GL_CheckExtension(const char *name, const dllfunction_t *funcs, const char *disableparm, int silent)
 {
        int failed = false;
@@ -244,9 +245,9 @@ int GL_CheckExtension(const char *name, const dllfunction_t *funcs, const char *
        for (func = funcs;func && func->name;func++)
                *func->funcvariable = NULL;
 
-       if (disableparm && COM_CheckParm(disableparm))
+       if (disableparm && (COM_CheckParm(disableparm) || COM_CheckParm("-safe")))
        {
-               Con_DPrintf("disabled by commandline\n");
+               Con_DPrint("disabled by commandline\n");
                return false;
        }
 
@@ -265,12 +266,12 @@ int GL_CheckExtension(const char *name, const dllfunction_t *funcs, const char *
                // delay the return so it prints all missing functions
                if (failed)
                        return false;
-               Con_DPrintf("enabled\n");
+               Con_DPrint("enabled\n");
                return true;
        }
        else
        {
-               Con_DPrintf("not detected\n");
+               Con_DPrint("not detected\n");
                return false;
        }
 }
@@ -418,6 +419,12 @@ static dllfunction_t wglvarfuncs[] =
        {NULL, NULL}
 };
 
+static dllfunction_t stenciltwosidefuncs[] =
+{
+       {"glActiveStencilFaceEXT", (void **) &qglActiveStencilFaceEXT},
+       {NULL, NULL}
+};
+
 
 void VID_CheckExtensions(void)
 {
@@ -429,17 +436,18 @@ void VID_CheckExtensions(void)
        gl_support_clamptoedge = false;
        gl_support_var = false;
        gl_support_var2 = false;
+       gl_support_stenciltwoside = false;
 
        if (!GL_CheckExtension("OpenGL 1.1.0", opengl110funcs, NULL, false))
                Sys_Error("OpenGL 1.1.0 functions not found\n");
 
-       Con_DPrintf ("GL_VENDOR: %s\n", gl_vendor);
-       Con_DPrintf ("GL_RENDERER: %s\n", gl_renderer);
-       Con_DPrintf ("GL_VERSION: %s\n", gl_version);
-       Con_DPrintf ("GL_EXTENSIONS: %s\n", gl_extensions);
-       Con_DPrintf ("%s_EXTENSIONS: %s\n", gl_platform, gl_platformextensions);
+       Con_DPrintf("GL_VENDOR: %s\n", gl_vendor);
+       Con_DPrintf("GL_RENDERER: %s\n", gl_renderer);
+       Con_DPrintf("GL_VERSION: %s\n", gl_version);
+       Con_DPrintf("GL_EXTENSIONS: %s\n", gl_extensions);
+       Con_DPrintf("%s_EXTENSIONS: %s\n", gl_platform, gl_platformextensions);
 
-       Con_DPrintf("Checking OpenGL extensions...\n");
+       Con_DPrint("Checking OpenGL extensions...\n");
 
        if (!GL_CheckExtension("glDrawRangeElements", drawrangeelementsfuncs, "-nodrawrangeelements", true))
                GL_CheckExtension("GL_EXT_draw_range_elements", drawrangeelementsextfuncs, "-nodrawrangeelements", false);
@@ -468,6 +476,8 @@ void VID_CheckExtensions(void)
 
        gl_textureshader = GL_CheckExtension("GL_NV_texture_shader", NULL, "-notextureshader", false);
 
+       gl_support_stenciltwoside = GL_CheckExtension("GL_EXT_stencil_two_side", stenciltwosidefuncs, "-nostenciltwoside", false);
+
        // we don't care if it's an extension or not, they are identical functions, so keep it simple in the rendering code
        if (qglDrawRangeElements == NULL)
                qglDrawRangeElements = qglDrawRangeElementsEXT;
@@ -812,7 +822,7 @@ void VID_Restart_f(void)
        VID_Close();
        if (!VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer))
        {
-               Con_Printf("Video mode change failed\n");
+               Con_Print("Video mode change failed\n");
                if (!VID_Mode(current_vid_fullscreen, current_vid_width, current_vid_height, current_vid_bitsperpixel))
                        Sys_Error("Unable to restore to last working video mode\n");
        }
@@ -821,14 +831,14 @@ void VID_Restart_f(void)
 
 void VID_Open(void)
 {
-       int i, width, height;
+       int i, width, height, success;
        if (vid_commandlinecheck)
        {
                // interpret command-line parameters
                vid_commandlinecheck = false;
-               if ((i = COM_CheckParm("-window")) != 0)
+               if (COM_CheckParm("-window") || COM_CheckParm("-safe"))
                        Cvar_SetValueQuick(&vid_fullscreen, false);
-               if ((i = COM_CheckParm("-fullscreen")) != 0)
+               if (COM_CheckParm("-fullscreen"))
                        Cvar_SetValueQuick(&vid_fullscreen, true);
                width = 0;
                height = 0;
@@ -848,18 +858,19 @@ void VID_Open(void)
                        Cvar_SetQuick(&vid_bitsperpixel, com_argv[i+1]);
        }
 
-       Con_DPrintf("Starting video system\n");
-       if (!VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer))
+       Con_DPrint("Starting video system\n");
+       success = VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer);
+       if (!success)
        {
-               Con_Printf("Desired video mode fail, trying fallbacks...\n");
-               if (vid_fullscreen.integer)
-               {
-                       if (!VID_Mode(true, 640, 480, 16))
-                               if (!VID_Mode(false, 640, 480, 16))
-                                       Sys_Error("Video modes failed\n");
-               }
-               else
-                       Sys_Error("Windowed video failed\n");
+               Con_Print("Desired video mode fail, trying fallbacks...\n");
+               if (!success && vid_bitsperpixel.integer > 16)
+                       success = VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, 16);
+               if (!success && (vid_width.integer > 640 || vid_height.integer > 480))
+                       success = VID_Mode(vid_fullscreen.integer, 640, 480, 16);
+               if (!success && vid_fullscreen.integer)
+                       success = VID_Mode(false, 640, 480, 16);
+               if (!success)
+                       Sys_Error("Video modes failed\n");
        }
        VID_OpenSystems();
 }