]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_shared.c
now uses hardware transforms
[xonotic/darkplaces.git] / vid_shared.c
index 98cdb8fbe044591d06435df796e2bda0a77211de..8ae15b81ea6741403bd724647a6a717cbef427f2 100644 (file)
@@ -12,8 +12,11 @@ int gl_combine_extension = false;
 // LordHavoc: GL_EXT_compiled_vertex_array support
 int gl_supportslockarrays = false;
 
-int gl_maxdrawrangeelementsvertices;
-int gl_maxdrawrangeelementsindices;
+// LordHavoc: if window is hidden, don't update screen
+int vid_hidden = false;
+// LordHavoc: if window is not the active window, don't hog as much CPU time,
+// let go of the mouse, turn off sound, and restore system gamma ramps...
+int vid_activewindow = true;
 
 cvar_t vid_mode = {0, "vid_mode", "0"};
 cvar_t vid_mouse = {CVAR_SAVE, "vid_mouse", "1"};
@@ -25,6 +28,11 @@ cvar_t in_pitch_max = {0, "in_pitch_max", "90"};
 
 cvar_t m_filter = {CVAR_SAVE, "m_filter","0"};
 
+const char *gl_vendor;
+const char *gl_renderer;
+const char *gl_version;
+const char *gl_extensions;
+
 // GL_ARB_multitexture
 void (GLAPIENTRY *qglMultiTexCoord2f) (GLenum, GLfloat, GLfloat);
 void (GLAPIENTRY *qglActiveTexture) (GLenum);
@@ -54,9 +62,9 @@ void (GLAPIENTRY *qglDisable)(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);
@@ -91,8 +99,8 @@ void (GLAPIENTRY *qglViewport)(GLint x, GLint y, GLsizei width, GLsizei height);
 //void (GLAPIENTRY *qglPushMatrix)(void);
 //void (GLAPIENTRY *qglPopMatrix)(void);
 void (GLAPIENTRY *qglLoadIdentity)(void);
-//void (GLAPIENTRY *qglLoadMatrixd)(const GLdouble *m);
-//void (GLAPIENTRY *qglLoadMatrixf)(const GLfloat *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);
@@ -192,9 +200,9 @@ static gl_extensionfunctionlist_t opengl110funcs[] =
 //     {"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},
@@ -223,8 +231,8 @@ static gl_extensionfunctionlist_t opengl110funcs[] =
 //     {"glPushMatrix", (void **) &qglPushMatrix},
 //     {"glPopMatrix", (void **) &qglPopMatrix},
        {"glLoadIdentity", (void **) &qglLoadIdentity},
-//     {"glLoadMatrixd", (void **) &qglLoadMatrixd},
-//     {"glLoadMatrixf", (void **) &qglLoadMatrixf},
+       {"glLoadMatrixd", (void **) &qglLoadMatrixd},
+       {"glLoadMatrixf", (void **) &qglLoadMatrixf},
 //     {"glMultMatrixd", (void **) &qglMultMatrixd},
 //     {"glMultMatrixf", (void **) &qglMultMatrixf},
 //     {"glRotated", (void **) &qglRotated},
@@ -286,27 +294,26 @@ static HINSTANCE gldll;
 static void *prjobj = NULL;
 #endif
 
-static void gl_getfuncs_begin(void)
+void GL_OpenLibrary(void)
 {
 #ifdef WIN32
-       gldll = LoadLibrary("opengl32.dll");
+       if (gldll)
+               FreeLibrary(gldll);
+       if (!(gldll = LoadLibrary("opengl32.dll")))
+               Sys_Error("Unable to LoadLibrary opengl32.dll\n");
 #else
        if (prjobj)
                dlclose(prjobj);
-
-       prjobj = dlopen(NULL, RTLD_LAZY);
-       if (prjobj == NULL)
-       {
-               Con_Printf("Unable to open symbol list for main program.\n");
-               return;
-       }
+       if (!(prjobj = dlopen("libGL.so.1", RTLD_LAZY)))
+               Sys_Error("Unable to open symbol list for libGL.so.1\n");
 #endif
 }
 
-static void gl_getfuncs_end(void)
+void GL_CloseLibrary(void)
 {
 #ifdef WIN32
        FreeLibrary(gldll);
+       gldll = 0;
 #else
        if (prjobj)
                dlclose(prjobj);
@@ -314,7 +321,7 @@ static void gl_getfuncs_end(void)
 #endif
 }
 
-static void *gl_getfuncaddress(char *name)
+void *GL_GetProcAddress(char *name)
 {
        void *p = NULL;
 #ifdef WIN32
@@ -349,7 +356,7 @@ static int gl_checkextension(char *name, gl_extensionfunctionlist_t *funcs, char
                for (func = funcs;func && func->name != NULL;func++)
                {
                        // functions are cleared before all the extensions are evaluated
-                       if (!(*func->funcvariable = (void *) gl_getfuncaddress(func->name)))
+                       if (!(*func->funcvariable = (void *) GL_GetProcAddress(func->name)))
                        {
                                if (!silent)
                                        Con_Printf("missing function \"%s\" - broken driver!\n", func->name);
@@ -371,9 +378,12 @@ static int gl_checkextension(char *name, gl_extensionfunctionlist_t *funcs, char
 
 void VID_CheckExtensions(void)
 {
-       Con_Printf("Checking OpenGL extensions...\n");
+       gl_vendor = NULL;
+       gl_renderer = NULL;
+       gl_version = NULL;
+       gl_extensions = NULL;
 
-       gl_getfuncs_begin();
+       Con_Printf("Opening OpenGL library to retrieve functions\n");
 
        gl_combine_extension = false;
        gl_supportslockarrays = false;
@@ -388,18 +398,20 @@ void VID_CheckExtensions(void)
        if (!gl_checkextension("OpenGL 1.1.0", opengl110funcs, NULL, false))
                Sys_Error("OpenGL 1.1.0 functions not found\n");
 
-       if (gl_checkextension("glDrawRangeElements", drawrangeelementsfuncs, "-nodrawrangeelements", true)
-        || gl_checkextension("GL_EXT_draw_range_elements", drawrangeelementsextfuncs, "-nodrawrangeelements", true))
-       {
-               qglGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &gl_maxdrawrangeelementsvertices);
-               qglGetIntegerv(GL_MAX_ELEMENTS_INDICES, &gl_maxdrawrangeelementsindices);
+       gl_vendor = qglGetString (GL_VENDOR);
+       gl_renderer = qglGetString (GL_RENDERER);
+       gl_version = qglGetString (GL_VERSION);
+       gl_extensions = qglGetString (GL_EXTENSIONS);
 
-               if (gl_maxdrawrangeelementsvertices < 1 || gl_maxdrawrangeelementsindices < 1)
-               {
-                       Con_Printf("invalid GL_MAX_ELEMENTS_VERTICES (%i) and/or GL_MAX_ELEMENTS_INDICES (%i)\n", gl_maxdrawrangeelementsvertices, gl_maxdrawrangeelementsindices);
-                       qglDrawRangeElements = qglDrawRangeElementsEXT = NULL;
-               }
-       }
+       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("Checking OpenGL extensions...\n");
+
+       if (!gl_checkextension("glDrawRangeElements", drawrangeelementsfuncs, "-nodrawrangeelements", true))
+               gl_checkextension("GL_EXT_draw_range_elements", drawrangeelementsextfuncs, "-nodrawrangeelements", false);
 
        if (gl_checkextension("GL_ARB_multitexture", multitexturefuncs, "-nomtex", false))
        {
@@ -415,8 +427,6 @@ void VID_CheckExtensions(void)
 
        gl_supportslockarrays = gl_checkextension("GL_EXT_compiled_vertex_array", compiledvertexarrayfuncs, "-nocva", false);
 
-       gl_getfuncs_end();
-
        // 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;
@@ -493,3 +503,4 @@ void VID_InitCvars(void)
        Cvar_RegisterVariable(&m_filter);
        Cmd_AddCommand("force_centerview", Force_CenterView_f);
 }
+