Revision: 15472
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15472
Author:   blendix
Date:     2008-07-07 19:14:44 +0200 (Mon, 07 Jul 2008)

Log Message:
-----------
Apricot Branch: two minor optimizations to avoid unneeded shader
and opengl light state changes.

Modified Paths:
--------------
    branches/apricot/source/blender/gpu/intern/gpu_material.c
    branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.cpp
    branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.h
    branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.h
    branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
    branches/apricot/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp

Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c   2008-07-07 
15:12:42 UTC (rev 15471)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c   2008-07-07 
17:14:44 UTC (rev 15472)
@@ -1184,7 +1184,7 @@
 
 int GPU_lamp_shadow_layer(GPULamp *lamp)
 {
-       if(lamp->fb && lamp->tex && (lamp->mode & LA_LAYER|LA_LAYER_SHADOW))
+       if(lamp->fb && lamp->tex && (lamp->mode & (LA_LAYER|LA_LAYER_SHADOW)))
                return lamp->lay;
        else
                return -1;

Modified: branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.cpp
===================================================================
--- branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.cpp      
2008-07-07 15:12:42 UTC (rev 15471)
+++ branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.cpp      
2008-07-07 17:14:44 UTC (rev 15472)
@@ -137,4 +137,10 @@
        GPU_material_bind_uniforms(mGPUMat, obmat, viewmat);
 }
 
+bool BL_BlenderShader::Identical(BL_BlenderShader *blshader)
+{
+       /* to avoid unneeded state switches */
+       return (blshader && mGPUMat == blshader->mGPUMat && mLightLayer == 
blshader->mLightLayer);
+}
+
 // eof

Modified: branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.h
===================================================================
--- branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.h        
2008-07-07 15:12:42 UTC (rev 15471)
+++ branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.h        
2008-07-07 17:14:44 UTC (rev 15472)
@@ -10,6 +10,8 @@
 #include "MT_Tuple3.h"
 #include "MT_Tuple4.h"
 
+#include "RAS_IPolygonMaterial.h"
+
 struct Material;
 class BL_Material;
 
@@ -36,6 +38,8 @@
        int GetAttribNum();
        void SetAttribs(class RAS_IRasterizer* ras, const BL_Material *mat);
        void Update(const class KX_MeshSlot & ms, class RAS_IRasterizer* rasty);
+
+       bool Identical(BL_BlenderShader *blshader);
 };
 
 #endif//__BL_GPUSHADER_H__

Modified: branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.cpp    
2008-07-07 15:12:42 UTC (rev 15471)
+++ branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.cpp    
2008-07-07 17:14:44 UTC (rev 15472)
@@ -238,8 +238,9 @@
                return;
        }
 
-       BL_Texture::DisableAllTextures();
-       if(mBlenderShader != mLastBlenderShader) {
+       if(!mBlenderShader->Identical(mLastBlenderShader)) {
+               BL_Texture::DisableAllTextures();
+
                if(mLastBlenderShader)
                        mLastBlenderShader->SetProg(false);
 
@@ -484,6 +485,18 @@
        return dopass;
 }
 
+bool KX_BlenderMaterial::UsesLighting(RAS_IRasterizer *rasty) const
+{
+       if(!RAS_IPolyMaterial::UsesLighting(rasty))
+               return false;
+
+       if(mShader && mShader->Ok());
+       else if(mBlenderShader && mBlenderShader->Ok())
+               return false;
+       
+       return true;
+}
+
 void KX_BlenderMaterial::ActivateMeshSlot(const KX_MeshSlot & ms, 
RAS_IRasterizer* rasty) const
 {
        if(mShader && GLEW_ARB_shader_objects)

Modified: branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.h
===================================================================
--- branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.h      
2008-07-07 15:12:42 UTC (rev 15471)
+++ branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.h      
2008-07-07 17:14:44 UTC (rev 15472)
@@ -107,6 +107,7 @@
        void ActivatGLMaterials( RAS_IRasterizer* rasty )const;
        void ActivateTexGen( RAS_IRasterizer *ras ) const;
 
+       bool UsesLighting(RAS_IRasterizer *rasty) const;
 
        // message centers
        void    setTexData( bool enable,RAS_IRasterizer *ras);

Modified: branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
===================================================================
--- branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp      
2008-07-07 15:12:42 UTC (rev 15471)
+++ branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp      
2008-07-07 17:14:44 UTC (rev 15472)
@@ -27,6 +27,7 @@
  */
 
 #include "RAS_IPolygonMaterial.h"
+#include "RAS_IRasterizer.h"
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -148,4 +149,19 @@
        return m_flag;
 }
 
+bool RAS_IPolyMaterial::UsesLighting(RAS_IRasterizer *rasty) const
+{
+       bool dolights = false;
+
+       if(m_flag & RAS_BLENDERMAT)
+               dolights = (m_flag &RAS_MULTILIGHT)!=0;
+       else if(rasty->GetDrawingMode() < RAS_IRasterizer::KX_SOLID);
+       else if(rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW);
+       else
+               dolights = (m_drawingmode & 16)!=0;
+       
+       return dolights;
+}
+
 unsigned int RAS_IPolyMaterial::m_newpolymatid = 0;
+

Modified: branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
===================================================================
--- branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h        
2008-07-07 15:12:42 UTC (rev 15471)
+++ branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h        
2008-07-07 17:14:44 UTC (rev 15472)
@@ -140,6 +140,8 @@
        const STR_String&       GetMaterialName() const;
        const STR_String&       GetTextureName() const;
        const unsigned int      GetFlag() const;
+
+       virtual bool            UsesLighting(RAS_IRasterizer *rasty) const;
        
        /*
         * PreCalculate texture gen

Modified: branches/apricot/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
===================================================================
--- branches/apricot/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp        
2008-07-07 15:12:42 UTC (rev 15471)
+++ branches/apricot/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp        
2008-07-07 17:14:44 UTC (rev 15472)
@@ -174,19 +174,7 @@
        if (!rasty->SetMaterial(*m_material))
                return false;
        
-       bool dolights = false;
-       const unsigned int flag = m_material->GetFlag();
-
-       if( flag & RAS_BLENDERMAT)
-               dolights = (flag &RAS_MULTILIGHT)!=0;
-       else if(rasty->GetDrawingMode() < RAS_IRasterizer::KX_SOLID)
-               dolights = false;
-       else if(rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW)
-               dolights = false;
-       else
-               dolights = (m_material->GetDrawingMode()&16)!=0;
-
-       if (dolights)
+       if (m_material->UsesLighting(rasty))
                
rendertools->ProcessLighting(RAS_IRenderTools::RAS_LIGHT_OBJECT_LAYER/*m_material->GetLightLayer()*/);
        else
                rendertools->ProcessLighting(-1);


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to