[Bf-blender-cvs] [054d871] decklink: BGE: Add GL synchronization on ImageRender.refresh() without buffer.

Benoit Bolsee noreply at git.blender.org
Sun Dec 6 12:42:20 CET 2015


Commit: 054d871ac1604ccd9ef67fdb63e173b9084dc10c
Author: Benoit Bolsee
Date:   Sun Dec 6 12:33:08 2015 +0100
Branches: decklink
https://developer.blender.org/rB054d871ac1604ccd9ef67fdb63e173b9084dc10c

BGE: Add GL synchronization on ImageRender.refresh() without buffer.

Calling ImageRender.refresh() without passing a buffer object will
now perform the render (if not already started earlier with
ImageRender.render()) and wait for the render to complete.
This is done internally with a GLSync object to synchronize with the GPU.
This is only useful when doing offscreen render on texture target:
when refresh() returns, you are guaranteed that the texture is ready for use.

fbo = bge.render.offScreenCreate(width,height,samples,bge.render.RAS_OFS_RENDER_TEXTURE)
tex = fbo.color
ir = bge.texture.ImageRender(scene,camera,fbo)
ir.refresh()
--> tex is now ready for use

===================================================================

M	doc/python_api/rst/bge.texture.rst
M	source/gameengine/Rasterizer/CMakeLists.txt
M	source/gameengine/Rasterizer/RAS_IOffScreen.h
M	source/gameengine/Rasterizer/RAS_IRasterizer.h
A	source/gameengine/Rasterizer/RAS_ISync.h
M	source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
M	source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.cpp
M	source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.h
M	source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
M	source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
A	source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLSync.cpp
A	source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLSync.h
M	source/gameengine/VideoTexture/ImageRender.cpp
M	source/gameengine/VideoTexture/ImageRender.h
M	source/gameengine/VideoTexture/ImageViewport.cpp

===================================================================

diff --git a/doc/python_api/rst/bge.texture.rst b/doc/python_api/rst/bge.texture.rst
index 093e45e..35366c6 100644
--- a/doc/python_api/rst/bge.texture.rst
+++ b/doc/python_api/rst/bge.texture.rst
@@ -627,15 +627,6 @@ Image classes
       
       :type: :class:`~bgl.Buffer` or None
 
-   .. method:: refresh(buffer=None, format="RGBA")
-
-      Refresh video - render and copy the image to an external buffer (optional) then invalidate its current content.
-
-      :arg buffer: An optional object that implements the buffer protocol. If specified, the image is copied to the buffer, which must be big enough or an exception is thrown. The transfer to the buffer is optimal if no processing of the image is needed. This is the case if flip=False, alpha=True, scale=False, whole=True, depth=False, zbuff=False and no filter is set.
-      :type buffer: any buffer type
-      :arg format: An optional image format specifier for the image that will be copied to the buffer. Only valid values are "RGBA" or "BGRA"
-      :type format: str
-
    .. attribute:: scale
 
       Fast scale of image (near neighbour).
@@ -673,6 +664,25 @@ Image classes
       
       :type: bool
 
+   .. method:: render()
+
+      Render the scene but do not extract the pixels yet. The function returns as soon as the render commands have been send to the GPU. The render will proceed asynchronously in the GPU while the host can perform other tasks. To complete the render, you can either call :func:`refresh` directly of refresh the texture of which this object is the source. This method is useful to implement asynchronous render for optimal performance: call render() on frame n and refresh() on frame n+1 to gi [...]
+
+      :return: True if the render was initiated, False if the render cannot be performed (e.g. the camera is active)
+      :rtype: bool
+
+   .. method:: refresh()
+   .. method:: refresh(buffer, format="RGBA")
+
+      Refresh video - render and optionally copy the image to an external buffer then invalidate its current content. The render may have been started earlier with the :func:`render` method, in which case this function simply waits for the render operations to complete. When called without argument, the pixels are not extracted but the render is guaranteed to be completed when the function returns. This only makes sense with offscreen render on texture target (see :func:`~bge.render.offS [...]
+
+      :arg buffer: An object that implements the buffer protocol. If specified, the image is copied to the buffer, which must be big enough or an exception is thrown. The transfer to the buffer is optimal if no processing of the image is needed. This is the case if flip=False, alpha=True, scale=False, whole=True, depth=False, zbuff=False and no filter is set.
+      :type buffer: any buffer type of sufficient size
+      :arg format: An optional image format specifier for the image that will be copied to the buffer. Only valid values are "RGBA" or "BGRA"
+      :type format: str
+      :return: True if the render is complete, False if the render cannot be performed (e.g. the camera is active)
+      :rtype: bool
+
 .. class:: ImageViewport
 
    Image source from viewport.
diff --git a/source/gameengine/Rasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/CMakeLists.txt
index 23e677b..64c9b8e 100644
--- a/source/gameengine/Rasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/CMakeLists.txt
@@ -64,6 +64,7 @@ set(SRC
 	RAS_IRasterizer.h
 	RAS_ILightObject.h
 	RAS_IOffScreen.h
+	RAS_ISync.h
 	RAS_MaterialBucket.h
 	RAS_MeshObject.h
 	RAS_ObjectColor.h
diff --git a/source/gameengine/Rasterizer/RAS_IOffScreen.h b/source/gameengine/Rasterizer/RAS_IOffScreen.h
index 0817b40..e5f3dc4 100644
--- a/source/gameengine/Rasterizer/RAS_IOffScreen.h
+++ b/source/gameengine/Rasterizer/RAS_IOffScreen.h
@@ -48,8 +48,8 @@ public:
 		RAS_OFS_BIND_READ,
 	};
 	enum RAS_OFS_RENDER_TARGET {
-		RAS_OFS_RENDER_BUFFER = 0,		// use texture as render target
-		RAS_OFS_RENDER_TEXTURE,			// use render buffer as render target
+		RAS_OFS_RENDER_BUFFER = 0,		// use render buffer as render target
+		RAS_OFS_RENDER_TEXTURE,			// use texture as render target
 	};
 
 	int	    m_width;
@@ -64,6 +64,7 @@ public:
 	virtual void Bind(RAS_OFS_BIND_MODE mode) = 0;
 	virtual void Blit() = 0;
 	virtual void Unbind() = 0;
+	virtual void MipMap() = 0;
 
 	virtual int GetWidth() { return m_width; }
 	virtual int GetHeight() { return m_height; }
diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h
index 487b824..7d4151a 100644
--- a/source/gameengine/Rasterizer/RAS_IRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h
@@ -56,6 +56,7 @@ class RAS_MeshSlot;
 class RAS_ILightObject;
 class SCA_IScene;
 class RAS_IOffScreen;
+class RAS_ISync;
 
 typedef vector<unsigned short> KX_IndexArray;
 typedef vector<RAS_TexVert> KX_VertexArray;
@@ -265,6 +266,12 @@ public:
 	virtual RAS_IOffScreen *CreateOffScreen(int width, int height, int samples, int target) = 0;
 
 	/**
+	 * Create a sync object
+	 * For use with offscreen render
+	 */
+	virtual RAS_ISync *CreateSync(int type) = 0;
+
+	/**
 	 * SwapBuffers swaps the back buffer with the front buffer.
 	 */
 	virtual void SwapBuffers() = 0;
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.h b/source/gameengine/Rasterizer/RAS_ISync.h
similarity index 60%
copy from source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.h
copy to source/gameengine/Rasterizer/RAS_ISync.h
index 0193c78..b9987dc 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.h
+++ b/source/gameengine/Rasterizer/RAS_ISync.h
@@ -25,34 +25,24 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
-#include "RAS_IOffScreen.h"
-#include "GPU_extensions.h"
+/** \file RAS_ISync.h
+ *  \ingroup bgerast
+ */
 
-class RAS_ICanvas;
+#ifndef __RAS_ISYNC_H__
+#define __RAS_ISYNC_H__
 
-class RAS_OpenGLOffScreen : public RAS_IOffScreen
+class RAS_ISync
 {
-	RAS_ICanvas *m_canvas;
-	// these are GL objects
-	unsigned int m_depthrb;
-	unsigned int m_colorrb;
-	unsigned int m_depthtx;
-	unsigned int m_colortx;
-	unsigned int m_fbo;
-	unsigned int m_blitfbo;
-	unsigned int m_blitrbo;
-	unsigned int m_blittex;
-	RAS_OFS_RENDER_TARGET m_target;
-	bool m_bound;
-
-
 public:
-	RAS_OpenGLOffScreen(RAS_ICanvas *canvas);
-	~RAS_OpenGLOffScreen();
+	enum RAS_SYNC_TYPE {
+		RAS_SYNC_TYPE_FENCE = 0,
+	};
+	virtual ~RAS_ISync() {}
 
-	bool Create(int width, int height, int samples, RAS_OFS_RENDER_TARGET target);
-	void Destroy();
-	void Bind(RAS_OFS_BIND_MODE mode);
-	void Blit();
-	void Unbind();
+	virtual bool Create(RAS_SYNC_TYPE type) = 0;
+	virtual void Destroy() = 0;
+	virtual void Wait() = 0;
 };
+
+#endif  /* __RAS_ISYNC_H__ */
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
index 0d6f0b8..d2137f2 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
@@ -53,6 +53,7 @@ set(SRC
 	RAS_ListRasterizer.cpp
 	RAS_OpenGLLight.cpp
 	RAS_OpenGLOffScreen.cpp
+	RAS_OpenGLSync.cpp
 	RAS_OpenGLRasterizer.cpp
 	RAS_StorageIM.cpp
 	RAS_StorageVA.cpp
@@ -63,6 +64,7 @@ set(SRC
 	RAS_ListRasterizer.h
 	RAS_OpenGLLight.h
 	RAS_OpenGLOffScreen.h
+	RAS_OpenGLSync.h
 	RAS_OpenGLRasterizer.h
 	RAS_StorageIM.h
 	RAS_StorageVA.h
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.cpp
index 4b299b2..13c5492 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.cpp
@@ -315,7 +315,7 @@ void RAS_OpenGLOffScreen::Bind(RAS_OFS_BIND_MODE mode)
 {
 	if (m_fbo)
 	{
-		if (mode == RAS_OFS_BIND_RENDER || !m_blitfbo)
+		if (mode == RAS_OFS_BIND_RENDER)
 		{
 			glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
 			glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
@@ -323,6 +323,11 @@ void RAS_OpenGLOffScreen::Bind(RAS_OFS_BIND_MODE mode)
 			glViewport(0, 0, m_width, m_height);
 			glDisable(GL_SCISSOR_TEST);
 		}
+		else if (!m_blitfbo)
+		{
+			glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+			glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
+		}
 		else
 		{
 			glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_blitfbo);
@@ -341,13 +346,17 @@ void RAS_OpenGLOffScreen::Unbind()
 	glEnable(GL_SCISSOR_TEST);
 	glReadBuffer(GL_BACK);
 	glDrawBuffer(GL_BACK);
+	m_bound = false;
+}
+
+void RAS_OpenGLOffScreen::MipMap()
+{
 	if (m_color)
 	{
 		glBindTexture(GL_TEXTURE_2D, m_color);
 		glGenerateMipmap(GL_TEXTURE_2D);
 		glBindTexture(GL_TEXTURE_2D, 0);
 	}
-	m_bound = false;
 }
 
 void RAS_OpenGLOffScreen::Blit()
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.h
index 0193c78..1f2a51d 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLOffScreen.h
@@ -55,4 +55,5 @@ public:
 	void Bind(RAS_OFS_BIND_MODE mode);
 	void Blit();
 	void Unbind();
+	void MipMap();
 };
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
index 0132298..7714114 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
@@ -47,6 +47,7 @@
 
 #include "RAS_OpenGLLight.h"
 #include "RAS_OpenGLOffScreen.h"
+#include "RAS_OpenGLSync.h"
 
 #include "RAS_StorageIM.h"
 #include "RAS_StorageVA.h"
@@ -623,6 +624,20 @@ RAS_IOffScreen *RAS_OpenGLRasterizer::CreateOffScreen(int width, int height, int
 	return ofs;
 }
 
+RAS_ISync *RAS_OpenGLRasterizer::CreateSync(int type)
+{
+	RAS_ISync *sync;
+
+	sync = new RAS_OpenGLSync();
+
+	if (!sync->Create((RA

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list