X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=vid_glx.c;h=70336a9c216c1fa2b2c49e77f700b2bb56df114d;hb=d51166488e91ed9bdf1ef6b8ba62fbeb7cde1795;hp=293cd098660916f731adf6c46984acafc2720a99;hpb=f0759ed4221a432267e456d6862000cd55775504;p=xonotic%2Fdarkplaces.git diff --git a/vid_glx.c b/vid_glx.c index 293cd098..70336a9c 100644 --- a/vid_glx.c +++ b/vid_glx.c @@ -42,6 +42,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" +// Tell startup code that we have a client +int cl_available = true; + //GLX prototypes XVisualInfo *(GLAPIENTRY *qglXChooseVisual)(Display *dpy, int screen, int *attribList); GLXContext (GLAPIENTRY *qglXCreateContext)(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); @@ -59,14 +62,12 @@ static dllfunction_t getprocaddressfuncs[] = {NULL, NULL} }; -//GLX_SGI_video_sync -GLint (GLAPIENTRY *qglXGetVideoSyncSGI)(GLuint *count); -GLint (GLAPIENTRY *qglXWaitVideoSyncSGI)(GLint divisor, GLint remainder, GLuint *count); +//GLX_SGI_swap_control +GLint (GLAPIENTRY *qglXSwapIntervalSGI)(GLint interval); -static dllfunction_t videosyncfuncs[] = +static dllfunction_t swapcontrolfuncs[] = { - {"glXGetVideoSyncSGI", (void **) &qglXGetVideoSyncSGI}, - {"glXWaitVideoSyncSGI", (void **) &qglXWaitVideoSyncSGI}, + {"glXSwapIntervalSGI", (void **) &qglXSwapIntervalSGI}, {NULL, NULL} }; @@ -85,8 +86,13 @@ Atom wm_delete_window_atom; LeaveWindowMask) -static qboolean mouse_avail = true; -static qboolean mouse_active = false, usingmouse = false; +static qboolean mouse_avail = true; +static qboolean mouse_active = false; +static qboolean vid_usingmouse = false; +static qboolean vid_usemouse = false; +static qboolean vid_usingvsync = false; +static qboolean vid_usevsync = false; +static qboolean ignoremousemove = false; static float mouse_x, mouse_y; static int p_mouse_x, p_mouse_y; @@ -264,7 +270,7 @@ static void install_grabs(void) if (!XF86DGAQueryVersion(vidx11_display, &MajorVersion, &MinorVersion)) { // unable to query, probalby not supported - Con_Printf( "Failed to detect XF86DGA Mouse\n" ); + Con_Print( "Failed to detect XF86DGA Mouse\n" ); vid_dga.integer = 0; } else @@ -282,6 +288,7 @@ static void install_grabs(void) mouse_active = true; mouse_x = mouse_y = 0; + ignoremousemove = true; } static void uninstall_grabs(void) @@ -301,6 +308,7 @@ static void uninstall_grabs(void) XUndefineCursor(vidx11_display, win); mouse_active = false; + ignoremousemove = true; } static void HandleEvents(void) @@ -333,7 +341,7 @@ static void HandleEvents(void) case MotionNotify: // mouse moved - if (usingmouse) + if (vid_usingmouse) { #ifndef __APPLE__ if (vid_dga.integer == 1) @@ -510,6 +518,13 @@ static void HandleEvents(void) XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, p_mouse_x, p_mouse_y); } + // if told to ignore one mouse move, do so + if (ignoremousemove) + { + ignoremousemove = false; + mouse_x = 0; + mouse_y = 0; + } } static void IN_DeactivateMouse( void ) @@ -531,7 +546,6 @@ static void IN_ActivateMouse( void ) if (!mouse_active) { - mouse_x = mouse_y = 0; // don't spazz install_grabs(); mouse_active = true; } @@ -543,7 +557,7 @@ void VID_Shutdown(void) return; vid_hidden = true; - usingmouse = false; + vid_usingmouse = false; if (vidx11_display) { VID_RestoreSystemGamma(); @@ -601,35 +615,43 @@ void VID_GetWindowSize (int *x, int *y, int *width, int *height) void VID_Finish (void) { - int usemouse; - if (r_render.integer) + vid_usevsync = vid_vsync.integer && !cls.timedemo && gl_videosyncavailable; + if (vid_usingvsync != vid_usevsync && gl_videosyncavailable) { - qglFinish(); - qglXSwapBuffers(vidx11_display, win); + vid_usingvsync = vid_usevsync; + if (qglXSwapIntervalSGI (vid_usevsync)) + Con_Print("glXSwapIntervalSGI didn't accept the vid_vsync change, it will take effect on next vid_restart (GLX_SGI_swap_control does not allow turning off vsync)\n"); } // handle the mouse state when windowed if that's changed - usemouse = false; + vid_usemouse = false; if (vid_mouse.integer && !key_consoleactive) - usemouse = true; + vid_usemouse = true; if (vidmode_active) - usemouse = true; - if (usemouse) + vid_usemouse = true; + if (vid_usemouse) { - if (!usingmouse) + if (!vid_usingmouse) { - usingmouse = true; + vid_usingmouse = true; IN_ActivateMouse (); } } else { - if (usingmouse) + if (vid_usingmouse) { - usingmouse = false; + vid_usingmouse = false; IN_DeactivateMouse (); } } + + if (r_render.integer) + { + if (r_speeds.integer || gl_finish.integer) + qglFinish(); + qglXSwapBuffers(vidx11_display, win); + } } int VID_SetGamma(unsigned short *ramps) @@ -649,6 +671,7 @@ void VID_Init(void) Cvar_RegisterVariable (&vid_dga_mouseaccel); #endif InitSig(); // trap evil signals +// COMMANDLINEOPTION: Input: -nomouse disables mouse support (see also vid_mouse cvar) if (COM_CheckParm ("-nomouse") || COM_CheckParm("-safe")) mouse_avail = false; } @@ -684,8 +707,11 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp) #if defined(__APPLE__) && defined(__MACH__) drivername = "/usr/X11R6/lib/libGL.1.dylib"; #else - drivername = "libGL.so.1" + drivername = "libGL.so.1"; #endif +// COMMANDLINEOPTION: Linux GLX: -gl_driver selects a GL driver library, default is libGL.so.1, useful only for using fxmesa or similar, if you don't know what this is for, you don't need it +// COMMANDLINEOPTION: BSD GLX: -gl_driver selects a GL driver library, default is libGL.so.1, useful only for using fxmesa or similar, if you don't know what this is for, you don't need it +// LordHavoc: although this works on MacOSX, it's useless there (as there is only one system libGL) i = COM_CheckParm("-gl_driver"); if (i && i < com_argc - 1) drivername = com_argv[i + 1]; @@ -697,7 +723,7 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp) if (!(vidx11_display = XOpenDisplay(NULL))) { - Con_Printf("Couldn't open the X display\n"); + Con_Print("Couldn't open the X display\n"); return false; } @@ -728,7 +754,7 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp) visinfo = qglXChooseVisual(vidx11_display, vidx11_screen, attrib); if (!visinfo) { - Con_Printf("Couldn't get an RGB, Double-buffered, Depth visual\n"); + Con_Print("Couldn't get an RGB, Double-buffered, Depth visual\n"); return false; } @@ -840,10 +866,20 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp) gl_platform = "GLX"; gl_platformextensions = qglXQueryExtensionsString(vidx11_display, vidx11_screen); - GL_CheckExtension("GLX_ARB_get_proc_address", getprocaddressfuncs, "-nogetprocaddress", false); - gl_videosyncavailable = GL_CheckExtension("GLX_SGI_video_sync", videosyncfuncs, "-novideosync", false); + gl_videosyncavailable = false; - usingmouse = false; +// COMMANDLINEOPTION: Linux GLX: -nogetprocaddress disables GLX_ARB_get_proc_address (not required, more formal method of getting extension functions) +// COMMANDLINEOPTION: BSD GLX: -nogetprocaddress disables GLX_ARB_get_proc_address (not required, more formal method of getting extension functions) +// COMMANDLINEOPTION: MacOSX GLX: -nogetprocaddress disables GLX_ARB_get_proc_address (not required, more formal method of getting extension functions) + GL_CheckExtension("GLX_ARB_get_proc_address", getprocaddressfuncs, "-nogetprocaddress", false); +// COMMANDLINEOPTION: Linux GLX: -novideosync disables GLX_SGI_swap_control +// COMMANDLINEOPTION: BSD GLX: -novideosync disables GLX_SGI_swap_control +// COMMANDLINEOPTION: MacOSX GLX: -novideosync disables GLX_SGI_swap_control + gl_videosyncavailable = GL_CheckExtension("GLX_SGI_swap_control", swapcontrolfuncs, "-novideosync", false); + + vid_usingmouse = false; + vid_usingvsync = false; + ignoremousemove = true; vid_hidden = false; vid_activewindow = true; GL_Init(); @@ -864,10 +900,10 @@ void IN_Commands (void) { } -void IN_Move (usercmd_t *cmd) +void IN_Move (void) { if (mouse_avail) - IN_Mouse(cmd, mouse_x, mouse_y); + IN_Mouse(mouse_x, mouse_y); mouse_x = 0; mouse_y = 0; }