diff options
| author | Matthias Melcher <github@matthiasm.com> | 2023-11-26 21:44:00 +0100 |
|---|---|---|
| committer | Matthias Melcher <github@matthiasm.com> | 2023-11-26 21:44:00 +0100 |
| commit | f3348e81204a4758b0c7dc231607196b790128f1 (patch) | |
| tree | 221e00512d2e7fadbcb563849e02318fb1715743 /src/drivers/X11/Fl_X11_Gl_Window_Driver.cxx | |
| parent | 6817e821af9d69363466025f17ee367cfaa4550e (diff) | |
Adds GL swap control for X11
Diffstat (limited to 'src/drivers/X11/Fl_X11_Gl_Window_Driver.cxx')
| -rw-r--r-- | src/drivers/X11/Fl_X11_Gl_Window_Driver.cxx | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/src/drivers/X11/Fl_X11_Gl_Window_Driver.cxx b/src/drivers/X11/Fl_X11_Gl_Window_Driver.cxx index 3f09edae2..fd07308fa 100644 --- a/src/drivers/X11/Fl_X11_Gl_Window_Driver.cxx +++ b/src/drivers/X11/Fl_X11_Gl_Window_Driver.cxx @@ -393,14 +393,49 @@ void Fl_X11_Gl_Window_Driver::swap_buffers() { glXSwapBuffers(fl_display, fl_xid(pWindow)); } +char Fl_X11_Gl_Window_Driver::swap_type() { + return copy; +} -char Fl_X11_Gl_Window_Driver::swap_type() {return copy;} +typedef void (*SWAPINTERVALPROC) (Display *dpy, GLXDrawable drawable, int interval); +static SWAPINTERVALPROC glXSwapIntervalEXT = NULL; +static bool glXSwapIntervalChecked = false; +static void checkGlxXSwapInterval() { + if (!glXSwapIntervalChecked) { + glXSwapIntervalChecked = true; + glXSwapIntervalEXT = (SWAPINTERVALPROC)glXGetProcAddressARB((const GLubyte*)"glXSwapIntervalEXT"); + } +} + +void Fl_X11_Gl_Window_Driver::swap_interval(int interval) { + if (!fl_xid(pWindow)) + return; + if (!glXSwapIntervalChecked) checkGlxXSwapInterval(); + if (glXSwapIntervalEXT) { + glXSwapIntervalEXT(fl_display, fl_xid(pWindow), interval); + } +} + +int Fl_X11_Gl_Window_Driver::swap_interval() const { + if (!fl_xid(pWindow)) + return -1; + if (!glXSwapIntervalChecked) checkGlxXSwapInterval(); + if (!glXSwapIntervalEXT) return -1; + static bool ext_checked = false, ext_exists = false; + if (!ext_checked) { + ext_checked = true; + ext_exists = (strstr(glXQueryExtensionsString(fl_display, fl_screen), "GLX_EXT_swap_control") != NULL); + } + if (!ext_exists) return -1; + unsigned int interval = -1; + glXQueryDrawable(fl_display, fl_xid(pWindow), 0x20F1 /*GLX_SWAP_INTERVAL_EXT*/, &interval); + return interval; +} void Fl_X11_Gl_Window_Driver::waitGL() { glXWaitGL(); } - void Fl_X11_Gl_Window_Driver::gl_visual(Fl_Gl_Choice *c) { Fl_Gl_Window_Driver::gl_visual(c); fl_visual = ((Fl_X11_Gl_Choice*)c)->vis; |
