[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49585] branches/ge_harmony/source/ gameengine/Rasterizer/RAS_OpenGLRasterizer: Making 2D Filters run mostly off FBOs now ( do people still use the luminance texture?).

Daniel Stokes kupomail at gmail.com
Sun Aug 5 23:02:30 CEST 2012


Revision: 49585
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49585
Author:   kupoman
Date:     2012-08-05 21:02:30 +0000 (Sun, 05 Aug 2012)
Log Message:
-----------
Making 2D Filters run mostly off FBOs now (do people still use the luminance texture?). There were some minor performance gains from this. Also fixing a conflict with shadow FBOs.

Modified Paths:
--------------
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.h
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.cpp	2012-08-05 20:40:26 UTC (rev 49584)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.cpp	2012-08-05 21:02:30 UTC (rev 49585)
@@ -53,7 +53,6 @@
 
 RAS_OGLFilterManager::RAS_OGLFilterManager():
 texturewidth(-1), textureheight(-1),
-canvaswidth(-1), canvasheight(-1),
 /* numberoffilters(0), */ /* UNUSED */ need_tex_update(true)
 {
 	isshadersupported = GLEW_ARB_shader_objects &&
@@ -249,16 +248,12 @@
 	}
 }
 
-void RAS_OGLFilterManager::StartShaderProgram(int passindex, RAS_IRasterizer *irast)
+void RAS_OGLFilterManager::StartShaderProgram(int passindex)
 {
-	RAS_OpenGLRasterizer *rast = (RAS_OpenGLRasterizer*)irast;
-
 	GLint uniformLoc;
 	glUseProgramObjectARB(m_filters[passindex]);
-	uniformLoc = m_uniforms[passindex]["bgl_RenderedTexture"].bind;
-	glActiveTextureARB(GL_TEXTURE0);
-	glBindTexture(GL_TEXTURE_2D, texname[0]);
 
+	uniformLoc = m_uniforms[passindex]["bgl_RenderedTexture"].bind;
 	if (uniformLoc != -1)
 	{
 		glUniform1iARB(uniformLoc, 0);
@@ -267,9 +262,6 @@
 	/* send depth texture to glsl program if it needs */
 	if (texflag[passindex] & 0x1) {
 		uniformLoc = glGetUniformLocationARB(m_filters[passindex], "bgl_DepthTexture");
-		glActiveTextureARB(GL_TEXTURE1);
-		glBindTexture(GL_TEXTURE_2D, rast->GetDepthTarget());
-
 		if (uniformLoc != -1)
 		{
 			glUniform1iARB(uniformLoc, 1);
@@ -279,9 +271,6 @@
 	/* send luminance texture to glsl program if it needs */
 	if (texflag[passindex] & 0x2) {
 		uniformLoc = m_uniforms[passindex]["bgl_LuminanceTexture"].bind;
-		glActiveTextureARB(GL_TEXTURE2);
-		glBindTexture(GL_TEXTURE_2D, texname[2]);
-
 		if (uniformLoc != -1)
 		{
 			glUniform1iARB(uniformLoc, 2);
@@ -378,28 +367,21 @@
 		glDeleteTextures(1, (GLuint*)&texname[1]);
 	if (texname[2]!=(unsigned int)-1)
 		glDeleteTextures(1, (GLuint*)&texname[2]);
+	if (m_fbo!=(unsigned int)-1)
+		glDeleteFramebuffersEXT(1, (GLuint*)&m_fbo);
 }
 
 void RAS_OGLFilterManager::SetupTextures(bool depth, bool luminance)
 {
+	int i;
 	FreeTextures();
 	
-	glGenTextures(1, (GLuint*)&texname[0]);
-	glBindTexture(GL_TEXTURE_2D, texname[0]);
-	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texturewidth, textureheight, 0, GL_RGBA,
-			GL_UNSIGNED_BYTE, 0);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+	glGenTextures(2, (GLuint*)&texname[0]);
 
-	if (depth) {
-		glGenTextures(1, (GLuint*)&texname[1]);
-		glBindTexture(GL_TEXTURE_2D, texname[1]);
-		glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, texturewidth,textureheight,
-		             0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE,NULL);
-		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE,
-		                GL_NONE);
+	for (i = 0; i < 2; i++) {
+		glBindTexture(GL_TEXTURE_2D, texname[i]);
+		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texturewidth, textureheight, 0, GL_RGBA,
+				GL_UNSIGNED_BYTE, 0);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
@@ -421,8 +403,9 @@
 void RAS_OGLFilterManager::UpdateOffsetMatrix(RAS_ICanvas* canvas)
 {
 	/* RAS_Rect canvas_rect = canvas->GetWindowArea(); */ /* UNUSED */
-	texturewidth = canvas->GetWidth()+1;
-	textureheight = canvas->GetHeight()+1;
+	//int rect_width = rect.GetRight()+1, rect_height = rect.GetTop()+1;
+	//texturewidth = rect_width;
+	//textureheight = rect_height;
 	GLint i,j;
 
 	if (!GL_ARB_texture_non_power_of_two)
@@ -475,6 +458,8 @@
 	bool need_depth=false;
 	bool need_luminance=false;
 	int num_filters = 0;
+	bool first_filter = true;
+	char buffer_toggle = 0;
 
 	int passindex;
 
@@ -500,10 +485,13 @@
 	GLuint	viewport[4]={0};
 	glGetIntegerv(GL_VIEWPORT,(GLint *)viewport);
 	RAS_Rect rect = canvas->GetWindowArea();
-	int rect_width = rect.GetRight()+1, rect_height = rect.GetTop()+1;
+	//int rect_width = rect.GetRight()+1, rect_height = rect.GetTop()+1;
+	int rect_width = rast->GetFBOWidth(), rect_height = rast->GetFBOHeight();
 
-	if (texturewidth != canvas->GetWidth()+1 || textureheight != canvas->GetHeight()+1)
+	if (texturewidth != rect_width || textureheight != rect_height)
 	{
+		texturewidth = rect_width;
+		textureheight = rect_height;
 		UpdateOffsetMatrix(canvas);
 		UpdateCanvasTextureCoord((unsigned int*)viewport);
 		need_tex_update = true;
@@ -549,12 +537,18 @@
 	{
 		if (m_filters[passindex] && m_enabled[passindex])
 		{
-			StartShaderProgram(passindex, rast);
+			StartShaderProgram(passindex);
+			if (first_filter)
+			{
+				glBindTexture(GL_TEXTURE_2D, rast->GetColorTarget());
+				first_filter = false;
+			}
+			else
+				glBindTexture(GL_TEXTURE_2D, texname[buffer_toggle^1]);
 
-			glActiveTextureARB(GL_TEXTURE0);
-			glBindTexture(GL_TEXTURE_2D, texname[0]);
-			glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, rect_width, rect_height, 0); // Don't use texturewidth and textureheight in case we don't have NPOT support
-			glClear(GL_COLOR_BUFFER_BIT);
+			glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texname[buffer_toggle], 0);
+			//glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, rect_width, rect_height, 0); // Don't use texturewidth and textureheight in case we don't have NPOT support
+			//glClear(GL_COLOR_BUFFER_BIT);
 
 			glBegin(GL_QUADS);
 				glColor4f(1.f, 1.f, 1.f, 1.f);
@@ -563,6 +557,8 @@
 				glTexCoord2f(0.0, 0.0);	glMultiTexCoord2fARB(GL_TEXTURE3_ARB, canvascoord[0], canvascoord[2]); glVertex2f(-1,-1);
 				glTexCoord2f(1.0, 0.0);	glMultiTexCoord2fARB(GL_TEXTURE3_ARB, canvascoord[1], canvascoord[2]); glVertex2f(1,-1);
 			glEnd();
+
+			buffer_toggle ^= 1;
 		}
 	}
 
@@ -572,6 +568,8 @@
 	glPopMatrix();
 	glMatrixMode(GL_MODELVIEW);
 	glPopMatrix();
+
+	rast->SetFinalTarget(texname[buffer_toggle^1]);
 }
 
 void RAS_OGLFilterManager::UpdateUniform(int pass, STR_String name, RAS_IRasterizer::RAS_UNIFORM_TYPE type, void *data)

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.h	2012-08-05 20:40:26 UTC (rev 49584)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.h	2012-08-05 21:02:30 UTC (rev 49585)
@@ -55,7 +55,7 @@
 	unsigned int	CreateShaderProgram(const char* shadersource);
 	unsigned int	CreateShaderProgram(int filtermode);
 	void		AnalyseShader(int passindex, std::vector<STR_String> propNames);
-	void			StartShaderProgram(int passindex, RAS_IRasterizer *rast);
+	void			StartShaderProgram(int passindex);
 	void			EndShaderProgram();
 	void			PrintShaderErrors(unsigned int shader, const char *task, const char *code);
 
@@ -68,12 +68,11 @@
 	float			canvascoord[4];
 	float			textureoffsets[18];
 	/* float			view[4]; */ /* UNUSED */
-	/* texname[0] contains render to texture, texname[1] contains depth texture,  texname[2] contains luminance texture*/
+	/* texname[0] contains render to texture, texname[1] contains render to texture,  texname[2] contains luminance texture*/
 	unsigned int	texname[3]; 
 	int				texturewidth;
 	int				textureheight;
-	int				canvaswidth;
-	int				canvasheight;
+	unsigned int	m_fbo;
 	/* int				numberoffilters; */ /* UNUSED */
 	/* bit 0: enable/disable depth texture
 	 * bit 1: enable/disable luminance texture*/

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-05 20:40:26 UTC (rev 49584)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-05 21:02:30 UTC (rev 49585)
@@ -288,7 +288,7 @@
 		glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
 
 	glDeleteTextures(1, &m_color_target);
-	glDeleteBuffersARB(1, &m_depth_target);
+	glDeleteTextures(1, &m_depth_target);
 	glDeleteFramebuffersEXT(1, &m_fbo);
 	
 	EndFrame();
@@ -300,6 +300,8 @@
 	m_drawingmode = drawingmode;
 
 	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target, 0);
+	m_final_target = m_color_target;
 
 	// Blender camera routine destroys the settings
 	if (m_drawingmode < KX_SOLID)
@@ -338,6 +340,8 @@
 
 	if (m_drawingmode == KX_WIREFRAME)
 		glDisable(GL_CULL_FACE);
+
+	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
 }
 
 int RAS_OpenGLRasterizer::GetDrawingMode()
@@ -463,7 +467,7 @@
 	glPushAttrib(GL_VIEWPORT_BIT);
 	glViewport(0, 0, m_width, m_height);
 
-	glBindTexture(GL_TEXTURE_2D, m_color_target);
+	glBindTexture(GL_TEXTURE_2D, m_final_target);
 
 	glBegin(GL_QUADS);
 		glColor4f(1.f, 1.f, 1.f, 1.f);

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2012-08-05 20:40:26 UTC (rev 49584)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	2012-08-05 21:02:30 UTC (rev 49585)
@@ -108,6 +108,7 @@
 	unsigned int	m_fbo;
 	unsigned int	m_color_target;
 	unsigned int	m_depth_target;
+	unsigned int	m_final_target;
 	int				m_width;
 	int				m_height;
 
@@ -332,8 +333,10 @@
 
 	int				GetFBOWidth() { return m_width; }
 	int				GetFBOHeight() { return m_height; }
+	unsigned int	GetFBO() { return m_fbo; }
 	unsigned int	GetDepthTarget() { return m_depth_target; }
 	unsigned int	GetColorTarget() { return m_color_target; }
+	void			SetFinalTarget(unsigned int id) { m_final_target = id; }
 
 
 #ifdef WITH_CXX_GUARDEDALLOC

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list