[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