From 86e460c08087f36edf5b2b65ece90360fccd1d7c Mon Sep 17 00:00:00 2001 From: turanszkij Date: Thu, 29 Oct 2015 18:29:44 +0100 Subject: [PATCH] fixed multithreaded rendering bug + lua bindings updated --- WickedEngine/DeferredRenderableComponent.cpp | 72 ++++++++++--------- .../DeferredRenderableComponent_BindLua.cpp | 2 + WickedEngine/ForwardRenderableComponent.cpp | 66 ++++++++--------- .../ForwardRenderableComponent_BindLua.cpp | 2 + WickedEngine/MainComponent.cpp | 2 +- .../Renderable3DComponent_BindLua.cpp | 17 +++++ WickedEngine/Renderable3DComponent_BindLua.h | 2 + WickedEngine/wiGraphicsThreads.h | 1 - WickedEngine/wiRenderer.cpp | 18 ++--- readme.txt | 2 - 10 files changed, 104 insertions(+), 80 deletions(-) diff --git a/WickedEngine/DeferredRenderableComponent.cpp b/WickedEngine/DeferredRenderableComponent.cpp index 9c7103495..6a6ca0be1 100644 --- a/WickedEngine/DeferredRenderableComponent.cpp +++ b/WickedEngine/DeferredRenderableComponent.cpp @@ -246,57 +246,34 @@ void DeferredRenderableComponent::setPreferredThreadingCount(unsigned short valu if (!wiRenderer::getMultithreadingSupport()) { + if (value > 1) + wiHelper::messageBox("Multithreaded rendering not supported by your hardware! Falling back to single threading!", "Caution"); return; } switch (value){ - case 0: break; + case 0: + case 1: + break; case 2: - workerThreads.push_back(new wiTaskThread([&] - { - RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SHADOWS)); - RenderReflections(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SHADOWS)); - wiRenderer::FinishCommandList(GRAPHICSTHREAD_SHADOWS); - })); - workerThreads.push_back(new wiTaskThread([&] - { - RenderScene(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - RenderSecondaryScene(rtGBuffer, GetFinalRT(), wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - RenderLightShafts(rtGBuffer, wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - RenderComposition1(GetFinalRT(), wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - RenderBloom(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - RenderComposition2(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - wiRenderer::FinishCommandList(GRAPHICSTHREAD_REFLECTIONS); - })); - break; - case 3: - workerThreads.push_back(new wiTaskThread([&] - { - RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SHADOWS)); - wiRenderer::FinishCommandList(GRAPHICSTHREAD_SHADOWS); - })); workerThreads.push_back(new wiTaskThread([&] { RenderReflections(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - wiRenderer::FinishCommandList(GRAPHICSTHREAD_REFLECTIONS); + wiRenderer::FinishCommandList(GRAPHICSTHREAD_REFLECTIONS); })); workerThreads.push_back(new wiTaskThread([&] { + RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); RenderScene(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); RenderSecondaryScene(rtGBuffer, GetFinalRT(), wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); RenderLightShafts(rtGBuffer, wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); RenderComposition1(GetFinalRT(), wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); RenderBloom(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); RenderComposition2(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); - wiRenderer::FinishCommandList(GRAPHICSTHREAD_SCENE); + wiRenderer::FinishCommandList(GRAPHICSTHREAD_SCENE); })); break; - case 4: - workerThreads.push_back(new wiTaskThread([&] - { - RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SHADOWS)); - wiRenderer::FinishCommandList(GRAPHICSTHREAD_SHADOWS); - })); + case 3: workerThreads.push_back(new wiTaskThread([&] { RenderReflections(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); @@ -304,8 +281,9 @@ void DeferredRenderableComponent::setPreferredThreadingCount(unsigned short valu })); workerThreads.push_back(new wiTaskThread([&] { + RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); RenderScene(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); - wiRenderer::FinishCommandList(GRAPHICSTHREAD_SCENE); + wiRenderer::FinishCommandList(GRAPHICSTHREAD_SCENE); })); workerThreads.push_back(new wiTaskThread([&] { @@ -314,11 +292,35 @@ void DeferredRenderableComponent::setPreferredThreadingCount(unsigned short valu RenderComposition1(GetFinalRT(), wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1)); RenderBloom(wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1)); RenderComposition2(wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1)); - wiRenderer::FinishCommandList(GRAPHICSTHREAD_MISC1); + wiRenderer::FinishCommandList(GRAPHICSTHREAD_MISC1); })); break; + case 4: default: - wiHelper::messageBox("You can assign a maximum of 4 rendering threads for graphics!\nFalling back to single threading!", "Caution"); + workerThreads.push_back(new wiTaskThread([&] + { + RenderReflections(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); + wiRenderer::FinishCommandList(GRAPHICSTHREAD_REFLECTIONS); + })); + workerThreads.push_back(new wiTaskThread([&] + { + RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); + RenderScene(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); + wiRenderer::FinishCommandList(GRAPHICSTHREAD_SCENE); + })); + workerThreads.push_back(new wiTaskThread([&] + { + RenderSecondaryScene(rtGBuffer, GetFinalRT(), wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1)); + RenderLightShafts(rtGBuffer, wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1)); + RenderComposition1(GetFinalRT(), wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1)); + wiRenderer::FinishCommandList(GRAPHICSTHREAD_MISC1); + })); + workerThreads.push_back(new wiTaskThread([&] + { + RenderBloom(wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC2)); + RenderComposition2(wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC2)); + wiRenderer::FinishCommandList(GRAPHICSTHREAD_MISC2); + })); break; }; } diff --git a/WickedEngine/DeferredRenderableComponent_BindLua.cpp b/WickedEngine/DeferredRenderableComponent_BindLua.cpp index 132a32d3f..481bf2d39 100644 --- a/WickedEngine/DeferredRenderableComponent_BindLua.cpp +++ b/WickedEngine/DeferredRenderableComponent_BindLua.cpp @@ -38,6 +38,8 @@ Luna::FunctionType DeferredRenderableCompon lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldFocus), lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldStrength), + + lunamethod(Renderable3DComponent_BindLua, SetPreferredThreadingCount), { NULL, NULL } }; Luna::PropertyType DeferredRenderableComponent_BindLua::properties[] = { diff --git a/WickedEngine/ForwardRenderableComponent.cpp b/WickedEngine/ForwardRenderableComponent.cpp index e65b39173..0f2799aef 100644 --- a/WickedEngine/ForwardRenderableComponent.cpp +++ b/WickedEngine/ForwardRenderableComponent.cpp @@ -101,35 +101,16 @@ void ForwardRenderableComponent::setPreferredThreadingCount(unsigned short value if (!wiRenderer::getMultithreadingSupport()) { + if (value > 1) + wiHelper::messageBox("Multithreaded rendering not supported by your hardware! Falling back to single threading!", "Caution"); return; } - switch (value){ - case 0: break; - case 2: - workerThreads.push_back(new wiTaskThread([&] - { - RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SHADOWS)); - RenderReflections(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SHADOWS)); - wiRenderer::FinishCommandList(GRAPHICSTHREAD_SHADOWS); - })); - workerThreads.push_back(new wiTaskThread([&] - { - RenderScene(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - RenderSecondaryScene(rtMain, rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - RenderLightShafts(rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - RenderComposition1(rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - RenderBloom(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - RenderComposition2(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); - wiRenderer::FinishCommandList(GRAPHICSTHREAD_REFLECTIONS); - })); + switch (value) { + case 0: + case 1: break; - case 3: - workerThreads.push_back(new wiTaskThread([&] - { - RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SHADOWS)); - wiRenderer::FinishCommandList(GRAPHICSTHREAD_SHADOWS); - })); + case 2: workerThreads.push_back(new wiTaskThread([&] { RenderReflections(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); @@ -137,6 +118,7 @@ void ForwardRenderableComponent::setPreferredThreadingCount(unsigned short value })); workerThreads.push_back(new wiTaskThread([&] { + RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); RenderScene(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); RenderSecondaryScene(rtMain, rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); RenderLightShafts(rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); @@ -146,12 +128,7 @@ void ForwardRenderableComponent::setPreferredThreadingCount(unsigned short value wiRenderer::FinishCommandList(GRAPHICSTHREAD_SCENE); })); break; - case 4: - workerThreads.push_back(new wiTaskThread([&] - { - RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SHADOWS)); - wiRenderer::FinishCommandList(GRAPHICSTHREAD_SHADOWS); - })); + case 3: workerThreads.push_back(new wiTaskThread([&] { RenderReflections(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); @@ -159,6 +136,7 @@ void ForwardRenderableComponent::setPreferredThreadingCount(unsigned short value })); workerThreads.push_back(new wiTaskThread([&] { + RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); RenderScene(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); wiRenderer::FinishCommandList(GRAPHICSTHREAD_SCENE); })); @@ -172,8 +150,32 @@ void ForwardRenderableComponent::setPreferredThreadingCount(unsigned short value wiRenderer::FinishCommandList(GRAPHICSTHREAD_MISC1); })); break; + case 4: default: - wiHelper::messageBox("You can assign a maximum of 4 rendering threads for graphics!\nFalling back to single threading!", "Caution"); + workerThreads.push_back(new wiTaskThread([&] + { + RenderReflections(wiRenderer::getDeferredContext(GRAPHICSTHREAD_REFLECTIONS)); + wiRenderer::FinishCommandList(GRAPHICSTHREAD_REFLECTIONS); + })); + workerThreads.push_back(new wiTaskThread([&] + { + RenderShadows(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); + RenderScene(wiRenderer::getDeferredContext(GRAPHICSTHREAD_SCENE)); + wiRenderer::FinishCommandList(GRAPHICSTHREAD_SCENE); + })); + workerThreads.push_back(new wiTaskThread([&] + { + RenderSecondaryScene(rtMain, rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1)); + RenderLightShafts(rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1)); + RenderComposition1(rtMain, wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC1)); + wiRenderer::FinishCommandList(GRAPHICSTHREAD_MISC1); + })); + workerThreads.push_back(new wiTaskThread([&] + { + RenderBloom(wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC2)); + RenderComposition2(wiRenderer::getDeferredContext(GRAPHICSTHREAD_MISC2)); + wiRenderer::FinishCommandList(GRAPHICSTHREAD_MISC2); + })); break; }; } diff --git a/WickedEngine/ForwardRenderableComponent_BindLua.cpp b/WickedEngine/ForwardRenderableComponent_BindLua.cpp index c91dab53f..14af25a5c 100644 --- a/WickedEngine/ForwardRenderableComponent_BindLua.cpp +++ b/WickedEngine/ForwardRenderableComponent_BindLua.cpp @@ -38,6 +38,8 @@ Luna::FunctionType ForwardRenderableComponen lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldFocus), lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldStrength), + + lunamethod(Renderable3DComponent_BindLua, SetPreferredThreadingCount), { NULL, NULL } }; Luna::PropertyType ForwardRenderableComponent_BindLua::properties[] = { diff --git a/WickedEngine/MainComponent.cpp b/WickedEngine/MainComponent.cpp index 237d4f187..bd645db93 100644 --- a/WickedEngine/MainComponent.cpp +++ b/WickedEngine/MainComponent.cpp @@ -137,7 +137,7 @@ void MainComponent::Compose() { wiImage::BatchBegin(); wiImage::Draw(wiTextureHelper::getInstance()->getColorGradeDefault(), wiImageEffects(0, 0, 256, 16)); - wiImage::Draw(wiRenderer::GetColorGrading(), wiImageEffects(screenW-256, 0, 256, 16)); + wiImage::Draw(wiRenderer::GetColorGrading(), wiImageEffects(screenW-256.f, 0, 256, 16)); } wiBackLog::Draw(); diff --git a/WickedEngine/Renderable3DComponent_BindLua.cpp b/WickedEngine/Renderable3DComponent_BindLua.cpp index a153082c2..213d25b1d 100644 --- a/WickedEngine/Renderable3DComponent_BindLua.cpp +++ b/WickedEngine/Renderable3DComponent_BindLua.cpp @@ -39,6 +39,8 @@ Luna::FunctionType Renderable3DComponent_BindLua: lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldFocus), lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldStrength), + + lunamethod(Renderable3DComponent_BindLua, SetPreferredThreadingCount), { NULL, NULL } }; Luna::PropertyType Renderable3DComponent_BindLua::properties[] = { @@ -290,6 +292,21 @@ int Renderable3DComponent_BindLua::SetDepthOfFieldStrength(lua_State* L) return 0; } +int Renderable3DComponent_BindLua::SetPreferredThreadingCount(lua_State* L) +{ + if (component == nullptr) + { + wiLua::SError(L, "SetPreferredThreadingCount(int value) component is null!"); + return 0; + } + if (wiLua::SGetArgCount(L) > 0) + { + ((Renderable3DComponent*)component)->setPreferredThreadingCount((unsigned short)wiLua::SGetInt(L, 1)); + } + else + wiLua::SError(L, "SetPreferredThreadingCount(int value) not enough arguments!"); + return 0; +} void Renderable3DComponent_BindLua::Bind() { diff --git a/WickedEngine/Renderable3DComponent_BindLua.h b/WickedEngine/Renderable3DComponent_BindLua.h index 5d40db46b..24ea7afdd 100644 --- a/WickedEngine/Renderable3DComponent_BindLua.h +++ b/WickedEngine/Renderable3DComponent_BindLua.h @@ -34,6 +34,8 @@ public: int SetDepthOfFieldFocus(lua_State* L); int SetDepthOfFieldStrength(lua_State* L); + int SetPreferredThreadingCount(lua_State* L); + static void Bind(); }; diff --git a/WickedEngine/wiGraphicsThreads.h b/WickedEngine/wiGraphicsThreads.h index 606269e89..5a2a8dba9 100644 --- a/WickedEngine/wiGraphicsThreads.h +++ b/WickedEngine/wiGraphicsThreads.h @@ -3,7 +3,6 @@ enum GRAPHICSTHREAD { GRAPHICSTHREAD_REFLECTIONS, - GRAPHICSTHREAD_SHADOWS, GRAPHICSTHREAD_SCENE, GRAPHICSTHREAD_MISC1, GRAPHICSTHREAD_MISC2, diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index e877825d6..ea9aa7a43 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -2879,16 +2879,16 @@ void wiRenderer::DrawForShadowMap(ID3D11DeviceContext* context) for (CulledObjectList::iterator viter = visibleInstances.begin(); viter != visibleInstances.end(); ++viter) { if ((*viter)->particleEmitter != Object::wiParticleEmitter::EMITTER_INVISIBLE) { if (mesh->softBody || (*viter)->armatureDeform) - mesh->AddRenderableInstance(Instance(XMMatrixIdentity(), (*viter)->transparency), k, GRAPHICSTHREAD_SHADOWS); + mesh->AddRenderableInstance(Instance(XMMatrixIdentity(), (*viter)->transparency), k, GRAPHICSTHREAD_SCENE); else - mesh->AddRenderableInstance(Instance(XMMatrixTranspose(XMLoadFloat4x4(&(*viter)->world)), (*viter)->transparency), k, GRAPHICSTHREAD_SHADOWS); + mesh->AddRenderableInstance(Instance(XMMatrixTranspose(XMLoadFloat4x4(&(*viter)->world)), (*viter)->transparency), k, GRAPHICSTHREAD_SCENE); ++k; } } if (k < 1) continue; - mesh->UpdateRenderableInstances(visibleInstances.size(), GRAPHICSTHREAD_SHADOWS, context); + mesh->UpdateRenderableInstances(visibleInstances.size(), GRAPHICSTHREAD_SCENE, context); BindVertexBuffer((mesh->sOutBuffer ? mesh->sOutBuffer : mesh->meshVertBuff), 0, sizeof(Vertex), context); @@ -2983,16 +2983,16 @@ void wiRenderer::DrawForShadowMap(ID3D11DeviceContext* context) for (CulledObjectList::iterator viter = visibleInstances.begin(); viter != visibleInstances.end(); ++viter) { if ((*viter)->particleEmitter != Object::wiParticleEmitter::EMITTER_INVISIBLE) { if (mesh->softBody || (*viter)->armatureDeform) - mesh->AddRenderableInstance(Instance(XMMatrixIdentity(), (*viter)->transparency), k, GRAPHICSTHREAD_SHADOWS); + mesh->AddRenderableInstance(Instance(XMMatrixIdentity(), (*viter)->transparency), k, GRAPHICSTHREAD_SCENE); else - mesh->AddRenderableInstance(Instance(XMMatrixTranspose(XMLoadFloat4x4(&(*viter)->world)), (*viter)->transparency), k, GRAPHICSTHREAD_SHADOWS); + mesh->AddRenderableInstance(Instance(XMMatrixTranspose(XMLoadFloat4x4(&(*viter)->world)), (*viter)->transparency), k, GRAPHICSTHREAD_SCENE); ++k; } } if (k < 1) continue; - mesh->UpdateRenderableInstances(visibleInstances.size(), GRAPHICSTHREAD_SHADOWS, context); + mesh->UpdateRenderableInstances(visibleInstances.size(), GRAPHICSTHREAD_SCENE, context); BindVertexBuffer((mesh->sOutBuffer ? mesh->sOutBuffer : mesh->meshVertBuff), 0, sizeof(Vertex), context); @@ -3088,16 +3088,16 @@ void wiRenderer::DrawForShadowMap(ID3D11DeviceContext* context) for (CulledObjectList::iterator viter = visibleInstances.begin(); viter != visibleInstances.end(); ++viter) { if ((*viter)->particleEmitter != Object::wiParticleEmitter::EMITTER_INVISIBLE) { if (mesh->softBody || (*viter)->armatureDeform) - mesh->AddRenderableInstance(Instance(XMMatrixIdentity(), (*viter)->transparency), k, GRAPHICSTHREAD_SHADOWS); + mesh->AddRenderableInstance(Instance(XMMatrixIdentity(), (*viter)->transparency), k, GRAPHICSTHREAD_SCENE); else - mesh->AddRenderableInstance(Instance(XMMatrixTranspose(XMLoadFloat4x4(&(*viter)->world)), (*viter)->transparency), k, GRAPHICSTHREAD_SHADOWS); + mesh->AddRenderableInstance(Instance(XMMatrixTranspose(XMLoadFloat4x4(&(*viter)->world)), (*viter)->transparency), k, GRAPHICSTHREAD_SCENE); ++k; } } if (k < 1) continue; - mesh->UpdateRenderableInstances(visibleInstances.size(), GRAPHICSTHREAD_SHADOWS, context); + mesh->UpdateRenderableInstances(visibleInstances.size(), GRAPHICSTHREAD_SCENE, context); BindVertexBuffer((mesh->sOutBuffer ? mesh->sOutBuffer : mesh->meshVertBuff), 0, sizeof(Vertex), context); diff --git a/readme.txt b/readme.txt index 8bf6578b8..89f7a1a56 100644 --- a/readme.txt +++ b/readme.txt @@ -76,8 +76,6 @@ _________________________________________________________ - Decouple API from wiRenderer The renderer has become too large, unmanageable, hardly readable. Aside from that it is a good idea to decouple them for possible support of multiple apis in the future... - - Multithreaded rendering bug after refactor (flashing geometry)(turned off for the time being) - Probably some instancing info being written in multiple theads at once Other: - Cleanup No comment