summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorMatthiasWM <visualc.git@matthiasm.com>2023-11-29 13:16:24 +0100
committerMatthiasWM <visualc.git@matthiasm.com>2023-11-29 13:16:24 +0100
commit75c879e2ff5022a4084b259c53a769d77ae13713 (patch)
tree1500f98170b8a54f8fd2c5d1f203b7f8e6313cf0 /src/drivers
parentf3348e81204a4758b0c7dc231607196b790128f1 (diff)
Implements swap_interval for MSWindows.
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.H2
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.cxx51
2 files changed, 53 insertions, 0 deletions
diff --git a/src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.H b/src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.H
index c925c6d0a..2958fe6e5 100644
--- a/src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.H
+++ b/src/drivers/WinAPI/Fl_WinAPI_Gl_Window_Driver.H
@@ -30,6 +30,8 @@ class Fl_WinAPI_Gl_Window_Driver : public Fl_Gl_Window_Driver {
int mode_(int m, const int *a) FL_OVERRIDE;
void make_current_after() FL_OVERRIDE;
void swap_buffers() FL_OVERRIDE;
+ void swap_interval(int) FL_OVERRIDE;
+ int swap_interval() const FL_OVERRIDE;
void invalidate() FL_OVERRIDE {}
int flush_begin(char& valid_f) FL_OVERRIDE;
Fl_Gl_Choice *find(int m, const int *alistp) FL_OVERRIDE;
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