[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15472] branches/apricot/source: Apricot Branch: two minor optimizations to avoid unneeded shader
Brecht Van Lommel
brechtvanlommel at pandora.be
Mon Jul 7 19:14:44 CEST 2008
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);
More information about the Bf-blender-cvs
mailing list