From 4128371b7fd44b5a664a3c5c118321b0af0ef8e0 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Wed, 19 Mar 2014 19:02:29 +0100 Subject: [PATCH] Do not switch program if it's not used. --- src/graphics/stkanimatedmesh.cpp | 55 +++++++++++------- src/graphics/stkmeshscenenode.cpp | 96 ++++++++++++++++++------------- 2 files changed, 90 insertions(+), 61 deletions(-) diff --git a/src/graphics/stkanimatedmesh.cpp b/src/graphics/stkanimatedmesh.cpp index 8bb937dd1..70f206d16 100644 --- a/src/graphics/stkanimatedmesh.cpp +++ b/src/graphics/stkanimatedmesh.cpp @@ -171,11 +171,13 @@ void STKAnimatedMesh::render() computeMVP(ModelViewProjectionMatrix); computeTIMV(TransposeInverseModelView); - glUseProgram(MeshShader::ObjectPass1Shader::Program); + if (!GeometricMesh[FPSM_DEFAULT].empty()) + glUseProgram(MeshShader::ObjectPass1Shader::Program); for (unsigned i = 0; i < GeometricMesh[FPSM_DEFAULT].size(); i++) drawSolidPass1(*GeometricMesh[FPSM_DEFAULT][i], FPSM_DEFAULT); - glUseProgram(MeshShader::ObjectRefPass1Shader::Program); + if (!GeometricMesh[FPSM_ALPHA_REF_TEXTURE].empty()) + glUseProgram(MeshShader::ObjectRefPass1Shader::Program); for (unsigned i = 0; i < GeometricMesh[FPSM_ALPHA_REF_TEXTURE].size(); i++) drawSolidPass1(*GeometricMesh[FPSM_ALPHA_REF_TEXTURE][i], FPSM_ALPHA_REF_TEXTURE); @@ -184,36 +186,43 @@ void STKAnimatedMesh::render() if (irr_driver->getPhase() == SOLID_LIT_PASS) { - glUseProgram(MeshShader::ObjectPass2Shader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_DEFAULT].size(); i++) - drawSolidPass2(*ShadedMesh[SM_DEFAULT][i], SM_DEFAULT); + if (!ShadedMesh[SM_DEFAULT].empty()) + glUseProgram(MeshShader::ObjectPass2Shader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_DEFAULT].size(); i++) + drawSolidPass2(*ShadedMesh[SM_DEFAULT][i], SM_DEFAULT); - glUseProgram(MeshShader::ObjectRefPass2Shader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_ALPHA_REF_TEXTURE].size(); i++) - drawSolidPass2(*ShadedMesh[SM_ALPHA_REF_TEXTURE][i], SM_ALPHA_REF_TEXTURE); + if (!ShadedMesh[SM_ALPHA_REF_TEXTURE].empty()) + glUseProgram(MeshShader::ObjectRefPass2Shader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_ALPHA_REF_TEXTURE].size(); i++) + drawSolidPass2(*ShadedMesh[SM_ALPHA_REF_TEXTURE][i], SM_ALPHA_REF_TEXTURE); - glUseProgram(MeshShader::ObjectRimLimitShader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_RIMLIT].size(); i++) - drawSolidPass2(*ShadedMesh[SM_RIMLIT][i], SM_RIMLIT); + if (!ShadedMesh[SM_RIMLIT].empty()) + glUseProgram(MeshShader::ObjectRimLimitShader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_RIMLIT].size(); i++) + drawSolidPass2(*ShadedMesh[SM_RIMLIT][i], SM_RIMLIT); - glUseProgram(MeshShader::ObjectUnlitShader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_UNLIT].size(); i++) - drawSolidPass2(*ShadedMesh[SM_UNLIT][i], SM_UNLIT); + if (!ShadedMesh[SM_UNLIT].empty()) + glUseProgram(MeshShader::ObjectUnlitShader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_UNLIT].size(); i++) + drawSolidPass2(*ShadedMesh[SM_UNLIT][i], SM_UNLIT); - glUseProgram(MeshShader::DetailledObjectPass2Shader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_DETAILS].size(); i++) - drawSolidPass2(*ShadedMesh[SM_DETAILS][i], SM_DETAILS); + if (!ShadedMesh[SM_DETAILS].empty()) + glUseProgram(MeshShader::DetailledObjectPass2Shader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_DETAILS].size(); i++) + drawSolidPass2(*ShadedMesh[SM_DETAILS][i], SM_DETAILS); - return; + return; } if (irr_driver->getPhase() == SHADOW_PASS) { - glUseProgram(MeshShader::ShadowShader::Program); + if (!GeometricMesh[FPSM_DEFAULT].empty()) + glUseProgram(MeshShader::ShadowShader::Program); for (unsigned i = 0; i < GeometricMesh[FPSM_DEFAULT].size(); i++) drawShadow(*GeometricMesh[FPSM_DEFAULT][i]); - glUseProgram(MeshShader::RefShadowShader::Program); + if (!GeometricMesh[FPSM_ALPHA_REF_TEXTURE].empty()) + glUseProgram(MeshShader::RefShadowShader::Program); for (unsigned i = 0; i < GeometricMesh[FPSM_ALPHA_REF_TEXTURE].size(); i++) drawShadowRef(*GeometricMesh[FPSM_ALPHA_REF_TEXTURE][i]); return; @@ -223,11 +232,13 @@ void STKAnimatedMesh::render() { computeMVP(ModelViewProjectionMatrix); - glUseProgram(MeshShader::BubbleShader::Program); + if (!TransparentMesh[TM_BUBBLE].empty()) + glUseProgram(MeshShader::BubbleShader::Program); for (unsigned i = 0; i < TransparentMesh[TM_BUBBLE].size(); i++) drawBubble(*TransparentMesh[TM_BUBBLE][i], ModelViewProjectionMatrix); - glUseProgram(MeshShader::TransparentShader::Program); + if (!TransparentMesh[TM_DEFAULT].empty()) + glUseProgram(MeshShader::TransparentShader::Program); for (unsigned i = 0; i < TransparentMesh[TM_DEFAULT].size(); i++) drawTransparentObject(*TransparentMesh[TM_DEFAULT][i], ModelViewProjectionMatrix, (*TransparentMesh[TM_DEFAULT][i]).TextureMatrix); return; diff --git a/src/graphics/stkmeshscenenode.cpp b/src/graphics/stkmeshscenenode.cpp index 6e7ce395e..6365ade59 100644 --- a/src/graphics/stkmeshscenenode.cpp +++ b/src/graphics/stkmeshscenenode.cpp @@ -309,19 +309,23 @@ void STKMeshSceneNode::render() computeMVP(ModelViewProjectionMatrix); computeTIMV(TransposeInverseModelView); - glUseProgram(MeshShader::ObjectPass1Shader::Program); + if (!GeometricMesh[FPSM_DEFAULT].empty()) + glUseProgram(MeshShader::ObjectPass1Shader::Program); for (unsigned i = 0; i < GeometricMesh[FPSM_DEFAULT].size(); i++) drawSolidPass1(*GeometricMesh[FPSM_DEFAULT][i], FPSM_DEFAULT); - glUseProgram(MeshShader::ObjectRefPass1Shader::Program); + if (!GeometricMesh[FPSM_ALPHA_REF_TEXTURE].empty()) + glUseProgram(MeshShader::ObjectRefPass1Shader::Program); for (unsigned i = 0; i < GeometricMesh[FPSM_ALPHA_REF_TEXTURE].size(); i++) drawSolidPass1(*GeometricMesh[FPSM_ALPHA_REF_TEXTURE][i], FPSM_ALPHA_REF_TEXTURE); - glUseProgram(MeshShader::NormalMapShader::Program); + if (!GeometricMesh[FPSM_NORMAL_MAP].empty()) + glUseProgram(MeshShader::NormalMapShader::Program); for (unsigned i = 0; i < GeometricMesh[FPSM_NORMAL_MAP].size(); i++) drawSolidPass1(*GeometricMesh[FPSM_NORMAL_MAP][i], FPSM_NORMAL_MAP); - glUseProgram(MeshShader::GrassPass1Shader::Program); + if (!GeometricMesh[FPSM_GRASS].empty()) + glUseProgram(MeshShader::GrassPass1Shader::Program); for (unsigned i = 0; i < GeometricMesh[FPSM_GRASS].size(); i++) drawSolidPass1(*GeometricMesh[FPSM_GRASS][i], FPSM_GRASS); @@ -330,56 +334,68 @@ void STKMeshSceneNode::render() if (irr_driver->getPhase() == SOLID_LIT_PASS) { - glUseProgram(MeshShader::ObjectPass2Shader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_DEFAULT].size(); i++) - drawSolidPass2(*ShadedMesh[SM_DEFAULT][i], SM_DEFAULT); + if (!ShadedMesh[SM_DEFAULT].empty()) + glUseProgram(MeshShader::ObjectPass2Shader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_DEFAULT].size(); i++) + drawSolidPass2(*ShadedMesh[SM_DEFAULT][i], SM_DEFAULT); - glUseProgram(MeshShader::ObjectRefPass2Shader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_ALPHA_REF_TEXTURE].size(); i++) - drawSolidPass2(*ShadedMesh[SM_ALPHA_REF_TEXTURE][i], SM_ALPHA_REF_TEXTURE); + if (!ShadedMesh[SM_ALPHA_REF_TEXTURE].empty()) + glUseProgram(MeshShader::ObjectRefPass2Shader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_ALPHA_REF_TEXTURE].size(); i++) + drawSolidPass2(*ShadedMesh[SM_ALPHA_REF_TEXTURE][i], SM_ALPHA_REF_TEXTURE); - glUseProgram(MeshShader::ObjectRimLimitShader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_RIMLIT].size(); i++) - drawSolidPass2(*ShadedMesh[SM_RIMLIT][i], SM_RIMLIT); + if (!ShadedMesh[SM_RIMLIT].empty()) + glUseProgram(MeshShader::ObjectRimLimitShader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_RIMLIT].size(); i++) + drawSolidPass2(*ShadedMesh[SM_RIMLIT][i], SM_RIMLIT); - glUseProgram(MeshShader::SphereMapShader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_SPHEREMAP].size(); i++) - drawSolidPass2(*ShadedMesh[SM_SPHEREMAP][i], SM_SPHEREMAP); + if (!ShadedMesh[SM_SPHEREMAP].empty()) + glUseProgram(MeshShader::SphereMapShader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_SPHEREMAP].size(); i++) + drawSolidPass2(*ShadedMesh[SM_SPHEREMAP][i], SM_SPHEREMAP); - glUseProgram(MeshShader::SplattingShader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_SPLATTING].size(); i++) - drawSolidPass2(*ShadedMesh[SM_SPLATTING][i], SM_SPLATTING); + if (!ShadedMesh[SM_SPLATTING].empty()) + glUseProgram(MeshShader::SplattingShader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_SPLATTING].size(); i++) + drawSolidPass2(*ShadedMesh[SM_SPLATTING][i], SM_SPLATTING); - glUseProgram(MeshShader::GrassPass2Shader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_GRASS].size(); i++) - drawSolidPass2(*ShadedMesh[SM_GRASS][i], SM_GRASS); + if (!ShadedMesh[SM_GRASS].empty()) + glUseProgram(MeshShader::GrassPass2Shader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_GRASS].size(); i++) + drawSolidPass2(*ShadedMesh[SM_GRASS][i], SM_GRASS); - glUseProgram(MeshShader::ObjectUnlitShader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_UNLIT].size(); i++) - drawSolidPass2(*ShadedMesh[SM_UNLIT][i], SM_UNLIT); + if (!ShadedMesh[SM_UNLIT].empty()) + glUseProgram(MeshShader::ObjectUnlitShader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_UNLIT].size(); i++) + drawSolidPass2(*ShadedMesh[SM_UNLIT][i], SM_UNLIT); - glUseProgram(MeshShader::CausticsShader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_CAUSTICS].size(); i++) - drawSolidPass2(*ShadedMesh[SM_CAUSTICS][i], SM_CAUSTICS); + if (!ShadedMesh[SM_CAUSTICS].empty()) + glUseProgram(MeshShader::CausticsShader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_CAUSTICS].size(); i++) + drawSolidPass2(*ShadedMesh[SM_CAUSTICS][i], SM_CAUSTICS); - glUseProgram(MeshShader::DetailledObjectPass2Shader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_DETAILS].size(); i++) - drawSolidPass2(*ShadedMesh[SM_DETAILS][i], SM_DETAILS); + if (!ShadedMesh[SM_DETAILS].empty()) + glUseProgram(MeshShader::DetailledObjectPass2Shader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_DETAILS].size(); i++) + drawSolidPass2(*ShadedMesh[SM_DETAILS][i], SM_DETAILS); - glUseProgram(MeshShader::UntexturedObjectShader::Program); - for (unsigned i = 0; i < ShadedMesh[SM_UNTEXTURED].size(); i++) - drawSolidPass2(*ShadedMesh[SM_UNTEXTURED][i], SM_UNTEXTURED); + if (!ShadedMesh[SM_UNTEXTURED].empty()) + glUseProgram(MeshShader::UntexturedObjectShader::Program); + for (unsigned i = 0; i < ShadedMesh[SM_UNTEXTURED].size(); i++) + drawSolidPass2(*ShadedMesh[SM_UNTEXTURED][i], SM_UNTEXTURED); - return; + return; } if (irr_driver->getPhase() == SHADOW_PASS) { - glUseProgram(MeshShader::ShadowShader::Program); + if (!GeometricMesh[FPSM_DEFAULT].empty()) + glUseProgram(MeshShader::ShadowShader::Program); for (unsigned i = 0; i < GeometricMesh[FPSM_DEFAULT].size(); i++) drawShadow(*GeometricMesh[FPSM_DEFAULT][i]); - glUseProgram(MeshShader::RefShadowShader::Program); + if (!GeometricMesh[FPSM_ALPHA_REF_TEXTURE].empty()) + glUseProgram(MeshShader::RefShadowShader::Program); for (unsigned i = 0; i < GeometricMesh[FPSM_ALPHA_REF_TEXTURE].size(); i++) drawShadowRef(*GeometricMesh[FPSM_ALPHA_REF_TEXTURE][i]); return; @@ -401,11 +417,13 @@ void STKMeshSceneNode::render() { computeMVP(ModelViewProjectionMatrix); - glUseProgram(MeshShader::BubbleShader::Program); + if (!TransparentMesh[TM_BUBBLE].empty()) + glUseProgram(MeshShader::BubbleShader::Program); for (unsigned i = 0; i < TransparentMesh[TM_BUBBLE].size(); i++) drawBubble(*TransparentMesh[TM_BUBBLE][i], ModelViewProjectionMatrix); - glUseProgram(MeshShader::TransparentShader::Program); + if (!TransparentMesh[TM_DEFAULT].empty()) + glUseProgram(MeshShader::TransparentShader::Program); for (unsigned i = 0; i < TransparentMesh[TM_DEFAULT].size(); i++) drawTransparentObject(*TransparentMesh[TM_DEFAULT][i], ModelViewProjectionMatrix, (*TransparentMesh[TM_DEFAULT][i]).TextureMatrix); return;