diff --git a/doomsday/sdk/libgui/CMakeLists.txt b/doomsday/sdk/libgui/CMakeLists.txt index 835a47e7c0..d5ef87918d 100644 --- a/doomsday/sdk/libgui/CMakeLists.txt +++ b/doomsday/sdk/libgui/CMakeLists.txt @@ -115,6 +115,7 @@ endif () if (APPLE) link_framework (libgui PRIVATE Cocoa) + link_framework (libgui PRIVATE OpenGL) endif () if (DENG_X11) diff --git a/doomsday/sdk/libgui/include/de/graphics/glinfo.h b/doomsday/sdk/libgui/include/de/graphics/glinfo.h index abfc282753..6a35cae32e 100644 --- a/doomsday/sdk/libgui/include/de/graphics/glinfo.h +++ b/doomsday/sdk/libgui/include/de/graphics/glinfo.h @@ -111,7 +111,10 @@ class LIBGUI_PUBLIC GLInfo static QOpenGLExtension_EXT_framebuffer_blit *EXT_framebuffer_blit(); static QOpenGLExtension_EXT_framebuffer_multisample *EXT_framebuffer_multisample(); static QOpenGLExtension_EXT_framebuffer_object *EXT_framebuffer_object(); - static QOpenGLExtension_NV_framebuffer_multisample_coverage *NV_framebuffer_multisample_coverage(); + static QOpenGLExtension_NV_framebuffer_multisample_coverage + *NV_framebuffer_multisample_coverage(); + + static void setSwapInterval(int interval); private: DENG2_PRIVATE(d) diff --git a/doomsday/sdk/libgui/src/graphics/glinfo.cpp b/doomsday/sdk/libgui/src/graphics/glinfo.cpp index d17e608d3c..0a00f50c6f 100644 --- a/doomsday/sdk/libgui/src/graphics/glinfo.cpp +++ b/doomsday/sdk/libgui/src/graphics/glinfo.cpp @@ -43,6 +43,10 @@ DENG2_PIMPL_NOREF(GLInfo), public QOpenGLFunctions_Doomsday std::unique_ptr EXT_framebuffer_object; std::unique_ptr NV_framebuffer_multisample_coverage; +#ifdef WIN32 + BOOL (APIENTRY *wglSwapIntervalEXT)(int interval) = nullptr; +#endif + Impl() { zap(ext); @@ -158,6 +162,12 @@ DENG2_PIMPL_NOREF(GLInfo), public QOpenGLFunctions_Doomsday #ifdef WIN32 ext.Windows_ARB_multisample = query("WGL_ARB_multisample"); ext.Windows_EXT_swap_control = query("WGL_EXT_swap_control"); + + if (ext.Windows_EXT_swap_control) + { + wglSwapIntervalEXT = de::function_cast + (QOpenGLContext::currentContext()->getProcAddress("wglSwapIntervalEXT")); + } #endif #ifdef DENG_X11 @@ -286,6 +296,36 @@ QOpenGLExtension_NV_framebuffer_multisample_coverage *GLInfo::NV_framebuffer_mul return info.d->NV_framebuffer_multisample_coverage.get(); } +void GLInfo::setSwapInterval(int interval) +{ + DENG2_ASSERT(info.d->inited); + +#if defined (WIN32) + if (extensions().Windows_EXT_swap_control) + { + info.d->wglSwapIntervalEXT(interval); + } +#endif + +#if defined (MACOSX) + { + CGLContextObj context = CGLGetCurrentContext(); + DENG2_ASSERT(context != nullptr); + if (context) + { + GLint params[1] = { interval }; + CGLSetParameter(context, kCGLCPSwapInterval, params); + } + } +#endif + +#if defined (Q_WS_X11) + { + //setXSwapInterval(on? 1 : 0); + } +#endif +} + GLInfo::Extensions const &GLInfo::extensions() { DENG2_ASSERT(info.d->inited);