diff options
| author | MatthiasWM <visualc.git@matthiasm.com> | 2023-11-29 13:16:24 +0100 |
|---|---|---|
| committer | MatthiasWM <visualc.git@matthiasm.com> | 2023-11-29 13:16:24 +0100 |
| commit | 75c879e2ff5022a4084b259c53a769d77ae13713 (patch) | |
| tree | 1500f98170b8a54f8fd2c5d1f203b7f8e6313cf0 /src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.cxx | |
| parent | f3348e81204a4758b0c7dc231607196b790128f1 (diff) | |
Implements swap_interval for MSWindows.
Diffstat (limited to 'src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.cxx')
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.cxx | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.cxx index 8d84ab15a..0c94f8af5 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.cxx +++ b/src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.cxx @@ -325,6 +325,57 @@ void Fl_WinAPI_Gl_Window_Driver::swap_buffers() { # endif } + +// Start of swap_interval implementation in the three possibel ways for X11 + +// -1 = not yet initialized, 0 = none found, 1 = GLX, 2 = MESA, 3 = SGI +static signed char swap_interval_type = -1; + +typedef const char *(WINAPI *WGL_Get_Extension_String_Proc)(); +typedef BOOL (WINAPI *WGL_Swap_Iterval_Proc)(int interval); +typedef int (WINAPI *WGL_Get_Swap_Iterval_Proc)(); + +static WGL_Swap_Iterval_Proc wglSwapIntervalEXT = NULL; +static WGL_Get_Swap_Iterval_Proc wglGetSwapIntervalEXT = NULL; + +static void init_swap_interval() { + if (swap_interval_type != -1) + return; + swap_interval_type = 0; + WGL_Get_Extension_String_Proc wglGetExtensionsStringEXT = NULL; + wglGetExtensionsStringEXT = (WGL_Get_Extension_String_Proc)wglGetProcAddress("wglGetExtensionsStringEXT"); + if (!wglGetExtensionsStringEXT) + return; + const char *extensions = wglGetExtensionsStringEXT(); + if (extensions && strstr(extensions, "WGL_EXT_swap_control")) { + wglSwapIntervalEXT = (WGL_Swap_Iterval_Proc)wglGetProcAddress("wglSwapIntervalEXT"); + wglGetSwapIntervalEXT = (WGL_Get_Swap_Iterval_Proc)wglGetProcAddress("wglGetSwapIntervalEXT"); + swap_interval_type = 1; + } +} + +void Fl_WinAPI_Gl_Window_Driver::swap_interval(int interval) { + if (swap_interval_type == -1) + init_swap_interval(); + if (swap_interval_type == 1) { + if (wglSwapIntervalEXT) + wglSwapIntervalEXT(interval); + } +} + +int Fl_WinAPI_Gl_Window_Driver::swap_interval() const { + if (swap_interval_type == -1) + init_swap_interval(); + int interval = -1; + if (swap_interval_type == 1) { + if (wglGetSwapIntervalEXT) + interval = wglGetSwapIntervalEXT(); + } + return interval; +} + +// end of swap_interval implementation + #if HAVE_GL_OVERLAY #endif |
