From d968ce11bfb9b3735fe6e27d3c5960d4477f39f0 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Thu, 21 Aug 2014 02:19:33 +0200 Subject: [PATCH] Add a function that kills shaders and use it when reloading shader. Thus there is no mesh corruption. --- src/graphics/irr_driver.cpp | 2 +- src/graphics/irr_driver.hpp | 2 +- src/graphics/shaders.cpp | 9 ++++++--- src/graphics/shaders.hpp | 1 + 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index d9fa4cdbc..66eaabe21 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -736,7 +736,7 @@ void IrrDriver::applyResolutionSettings() // FIXME: this load sequence is (mostly) duplicated from main.cpp!! // That's just error prone // (we're sure to update main.cpp at some point and forget this one...) - + m_shaders->killShaders(); // initDevice will drop the current device. initDevice(); diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp index eb2cc3f61..3fe360c36 100644 --- a/src/graphics/irr_driver.hpp +++ b/src/graphics/irr_driver.hpp @@ -570,7 +570,7 @@ public: // ----------------------------------------------------------------------- inline video::E_MATERIAL_TYPE getShader(const ShaderType num) {return m_shaders->getShader(num);} // ----------------------------------------------------------------------- - inline void updateShaders() {m_shaders->loadShaders();} + inline void updateShaders() {m_shaders->killShaders();} // ------------------------------------------------------------------------ inline video::IShaderConstantSetCallBack* getCallback(const ShaderType num) { diff --git a/src/graphics/shaders.cpp b/src/graphics/shaders.cpp index f140e6bc9..ab076906c 100644 --- a/src/graphics/shaders.cpp +++ b/src/graphics/shaders.cpp @@ -399,9 +399,6 @@ void Shaders::loadShaders() } initGL(); - // Clean alive shaders - for (unsigned i = 0; i < CleanTable.size(); i++) - CleanTable[i](); CleanTable.clear(); initQuadVBO(); initQuadBuffer(); @@ -418,6 +415,12 @@ void Shaders::loadShaders() UtilShader::ColoredLine::init(); } +void Shaders::killShaders() +{ + for (unsigned i = 0; i < CleanTable.size(); i++) + CleanTable[i](); +} + Shaders::~Shaders() { u32 i; diff --git a/src/graphics/shaders.hpp b/src/graphics/shaders.hpp index 16c38fcb3..efce0d589 100644 --- a/src/graphics/shaders.hpp +++ b/src/graphics/shaders.hpp @@ -1039,6 +1039,7 @@ public: video::IShaderConstantSetCallBack * m_callbacks[ES_COUNT]; void loadShaders(); + void killShaders(); private: void check(const int num) const;