X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=vid_shared.c;h=2788e3e01d385d1e46739c0da8320f29a397efef;hb=3dd1e6fd20b37f7f88418ef0593114a73312b0d3;hp=c091d824e02b678543bd7d22438a2965f8082c4a;hpb=5276075225f350c45e2a78a254cf1746e4c10948;p=xonotic%2Fdarkplaces.git diff --git a/vid_shared.c b/vid_shared.c index c091d824..2788e3e0 100644 --- a/vid_shared.c +++ b/vid_shared.c @@ -2,6 +2,19 @@ #include "quakedef.h" #include "cdaudio.h" +#ifdef SUPPORTCG +#include +#endif + +#ifdef SUPPORTD3D +#include +#ifdef _MSC_VER +#pragma comment(lib, "d3d9.lib") +#endif + +LPDIRECT3DDEVICE9 vid_d3d9dev; +#endif + // global video state viddef_t vid; @@ -56,6 +69,9 @@ cvar_t vid_minwidth = {0, "vid_minwidth", "0", "minimum vid_width that is accept 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" }; @@ -103,10 +119,6 @@ void (GLAPIENTRY *qglMultiTexCoord4f) (GLenum, GLfloat, GLfloat, GLfloat, GLfloa 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); @@ -144,12 +156,14 @@ void (GLAPIENTRY *qglColorMask)(GLboolean red, GLboolean green, GLboolean blue, void (GLAPIENTRY *qglDrawRangeElements)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); void (GLAPIENTRY *qglDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); +void (GLAPIENTRY *qglDrawArrays)(GLenum mode, GLint first, GLsizei count); void (GLAPIENTRY *qglVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); void (GLAPIENTRY *qglNormalPointer)(GLenum type, GLsizei stride, const GLvoid *ptr); void (GLAPIENTRY *qglColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); void (GLAPIENTRY *qglTexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); void (GLAPIENTRY *qglArrayElement)(GLint i); +void (GLAPIENTRY *qglColor4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); void (GLAPIENTRY *qglColor4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); void (GLAPIENTRY *qglTexCoord1f)(GLfloat s); void (GLAPIENTRY *qglTexCoord2f)(GLfloat s, GLfloat t); @@ -157,26 +171,27 @@ void (GLAPIENTRY *qglTexCoord3f)(GLfloat s, GLfloat t, GLfloat r); void (GLAPIENTRY *qglTexCoord4f)(GLfloat s, GLfloat t, GLfloat r, GLfloat q); void (GLAPIENTRY *qglVertex2f)(GLfloat x, GLfloat y); void (GLAPIENTRY *qglVertex3f)(GLfloat x, GLfloat y, GLfloat z); +void (GLAPIENTRY *qglVertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); void (GLAPIENTRY *qglBegin)(GLenum mode); 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); @@ -191,6 +206,11 @@ 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 *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); @@ -198,8 +218,8 @@ void (GLAPIENTRY *qglDeleteTextures)(GLsizei n, const 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); @@ -226,8 +246,8 @@ void (GLAPIENTRY *qglPolygonOffset)(GLfloat factor, GLfloat units); 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); @@ -355,6 +375,8 @@ void (GLAPIENTRY *qglFramebufferRenderbufferEXT)(GLenum target, GLenum attachmen void (GLAPIENTRY *qglGetFramebufferAttachmentParameterivEXT)(GLenum target, GLenum attachment, GLenum pname, GLint *params); void (GLAPIENTRY *qglGenerateMipmapEXT)(GLenum target); +void (GLAPIENTRY *qglDrawBuffersARB)(GLsizei n, const GLenum *bufs); + void (GLAPIENTRY *qglCompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); void (GLAPIENTRY *qglCompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); //void (GLAPIENTRY *qglCompressedTexImage1DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); @@ -376,7 +398,7 @@ void (GLAPIENTRY *qglGetQueryObjectuivARB)(GLuint qid, GLenum pname, GLuint *par #define sscanf sscanf_s #endif -int GL_CheckExtension(const char *minglver_or_ext, const dllfunction_t *funcs, const char *disableparm, int silent) +qboolean GL_CheckExtension(const char *minglver_or_ext, const dllfunction_t *funcs, const char *disableparm, int silent) { int failed = false; const dllfunction_t *func; @@ -416,7 +438,8 @@ int GL_CheckExtension(const char *minglver_or_ext, const dllfunction_t *funcs, c 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)) { @@ -432,13 +455,10 @@ int GL_CheckExtension(const char *minglver_or_ext, const dllfunction_t *funcs, c // 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; } } @@ -480,12 +500,14 @@ static dllfunction_t opengl110funcs[] = {"glDepthMask", (void **) &qglDepthMask}, {"glDepthRange", (void **) &qglDepthRange}, {"glDrawElements", (void **) &qglDrawElements}, + {"glDrawArrays", (void **) &qglDrawArrays}, {"glColorMask", (void **) &qglColorMask}, {"glVertexPointer", (void **) &qglVertexPointer}, {"glNormalPointer", (void **) &qglNormalPointer}, {"glColorPointer", (void **) &qglColorPointer}, {"glTexCoordPointer", (void **) &qglTexCoordPointer}, {"glArrayElement", (void **) &qglArrayElement}, + {"glColor4ub", (void **) &qglColor4ub}, {"glColor4f", (void **) &qglColor4f}, {"glTexCoord1f", (void **) &qglTexCoord1f}, {"glTexCoord2f", (void **) &qglTexCoord2f}, @@ -493,6 +515,7 @@ static dllfunction_t opengl110funcs[] = {"glTexCoord4f", (void **) &qglTexCoord4f}, {"glVertex2f", (void **) &qglVertex2f}, {"glVertex3f", (void **) &qglVertex3f}, + {"glVertex4f", (void **) &qglVertex4f}, {"glBegin", (void **) &qglBegin}, {"glEnd", (void **) &qglEnd}, //[515]: added on 29.07.2005 @@ -500,22 +523,22 @@ static dllfunction_t opengl110funcs[] = {"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}, @@ -527,15 +550,20 @@ static dllfunction_t opengl110funcs[] = {"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}, @@ -548,8 +576,8 @@ static dllfunction_t opengl110funcs[] = {"glPolygonOffset", (void **) &qglPolygonOffset}, {"glPolygonMode", (void **) &qglPolygonMode}, {"glPolygonStipple", (void **) &qglPolygonStipple}, - {"glClipPlane", (void **) &qglClipPlane}, - {"glGetClipPlane", (void **) &qglGetClipPlane}, +// {"glClipPlane", (void **) &qglClipPlane}, +// {"glGetClipPlane", (void **) &qglGetClipPlane}, {NULL, NULL} }; @@ -576,13 +604,6 @@ static dllfunction_t multitexturefuncs[] = {NULL, NULL} }; -static dllfunction_t compiledvertexarrayfuncs[] = -{ - {"glLockArraysEXT", (void **) &qglLockArraysEXT}, - {"glUnlockArraysEXT", (void **) &qglUnlockArraysEXT}, - {NULL, NULL} -}; - static dllfunction_t texture3dextfuncs[] = { {"glTexImage3DEXT", (void **) &qglTexImage3D}, @@ -772,13 +793,43 @@ static dllfunction_t occlusionqueryfuncs[] = {NULL, NULL} }; -void VID_CheckExtensions(void) +static dllfunction_t drawbuffersfuncs[] = { - // clear the extension flags - memset(&vid.support, 0, sizeof(vid.support)); + {"glDrawBuffersARB", (void **) &qglDrawBuffersARB}, + {NULL, NULL} +}; +void VID_ClearExtensions(void) +{ // VorteX: reset extensions info cvar, it got filled by GL_CheckExtension Cvar_SetQuick(&gl_info_extensions, ""); + + // clear the extension flags + memset(&vid.support, 0, sizeof(vid.support)); + vid.renderpath = RENDERPATH_GL11; + vid.forcevbo = false; + vid.maxtexturesize_2d = 0; + vid.maxtexturesize_3d = 0; + vid.maxtexturesize_cubemap = 0; + vid.texunits = 1; + vid.teximageunits = 1; + vid.texarrayunits = 1; + vid.max_anisotropy = 1; + vid.maxdrawbuffers = 1; + + // this is a complete list of all functions that are directly checked in the renderer + qglDrawRangeElements = NULL; + qglDrawBuffer = NULL; + qglPolygonStipple = NULL; + qglFlush = NULL; + qglActiveTexture = NULL; + qglGetCompressedTexImageARB = NULL; + qglFramebufferTexture2DEXT = NULL; + qglDrawBuffersARB = NULL; +} + +void VID_CheckExtensions(void) +{ if (!GL_CheckExtension("1.1", opengl110funcs, NULL, false)) Sys_Error("OpenGL 1.1.0 functions not found"); @@ -788,6 +839,7 @@ void VID_CheckExtensions(void) vid.support.amd_texture_texture4 = GL_CheckExtension("GL_AMD_texture_texture4", NULL, "-notexture4", false); vid.support.arb_depth_texture = GL_CheckExtension("GL_ARB_depth_texture", NULL, "-nodepthtexture", false); + vid.support.arb_draw_buffers = GL_CheckExtension("GL_ARB_draw_buffers", drawbuffersfuncs, "-nodrawbuffers", false); vid.support.arb_fragment_shader = GL_CheckExtension("GL_ARB_fragment_shader", NULL, "-nofragmentshader", false); vid.support.arb_multitexture = GL_CheckExtension("GL_ARB_multitexture", multitexturefuncs, "-nomtex", false); vid.support.arb_occlusion_query = GL_CheckExtension("GL_ARB_occlusion_query", occlusionqueryfuncs, "-noocclusionquery", false); @@ -799,36 +851,32 @@ void VID_CheckExtensions(void) vid.support.arb_texture_env_combine = GL_CheckExtension("GL_ARB_texture_env_combine", NULL, "-nocombine", false) || GL_CheckExtension("GL_EXT_texture_env_combine", NULL, "-nocombine", false); vid.support.arb_texture_gather = GL_CheckExtension("GL_ARB_texture_gather", NULL, "-notexturegather", false); vid.support.arb_texture_non_power_of_two = GL_CheckExtension("GL_ARB_texture_non_power_of_two", NULL, "-notexturenonpoweroftwo", false); - vid.support.arb_texture_rectangle = GL_CheckExtension("GL_ARB_texture_rectangle", NULL, "-norectangle", false); vid.support.arb_vertex_buffer_object = GL_CheckExtension("GL_ARB_vertex_buffer_object", vbofuncs, "-novbo", false); vid.support.arb_vertex_shader = GL_CheckExtension("GL_ARB_vertex_shader", vertexshaderfuncs, "-novertexshader", false); 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); - vid.support.nv_blend_square = GL_CheckExtension("GL_NV_blend_square", NULL, "-noblendsquare", false); // COMMANDLINEOPTION: GL: -noanisotropy disables GL_EXT_texture_filter_anisotropic (allows higher quality texturing) // COMMANDLINEOPTION: GL: -noblendminmax disables GL_EXT_blend_minmax -// COMMANDLINEOPTION: GL: -noblendsquare disables GL_NV_blend_square // 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: -nodot3 disables use of GL_ARB_texture_env_dot3 +// 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: -noedgeclamp disables GL_EXT_texture_edge_clamp or GL_SGIS_texture_edge_clamp (recommended, some cards do not support the other texture clamp method) // COMMANDLINEOPTION: GL: -nofbo disables GL_EXT_framebuffer_object (which accelerates rendering), only used if GL_ARB_fragment_shader is also available // COMMANDLINEOPTION: GL: -nofragmentshader disables GL_ARB_fragment_shader (allows pixel shader effects, can improve per pixel lighting performance and capabilities) // 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) @@ -842,13 +890,8 @@ void VID_CheckExtensions(void) // COMMANDLINEOPTION: GL: -novbo disables GL_ARB_vertex_buffer_object (which accelerates rendering) // COMMANDLINEOPTION: GL: -novertexshader disables GL_ARB_vertex_shader (allows vertex shader effects) - vid.maxtexturesize_2d = 0; - vid.maxtexturesize_3d = 0; - vid.maxtexturesize_cubemap = 0; - vid.texunits = 1; - vid.teximageunits = 1; - vid.texarrayunits = 1; - vid.max_anisotropy = 1; + if (vid.support.arb_draw_buffers) + qglGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, (GLint*)&vid.maxdrawbuffers); // disable non-power-of-two textures on Radeon X1600 and other cards that do not accelerate it with some filtering modes / repeat modes that we use // we detect these cards by checking if the hardware supports vertex texture fetch (Geforce6 does, Radeon X1600 does not, all GL3-class hardware does) @@ -870,8 +913,6 @@ void VID_CheckExtensions(void) qglGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, (GLint*)&vid.max_anisotropy); if (vid.support.arb_texture_cube_map) qglGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, (GLint*)&vid.maxtexturesize_cubemap); - if (vid.support.arb_texture_rectangle) - qglGetIntegerv(GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB, (GLint*)&vid.maxtexturesize_rectangle); if (vid.support.ext_texture_3d) qglGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, (GLint*)&vid.maxtexturesize_3d); @@ -896,6 +937,16 @@ void VID_CheckExtensions(void) 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); @@ -1003,6 +1054,10 @@ void VID_UpdateGamma(qboolean force, int rampsize) switch(vid.renderpath) { case RENDERPATH_GL20: + case RENDERPATH_CGGL: + case RENDERPATH_D3D9: + case RENDERPATH_D3D10: + case RENDERPATH_D3D11: if (v_glslgamma.integer) wantgamma = 0; break; @@ -1182,6 +1237,9 @@ void VID_Shared_Init(void) 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)"); @@ -1191,15 +1249,16 @@ int VID_Mode(int fullscreen, int width, int height, int bpp, float refreshrate, { viddef_mode_t mode; memset(&mode, 0, sizeof(mode)); - mode.fullscreen = fullscreen; + mode.fullscreen = fullscreen != 0; mode.width = width; mode.height = height; mode.bitsperpixel = bpp; mode.refreshrate = vid_userefreshrate.integer ? max(1, refreshrate) : 0; - mode.userefreshrate = vid_userefreshrate.integer; - mode.stereobuffer = stereobuffer; + mode.userefreshrate = vid_userefreshrate.integer != 0; + mode.stereobuffer = stereobuffer != 0; mode.samples = samples; cl_ignoremousemoves = 2; + VID_ClearExtensions(); if (VID_InitMode(&mode)) { // accept the (possibly modified) mode