[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