X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=vid_glx.c;h=4df6fb707ab1a0bf7afcf2181f9e1f2804ddcf9c;hb=72125a0f1092db1722c65be750fac8db7c303d4b;hp=6aeb59220f00dc40967e4142c61536c95383e05a;hpb=ae7c70225c6ac23300f7620394de4fab13485663;p=xonotic%2Fdarkplaces.git diff --git a/vid_glx.c b/vid_glx.c index 6aeb5922..4df6fb70 100644 --- a/vid_glx.c +++ b/vid_glx.c @@ -62,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} }; @@ -88,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; @@ -267,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 @@ -285,6 +288,7 @@ static void install_grabs(void) mouse_active = true; mouse_x = mouse_y = 0; + ignoremousemove = true; } static void uninstall_grabs(void) @@ -304,6 +308,7 @@ static void uninstall_grabs(void) XUndefineCursor(vidx11_display, win); mouse_active = false; + ignoremousemove = true; } static void HandleEvents(void) @@ -336,7 +341,7 @@ static void HandleEvents(void) case MotionNotify: // mouse moved - if (usingmouse) + if (vid_usingmouse) { #ifndef __APPLE__ if (vid_dga.integer == 1) @@ -513,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 ) @@ -534,7 +546,6 @@ static void IN_ActivateMouse( void ) if (!mouse_active) { - mouse_x = mouse_y = 0; // don't spazz install_grabs(); mouse_active = true; } @@ -546,7 +557,7 @@ void VID_Shutdown(void) return; vid_hidden = true; - usingmouse = false; + vid_usingmouse = false; if (vidx11_display) { VID_RestoreSystemGamma(); @@ -604,35 +615,42 @@ 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; + qglXSwapIntervalSGI (vid_usevsync); } // 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) @@ -652,6 +670,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; } @@ -689,6 +708,9 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp) #else 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]; @@ -700,7 +722,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; } @@ -731,7 +753,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; } @@ -843,10 +865,19 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp) gl_platform = "GLX"; gl_platformextensions = qglXQueryExtensionsString(vidx11_display, vidx11_screen); + gl_videosyncavailable = 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); - gl_videosyncavailable = GL_CheckExtension("GLX_SGI_video_sync", videosyncfuncs, "-novideosync", 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); - usingmouse = false; + vid_usingmouse = false; + ignoremousemove = true; vid_hidden = false; vid_activewindow = true; GL_Init(); @@ -867,10 +898,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; }