From 58927b72b98e60dc93f0f4f933eda21053bac22d Mon Sep 17 00:00:00 2001 From: turanszkij Date: Sun, 27 Dec 2015 20:16:32 +0100 Subject: [PATCH] updated shader loading, cleaning --- WickedEngine/wiEmittedParticle.cpp | 1 - WickedEngine/wiFont.cpp | 1 - WickedEngine/wiHairParticle.cpp | 1 - WickedEngine/wiImage.cpp | 4 +-- WickedEngine/wiLensFlare.cpp | 1 - WickedEngine/wiRenderer.cpp | 26 ++++++-------- WickedEngine/wiRenderer.h | 1 + WickedEngine/wiResourceManager.cpp | 54 ++++++++++++++++++++++++------ 8 files changed, 58 insertions(+), 31 deletions(-) diff --git a/WickedEngine/wiEmittedParticle.cpp b/WickedEngine/wiEmittedParticle.cpp index 229261503..186ec19f7 100644 --- a/WickedEngine/wiEmittedParticle.cpp +++ b/WickedEngine/wiEmittedParticle.cpp @@ -350,7 +350,6 @@ void wiEmittedParticle::LoadShaders() vertexShader = vsinfo->vertexShader; vertexLayout = vsinfo->vertexLayout; } - delete vsinfo; pixelShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "pointspritePS.cso", wiResourceManager::PIXELSHADER)); diff --git a/WickedEngine/wiFont.cpp b/WickedEngine/wiFont.cpp index d0a2d5dd5..4351f0cfa 100644 --- a/WickedEngine/wiFont.cpp +++ b/WickedEngine/wiFont.cpp @@ -144,7 +144,6 @@ void wiFont::LoadShaders() vertexShader = vsinfo->vertexShader; vertexLayout = vsinfo->vertexLayout; } - delete vsinfo; pixelShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "fontPS.cso", wiResourceManager::PIXELSHADER)); diff --git a/WickedEngine/wiHairParticle.cpp b/WickedEngine/wiHairParticle.cpp index d6327755b..9562e6d38 100644 --- a/WickedEngine/wiHairParticle.cpp +++ b/WickedEngine/wiHairParticle.cpp @@ -81,7 +81,6 @@ void wiHairParticle::LoadShaders() vs = vsinfo->vertexShader; il = vsinfo->vertexLayout; } - delete vsinfo; diff --git a/WickedEngine/wiImage.cpp b/WickedEngine/wiImage.cpp index 9e2bf1110..ab56236f1 100644 --- a/WickedEngine/wiImage.cpp +++ b/WickedEngine/wiImage.cpp @@ -79,8 +79,8 @@ void wiImage::LoadShaders() { - vertexShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "imageVS.cso", wiResourceManager::VERTEXSHADER)); - screenVS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "screenVS.cso", wiResourceManager::VERTEXSHADER)); + vertexShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "imageVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; + screenVS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "screenVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; pixelShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "imagePS.cso", wiResourceManager::PIXELSHADER)); blurHPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "horizontalBlurPS.cso", wiResourceManager::PIXELSHADER)); diff --git a/WickedEngine/wiLensFlare.cpp b/WickedEngine/wiLensFlare.cpp index 8d8ff2523..4c4425cee 100644 --- a/WickedEngine/wiLensFlare.cpp +++ b/WickedEngine/wiLensFlare.cpp @@ -105,7 +105,6 @@ void wiLensFlare::LoadShaders(){ vertexShader = vsinfo->vertexShader; inputLayout = vsinfo->vertexLayout; } - delete vsinfo; pixelShader = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "lensFlarePS.cso", wiResourceManager::PIXELSHADER)); diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 059ca2299..35a831c4d 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -1004,7 +1004,6 @@ void wiRenderer::LoadBasicShaders() vertexShader10 = vsinfo->vertexShader; vertexLayout = vsinfo->vertexLayout; } - delete vsinfo; } { @@ -1025,7 +1024,6 @@ void wiRenderer::LoadBasicShaders() sOVS = vsinfo->vertexShader; sOIL = vsinfo->vertexLayout; } - delete vsinfo; } { @@ -1042,13 +1040,13 @@ void wiRenderer::LoadBasicShaders() } - vertexShader = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectVS.cso", wiResourceManager::VERTEXSHADER)); - lightVS[0] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "dirLightVS.cso", wiResourceManager::VERTEXSHADER)); - lightVS[1] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "pointLightVS.cso", wiResourceManager::VERTEXSHADER)); - lightVS[2] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "spotLightVS.cso", wiResourceManager::VERTEXSHADER)); - vSpotLightVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "vSpotLightVS.cso", wiResourceManager::VERTEXSHADER)); - vPointLightVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "vPointLightVS.cso", wiResourceManager::VERTEXSHADER)); - decalVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "decalVS.cso", wiResourceManager::VERTEXSHADER)); + vertexShader = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; + lightVS[0] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "dirLightVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; + lightVS[1] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "pointLightVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; + lightVS[2] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "spotLightVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; + vSpotLightVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "vSpotLightVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; + vPointLightVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "vPointLightVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; + decalVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "decalVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; pixelShader = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectPS.cso", wiResourceManager::PIXELSHADER)); transparentPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "effectPS_transparent.cso", wiResourceManager::PIXELSHADER)); @@ -1075,7 +1073,6 @@ void wiRenderer::LoadLineShaders() lineVS = vsinfo->vertexShader; lineIL = vsinfo->vertexLayout; } - delete vsinfo; linePS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "linesPS.cso", wiResourceManager::PIXELSHADER)); @@ -1089,15 +1086,15 @@ void wiRenderer::LoadTessShaders() } void wiRenderer::LoadSkyShaders() { - skyVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "skyVS.cso", wiResourceManager::VERTEXSHADER)); + skyVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "skyVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; skyPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "skyPS.cso", wiResourceManager::PIXELSHADER)); } void wiRenderer::LoadShadowShaders() { - shVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowVS.cso", wiResourceManager::VERTEXSHADER)); - cubeShVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowVS.cso", wiResourceManager::VERTEXSHADER)); + shVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; + cubeShVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; shPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowPS.cso", wiResourceManager::PIXELSHADER)); cubeShPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowPS.cso", wiResourceManager::PIXELSHADER)); @@ -1108,7 +1105,7 @@ void wiRenderer::LoadShadowShaders() void wiRenderer::LoadWaterShaders() { - waterVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "waterVS.cso", wiResourceManager::VERTEXSHADER)); + waterVS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "waterVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; waterPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "waterPS.cso", wiResourceManager::PIXELSHADER)); } @@ -1126,7 +1123,6 @@ void wiRenderer::LoadTrailShaders(){ trailVS = vsinfo->vertexShader; trailIL = vsinfo->vertexLayout; } - delete vsinfo; trailPS = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "trailPS.cso", wiResourceManager::PIXELSHADER)); diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index 6d90d6283..83c7a571f 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -65,6 +65,7 @@ public: typedef ID3D11GeometryShader* GeometryShader; typedef ID3D11HullShader* HullShader; typedef ID3D11DomainShader* DomainShader; + typedef ID3D11ComputeShader* ComputeShader; typedef ID3D11InputLayout* VertexLayout; typedef D3D11_INPUT_ELEMENT_DESC VertexLayoutDesc; typedef ID3D11BlendState* BlendState; diff --git a/WickedEngine/wiResourceManager.cpp b/WickedEngine/wiResourceManager.cpp index 7680401ff..352be25ca 100644 --- a/WickedEngine/wiResourceManager.cpp +++ b/WickedEngine/wiResourceManager.cpp @@ -130,18 +130,22 @@ void* wiResourceManager::add(const string& name, Data_Type newType BYTE* buffer; size_t bufferSize; if (wiHelper::readByteData(name, &buffer, bufferSize)){ - wiRenderer::VertexShader shader = nullptr; - wiRenderer::graphicsDevice->CreateVertexShader(buffer, bufferSize, NULL, &shader); + wiRenderer::VertexShaderInfo* vertexShaderInfo = new wiRenderer::VertexShaderInfo; + wiRenderer::graphicsDevice->CreateVertexShader(buffer, bufferSize, NULL, &vertexShaderInfo->vertexShader); if (vertexLayoutDesc != nullptr && elementCount > 0){ - wiRenderer::VertexShaderInfo* vertexShaderInfo = new wiRenderer::VertexShaderInfo(); - vertexShaderInfo->vertexShader = shader; wiRenderer::graphicsDevice->CreateInputLayout(vertexLayoutDesc, elementCount, buffer, bufferSize, &vertexShaderInfo->vertexLayout); - if (vertexShaderInfo->vertexShader != nullptr && vertexShaderInfo->vertexLayout != nullptr){ + if (vertexShaderInfo->vertexLayout == nullptr) + { + success = nullptr; + } + else + { success = vertexShaderInfo; } } - else{ - success = shader; + else + { + success = (vertexShaderInfo->vertexShader == nullptr ? nullptr : vertexShaderInfo); } delete[] buffer; } @@ -237,7 +241,11 @@ void* wiResourceManager::add(const string& name, Data_Type newType bool wiResourceManager::del(const string& name) { - const Resource* res = get(name); + Resource* res = nullptr; + container::iterator it = resources.find(name); + if (it != resources.end()) + res = it->second; + else return false; if(res){ LOCK(); @@ -247,13 +255,30 @@ bool wiResourceManager::del(const string& name) switch(res->type){ case Data_Type::IMAGE: case Data_Type::IMAGE_STAGING: + wiRenderer::SafeRelease(reinterpret_cast(res->data)); + break; case Data_Type::VERTEXSHADER: + { + wiRenderer::VertexShaderInfo* vsinfo = (wiRenderer::VertexShaderInfo*)res->data; + wiRenderer::SafeRelease(vsinfo->vertexLayout); + wiRenderer::SafeRelease(vsinfo->vertexShader); + delete vsinfo; + } + break; case Data_Type::PIXELSHADER: + wiRenderer::SafeRelease(reinterpret_cast(res->data)); + break; case Data_Type::GEOMETRYSHADER: + wiRenderer::SafeRelease(reinterpret_cast(res->data)); + break; case Data_Type::HULLSHADER: + wiRenderer::SafeRelease(reinterpret_cast(res->data)); + break; case Data_Type::DOMAINSHADER: + wiRenderer::SafeRelease(reinterpret_cast(res->data)); + break; case Data_Type::COMPUTESHADER: - wiRenderer::SafeRelease(((wiRenderer::APIInterface&)res->data)); + wiRenderer::SafeRelease(reinterpret_cast(res->data)); break; case Data_Type::SOUND: case Data_Type::MUSIC: @@ -264,6 +289,7 @@ bool wiResourceManager::del(const string& name) break; }; + delete res; resources.erase(name); UNLOCK(); @@ -275,7 +301,15 @@ bool wiResourceManager::del(const string& name) bool wiResourceManager::CleanUp() { - // TODO + vectorresNames(0); + for (auto& x : resources) + { + resNames.push_back(x.first); + } + for (auto& x : resNames) + { + del(x); + } LOCK(); resources.clear(); UNLOCK();