]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_shared.c
support for %s_%i.skin files on alias models (I.E. progs/test.mdl_0.skin), which...
[xonotic/darkplaces.git] / vid_shared.c
index 37f2444bf40decf590e869bbe2e795d028019f6e..76d3c75b2889ac147f080f91d4183ec075145570 100644 (file)
@@ -26,6 +26,12 @@ int gl_texturecubemap = false;
 int gl_dot3arb = false;
 // GL_SGIS_texture_edge_clamp
 int gl_support_clamptoedge = false;
+// GL_NV_vertex_array_range
+int gl_support_var = false;
+// GL_NV_vertex_array_range2
+int gl_support_var2 = false;
+// GL_EXT_texture_filter_anisotropic
+int gl_support_anisotropy = false;
 
 // LordHavoc: if window is hidden, don't update screen
 int vid_hidden = true;
@@ -90,7 +96,8 @@ const char *gl_platformextensions;
 char gl_driver[256];
 
 // GL_ARB_multitexture
-//void (GLAPIENTRY *qglMultiTexCoord2f) (GLenum, GLfloat, GLfloat);
+void (GLAPIENTRY *qglMultiTexCoord2f) (GLenum, GLfloat, GLfloat);
+void (GLAPIENTRY *qglMultiTexCoord3f) (GLenum, GLfloat, GLfloat, GLfloat);
 void (GLAPIENTRY *qglActiveTexture) (GLenum);
 void (GLAPIENTRY *qglClientActiveTexture) (GLenum);
 
@@ -98,6 +105,11 @@ void (GLAPIENTRY *qglClientActiveTexture) (GLenum);
 void (GLAPIENTRY *qglLockArraysEXT) (GLint first, GLint count);
 void (GLAPIENTRY *qglUnlockArraysEXT) (void);
 
+//GL_NV_vertex_array_range
+GLvoid *(GLAPIENTRY *qglAllocateMemoryNV)(GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority);
+GLvoid (GLAPIENTRY *qglFreeMemoryNV)(GLvoid *pointer);
+GLvoid (GLAPIENTRY *qglVertexArrayRangeNV)(GLsizei length, GLvoid *pointer);
+GLvoid (GLAPIENTRY *qglFlushVertexArrayRangeNV)(GLvoid);
 
 // general GL functions
 
@@ -113,7 +125,7 @@ void (GLAPIENTRY *qglCullFace)(GLenum mode);
 //void (GLAPIENTRY *qglReadBuffer)(GLenum mode);
 void (GLAPIENTRY *qglEnable)(GLenum cap);
 void (GLAPIENTRY *qglDisable)(GLenum cap);
-//GLboolean GLAPIENTRY *qglIsEnabled)(GLenum cap);
+GLboolean (GLAPIENTRY *qglIsEnabled)(GLenum cap);
 
 void (GLAPIENTRY *qglEnableClientState)(GLenum cap);
 void (GLAPIENTRY *qglDisableClientState)(GLenum cap);
@@ -131,23 +143,25 @@ void (GLAPIENTRY *qglFlush)(void);
 void (GLAPIENTRY *qglClearDepth)(GLclampd depth);
 void (GLAPIENTRY *qglDepthFunc)(GLenum func);
 void (GLAPIENTRY *qglDepthMask)(GLboolean flag);
-//void (GLAPIENTRY *qglDepthRange)(GLclampd near_val, GLclampd far_val);
+void (GLAPIENTRY *qglDepthRange)(GLclampd near_val, GLclampd far_val);
 void (GLAPIENTRY *qglColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
 
 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 *qglVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr);
-//void (GLAPIENTRY *qglNormalPointer)(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 *qglArrayElement)(GLint i);
 
 void (GLAPIENTRY *qglColor4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-//void (GLAPIENTRY *qglTexCoord2f)(GLfloat s, GLfloat t);
-//void (GLAPIENTRY *qglVertex2f)(GLfloat x, GLfloat y);
-//void (GLAPIENTRY *qglVertex3f)(GLfloat x, GLfloat y, GLfloat z);
-//void (GLAPIENTRY *qglBegin)(GLenum mode);
-//void (GLAPIENTRY *qglEnd)(void);
+void (GLAPIENTRY *qglTexCoord2f)(GLfloat s, GLfloat t);
+void (GLAPIENTRY *qglTexCoord2f)(GLfloat s, GLfloat t);
+void (GLAPIENTRY *qglTexCoord3f)(GLfloat s, GLfloat t, GLfloat r);
+void (GLAPIENTRY *qglVertex2f)(GLfloat x, GLfloat y);
+void (GLAPIENTRY *qglVertex3f)(GLfloat x, GLfloat y, GLfloat z);
+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);
@@ -176,7 +190,7 @@ void (GLAPIENTRY *qglClearStencil)(GLint s);
 
 //void (GLAPIENTRY *qglTexEnvf)(GLenum target, GLenum pname, GLfloat param);
 void (GLAPIENTRY *qglTexEnvi)(GLenum target, GLenum pname, GLint param);
-//void (GLAPIENTRY *qglTexParameterf)(GLenum target, GLenum pname, GLfloat 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);
 
@@ -216,14 +230,14 @@ int GL_CheckExtension(const char *name, const dllfunction_t *funcs, const char *
        int failed = false;
        const dllfunction_t *func;
 
-       Con_Printf("checking for %s...  ", name);
+       Con_DPrintf("checking for %s...  ", name);
 
        for (func = funcs;func && func->name;func++)
                *func->funcvariable = NULL;
 
        if (disableparm && COM_CheckParm(disableparm))
        {
-               Con_Printf("disabled by commandline\n");
+               Con_DPrintf("disabled by commandline\n");
                return false;
        }
 
@@ -235,19 +249,19 @@ int GL_CheckExtension(const char *name, const dllfunction_t *funcs, const char *
                        if (!(*func->funcvariable = (void *) GL_GetProcAddress(func->name)))
                        {
                                if (!silent)
-                                       Con_Printf("missing function \"%s\" - broken driver!\n", func->name);
+                                       Con_Printf("OpenGL extension \"%s\" is missing function \"%s\" - broken driver!\n", name, func->name);
                                failed = true;
                        }
                }
                // delay the return so it prints all missing functions
                if (failed)
                        return false;
-               Con_Printf("enabled\n");
+               Con_DPrintf("enabled\n");
                return true;
        }
        else
        {
-               Con_Printf("not detected\n");
+               Con_DPrintf("not detected\n");
                return false;
        }
 }
@@ -263,7 +277,7 @@ static dllfunction_t opengl110funcs[] =
 //     {"glReadBuffer", (void **) &qglReadBuffer},
        {"glEnable", (void **) &qglEnable},
        {"glDisable", (void **) &qglDisable},
-//     {"glIsEnabled", (void **) &qglIsEnabled},
+       {"glIsEnabled", (void **) &qglIsEnabled},
        {"glEnableClientState", (void **) &qglEnableClientState},
        {"glDisableClientState", (void **) &qglDisableClientState},
 //     {"glGetBooleanv", (void **) &qglGetBooleanv},
@@ -277,20 +291,21 @@ static dllfunction_t opengl110funcs[] =
        {"glClearDepth", (void **) &qglClearDepth},
        {"glDepthFunc", (void **) &qglDepthFunc},
        {"glDepthMask", (void **) &qglDepthMask},
-//     {"glDepthRange", (void **) &qglDepthRange},
+       {"glDepthRange", (void **) &qglDepthRange},
        {"glDrawElements", (void **) &qglDrawElements},
        {"glColorMask", (void **) &qglColorMask},
        {"glVertexPointer", (void **) &qglVertexPointer},
-//     {"glNormalPointer", (void **) &qglNormalPointer},
+       {"glNormalPointer", (void **) &qglNormalPointer},
        {"glColorPointer", (void **) &qglColorPointer},
        {"glTexCoordPointer", (void **) &qglTexCoordPointer},
-//     {"glArrayElement", (void **) &qglArrayElement},
+       {"glArrayElement", (void **) &qglArrayElement},
        {"glColor4f", (void **) &qglColor4f},
-//     {"glTexCoord2f", (void **) &qglTexCoord2f},
-//     {"glVertex2f", (void **) &qglVertex2f},
-//     {"glVertex3f", (void **) &qglVertex3f},
-//     {"glBegin", (void **) &qglBegin},
-//     {"glEnd", (void **) &qglEnd},
+       {"glTexCoord2f", (void **) &qglTexCoord2f},
+       {"glTexCoord3f", (void **) &qglTexCoord3f},
+       {"glVertex2f", (void **) &qglVertex2f},
+       {"glVertex3f", (void **) &qglVertex3f},
+       {"glBegin", (void **) &qglBegin},
+       {"glEnd", (void **) &qglEnd},
        {"glMatrixMode", (void **) &qglMatrixMode},
        {"glOrtho", (void **) &qglOrtho},
        {"glFrustum", (void **) &qglFrustum},
@@ -315,7 +330,7 @@ static dllfunction_t opengl110funcs[] =
        {"glClearStencil", (void **) &qglClearStencil},
 //     {"glTexEnvf", (void **) &qglTexEnvf},
        {"glTexEnvi", (void **) &qglTexEnvi},
-//     {"glTexParameterf", (void **) &qglTexParameterf},
+       {"glTexParameterf", (void **) &qglTexParameterf},
 //     {"glTexParameterfv", (void **) &qglTexParameterfv},
        {"glTexParameteri", (void **) &qglTexParameteri},
 //     {"glPixelStoref", (void **) &qglPixelStoref},
@@ -353,7 +368,8 @@ static dllfunction_t drawrangeelementsextfuncs[] =
 
 static dllfunction_t multitexturefuncs[] =
 {
-       //{"glMultiTexCoord2fARB", (void **) &qglMultiTexCoord2f},
+       {"glMultiTexCoord2fARB", (void **) &qglMultiTexCoord2f},
+       {"glMultiTexCoord3fARB", (void **) &qglMultiTexCoord3f},
        {"glActiveTextureARB", (void **) &qglActiveTexture},
        {"glClientActiveTextureARB", (void **) &qglClientActiveTexture},
        {NULL, NULL}
@@ -374,6 +390,25 @@ static dllfunction_t texture3dextfuncs[] =
        {NULL, NULL}
 };
 
+static dllfunction_t glxvarfuncs[] =
+{
+       {"glXAllocateMemoryNV", (void **) &qglAllocateMemoryNV},
+       {"glXFreeMemoryNV", (void **) &qglFreeMemoryNV},
+       {"glVertexArrayRangeNV", (void **) &qglVertexArrayRangeNV},
+       {"glFlushVertexArrayRangeNV", (void **) &qglFlushVertexArrayRangeNV},
+       {NULL, NULL}
+};
+
+static dllfunction_t wglvarfuncs[] =
+{
+       {"wglAllocateMemoryNV", (void **) &qglAllocateMemoryNV},
+       {"wglFreeMemoryNV", (void **) &qglFreeMemoryNV},
+       {"glVertexArrayRangeNV", (void **) &qglVertexArrayRangeNV},
+       {"glFlushVertexArrayRangeNV", (void **) &qglFlushVertexArrayRangeNV},
+       {NULL, NULL}
+};
+
+
 void VID_CheckExtensions(void)
 {
        gl_stencil = vid_stencil.integer;
@@ -382,17 +417,19 @@ void VID_CheckExtensions(void)
        gl_supportslockarrays = false;
        gl_textureunits = 1;
        gl_support_clamptoedge = false;
+       gl_support_var = false;
+       gl_support_var2 = false;
 
        if (!GL_CheckExtension("OpenGL 1.1.0", opengl110funcs, NULL, false))
                Sys_Error("OpenGL 1.1.0 functions not found\n");
 
-       Con_Printf ("GL_VENDOR: %s\n", gl_vendor);
-       Con_Printf ("GL_RENDERER: %s\n", gl_renderer);
-       Con_Printf ("GL_VERSION: %s\n", gl_version);
-       Con_Printf ("GL_EXTENSIONS: %s\n", gl_extensions);
-       Con_Printf ("%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_Printf("Checking OpenGL extensions...\n");
+       Con_DPrintf("Checking OpenGL extensions...\n");
 
        if (!GL_CheckExtension("glDrawRangeElements", drawrangeelementsfuncs, "-nodrawrangeelements", true))
                GL_CheckExtension("GL_EXT_draw_range_elements", drawrangeelementsextfuncs, "-nodrawrangeelements", false);
@@ -410,11 +447,52 @@ void VID_CheckExtensions(void)
        gl_supportslockarrays = GL_CheckExtension("GL_EXT_compiled_vertex_array", compiledvertexarrayfuncs, "-nocva", false);
        gl_support_clamptoedge = GL_CheckExtension("GL_EXT_texture_edge_clamp", NULL, "-noedgeclamp", false) || GL_CheckExtension("GL_SGIS_texture_edge_clamp", NULL, "-noedgeclamp", false);
 
+       if (!strcmp(gl_platform, "GLX"))
+               gl_support_var = GL_CheckExtension("GL_NV_vertex_array_range", glxvarfuncs, "-novar", false);
+       else if (!strcmp(gl_platform, "WGL"))
+               gl_support_var = GL_CheckExtension("GL_NV_vertex_array_range", wglvarfuncs, "-novar", 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);
+
        // 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;
 }
 
+int vid_vertexarrays_are_var = false;
+void *VID_AllocVertexArrays(mempool_t *pool, int size, int fast, float readfrequency, float writefrequency, float priority)
+{
+       void *m;
+       vid_vertexarrays_are_var = false;
+       if (fast && qglAllocateMemoryNV)
+       {
+               CHECKGLERROR
+               m = qglAllocateMemoryNV(size, readfrequency, writefrequency, priority);
+               CHECKGLERROR
+               if (m)
+               {
+                       vid_vertexarrays_are_var = true;
+                       return m;
+               }
+       }
+       return Mem_Alloc(pool, size);
+}
+
+void VID_FreeVertexArrays(void *pointer)
+{
+       if (vid_vertexarrays_are_var)
+       {
+               CHECKGLERROR
+               qglFreeMemoryNV(pointer);
+               CHECKGLERROR
+       }
+       else
+               Mem_Free(pointer);
+       vid_vertexarrays_are_var = false;
+}
+
 void Force_CenterView_f (void)
 {
        cl.viewangles[PITCH] = 0;
@@ -595,6 +673,8 @@ void VID_Shared_Init(void)
        Cvar_RegisterVariable(&m_filter);
        Cmd_AddCommand("force_centerview", Force_CenterView_f);
        Cmd_AddCommand("vid_restart", VID_Restart_f);
+       if (gamemode == GAME_GOODVSBAD2)
+               Cvar_Set("gl_combine", "0");
 }
 
 int current_vid_fullscreen;
@@ -693,7 +773,7 @@ void VID_Open(void)
                Cvar_SetValueQuick(&vid_stencil, 0);
        }
 
-       Con_Printf("Starting video system\n");
+       Con_DPrintf("Starting video system\n");
        if (!VID_Mode(vid_fullscreen.integer, vid_width.integer, vid_height.integer, vid_bitsperpixel.integer, vid_stencil.integer))
        {
                Con_Printf("Desired video mode fail, trying fallbacks...\n");
@@ -717,3 +797,4 @@ void VID_Close(void)
        VID_CloseSystems();
        VID_Shutdown();
 }
+