[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58729] trunk/blender: BGE: Adding vsync control.

Mitchell Stokes mogurijin at gmail.com
Tue Jul 30 00:31:32 CEST 2013


Revision: 58729
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58729
Author:   moguri
Date:     2013-07-29 22:31:32 +0000 (Mon, 29 Jul 2013)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/doc/python_api/rst/bge.render.rst
    trunk/blender/intern/ghost/GHOST_C-api.h
    trunk/blender/intern/ghost/GHOST_IWindow.h
    trunk/blender/intern/ghost/intern/GHOST_C-api.cpp
    trunk/blender/intern/ghost/intern/GHOST_Window.h
    trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp
    trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h
    trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp
    trunk/blender/intern/ghost/intern/GHOST_WindowX11.h
    trunk/blender/release/scripts/startup/bl_ui/properties_game.py
    trunk/blender/source/blender/windowmanager/intern/wm_window.c
    trunk/blender/source/blender/windowmanager/wm_window.h
    trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.h
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Canvas.h
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_ICanvas.h

Modified: trunk/blender/doc/python_api/rst/bge.render.rst
===================================================================
--- trunk/blender/doc/python_api/rst/bge.render.rst	2013-07-29 22:20:06 UTC (rev 58728)
+++ trunk/blender/doc/python_api/rst/bge.render.rst	2013-07-29 22:31:32 UTC (rev 58729)
@@ -62,7 +62,19 @@
 .. data:: KX_BLENDER_GLSL_MATERIAL
 
    Materials approximating blender materials with GLSL.
+   
+.. DATA:: VSYNC_OFF
 
+   Disables vsync
+
+.. DATA:: VSYNC_ON
+
+   Enables vsync
+
+.. DATA:: VSYNC_ADAPTIVE
+
+   Enables adaptive vsync if supported. Adaptive vsync enables vsync if the framerate is above the monitors refresh rate. Otherwise, vsync is diabled if the framerate is too low.
+
 *********
 Functions
 *********
@@ -289,3 +301,15 @@
 
    Disable the motion blur effect.
 
+.. function:: setVsync(value)
+
+   Set the vsync value
+
+   :arg value: One of VSYNC_OFF, VSYNC_ON, VSYNC_ADAPTIVE
+   :type value: integer
+
+.. function:: getVsync()
+
+   Get the current vsync value
+
+   :rtype: One of VSYNC_OFF, VSYNC_ON, VSYNC_ADAPTIVE

Modified: trunk/blender/intern/ghost/GHOST_C-api.h
===================================================================
--- trunk/blender/intern/ghost/GHOST_C-api.h	2013-07-29 22:20:06 UTC (rev 58728)
+++ trunk/blender/intern/ghost/GHOST_C-api.h	2013-07-29 22:31:32 UTC (rev 58729)
@@ -666,6 +666,19 @@
 extern GHOST_TSuccess GHOST_SwapWindowBuffers(GHOST_WindowHandle windowhandle);
 
 /**
+ * Sets the swap interval for swapBuffers.
+ * \param interval The swap interval to use.
+ * \return A boolean success indicator.
+ */
+extern GHOST_TSuccess GHOST_SetSwapInterval(GHOST_WindowHandle windowhandle, int interval);
+
+/**
+ * Gets the current swap interval for swapBuffers.
+ * \return An integer.
+ */
+extern int GHOST_GetSwapInterval(GHOST_WindowHandle windowhandle);
+
+/**
  * Activates the drawing context of this window.
  * \param windowhandle The handle to the window
  * \return An intean success indicator.

Modified: trunk/blender/intern/ghost/GHOST_IWindow.h
===================================================================
--- trunk/blender/intern/ghost/GHOST_IWindow.h	2013-07-29 22:20:06 UTC (rev 58728)
+++ trunk/blender/intern/ghost/GHOST_IWindow.h	2013-07-29 22:31:32 UTC (rev 58729)
@@ -205,6 +205,19 @@
 	virtual GHOST_TSuccess swapBuffers() = 0;
 
 	/**
+	 * Sets the swap interval for swapBuffers.
+	 * \param interval The swap interval to use.
+	 * \return A boolean success indicator.
+	 */
+	virtual GHOST_TSuccess setSwapInterval(int interval) = 0;
+
+	/**
+	 * Gets the current swap interval for swapBuffers.
+	 * \return An integer.
+	 */
+	virtual int getSwapInterval() = 0;
+
+	/**
 	 * Activates the drawing context of this window.
 	 * \return  A boolean success indicator.
 	 */

Modified: trunk/blender/intern/ghost/intern/GHOST_C-api.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_C-api.cpp	2013-07-29 22:20:06 UTC (rev 58728)
+++ trunk/blender/intern/ghost/intern/GHOST_C-api.cpp	2013-07-29 22:31:32 UTC (rev 58729)
@@ -691,8 +691,21 @@
 	return window->swapBuffers();
 }
 
+GHOST_TSuccess GHOST_SetSwapInterval(GHOST_WindowHandle windowhandle, int interval)
+{
+	GHOST_IWindow *window = (GHOST_IWindow *) windowhandle;
 
+	return window->setSwapInterval(interval);
+}
 
+int GHOST_GetSwapInterval(GHOST_WindowHandle windowhandle)
+{
+	GHOST_IWindow *window = (GHOST_IWindow *) windowhandle;
+
+	return window->getSwapInterval();
+}
+
+
 GHOST_TSuccess GHOST_ActivateWindowDrawingContext(GHOST_WindowHandle windowhandle)
 {
 	GHOST_IWindow *window = (GHOST_IWindow *) windowhandle;

Modified: trunk/blender/intern/ghost/intern/GHOST_Window.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_Window.h	2013-07-29 22:20:06 UTC (rev 58728)
+++ trunk/blender/intern/ghost/intern/GHOST_Window.h	2013-07-29 22:31:32 UTC (rev 58729)
@@ -67,6 +67,8 @@
 	 * virtual GHOST_TWindowOrder getOrder(void) = 0;
 	 * virtual GHOST_TSuccess setOrder(GHOST_TWindowOrder order) = 0;
 	 * virtual GHOST_TSuccess swapBuffers() = 0;
+	 * virtual GHOST_TSuccess setSwapInterval() = 0;
+	 * virtual int getSwapInterval() = 0;
 	 * virtual GHOST_TSuccess activateDrawingContext() = 0;
 	 * virtual GHOST_TSuccess invalidate() = 0;
 	 */
@@ -110,6 +112,8 @@
 	 * virtual GHOST_TSuccess setState(GHOST_TWindowState state) = 0;
 	 * virtual GHOST_TSuccess setOrder(GHOST_TWindowOrder order) = 0;
 	 * virtual GHOST_TSuccess swapBuffers() = 0;
+	 * virtual GHOST_TSuccess setSwapInterval() = 0;
+	 * virtual int getSwapInterval() = 0;
 	 * virtual GHOST_TSuccess activateDrawingContext() = 0;
 	 * virtual GHOST_TSuccess invalidate() = 0;
 	 */
@@ -205,6 +209,23 @@
 	}
 	
 	/**
+	 * Sets the swap interval for swapBuffers.
+	 * \param interval The swap interval to use.
+	 * \return A boolean success indicator.
+	 */
+	virtual GHOST_TSuccess setSwapInterval(int interval) {
+		return GHOST_kFailure;
+	}
+	
+	/**
+	 * Gets the current swap interval for swapBuffers.
+	 * \return An integer.
+	 */
+	virtual int getSwapInterval() {
+		return 0;
+	}
+	
+	/**
 	 * Tells if the ongoing drag'n'drop object can be accepted upon mouse drop
 	 */
 	virtual void setAcceptDragOperation(bool canAccept);

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp	2013-07-29 22:20:06 UTC (rev 58728)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp	2013-07-29 22:31:32 UTC (rev 58729)
@@ -648,7 +648,21 @@
 	return ::SwapBuffers(hDC) == TRUE ? GHOST_kSuccess : GHOST_kFailure;
 }
 
+GHOST_TSuccess GHOST_WindowWin32::setSwapInterval(int interval)
+{
+	if (!WGL_EXT_swap_control)
+		return GHOST_kFailure;
+	return wglSwapIntervalEXT(interval) == TRUE ? GHOST_kSuccess : GHOST_kFailure;
+}
 
+int GHOST_WindowWin32::getSwapInterval()
+{
+	if (WGL_EXT_swap_control)
+		return wglGetSwapIntervalEXT();
+
+	return 0;
+}
+
 GHOST_TSuccess GHOST_WindowWin32::activateDrawingContext()
 {
 	GHOST_TSuccess success;

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h	2013-07-29 22:20:06 UTC (rev 58728)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h	2013-07-29 22:31:32 UTC (rev 58729)
@@ -212,6 +212,19 @@
 	virtual GHOST_TSuccess swapBuffers();
 
 	/**
+	 * Sets the swap interval for swapBuffers.
+	 * \param interval The swap interval to use.
+	 * \return A boolean success indicator.
+	 */
+	virtual GHOST_TSuccess setSwapInterval(int interval);
+
+	/**
+	 * Gets the current swap interval for swapBuffers.
+	 * \return An integer.
+	 */
+	virtual int getSwapInterval();
+
+	/**
 	 * Activates the drawing context of this window.
 	 * \return Indication of success.
 	 */

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp	2013-07-29 22:20:06 UTC (rev 58728)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp	2013-07-29 22:31:32 UTC (rev 58729)
@@ -30,6 +30,8 @@
  */
 
 
+#include <GL/glxew.h>
+
 #include "GHOST_WindowX11.h"
 #include "GHOST_SystemX11.h"
 #include "STR_String.h"
@@ -1513,3 +1515,23 @@
 
 	return GHOST_kSuccess;
 }
+
+GHOST_TSuccess
+GHOST_WindowX11::
+setSwapInterval(int interval) {
+	if (!GLX_EXT_swap_control)
+		return GHOST_kFailure;
+	glXSwapIntervalEXT(m_display, m_window, interval);
+	return GHOST_kSuccess;
+}
+
+int
+GHOST_WindowX11::
+getSwapInterval() {
+	if (GLX_EXT_swap_control) {
+		unsigned int value;
+		glXQueryDrawable(m_display, m_window, GLX_SWAP_INTERVAL_EXT, &value);
+		return (int)value;
+	}
+	return 0;
+}

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowX11.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowX11.h	2013-07-29 22:20:06 UTC (rev 58728)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowX11.h	2013-07-29 22:31:32 UTC (rev 58729)
@@ -235,6 +235,19 @@
 
 	GHOST_TSuccess endFullScreen() const;
 
+	/**
+	 * Sets the swap interval for swapBuffers.
+	 * \param interval The swap interval to use.
+	 * \return A boolean success indicator.
+	 */
+	virtual GHOST_TSuccess setSwapInterval(int interval);
+
+	/**
+	 * Gets the current swap interval for swapBuffers.
+	 * \return An integer.
+	 */
+	virtual int getSwapInterval();
+
 protected:
 	/**
 	 * Tries to install a rendering context in this window.

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_game.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_game.py	2013-07-29 22:20:06 UTC (rev 58728)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_game.py	2013-07-29 22:31:32 UTC (rev 58729)
@@ -414,6 +414,9 @@
         col.active = gs.raster_storage != 'VERTEX_BUFFER_OBJECT'
 
         row = layout.row()
+        row.prop(gs, "vsync")
+
+        row = layout.row()
         row.prop(gs, "raster_storage")
 
         row = layout.row()

Modified: trunk/blender/source/blender/windowmanager/intern/wm_window.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_window.c	2013-07-29 22:20:06 UTC (rev 58728)
+++ trunk/blender/source/blender/windowmanager/intern/wm_window.c	2013-07-29 22:31:32 UTC (rev 58729)
@@ -1324,7 +1324,17 @@
 #endif
 }
 
+void wm_window_set_swap_interval (wmWindow *win, int interval)
+{
+	GHOST_SetSwapInterval(win->ghostwin, interval);
+}
 
+int wm_window_get_swap_interval (wmWindow *win)
+{
+	return GHOST_GetSwapInterval(win->ghostwin);
+}
+
+
 /* ******************* exported api ***************** */
 
 

Modified: trunk/blender/source/blender/windowmanager/wm_window.h
===================================================================
--- trunk/blender/source/blender/windowmanager/wm_window.h	2013-07-29 22:20:06 UTC (rev 58728)
+++ trunk/blender/source/blender/windowmanager/wm_window.h	2013-07-29 22:31:32 UTC (rev 58729)
@@ -58,6 +58,8 @@
 void		wm_window_set_size		(wmWindow *win, int width, int height);
 void		wm_window_get_position	(wmWindow *win, int *posx_r, int *posy_r);
 void		wm_window_swap_buffers	(wmWindow *win);
+void		wm_window_set_swap_interval	(wmWindow *win, int interval);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list