[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49375] branches/ge_harmony/source/ gameengine: Some improvements to the 2D filter system (FBO for depth, caching uniform locations).

Daniel Stokes kupomail at gmail.com
Mon Jul 30 06:00:21 CEST 2012


Revision: 49375
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49375
Author:   kupoman
Date:     2012-07-30 04:00:19 +0000 (Mon, 30 Jul 2012)
Log Message:
-----------
Some improvements to the 2D filter system (FBO for depth, caching uniform locations). On my gtx260 I some times get a slight improvement of about 0.5-1.0 ms on the rasterizer. On the integrated Intel card on my laptop I see a decrease of about 75ms. So it seems these improvements help low end cards more than high end cards.

Modified Paths:
--------------
    branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
    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

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2012-07-30 03:54:14 UTC (rev 49374)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2012-07-30 04:00:19 UTC (rev 49375)
@@ -489,9 +489,8 @@
 
 	if (m_canvas->BeginDraw())
 	{
-		ClearFrame();
-
 		m_rasterizer->BeginFrame(m_drawingmode , m_kxsystem->GetTimeInSeconds());
+		ClearFrame();
 		m_rendertools->BeginFrame(m_rasterizer);
 
 		return true;

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h	2012-07-30 03:54:14 UTC (rev 49374)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h	2012-07-30 04:00:19 UTC (rev 49375)
@@ -437,7 +437,8 @@
 		RAS_2DFILTER_NUMBER_OF_FILTERS
 	};
 	enum RAS_UNIFORM_TYPE {
-		RAS_FLOAT = 1,
+		RAS_BUILTIN = 0,
+		RAS_FLOAT,
 		RAS_VEC2,
 		RAS_VEC3,
 		RAS_VEC4,

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.cpp	2012-07-30 03:54:14 UTC (rev 49374)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.cpp	2012-07-30 04:00:19 UTC (rev 49375)
@@ -42,6 +42,7 @@
 #include "RAS_ICanvas.h"
 #include "RAS_Rect.h"
 #include "RAS_OGLFilterManager.h"
+#include "RAS_OpenGLRasterizer.h"
 #include <iostream>
 
 #include "GL/glew.h"
@@ -182,18 +183,28 @@
 
 void RAS_OGLFilterManager::AnalyseShader(int passindex, vector<STR_String>& propNames)
 {
-	GLint bind;
+	FilterUniform uniform;
 	texflag[passindex] = 0;
+	uniform.type = RAS_IRasterizer::RAS_BUILTIN;
+	unsigned int bind;
 
-	bind = m_uniforms[passindex]["bgl_DepthTexture"].bind = glGetUniformLocationARB(m_filters[passindex], "bgl_DepthTexture");
-	if (bind != -1)
+	uniform.name = "bgl_RenderedTexture";
+	uniform.bind = glGetUniformLocationARB(m_filters[passindex], uniform.name);
+	m_uniforms[passindex][uniform.name] = FilterUniform(uniform);
+
+	uniform.name = "bgl_DepthTexture";
+	uniform.bind = glGetUniformLocationARB(m_filters[passindex], uniform.name);
+	m_uniforms[passindex][uniform.name] = FilterUniform(uniform);
+	if (uniform.bind != -1)
 	{
 		if (GLEW_ARB_depth_texture)
 			texflag[passindex] |= 0x1;
 	}
 
-	bind = m_uniforms[passindex]["bgl_LuminanceTexture"].bind = glGetUniformLocationARB(m_filters[passindex], "bgl_LuminanceTexture");
-	if (bind != -1)
+	uniform.name = "bgl_LuminanceTexture";
+	uniform.bind = glGetUniformLocationARB(m_filters[passindex], uniform.name);
+	m_uniforms[passindex][uniform.name] = FilterUniform(uniform);
+	if (uniform.bind != -1)
 	{
 		texflag[passindex] |= 0x2;
 	}
@@ -207,26 +218,41 @@
 				m_properties[passindex].push_back(propNames[i]);
 	}	
 	
-	m_uniforms[passindex]["bgl_TextureCoordinateOffset"].bind = glGetUniformLocationARB(m_filters[passindex], "bgl_TextureCoordinateOffset");
-	m_uniforms[passindex]["bgl_RenderedTextureWidth"].bind = glGetUniformLocationARB(m_filters[passindex], "bgl_RenderedTextureWidth");
-	m_uniforms[passindex]["bgl_RenderedTextureHeight"].bind = glGetUniformLocationARB(m_filters[passindex], "bgl_RenderedTextureHeight");
+	uniform.name = "bgl_TextureCoordinateOffset";
+	uniform.bind = glGetUniformLocationARB(m_filters[passindex], uniform.name);
+	m_uniforms[passindex][uniform.name] = FilterUniform(uniform);
 
+	uniform.name = "bgl_RenderedTextureWidth";
+	uniform.bind = glGetUniformLocationARB(m_filters[passindex], uniform.name);
+	m_uniforms[passindex][uniform.name] = FilterUniform(uniform);
+
+	uniform.name = "bgl_RenderedTextureHeight";
+	uniform.bind = glGetUniformLocationARB(m_filters[passindex], uniform.name);
+	m_uniforms[passindex][uniform.name] = FilterUniform(uniform);
+
 	int i, objProperties = m_properties[passindex].size();
 	for (i=0; i<objProperties; i++)
-		m_uniforms[passindex][m_properties[passindex][i]].bind = glGetUniformLocationARB(m_filters[passindex], m_properties[passindex][i]);
+	{
+
+		uniform.name = m_properties[passindex][i];
+		uniform.bind = glGetUniformLocationARB(m_filters[passindex], uniform.name);
+		m_uniforms[passindex][uniform.name] = FilterUniform(uniform);
+	}
 	std::map<STR_String, FilterUniform>::iterator it;
 	for (it = m_uniforms[passindex].begin(); it != m_uniforms[passindex].end(); it++)
 	{
 		STR_String name = it->first;
 		FilterUniform uniform = it->second;
-		if (uniform.type == 0)
+		if (uniform.type == RAS_IRasterizer::RAS_BUILTIN)
 			continue;
 		uniform.bind = glGetUniformLocationARB(m_filters[passindex], name);
 	}
 }
 
-void RAS_OGLFilterManager::StartShaderProgram(int passindex)
+void RAS_OGLFilterManager::StartShaderProgram(int passindex, RAS_IRasterizer *irast)
 {
+	RAS_OpenGLRasterizer *rast = (RAS_OpenGLRasterizer*)irast;
+
 	GLint uniformLoc;
 	glUseProgramObjectARB(m_filters[passindex]);
 	uniformLoc = m_uniforms[passindex]["bgl_RenderedTexture"].bind;
@@ -242,7 +268,7 @@
 	if (texflag[passindex] & 0x1) {
 		uniformLoc = glGetUniformLocationARB(m_filters[passindex], "bgl_DepthTexture");
 		glActiveTextureARB(GL_TEXTURE1);
-		glBindTexture(GL_TEXTURE_2D, texname[1]);
+		glBindTexture(GL_TEXTURE_2D, rast->GetDepthTarget());
 
 		if (uniformLoc != -1)
 		{
@@ -296,7 +322,7 @@
 	{
 		STR_String name = it->first;
 		FilterUniform uniform = it->second;
-		if (uniform.type == 0)
+		if (uniform.type == RAS_IRasterizer::RAS_BUILTIN)
 			continue;
 		uniformLoc = uniform.bind;
 		if (uniformLoc != -1)
@@ -443,8 +469,9 @@
 	canvascoord[3] = (GLfloat)(textureheight - viewport[1]) / viewport[3];
 }
 
-void RAS_OGLFilterManager::RenderFilters(RAS_ICanvas* canvas)
+void RAS_OGLFilterManager::RenderFilters(RAS_IRasterizer *irast, RAS_ICanvas* canvas)
 {
+	RAS_OpenGLRasterizer *rast = (RAS_OpenGLRasterizer *)irast;
 	bool need_depth=false;
 	bool need_luminance=false;
 	int num_filters = 0;
@@ -473,9 +500,9 @@
 	GLuint	viewport[4]={0};
 	glGetIntegerv(GL_VIEWPORT,(GLint *)viewport);
 	RAS_Rect rect = canvas->GetWindowArea();
-	int rect_width = rect.GetWidth()+1, rect_height = rect.GetHeight()+1;
+	int rect_width = rect.GetRight()+1, rect_height = rect.GetTop()+1;
 
-	if (canvaswidth != canvas->GetWidth() || canvasheight != canvas->GetHeight())
+	if (texturewidth != canvas->GetWidth()+1 || textureheight != canvas->GetHeight()+1)
 	{
 		UpdateOffsetMatrix(canvas);
 		UpdateCanvasTextureCoord((unsigned int*)viewport);
@@ -490,7 +517,7 @@
 
 	if (need_depth) {
 		glActiveTextureARB(GL_TEXTURE1);
-		glBindTexture(GL_TEXTURE_2D, texname[1]);
+		glBindTexture(GL_TEXTURE_2D, rast->GetDepthTarget());
 		//glCopyTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT, rect.GetLeft(), rect.GetBottom(), rect_width, rect_height, 0);
 	}
 
@@ -503,7 +530,7 @@
 	// reverting to texunit 0, without this we get bug [#28462]
 	glActiveTextureARB(GL_TEXTURE0);
 
-	glViewport(rect.GetLeft(), rect.GetBottom(), rect_width, rect.GetHeight()+1);
+	glViewport(0, 0, rect_width, rect_height);
 
 	glDisable(GL_DEPTH_TEST);
 	// in case the previous material was wire
@@ -522,11 +549,11 @@
 	{
 		if (m_filters[passindex] && m_enabled[passindex])
 		{
-			StartShaderProgram(passindex);
+			StartShaderProgram(passindex, rast);
 
 			glActiveTextureARB(GL_TEXTURE0);
 			glBindTexture(GL_TEXTURE_2D, texname[0]);
-			glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, rect.GetLeft(), rect.GetBottom(), rect_width, rect_height, 0); // Don't use texturewidth and textureheight in case we don't have NPOT support
+			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);

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.h	2012-07-30 03:54:14 UTC (rev 49374)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.h	2012-07-30 04:00:19 UTC (rev 49375)
@@ -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);
+	void			StartShaderProgram(int passindex, RAS_IRasterizer *rast);
 	void			EndShaderProgram();
 	void			PrintShaderErrors(unsigned int shader, const char *task, const char *code);
 
@@ -95,7 +95,7 @@
 
 	~RAS_OGLFilterManager();
 
-	void RenderFilters(RAS_ICanvas* canvas);
+	void RenderFilters(RAS_IRasterizer *rast, RAS_ICanvas* canvas);
 	void UpdateUniform(int pass, STR_String& name, RAS_IRasterizer::RAS_UNIFORM_TYPE type, void *data);
 	void EnableFilter(std::vector<STR_String>& propNames, void* gameObj, RAS_IRasterizer::RAS_2DFILTER_MODE mode, int pass, STR_String& text);
 

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-07-30 03:54:14 UTC (rev 49374)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-07-30 04:00:19 UTC (rev 49375)
@@ -90,7 +90,9 @@
 	m_attrib_num(0),
 	//m_last_alphablend(GPU_BLEND_SOLID),
 	m_last_frontface(true),
-	m_materialCachingInfo(0)
+	m_materialCachingInfo(0),
+	m_width(0),
+	m_height(0)
 {
 	m_viewmatrix.setIdentity();
 	m_viewinvmatrix.setIdentity();
@@ -143,6 +145,11 @@
 
 	glShadeModel(GL_SMOOTH);
 
+	// FBO
+	glGenFramebuffersEXT(1, &m_fbo);
+	glGenTextures(1, &m_depth_target);
+	glGenTextures(1, &m_color_target);
+
 	return true;
 }
 
@@ -279,6 +286,10 @@
 	glDisable(GL_LIGHTING);
 	if (GLEW_EXT_separate_specular_color || GLEW_VERSION_1_2)
 		glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
+
+	glDeleteTextures(1, &m_color_target);
+	glDeleteBuffersARB(1, &m_depth_target);
+	glDeleteFramebuffersEXT(1, &m_fbo);
 	
 	EndFrame();
 }
@@ -288,6 +299,8 @@
 	m_time = time;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list