fixed multithreaded rendering bug + lua bindings updated

This commit is contained in:
turanszkij
2015-10-29 18:29:44 +01:00
parent 0bd9d84789
commit 86e460c080
10 changed files with 104 additions and 80 deletions
+37 -35
View File
@@ -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;
};
}
@@ -38,6 +38,8 @@ Luna<DeferredRenderableComponent_BindLua>::FunctionType DeferredRenderableCompon
lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldFocus),
lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldStrength),
lunamethod(Renderable3DComponent_BindLua, SetPreferredThreadingCount),
{ NULL, NULL }
};
Luna<DeferredRenderableComponent_BindLua>::PropertyType DeferredRenderableComponent_BindLua::properties[] = {
+34 -32
View File
@@ -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;
};
}
@@ -38,6 +38,8 @@ Luna<ForwardRenderableComponent_BindLua>::FunctionType ForwardRenderableComponen
lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldFocus),
lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldStrength),
lunamethod(Renderable3DComponent_BindLua, SetPreferredThreadingCount),
{ NULL, NULL }
};
Luna<ForwardRenderableComponent_BindLua>::PropertyType ForwardRenderableComponent_BindLua::properties[] = {
+1 -1
View File
@@ -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();
@@ -39,6 +39,8 @@ Luna<Renderable3DComponent_BindLua>::FunctionType Renderable3DComponent_BindLua:
lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldFocus),
lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldStrength),
lunamethod(Renderable3DComponent_BindLua, SetPreferredThreadingCount),
{ NULL, NULL }
};
Luna<Renderable3DComponent_BindLua>::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()
{
@@ -34,6 +34,8 @@ public:
int SetDepthOfFieldFocus(lua_State* L);
int SetDepthOfFieldStrength(lua_State* L);
int SetPreferredThreadingCount(lua_State* L);
static void Bind();
};
-1
View File
@@ -3,7 +3,6 @@
enum GRAPHICSTHREAD
{
GRAPHICSTHREAD_REFLECTIONS,
GRAPHICSTHREAD_SHADOWS,
GRAPHICSTHREAD_SCENE,
GRAPHICSTHREAD_MISC1,
GRAPHICSTHREAD_MISC2,
+9 -9
View File
@@ -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);
-2
View File
@@ -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