diff --git a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.h b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.h index 58a3eb4bf..aa2f59261 100644 --- a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.h +++ b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.h @@ -180,8 +180,6 @@ public: void processPix( Vector &componentList, const MaterialFeatureData &fd ) override; - - U32 getShaderStages() override { return GFXShaderStage::PIXEL_SHADER; } U32 getOutputTargets( const MaterialFeatureData &fd ) const override { return mOutputTargetMask; } }; diff --git a/Engine/source/shaderGen/shaderGen.cpp b/Engine/source/shaderGen/shaderGen.cpp index f78033c34..23fa7a398 100644 --- a/Engine/source/shaderGen/shaderGen.cpp +++ b/Engine/source/shaderGen/shaderGen.cpp @@ -30,6 +30,7 @@ #include "gfx/gfxDevice.h" #include "core/memVolume.h" #include "core/module.h" +#include "console/persistenceManager.h" #ifdef TORQUE_D3D11 #include "shaderGen/HLSL/customFeatureHLSL.h" @@ -95,6 +96,14 @@ ShaderGen::~ShaderGen() _uninit(); mFileCache.clear(); + + for (ShaderDataMap::Pair data : mProcShaderData) + { + if (data.value->isProperlyAdded() && !data.value->isDeleted()) + data.value->unregisterObject(); + } + + mProcShaderData.clear(); } void ShaderGen::registerInitDelegate(GFXAdapterType adapterType, ShaderGenInitDelegate& initDelegate) @@ -272,14 +281,20 @@ void ShaderGen::generateShader( const MaterialFeatureData& featureData, case VERTEX_SHADER: _processVertFeatures(macros, skipRegen); if (skipRegen) + { + LangElement::deleteElements(); continue; + } _printVertShader(*stream); ((ShaderConnector*)mComponents[C_CONNECTOR])->reset(); break; case PIXEL_SHADER: _processPixFeatures(macros, skipRegen); if (skipRegen) + { + LangElement::deleteElements(); continue; + } _printPixShader(*stream); break; case GEOMETRY_SHADER: @@ -568,14 +583,14 @@ GFXShader* ShaderGen::getShader(const MaterialFeatureData& featureData, const GF String cacheKey = Torque::getStringHash64(shaderDescription); + Vector shaderMacros; + shaderMacros.push_back(GFXShaderMacro("TORQUE_SHADERGEN")); + if (macros) + shaderMacros.merge(*macros); + ShaderDataMap::iterator dat = mProcShaderData.find(cacheKey); if (dat != mProcShaderData.end()) { - Vector shaderMacros; - shaderMacros.push_back(GFXShaderMacro("TORQUE_SHADERGEN")); - if (macros) - shaderMacros.merge(*macros); - // should we loop vertex shader features to build mInstancingFormat before sending it down to see old hob? return dat->value->getShader(shaderMacros); } @@ -589,26 +604,15 @@ GFXShader* ShaderGen::getShader(const MaterialFeatureData& featureData, const GF shaderData->setSamplerName(samplers[samp], samp); } - Vector shaderMacros; - shaderMacros.push_back(GFXShaderMacro("TORQUE_SHADERGEN")); - if (macros) - shaderMacros.merge(*macros); - generateShader(featureData, shaderData, vertexFormat, cacheKey, shaderMacros); shaderData->setInstancingFormat(&mInstancingFormat); - shaderData->registerObject(); - mProcShaderData[cacheKey] = shaderData; + mProcShaderData.insert(cacheKey, shaderData); return shaderData->getShader(shaderMacros); } void ShaderGen::flushProceduralShaders() { - for (auto data : mProcShaderData) - { - data.value->deleteObject(); - } - mProcShaderData.clear(); } diff --git a/Engine/source/terrain/hlsl/terrFeatureHLSL.h b/Engine/source/terrain/hlsl/terrFeatureHLSL.h index 9901faf34..b65b1335b 100644 --- a/Engine/source/terrain/hlsl/terrFeatureHLSL.h +++ b/Engine/source/terrain/hlsl/terrFeatureHLSL.h @@ -153,8 +153,6 @@ public: void processPix( Vector &componentList, const MaterialFeatureData &fd ) override; - - U32 getShaderStages() override { return GFXShaderStage::PIXEL_SHADER; } Resources getResources( const MaterialFeatureData &fd ) override; @@ -184,7 +182,6 @@ public: void processPix(Vector &componentList, const MaterialFeatureData &fd) override; String getName() override { return "Blank Matinfo map"; } - U32 getShaderStages() override { return GFXShaderStage::PIXEL_SHADER; } }; class TerrainHeightMapBlendHLSL : public TerrainFeatHLSL