]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_glx.c
this should fix some Solaris/NetBSD/OpenBSD compile problems, model_t still remaining
[xonotic/darkplaces.git] / vid_glx.c
index 35f70de073d66a4efc16088e684a05ba0968612c..e10cccfeb7929498c6e8d2529883b83128ee1cd1 100644 (file)
--- a/vid_glx.c
+++ b/vid_glx.c
@@ -25,6 +25,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include <X11/Xutil.h>
 #include <GL/glx.h>
 
+#include "quakedef.h"
+
 #include <X11/keysym.h>
 #include <X11/cursorfont.h>
 #include <X11/xpm.h>
@@ -35,8 +37,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #endif
 #include <X11/extensions/xf86vmode.h>
 
-#include "quakedef.h"
-
 #include "nexuiz.xpm"
 #include "darkplaces.xpm"
 
@@ -99,6 +99,7 @@ static int p_mouse_x, p_mouse_y;
 
 #if !defined(__APPLE__) && !defined(SUNOS)
 cvar_t vid_dgamouse = {CVAR_SAVE, "vid_dgamouse", "1", "make use of DGA mouse input"};
+static qboolean vid_usingdgamouse = false;
 #endif
 
 qboolean vidmode_ext = false;
@@ -254,6 +255,10 @@ static void IN_Activate (qboolean grab)
                return;
        if (grab)
        {
+#if !defined(__APPLE__) && !defined(SUNOS)
+               if(vid_usingmouse && (vid_usingdgamouse != !!vid_dgamouse.integer))
+                       IN_Activate(false); // ungrab first!
+#endif
                if (!vid_usingmouse && mouse_avail && win)
                {
                        XWindowAttributes attribs_1;
@@ -282,8 +287,11 @@ static void IN_Activate (qboolean grab)
                                XGrabKeyboard(vidx11_display, win, False, GrabModeAsync, GrabModeAsync, CurrentTime);
 
                        mouse_x = mouse_y = 0;
-                       cl_ignoremousemove = true;
+                       cl_ignoremousemoves = 2;
                        vid_usingmouse = true;
+#if !defined(__APPLE__) && !defined(SUNOS)
+                       vid_usingdgamouse = !!vid_dgamouse.integer;
+#endif
                }
        }
        else
@@ -302,7 +310,7 @@ static void IN_Activate (qboolean grab)
                        if (win)
                                XUndefineCursor(vidx11_display, win);
 
-                       cl_ignoremousemove = true;
+                       cl_ignoremousemoves = 2;
                        vid_usingmouse = false;
                }
        }
@@ -413,6 +421,11 @@ static void HandleEvents(void)
                        // window changed size/location
                        win_x = event.xconfigure.x;
                        win_y = event.xconfigure.y;
+                       if(vid_resizable.integer < 2)
+                       {
+                               vid.width = event.xconfigure.width;
+                               vid.height = event.xconfigure.height;
+                       }
                        break;
                case DestroyNotify:
                        // window has been destroyed
@@ -602,32 +615,40 @@ void VID_Init(void)
                mouse_avail = false;
 }
 
-void VID_BuildGLXAttrib(int *attrib, qboolean stencil, qboolean stereobuffer)
+void VID_BuildGLXAttrib(int *attrib, qboolean stencil, qboolean stereobuffer, int samples)
 {
        *attrib++ = GLX_RGBA;
-       *attrib++ = GLX_RED_SIZE;*attrib++ = 1;
-       *attrib++ = GLX_GREEN_SIZE;*attrib++ = 1;
-       *attrib++ = GLX_BLUE_SIZE;*attrib++ = 1;
+       *attrib++ = GLX_RED_SIZE;*attrib++ = stencil ? 8 : 5;
+       *attrib++ = GLX_GREEN_SIZE;*attrib++ = stencil ? 8 : 5;
+       *attrib++ = GLX_BLUE_SIZE;*attrib++ = stencil ? 8 : 5;
        *attrib++ = GLX_DOUBLEBUFFER;
-       *attrib++ = GLX_DEPTH_SIZE;*attrib++ = 1;
+       *attrib++ = GLX_DEPTH_SIZE;*attrib++ = stencil ? 24 : 16;
        // if stencil is enabled, ask for alpha too
        if (stencil)
        {
                *attrib++ = GLX_STENCIL_SIZE;*attrib++ = 8;
-               *attrib++ = GLX_ALPHA_SIZE;*attrib++ = 1;
+               *attrib++ = GLX_ALPHA_SIZE;*attrib++ = 8;
        }
        if (stereobuffer)
                *attrib++ = GLX_STEREO;
+       if (samples > 1)
+       {
+               *attrib++ = GLX_SAMPLE_BUFFERS_ARB;
+               *attrib++ = 1;
+               *attrib++ = GLX_SAMPLES_ARB;
+               *attrib++ = samples;
+       }
        *attrib++ = None;
 }
 
-int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate, int stereobuffer)
+int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate, int stereobuffer, int samples)
 {
        int i;
        int attrib[32];
        XSetWindowAttributes attr;
        XClassHint *clshints;
-       XWMHints wmhints;
+       XWMHints *wmhints;
+       XSizeHints *szhints;
        unsigned long mask;
        Window root;
        XVisualInfo *visinfo;
@@ -681,8 +702,15 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate
                return false;
        }
 
-       VID_BuildGLXAttrib(attrib, bpp == 32, stereobuffer);
+       VID_BuildGLXAttrib(attrib, bpp == 32, stereobuffer, samples);
        visinfo = qglXChooseVisual(vidx11_display, vidx11_screen, attrib);
+       if (!visinfo && (samples == 1))
+       {
+                /* Some Mesa drivers reject sample buffers with 1 sample, so try
+                 * entirely without one */
+               VID_BuildGLXAttrib(attrib, bpp == 32, stereobuffer, 0);
+               visinfo = qglXChooseVisual(vidx11_display, vidx11_screen, attrib);
+       }
        if (!visinfo)
        {
                Con_Print("Couldn't get an RGB, Double-buffered, Depth visual\n");
@@ -766,17 +794,28 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate
 
        win = XCreateWindow(vidx11_display, root, 0, 0, width, height, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &attr);
 
-       wmhints.flags = 0;
+       wmhints = XAllocWMHints();
        if(XpmCreatePixmapFromData(vidx11_display, win,
                (gamemode == GAME_NEXUIZ) ? nexuiz_xpm : darkplaces_xpm,
-               &wmhints.icon_pixmap, &wmhints.icon_mask, NULL) == XpmSuccess)
-               wmhints.flags |= IconPixmapHint | IconMaskHint;
+               &wmhints->icon_pixmap, &wmhints->icon_mask, NULL) == XpmSuccess)
+               wmhints->flags |= IconPixmapHint | IconMaskHint;
 
        clshints = XAllocClassHint();
        clshints->res_name = strdup(gamename);
        clshints->res_class = strdup("DarkPlaces");
 
-       XmbSetWMProperties(vidx11_display, win, gamename, gamename, (char **) com_argv, com_argc, NULL, &wmhints, clshints);
+       szhints = XAllocSizeHints();
+       if(vid_resizable.integer == 0)
+       {
+               szhints->min_width = szhints->max_width = width;
+               szhints->min_height = szhints->max_height = height;
+               szhints->flags |= PMinSize | PMaxSize;
+       }
+
+       XmbSetWMProperties(vidx11_display, win, gamename, gamename, (char **) com_argv, com_argc, szhints, wmhints, clshints);
+       XFree(clshints);
+       XFree(wmhints);
+       XFree(szhints);
        //XStoreName(vidx11_display, win, gamename);
        XMapWindow(vidx11_display, win);
 
@@ -825,6 +864,17 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate
        gl_platform = "GLX";
        gl_platformextensions = qglXQueryExtensionsString(vidx11_display, vidx11_screen);
 
+       if (!gl_extensions)
+               gl_extensions = "";
+       if (!gl_platformextensions)
+               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);
+
        gl_videosyncavailable = false;
 
 // COMMANDLINEOPTION: Linux GLX: -nogetprocaddress disables GLX_ARB_get_proc_address (not required, more formal method of getting extension functions)