X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=vid_glx.c;h=aa86a167961ef98fc0174235a2c197459ce227a4;hp=7e670a13c3d2068c8529a0043c415784dc505e45;hb=17dc94051ad4df6553fc5e4694ca9b55d55cb612;hpb=3f93e1c3074a97c2f15292bf8ff43e9dc1f93e53 diff --git a/vid_glx.c b/vid_glx.c index 7e670a13..aa86a167 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; @@ -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,19 +546,55 @@ static void IN_ActivateMouse( void ) if (!mouse_active) { - mouse_x = mouse_y = 0; // don't spazz install_grabs(); mouse_active = true; } } +static void *prjobj = NULL; + +static void GL_CloseLibrary(void) +{ + if (prjobj) + dlclose(prjobj); + prjobj = NULL; + gl_driver[0] = 0; + qglXGetProcAddressARB = NULL; + gl_extensions = ""; + gl_platform = ""; + gl_platformextensions = ""; +} + +static int GL_OpenLibrary(const char *name) +{ + Con_Printf("Loading OpenGL driver %s\n", name); + GL_CloseLibrary(); + if (!(prjobj = dlopen(name, RTLD_LAZY))) + { + Con_Printf("Unable to open symbol list for %s\n", name); + return false; + } + strcpy(gl_driver, name); + return true; +} + +void *GL_GetProcAddress(const char *name) +{ + void *p = NULL; + if (qglXGetProcAddressARB != NULL) + p = (void *) qglXGetProcAddressARB(name); + if (p == NULL) + p = (void *) dlsym(prjobj, name); + return p; +} + void VID_Shutdown(void) { if (!ctx || !vidx11_display) return; vid_hidden = true; - usingmouse = false; + vid_usingmouse = false; if (vidx11_display) { VID_RestoreSystemGamma(); @@ -604,36 +652,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) { - if (r_speeds.integer || gl_finish.integer) - 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) @@ -653,6 +708,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; } @@ -690,6 +746,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]; @@ -844,10 +903,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(); @@ -868,48 +937,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; } - -static void *prjobj = NULL; - -int GL_OpenLibrary(const char *name) -{ - Con_Printf("Loading OpenGL driver %s\n", name); - GL_CloseLibrary(); - if (!(prjobj = dlopen(name, RTLD_LAZY))) - { - Con_Printf("Unable to open symbol list for %s\n", name); - return false; - } - strcpy(gl_driver, name); - return true; -} - -void GL_CloseLibrary(void) -{ - if (prjobj) - dlclose(prjobj); - prjobj = NULL; - gl_driver[0] = 0; - qglXGetProcAddressARB = NULL; - gl_extensions = ""; - gl_platform = ""; - gl_platformextensions = ""; -} - -void *GL_GetProcAddress(const char *name) -{ - void *p = NULL; - if (qglXGetProcAddressARB != NULL) - p = (void *) qglXGetProcAddressARB(name); - if (p == NULL) - p = (void *) dlsym(prjobj, name); - return p; -} -