float in_mouse_x, in_mouse_y;
// GL_ARB_multitexture
-int gl_textureunits = 0;
+int gl_textureunits = 1;
// GL_ARB_texture_env_combine or GL_EXT_texture_env_combine
int gl_combine_extension = false;
// GL_EXT_compiled_vertex_array
int gl_support_var2 = false;
// GL_EXT_texture_filter_anisotropic
int gl_support_anisotropy = false;
+int gl_max_anisotropy = 1;
// 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;
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);
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);
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);
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);
//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);
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;
if (disableparm && (COM_CheckParm(disableparm) || COM_CheckParm("-safe")))
{
- Con_DPrintf("disabled by commandline\n");
+ Con_DPrint("disabled by commandline\n");
return false;
}
// 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;
}
}
{
{"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},
{"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},
{NULL, NULL}
};
+static dllfunction_t stenciltwosidefuncs[] =
+{
+ {"glActiveStencilFaceEXT", (void **) &qglActiveStencilFaceEXT},
+ {NULL, NULL}
+};
+
void VID_CheckExtensions(void)
{
gl_stencil = vid_bitsperpixel.integer == 32;
+
+ // reset all the gl extension variables here
+ // this should match the declarations
+ gl_textureunits = 1;
gl_combine_extension = false;
- gl_dot3arb = false;
gl_supportslockarrays = false;
- gl_textureunits = 1;
+ gl_videosyncavailable = false;
+ gl_texture3d = false;
+ gl_texturecubemap = false;
+ gl_dot3arb = false;
gl_support_clamptoedge = false;
gl_support_var = false;
gl_support_var2 = false;
+ gl_support_anisotropy = false;
+ gl_max_anisotropy = 1;
+ gl_textureshader = 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);
if (gl_support_var)
gl_support_var2 = GL_CheckExtension("GL_NV_vertex_array_range2", NULL, "-novar2", false);
- gl_support_anisotropy = GL_CheckExtension("GL_EXT_texture_filter_anisotropic", NULL, "-noanisotropy", false);
+ if ((gl_support_anisotropy = GL_CheckExtension("GL_EXT_texture_filter_anisotropic", NULL, "-noanisotropy", false)))
+ qglGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_max_anisotropy);
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;
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");
}
Cvar_SetQuick(&vid_bitsperpixel, com_argv[i+1]);
}
- Con_DPrintf("Starting video system\n");
+ 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");
+ 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))