diff --git a/readme.html b/readme.html index 1290fefd..0e001b17 100644 --- a/readme.html +++ b/readme.html @@ -295,6 +295,7 @@ version of GLFW.

  • Removed GLFWCALL and GLFWAPIENTRY macros for stdcall calling convention
  • Bugfix: The default OpenGL version in the version test was set to 1.1
  • Bugfix: The OpenGL profile and forward-compatibility window parameters were not saved after context creation
  • +
  • [X11] Added support for the GLX_EXT_swap_control extension as an alternative to GLX_SGI_swap_control
  • [X11] Bugfix: Calling glXCreateContextAttribsARB with an unavailable OpenGL version caused the application to terminate with a BadMatch Xlib error
  • [Win32] Removed explicit support for versions of Windows older than Windows XP
  • [Win32] Bugfix: Window activation and iconification did not work as expected
  • diff --git a/src/x11/platform.h b/src/x11/platform.h index 57b10447..05bc2544 100644 --- a/src/x11/platform.h +++ b/src/x11/platform.h @@ -100,6 +100,7 @@ typedef struct _GLFWcontextGLX // GLX extensions PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI; + PFNGLXSWAPINTERVALEXTPROC SwapIntervalEXT; PFNGLXGETFBCONFIGATTRIBSGIXPROC GetFBConfigAttribSGIX; PFNGLXCHOOSEFBCONFIGSGIXPROC ChooseFBConfigSGIX; PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC CreateContextWithConfigSGIX; @@ -107,6 +108,7 @@ typedef struct _GLFWcontextGLX PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; GLboolean has_GLX_SGIX_fbconfig; GLboolean has_GLX_SGI_swap_control; + GLboolean has_GLX_EXT_swap_control; GLboolean has_GLX_ARB_multisample; GLboolean has_GLX_ARB_create_context; GLboolean has_GLX_ARB_create_context_profile; diff --git a/src/x11/x11_window.c b/src/x11/x11_window.c index e716129d..8ae0b256 100644 --- a/src/x11/x11_window.c +++ b/src/x11/x11_window.c @@ -667,13 +667,25 @@ static int createContext(_GLFWwindow* window, static void initGLXExtensions(_GLFWwindow* window) { - if (_glfwPlatformExtensionSupported("GLX_SGI_swap_control")) + if (_glfwPlatformExtensionSupported("GLX_EXT_swap_control")) { - window->GLX.SwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC) - _glfwPlatformGetProcAddress("glXSwapIntervalSGI"); + window->GLX.SwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC) + _glfwPlatformGetProcAddress("glXSwapIntervalEXT"); - if (window->GLX.SwapIntervalSGI) - window->GLX.has_GLX_SGI_swap_control = GL_TRUE; + if (window->GLX.SwapIntervalEXT) + window->GLX.has_GLX_EXT_swap_control = GL_TRUE; + } + + if (!window->GLX.has_GLX_EXT_swap_control) + { + if (_glfwPlatformExtensionSupported("GLX_SGI_swap_control")) + { + window->GLX.SwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC) + _glfwPlatformGetProcAddress("glXSwapIntervalSGI"); + + if (window->GLX.SwapIntervalSGI) + window->GLX.has_GLX_SGI_swap_control = GL_TRUE; + } } if (_glfwPlatformExtensionSupported("GLX_SGIX_fbconfig")) @@ -1684,7 +1696,13 @@ void _glfwPlatformSwapInterval(int interval) { _GLFWwindow* window = _glfwLibrary.currentWindow; - if (window->GLX.has_GLX_SGI_swap_control) + if (window->GLX.has_GLX_EXT_swap_control) + { + window->GLX.SwapIntervalEXT(_glfwLibrary.X11.display, + window->X11.handle, + interval); + } + else if (window->GLX.has_GLX_SGI_swap_control) window->GLX.SwapIntervalSGI(interval); }