From 73eb98ed8e85e2c3fdeca440e7aed50117bac8f8 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 24 Jan 2013 10:31:08 -0600 Subject: [PATCH] Move swap control to the host specific GLInterface files. --- Source/Core/DolphinWX/Src/GLInterface/EGL.cpp | 6 ++++++ Source/Core/DolphinWX/Src/GLInterface/EGL.h | 1 + Source/Core/DolphinWX/Src/GLInterface/GLX.cpp | 9 +++++++++ Source/Core/DolphinWX/Src/GLInterface/GLX.h | 1 + .../DolphinWX/Src/GLInterface/InterfaceBase.h | 1 + Source/Core/DolphinWX/Src/GLInterface/WGL.cpp | 7 +++++++ Source/Core/DolphinWX/Src/GLInterface/WGL.h | 1 + Source/Core/DolphinWX/Src/GLInterface/WX.cpp | 13 ++++++++++++ Source/Core/DolphinWX/Src/GLInterface/WX.h | 1 + Source/Plugins/Plugin_VideoOGL/Src/Render.cpp | 19 +----------------- .../Plugin_VideoSoftware/Src/SWmain.cpp | 20 ++++--------------- 11 files changed, 45 insertions(+), 34 deletions(-) diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp index b8716ab467..942b60fc1e 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp @@ -26,6 +26,12 @@ void cInterfaceEGL::UpdateFPSDisplay(const char *text) { XStoreName(GLWin.dpy, GLWin.win, text); } + +void cInterfaceEGL::SwapInterval(int Interval) +{ + eglSwapInterval(GLWin.egl_dpy, Interval); +} + void cInterfaceEGL::Swap() { eglSwapBuffers(GLWin.egl_dpy, GLWin.egl_surf); diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.h b/Source/Core/DolphinWX/Src/GLInterface/EGL.h index c4b6a00b6c..fe127fe0ba 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.h +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.h @@ -34,6 +34,7 @@ private: cX11Window XWindow; public: friend class cX11Window; + void SwapInterval(int Interval); void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); diff --git a/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp index ef60873531..5745823cbf 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp @@ -27,6 +27,15 @@ void cInterfaceGLX::UpdateFPSDisplay(const char *text) { XStoreName(GLWin.dpy, GLWin.win, text); } + +void cInterfaceGLX::SwapInterval(int Interval) +{ + if (glXSwapIntervalSGI) + glXSwapIntervalSGI(Interval); + else + ERROR_LOG(VIDEO, "No support for SwapInterval (framerate clamped to monitor refresh rate)."); +} + void cInterfaceGLX::Swap() { glXSwapBuffers(GLWin.dpy, GLWin.win); diff --git a/Source/Core/DolphinWX/Src/GLInterface/GLX.h b/Source/Core/DolphinWX/Src/GLInterface/GLX.h index 73a6690ec5..83bb14a507 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/GLX.h +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.h @@ -31,6 +31,7 @@ private: cX11Window XWindow; public: friend class cX11Window; + void SwapInterval(int Interval); void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); diff --git a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h index 3e4f10fcd4..c2d1ffc54b 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h +++ b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h @@ -29,6 +29,7 @@ public: virtual bool MakeCurrent() = 0; virtual void Shutdown() = 0; + virtual void SwapInterval(int Interval) { } virtual u32 GetBackBufferWidth() { return s_backbuffer_width; } virtual u32 GetBackBufferHeight() { return s_backbuffer_height; } virtual void SetBackBufferDimensions(u32 W, u32 H) {s_backbuffer_width = W; s_backbuffer_height = H; } diff --git a/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp index c97cb48bdf..ce1bb3d946 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp @@ -27,6 +27,13 @@ static HDC hDC = NULL; // Private GDI Device Context static HGLRC hRC = NULL; // Permanent Rendering Context +void cInterfaceWGL::SwapInterval(int Interval) +{ + if (WGLEW_EXT_swap_control) + wglSwapIntervalEXT(Interval); + else + ERROR_LOG(VIDEO, "No support for SwapInterval (framerate clamped to monitor refresh rate)."); +} void cInterfaceWGL::Swap() { SwapBuffers(hDC); diff --git a/Source/Core/DolphinWX/Src/GLInterface/WGL.h b/Source/Core/DolphinWX/Src/GLInterface/WGL.h index 184ddd475f..18b8b2afb0 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WGL.h +++ b/Source/Core/DolphinWX/Src/GLInterface/WGL.h @@ -28,6 +28,7 @@ class cInterfaceWGL : public cInterfaceBase { public: + void SwapInterval(int Interval); void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); diff --git a/Source/Core/DolphinWX/Src/GLInterface/WX.cpp b/Source/Core/DolphinWX/Src/GLInterface/WX.cpp index d5415c8ed9..16de6369a7 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WX.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/WX.cpp @@ -23,6 +23,19 @@ #include "../GLInterface.h" #include "WX.h" +void cInterfaceWX::SwapInterval(int Interval) +{ + // WX interface only used on Apple +#ifdef __APPLE__ +#if defined USE_WX && USE_WX + NSOpenGLContext *ctx = GLWin.glCtxt->GetWXGLContext(); +#else + NSOpenGLContext *ctx = GLWin.cocoaCtx; +#endif + [ctx setValues: &Interval forParameter: NSOpenGLCPSwapInterval]; +#endif +} + void cInterfaceWX::Swap() { GLWin.glCanvas->SwapBuffers(); diff --git a/Source/Core/DolphinWX/Src/GLInterface/WX.h b/Source/Core/DolphinWX/Src/GLInterface/WX.h index 7772f864e5..82304942ea 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WX.h +++ b/Source/Core/DolphinWX/Src/GLInterface/WX.h @@ -35,6 +35,7 @@ class cInterfaceWX : public cInterfaceBase { public: + void SwapInterval(int Interval); void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index e3c35a6511..cd924acd8a 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -327,25 +327,8 @@ Renderer::Renderer() s_backbuffer_height = (int)GLInterface->GetBackBufferHeight(); // Handle VSync on/off -#ifdef __APPLE__ int swapInterval = g_ActiveConfig.bVSync ? 1 : 0; -#if defined USE_WX && USE_WX - NSOpenGLContext *ctx = GLWin.glCtxt->GetWXGLContext(); -#else - NSOpenGLContext *ctx = GLWin.cocoaCtx; -#endif - [ctx setValues: &swapInterval forParameter: NSOpenGLCPSwapInterval]; -#elif defined _WIN32 - if (WGLEW_EXT_swap_control) - wglSwapIntervalEXT(g_ActiveConfig.bVSync ? 1 : 0); - else - ERROR_LOG(VIDEO, "No support for SwapInterval (framerate clamped to monitor refresh rate)."); -#elif defined(HAVE_X11) && HAVE_X11 - if (glXSwapIntervalSGI) - glXSwapIntervalSGI(g_ActiveConfig.bVSync ? 1 : 0); - else - ERROR_LOG(VIDEO, "No support for SwapInterval (framerate clamped to monitor refresh rate)."); -#endif + GLInterface->SwapInterval(swapInterval); // check the max texture width and height GLint max_texture_size; diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp index 4c88a89ab6..332e83d0e8 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp @@ -141,28 +141,16 @@ void VideoSoftware::Shutdown() void VideoSoftware::Video_Prepare() { GLInterface->MakeCurrent(); - // Init extension support. - { + // Init extension support. + // Required for WGL SwapInterval #ifndef USE_GLES if (glewInit() != GLEW_OK) { ERROR_LOG(VIDEO, "glewInit() failed!Does your video card support OpenGL 2.x?"); return; } - - // Handle VSync on/off -#ifdef _WIN32 - if (WGLEW_EXT_swap_control) - wglSwapIntervalEXT(VSYNC_ENABLED); - else - ERROR_LOG(VIDEO, "no support for SwapInterval (framerate clamped to monitor refresh rate)Does your video card support OpenGL 2.x?"); -#elif defined(HAVE_X11) && HAVE_X11 - if (glXSwapIntervalSGI) - glXSwapIntervalSGI(VSYNC_ENABLED); - else - ERROR_LOG(VIDEO, "no support for SwapInterval (framerate clamped to monitor refresh rate)"); -#endif #endif - } + // Handle VSync on/off + GLInterface->SwapInterval(VSYNC_ENABLED); HwRasterizer::Prepare(); SWRenderer::Prepare();