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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to