[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