X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=vid_shared.c;h=ae62bcbacaf1f2266cbd4bb65d6dbc0f2bac47c9;hb=d802f6097b996ccd7a1e963eee7648e86ad0108d;hp=eb0cc8565425575c4577b483e17ab4f152fb4654;hpb=ae7c70225c6ac23300f7620394de4fab13485663;p=xonotic%2Fdarkplaces.git diff --git a/vid_shared.c b/vid_shared.c index eb0cc856..ae62bcba 100644 --- a/vid_shared.c +++ b/vid_shared.c @@ -40,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; @@ -122,12 +124,12 @@ void (GLAPIENTRY *qglClearColor)(GLclampf red, GLclampf green, GLclampf blue, GL void (GLAPIENTRY *qglClear)(GLbitfield mask); -//void (GLAPIENTRY *qglAlphaFunc)(GLenum func, GLclampf ref); +void (GLAPIENTRY *qglAlphaFunc)(GLenum func, GLclampf ref); void (GLAPIENTRY *qglBlendFunc)(GLenum sfactor, GLenum dfactor); void (GLAPIENTRY *qglCullFace)(GLenum mode); -//void (GLAPIENTRY *qglDrawBuffer)(GLenum mode); -//void (GLAPIENTRY *qglReadBuffer)(GLenum mode); +void (GLAPIENTRY *qglDrawBuffer)(GLenum mode); +void (GLAPIENTRY *qglReadBuffer)(GLenum mode); void (GLAPIENTRY *qglEnable)(GLenum cap); void (GLAPIENTRY *qglDisable)(GLenum cap); GLboolean (GLAPIENTRY *qglIsEnabled)(GLenum cap); @@ -135,9 +137,9 @@ GLboolean (GLAPIENTRY *qglIsEnabled)(GLenum cap); void (GLAPIENTRY *qglEnableClientState)(GLenum cap); void (GLAPIENTRY *qglDisableClientState)(GLenum cap); -//void (GLAPIENTRY *qglGetBooleanv)(GLenum pname, GLboolean *params); -//void (GLAPIENTRY *qglGetDoublev)(GLenum pname, GLdouble *params); -//void (GLAPIENTRY *qglGetFloatv)(GLenum pname, GLfloat *params); +void (GLAPIENTRY *qglGetBooleanv)(GLenum pname, GLboolean *params); +void (GLAPIENTRY *qglGetDoublev)(GLenum pname, GLdouble *params); +void (GLAPIENTRY *qglGetFloatv)(GLenum pname, GLfloat *params); void (GLAPIENTRY *qglGetIntegerv)(GLenum pname, GLint *params); GLenum (GLAPIENTRY *qglGetError)(void); @@ -172,19 +174,19 @@ 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 *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); @@ -193,11 +195,11 @@ void (GLAPIENTRY *qglStencilMask)(GLuint mask); void (GLAPIENTRY *qglStencilOp)(GLenum fail, GLenum zfail, GLenum zpass); void (GLAPIENTRY *qglClearStencil)(GLint s); -//void (GLAPIENTRY *qglTexEnvf)(GLenum target, GLenum pname, GLfloat param); +void (GLAPIENTRY *qglTexEnvf)(GLenum target, GLenum pname, GLfloat param); void (GLAPIENTRY *qglTexEnvfv)(GLenum target, GLenum pname, const GLfloat *params); 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 *qglTexParameterfv)(GLenum target, GLenum pname, GLfloat *params); void (GLAPIENTRY *qglTexParameteri)(GLenum target, GLenum pname, GLint param); void (GLAPIENTRY *qglGenTextures)(GLsizei n, GLuint *textures); @@ -206,7 +208,7 @@ 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); +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); @@ -231,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; @@ -241,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; } @@ -262,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; } } @@ -276,19 +280,19 @@ static dllfunction_t opengl110funcs[] = { {"glClearColor", (void **) &qglClearColor}, {"glClear", (void **) &qglClear}, -// {"glAlphaFunc", (void **) &qglAlphaFunc}, + {"glAlphaFunc", (void **) &qglAlphaFunc}, {"glBlendFunc", (void **) &qglBlendFunc}, {"glCullFace", (void **) &qglCullFace}, -// {"glDrawBuffer", (void **) &qglDrawBuffer}, -// {"glReadBuffer", (void **) &qglReadBuffer}, + {"glDrawBuffer", (void **) &qglDrawBuffer}, + {"glReadBuffer", (void **) &qglReadBuffer}, {"glEnable", (void **) &qglEnable}, {"glDisable", (void **) &qglDisable}, {"glIsEnabled", (void **) &qglIsEnabled}, {"glEnableClientState", (void **) &qglEnableClientState}, {"glDisableClientState", (void **) &qglDisableClientState}, -// {"glGetBooleanv", (void **) &qglGetBooleanv}, -// {"glGetDoublev", (void **) &qglGetDoublev}, -// {"glGetFloatv", (void **) &qglGetFloatv}, + {"glGetBooleanv", (void **) &qglGetBooleanv}, + {"glGetDoublev", (void **) &qglGetDoublev}, + {"glGetFloatv", (void **) &qglGetFloatv}, {"glGetIntegerv", (void **) &qglGetIntegerv}, {"glGetError", (void **) &qglGetError}, {"glGetString", (void **) &qglGetString}, @@ -316,31 +320,31 @@ static dllfunction_t opengl110funcs[] = {"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}, {"glStencilOp", (void **) &qglStencilOp}, {"glClearStencil", (void **) &qglClearStencil}, -// {"glTexEnvf", (void **) &qglTexEnvf}, + {"glTexEnvf", (void **) &qglTexEnvf}, {"glTexEnvfv", (void **) &qglTexEnvfv}, {"glTexEnvi", (void **) &qglTexEnvi}, {"glTexParameterf", (void **) &qglTexParameterf}, -// {"glTexParameterfv", (void **) &qglTexParameterfv}, + {"glTexParameterfv", (void **) &qglTexParameterfv}, {"glTexParameteri", (void **) &qglTexParameteri}, -// {"glPixelStoref", (void **) &qglPixelStoref}, + {"glPixelStoref", (void **) &qglPixelStoref}, {"glPixelStorei", (void **) &qglPixelStorei}, {"glGenTextures", (void **) &qglGenTextures}, {"glDeleteTextures", (void **) &qglDeleteTextures}, @@ -415,6 +419,12 @@ static dllfunction_t wglvarfuncs[] = {NULL, NULL} }; +static dllfunction_t stenciltwosidefuncs[] = +{ + {"glActiveStencilFaceEXT", (void **) &qglActiveStencilFaceEXT}, + {NULL, NULL} +}; + void VID_CheckExtensions(void) { @@ -426,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); @@ -465,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; @@ -809,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"); } @@ -818,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; @@ -845,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(); }