#include "quakedef.h"
#include "cdaudio.h"
+#ifdef SUPPORTCG
+#include <Cg/cgGL.h>
+#endif
+
// global video state
viddef_t vid;
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" };
void (GLAPIENTRY *qglActiveTexture) (GLenum);
void (GLAPIENTRY *qglClientActiveTexture) (GLenum);
-// GL_EXT_compiled_vertex_array
-void (GLAPIENTRY *qglLockArraysEXT) (GLint first, GLint count);
-void (GLAPIENTRY *qglUnlockArraysEXT) (void);
-
// general GL functions
void (GLAPIENTRY *qglClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
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);
void (GLAPIENTRY *qglTexParameterf)(GLenum target, GLenum pname, GLfloat param);
void (GLAPIENTRY *qglTexParameterfv)(GLenum target, GLenum pname, GLfloat *params);
void (GLAPIENTRY *qglTexParameteri)(GLenum target, GLenum pname, GLint param);
+void (GLAPIENTRY *qglGetTexParameterfv)(GLenum target, GLenum pname, GLfloat *params);
+void (GLAPIENTRY *qglGetTexParameteriv)(GLenum target, GLenum pname, GLint *params);
+void (GLAPIENTRY *qglGetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat *params);
+void (GLAPIENTRY *qglGetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint *params);
+void (GLAPIENTRY *qglGetTexImage)(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
void (GLAPIENTRY *qglHint)(GLenum target, GLenum mode);
void (GLAPIENTRY *qglGenTextures)(GLsizei n, 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);
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);
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))
{
// 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;
}
}
{"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},
{"glTexParameterf", (void **) &qglTexParameterf},
{"glTexParameterfv", (void **) &qglTexParameterfv},
{"glTexParameteri", (void **) &qglTexParameteri},
+ {"glGetTexImage", (void **) &qglGetTexImage},
+ {"glGetTexParameterfv", (void **) &qglGetTexParameterfv},
+ {"glGetTexParameteriv", (void **) &qglGetTexParameteriv},
+ {"glGetTexLevelParameterfv", (void **) &qglGetTexLevelParameterfv},
+ {"glGetTexLevelParameteriv", (void **) &qglGetTexLevelParameteriv},
{"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},
{"glPolygonOffset", (void **) &qglPolygonOffset},
{"glPolygonMode", (void **) &qglPolygonMode},
{"glPolygonStipple", (void **) &qglPolygonStipple},
- {"glClipPlane", (void **) &qglClipPlane},
- {"glGetClipPlane", (void **) &qglGetClipPlane},
+// {"glClipPlane", (void **) &qglClipPlane},
+// {"glGetClipPlane", (void **) &qglGetClipPlane},
{NULL, NULL}
};
{NULL, NULL}
};
-static dllfunction_t compiledvertexarrayfuncs[] =
-{
- {"glLockArraysEXT", (void **) &qglLockArraysEXT},
- {"glUnlockArraysEXT", (void **) &qglUnlockArraysEXT},
- {NULL, NULL}
-};
-
static dllfunction_t texture3dextfuncs[] =
{
{"glTexImage3DEXT", (void **) &qglTexImage3D},
vid.support.ati_separate_stencil = GL_CheckExtension("2.0", gl2separatestencilfuncs, "-noseparatestencil", true) || GL_CheckExtension("GL_ATI_separate_stencil", atiseparatestencilfuncs, "-noseparatestencil", false);
vid.support.ext_blend_minmax = GL_CheckExtension("GL_EXT_blend_minmax", blendequationfuncs, "-noblendminmax", false);
vid.support.ext_blend_subtract = GL_CheckExtension("GL_EXT_blend_subtract", blendequationfuncs, "-noblendsubtract", false);
- vid.support.ext_compiled_vertex_array = GL_CheckExtension("GL_EXT_compiled_vertex_array", compiledvertexarrayfuncs, "-nocva", false);
vid.support.ext_draw_range_elements = GL_CheckExtension("1.2", drawrangeelementsfuncs, "-nodrawrangeelements", true) || GL_CheckExtension("GL_EXT_draw_range_elements", drawrangeelementsextfuncs, "-nodrawrangeelements", false);
vid.support.ext_framebuffer_object = GL_CheckExtension("GL_EXT_framebuffer_object", fbofuncs, "-nofbo", false);
vid.support.ext_stencil_two_side = GL_CheckExtension("GL_EXT_stencil_two_side", stenciltwosidefuncs, "-nostenciltwoside", false);
vid.support.ext_texture_3d = GL_CheckExtension("GL_EXT_texture3D", texture3dextfuncs, "-notexture3d", false);
+ vid.support.ext_texture_compression_s3tc = GL_CheckExtension("GL_EXT_texture_compression_s3tc", NULL, "-nos3tc", 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);
// COMMANDLINEOPTION: GL: -noanisotropy disables GL_EXT_texture_filter_anisotropic (allows higher quality texturing)
// 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: -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: -nomtex disables GL_ARB_multitexture (required for faster map rendering)
// COMMANDLINEOPTION: GL: -noocclusionquery disables GL_ARB_occlusion_query (which allows coronas to fade according to visibility, and potentially used for rendering optimizations)
// COMMANDLINEOPTION: GL: -norectangle disables GL_ARB_texture_rectangle (required for bumpmapping)
+// COMMANDLINEOPTION: GL: -nos3tc disables GL_EXT_texture_compression_s3tc (which allows use of .dds texture caching)
// COMMANDLINEOPTION: GL: -noseparatestencil disables use of OpenGL2.0 glStencilOpSeparate and GL_ATI_separate_stencil extensions (which accelerate shadow rendering)
// COMMANDLINEOPTION: GL: -noshaderobjects disables GL_ARB_shader_objects (required for vertex shader and fragment shader)
// COMMANDLINEOPTION: GL: -noshadinglanguage100 disables GL_ARB_shading_language_100 (required for vertex shader and fragment shader)
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);
switch(vid.renderpath)
{
case RENDERPATH_GL20:
+ case RENDERPATH_CGGL:
if (v_glslgamma.integer)
wantgamma = 0;
break;
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)");