diff options
author | Mitchell Stokes <mogurijin@gmail.com> | 2013-07-30 02:31:32 +0400 |
---|---|---|
committer | Mitchell Stokes <mogurijin@gmail.com> | 2013-07-30 02:31:32 +0400 |
commit | 29f8dfd37a2fbf4190e551bef0b04ff1ae1fd7b6 (patch) | |
tree | af50623534adee419cecbbf6e0d8dd789409d266 /source/gameengine/BlenderRoutines | |
parent | 2840edba840382f0957c4963c3613c7836ac5979 (diff) |
BGE: Adding vsync control. Users can enable vsync, disable vsync, or use adaptive vsync via UI options in the render properties, or by using the new Python method bge.render.setVsync(). Win32 and X11 support are done via EXT_swap_control. Support for using EXT_swap_control on OS X still needs to be added to Ghost.
Diffstat (limited to 'source/gameengine/BlenderRoutines')
5 files changed, 41 insertions, 0 deletions
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp index bb4c3fd2cbc..5703527eae0 100644 --- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp +++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp @@ -284,6 +284,14 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL); else canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE); + + // Setup vsync + int previous_vsync = canvas->GetSwapInterval(); + if (startscene->gm.vsync == VSYNC_ADAPTIVE) + canvas->SetSwapInterval(-1); + else + canvas->SetSwapInterval(startscene->gm.vsync); // VSYNC_OFF == 0, VSYNC_ON == 1, so this works + RAS_IRenderTools* rendertools = new KX_BlenderRenderTools(); RAS_IRasterizer* rasterizer = NULL; //Don't use displaylists with VBOs @@ -663,6 +671,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c } if (canvas) { + canvas->SetSwapInterval(previous_vsync); // Set the swap interval back delete canvas; canvas = NULL; } diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp index 3bd1c02f12e..3089b3fd44d 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp @@ -66,6 +66,16 @@ void KX_BlenderCanvas::SwapBuffers() BL_SwapBuffers(m_win); } +void KX_BlenderCanvas::SetSwapInterval(int interval) +{ + BL_SetSwapInterval(m_win, interval); +} + +int KX_BlenderCanvas::GetSwapInterval() +{ + return BL_GetSwapInterval(m_win); +} + void KX_BlenderCanvas::ResizeWindow(int width, int height) { // Not implemented for the embedded player diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h index c201d866efe..c5318b882fa 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h @@ -80,6 +80,16 @@ public: void SwapBuffers( ); + + void + SetSwapInterval( + int interval + ); + + int + GetSwapInterval( + ); + void ResizeWindow( int width, diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp index 61598995040..6ed4866579c 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp @@ -98,6 +98,16 @@ void BL_MakeDrawable(wmWindowManager *wm, wmWindow *win) wm_window_make_drawable(wm, win); } +void BL_SetSwapInterval(struct wmWindow *win, int interval) +{ + wm_window_set_swap_interval(win, interval); +} + +int BL_GetSwapInterval(struct wmWindow *win) +{ + return wm_window_get_swap_interval(win); +} + static void DisableForText() { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); /* needed for texture fonts otherwise they render as wireframe */ diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.h b/source/gameengine/BlenderRoutines/KX_BlenderGL.h index 54e76ff6489..8032d9a594a 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderGL.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.h @@ -43,6 +43,8 @@ struct wmWindowManager; // special swapbuffers, that takes care of which area (viewport) needs to be swapped void BL_SwapBuffers(struct wmWindow *win); +void BL_SetSwapInterval(struct wmWindow *win, int interval); +int BL_GetSwapInterval(struct wmWindow *win); void BL_MakeDrawable(struct wmWindowManager *wm, struct wmWindow *win); |