X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=vid_shared.c;h=e633c50ad9600c20e408b43577d50d256db29b3c;hb=a7f3098c45daeb30e23bdc6412cf1512ab1927c6;hp=a6bc8a9f6c8e4ee6a1e538d74de42bb6a209903b;hpb=22c208746a407737e19a6e615cadf7b6f1109eea;p=xonotic%2Fdarkplaces.git diff --git a/vid_shared.c b/vid_shared.c index a6bc8a9f..e633c50a 100644 --- a/vid_shared.c +++ b/vid_shared.c @@ -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(); }