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