From e941833676867778d77001bd82e266445a023c74 Mon Sep 17 00:00:00 2001 From: sam gateau Date: Thu, 6 Dec 2018 17:27:13 -0800 Subject: [PATCH] gathering the lighting stage jobs in their own task away from the renderer specificities --- .../src/AssembleLightingStageTask.cpp | 52 +++++++++++++++++++ .../src/AssembleLightingStageTask.h | 44 ++++++++++++++++ .../render-utils/src/RenderCommonTask.cpp | 17 ------ libraries/render-utils/src/RenderCommonTask.h | 29 +---------- .../render-utils/src/RenderDeferredTask.cpp | 26 +++++----- .../render-utils/src/RenderDeferredTask.h | 4 +- .../render-utils/src/RenderForwardTask.cpp | 24 ++++++--- .../render-utils/src/RenderForwardTask.h | 4 +- .../render-utils/src/RenderShadowTask.cpp | 1 + libraries/render-utils/src/RenderViewTask.cpp | 8 ++- libraries/task/src/task/Varying.h | 51 +++++++++++++++++- 11 files changed, 188 insertions(+), 72 deletions(-) create mode 100644 libraries/render-utils/src/AssembleLightingStageTask.cpp create mode 100644 libraries/render-utils/src/AssembleLightingStageTask.h diff --git a/libraries/render-utils/src/AssembleLightingStageTask.cpp b/libraries/render-utils/src/AssembleLightingStageTask.cpp new file mode 100644 index 0000000000..7ef5817edc --- /dev/null +++ b/libraries/render-utils/src/AssembleLightingStageTask.cpp @@ -0,0 +1,52 @@ +// +// Created by Samuel Gateau on 2018/12/06 +// Copyright 2013-2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +#include "AssembleLightingStageTask.h" + + +void FetchCurrentFrames::run(const render::RenderContextPointer& renderContext, Outputs& outputs) { + auto lightStage = renderContext->_scene->getStage(); + assert(lightStage); + outputs.edit0() = std::make_shared(lightStage->_currentFrame); + + auto backgroundStage = renderContext->_scene->getStage(); + assert(backgroundStage); + outputs.edit1() = std::make_shared(backgroundStage->_currentFrame); + + auto hazeStage = renderContext->_scene->getStage(); + assert(hazeStage); + outputs.edit2() = std::make_shared(hazeStage->_currentFrame); + + auto bloomStage = renderContext->_scene->getStage(); + assert(bloomStage); + outputs.edit3() = std::make_shared(bloomStage->_currentFrame); +} + + +void RenderUpdateLightingStagesTask::build(JobModel& task, const render::Varying& input, render::Varying& output) { + const auto& items = input.get(); + + const auto& metas = items[RenderFetchCullSortTask::META]; + + // Clear Light, Haze, Bloom, and Skybox Stages and render zones from the general metas bucket + const auto zones = task.addJob("ZoneRenderer", metas); + + // Draw Lights just add the lights to the current list of lights to deal with. NOt really gpu job for now. + task.addJob("DrawLight", lights); + + // Fetch the current frame stacks from all the stages + const auto currentStageFrames = task.addJob("FetchCurrentFrames"); + + const auto lightFrame = currentStageFrames.getN(0); + const auto backgroundFrame = currentStageFrames.getN(1); + const auto hazeFrame = currentStageFrames.getN(2); + const auto bloomFrame = currentStageFrames.getN(3); + + outputs.edit0() = currentStageFrames; + outputs.edit1() = zones; +} + diff --git a/libraries/render-utils/src/AssembleLightingStageTask.h b/libraries/render-utils/src/AssembleLightingStageTask.h new file mode 100644 index 0000000000..bd440d23a1 --- /dev/null +++ b/libraries/render-utils/src/AssembleLightingStageTask.h @@ -0,0 +1,44 @@ +// +// Created by Samuel Gateau on 2018/12/06 +// Copyright 2013-2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_AssembleLightingStageTask_h +#define hifi_AssembleLightingStageTask_h + +#include +#include "LightingModel.h" + +#include "LightStage.h" +#include "BackgroundStage.h" +#include "HazeStage.h" +#include "BloomStage.h" + +#include "ZoneRenderer.h" + + +class FetchCurrentFrames { +public: + using Outputs = render::VaryingSet4; + using JobModel = render::Job::ModelO; + + FetchCurrentFrames() {} + + void run(const render::RenderContextPointer& renderContext, Outputs& outputs); +}; + +class AssembleLightingStageTask { +public: + using Inputs = RenderFetchCullSortTask::BucketList; + using Outputs = render::VaryingSet2; + using JobModel = render::Task::ModelIO; + + AssembleLightingStageTask() {} + + void build(JobModel& task, const render::Varying& input, render::Varying& output); +}; + +#endif diff --git a/libraries/render-utils/src/RenderCommonTask.cpp b/libraries/render-utils/src/RenderCommonTask.cpp index 4422d15d5c..863d6f19ea 100644 --- a/libraries/render-utils/src/RenderCommonTask.cpp +++ b/libraries/render-utils/src/RenderCommonTask.cpp @@ -232,20 +232,3 @@ void ExtractFrustums::run(const render::RenderContextPointer& renderContext, con } } -void FetchCurrentFrames::run(const render::RenderContextPointer& renderContext, Outputs& outputs) { - auto lightStage = renderContext->_scene->getStage(); - assert(lightStage); - outputs.edit0() = std::make_shared(lightStage->_currentFrame); - - auto backgroundStage = renderContext->_scene->getStage(); - assert(backgroundStage); - outputs.edit1() = std::make_shared(backgroundStage->_currentFrame); - - auto hazeStage = renderContext->_scene->getStage(); - assert(hazeStage); - outputs.edit2() = std::make_shared(hazeStage->_currentFrame); - - auto bloomStage = renderContext->_scene->getStage(); - assert(bloomStage); - outputs.edit3() = std::make_shared(bloomStage->_currentFrame); -} diff --git a/libraries/render-utils/src/RenderCommonTask.h b/libraries/render-utils/src/RenderCommonTask.h index 8f3a6e3ed4..5d4f2184a6 100644 --- a/libraries/render-utils/src/RenderCommonTask.h +++ b/libraries/render-utils/src/RenderCommonTask.h @@ -10,13 +10,8 @@ #define hifi_RenderCommonTask_h #include -#include -#include "LightingModel.h" - #include "LightStage.h" -#include "BackgroundStage.h" -#include "HazeStage.h" -#include "BloomStage.h" +#include "LightingModel.h" class BeginGPURangeTimer { public: @@ -118,26 +113,4 @@ public: void run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& output); }; - -class FetchCurrentFrames { -public: - using Outputs = render::VaryingSet4; - using JobModel = render::Job::ModelO; - - FetchCurrentFrames() {} - - void run(const render::RenderContextPointer& renderContext, Outputs& outputs); -}; - -class RenderUpdateStageLightingTask { -public: - using Inputs = - using Outputs = render::VaryingSet4; - using JobModel = render::Job::ModelIO; - - RenderUpdateStageLightingTask() {} - - void run(const render::RenderContextPointer& renderContext, Outputs& outputs); -}; - #endif // hifi_RenderDeferredTask_h diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index eab28ac0f6..62990cb819 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -151,6 +151,17 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto& spatialSelection = fetchedItems[1]; + // Extract the Lighting Stages Current frame ( and zones) + const auto& lightingStageInputs = inputs[1]; + // Fetch the current frame stacks from all the stages + const auto& currentStageFrames = lightingStageInputs[0]; + const auto& lightFrame = currentStageFrames[0]; + const auto& backgroundFrame = currentStageFrames[1]; + const auto& hazeFrame = currentStageFrames[2]; + const auto& bloomFrame = currentStageFrames[3]; + + const auto& zones = lightingStageInputs[1]; + fadeEffect->build(task, opaques); const auto jitter = task.addJob("JitterCam"); @@ -207,19 +218,6 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto velocityBufferOutputs = task.addJob("VelocityBuffer", velocityBufferInputs); const auto velocityBuffer = velocityBufferOutputs.getN(0); -/* // Clear Light, Haze, Bloom, and Skybox Stages and render zones from the general metas bucket - const auto zones = task.addJob("ZoneRenderer", metas); - - // Draw Lights just add the lights to the current list of lights to deal with. NOt really gpu job for now. - task.addJob("DrawLight", lights); - - // Fetch the current frame stacks from all the stages - const auto currentStageFrames = task.addJob("FetchCurrentFrames"); - const auto lightFrame = currentStageFrames.getN(0); - const auto backgroundFrame = currentStageFrames.getN(1); - const auto hazeFrame = currentStageFrames.getN(2); - const auto bloomFrame = currentStageFrames.getN(3); -*/ // Light Clustering // Create the cluster grid of lights, cpu job for now const auto lightClusteringPassInputs = LightClusteringPass::Inputs(deferredFrameTransform, lightingModel, lightFrame, linearDepthTarget).asVarying(); @@ -279,7 +277,7 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren // Debugging task is happening in the "over" layer after tone mapping and just before HUD { // Debug the bounds of the rendered items, still look at the zbuffer - const auto debugInputs = RenderDeferredTaskDebug::Input(fetchedItems, inputs[1], zones, selectedItems, currentStageFrames, prepareDeferredOutputs, deferredFrameTransform, jitter, lightingModel).asVarying(); + const auto debugInputs = RenderDeferredTaskDebug::Input(fetchedItems, inputs[2], zones, selectedItems, currentStageFrames, prepareDeferredOutputs, deferredFrameTransform, jitter, lightingModel).asVarying(); task.addJob("DebugRenderDeferredTask", debugInputs); } diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index c18daa6d3d..078b792d57 100644 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -14,10 +14,10 @@ #include #include +#include "AssembleLightingStageTask.h" #include "LightingModel.h" #include "LightClusters.h" #include "RenderShadowTask.h" -#include "HazeStage.h" class DrawDeferredConfig : public render::Job::Config { Q_OBJECT @@ -137,7 +137,7 @@ signals: class RenderDeferredTask { public: - using Input = render::VaryingSet2; + using Input = render::VaryingSet3; using Config = RenderDeferredTaskConfig; using JobModel = render::Task::ModelI; diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 59461b3b44..fb29f026e2 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -48,12 +48,24 @@ using namespace render; extern void initForwardPipelines(ShapePlumber& plumber); void RenderForwardTask::build(JobModel& task, const render::Varying& input, render::Varying& output) { - // const auto& inputs = input.get(); - const auto& fetchedItems = input.get(); + const auto& inputs = input.get(); + const auto& fetchedItems = inputs.get0(); // const auto& fetchedItems = inputs[0]; // const auto& items = fetchedItems[0]; const auto& items = fetchedItems.get0(); + + const auto& lightingStageInputs = inputs[1]; + // Fetch the current frame stacks from all the stages + const auto& currentStageFrames = lightingStageInputs[0]; + const auto& lightFrame = currentStageFrames[0]; + const auto& backgroundFrame = currentStageFrames[1]; + const auto& hazeFrame = currentStageFrames[2]; + const auto& bloomFrame = currentStageFrames[3]; + + const auto& zones = lightingStageInputs[1]; + + auto fadeEffect = DependencyManager::get(); // Prepare the ShapePipelines @@ -82,12 +94,12 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend const auto lightingModel = task.addJob("LightingModel"); // Filter zones from the general metas bucket - const auto zones = task.addJob("ZoneRenderer", metas); + // const auto zones = task.addJob("ZoneRenderer", metas); // Fetch the current frame stacks from all the stages - const auto currentFrames = task.addJob("FetchCurrentFrames"); - const auto lightFrame = currentFrames.getN(0); - const auto backgroundFrame = currentFrames.getN(1); + // const auto currentFrames = task.addJob("FetchCurrentFrames"); + // const auto lightFrame = currentFrames.getN(0); + // const auto backgroundFrame = currentFrames.getN(1); //const auto hazeFrame = currentFrames.getN(2); //const auto bloomFrame = currentFrames.getN(3); diff --git a/libraries/render-utils/src/RenderForwardTask.h b/libraries/render-utils/src/RenderForwardTask.h index 54341d1ded..0a2684555d 100755 --- a/libraries/render-utils/src/RenderForwardTask.h +++ b/libraries/render-utils/src/RenderForwardTask.h @@ -14,12 +14,12 @@ #include #include +#include "AssembleLightingStageTask.h" #include "LightingModel.h" -#include "LightStage.h" class RenderForwardTask { public: - using Input = RenderFetchCullSortTask::Output; + using Input = render::VaryingSet2; using JobModel = render::Task::ModelI; RenderForwardTask() {} diff --git a/libraries/render-utils/src/RenderShadowTask.cpp b/libraries/render-utils/src/RenderShadowTask.cpp index b5b3e9c5b9..a753722489 100644 --- a/libraries/render-utils/src/RenderShadowTask.cpp +++ b/libraries/render-utils/src/RenderShadowTask.cpp @@ -25,6 +25,7 @@ #include "RenderUtilsLogging.h" #include "RenderCommonTask.h" +#include "AssembleLightingStageTask.h" #include "FadeEffect.h" diff --git a/libraries/render-utils/src/RenderViewTask.cpp b/libraries/render-utils/src/RenderViewTask.cpp index 2e03082ff4..53e50d244e 100644 --- a/libraries/render-utils/src/RenderViewTask.cpp +++ b/libraries/render-utils/src/RenderViewTask.cpp @@ -10,6 +10,7 @@ // #include "RenderViewTask.h" +#include "AssembleLightingStageTask.h" #include "RenderShadowTask.h" #include "RenderDeferredTask.h" #include "RenderForwardTask.h" @@ -20,14 +21,17 @@ void RenderViewTask::build(JobModel& task, const render::Varying& input, render: const auto items = task.addJob("FetchCullSort", cullFunctor, tagBits, tagMask); assert(items.canCast()); + + const auto lightingStageFramesAndZones = task.addJob("AssembleStages", items[0]); + if (isDeferred) { // Warning : the cull functor passed to the shadow pass should only be testing for LOD culling. If frustum culling // is performed, then casters not in the view frustum will be removed, which is not what we wish. const auto cascadeSceneBBoxes = task.addJob("RenderShadowTask", cullFunctor, tagBits, tagMask); - const auto renderInput = RenderDeferredTask::Input(items, cascadeSceneBBoxes).asVarying(); + const auto renderInput = RenderDeferredTask::Input(items, lightingStageFramesAndZones, cascadeSceneBBoxes).asVarying(); task.addJob("RenderDeferredTask", renderInput, true); } else { - task.addJob("Forward", items); + task.addJob("Forward", items, lightingStageFramesAndZones); } } diff --git a/libraries/task/src/task/Varying.h b/libraries/task/src/task/Varying.h index 7be49006b9..10c894c72f 100644 --- a/libraries/task/src/task/Varying.h +++ b/libraries/task/src/task/Varying.h @@ -155,6 +155,13 @@ public: Varying asVarying() const { return Varying((*this)); } }; +template Varying varyingGetSub(const VaryingSet3& dat, uint8_t index) { + return data[index]; +} +template uint8_t varyingGetLength(const VaryingSet3& data) { + return data.length(); +} + template class VaryingSet4 : public std::tuple{ public: @@ -191,7 +198,12 @@ public: Varying asVarying() const { return Varying((*this)); } }; - +template Varying varyingGetSub(const VaryingSet4& dat, uint8_t index) { + return data[index]; +} +template uint8_t varyingGetLength(const VaryingSet4& data) { + return data.length(); +} template class VaryingSet5 : public std::tuple{ @@ -234,6 +246,12 @@ public: Varying asVarying() const { return Varying((*this)); } }; +template Varying varyingGetSub(const VaryingSet5& dat, uint8_t index) { + return data[index]; +} +template uint8_t varyingGetLength(const VaryingSet5& data) { + return data.length(); +} template class VaryingSet6 : public std::tuple{ @@ -282,6 +300,12 @@ public: Varying asVarying() const { return Varying((*this)); } }; +template Varying varyingGetSub(const VaryingSet6& dat, uint8_t index) { + return data[index]; +} +template uint8_t varyingGetLength(const VaryingSet6& data) { + return data.length(); +} template class VaryingSet7 : public std::tuple{ @@ -335,6 +359,12 @@ public: Varying asVarying() const { return Varying((*this)); } }; +template Varying varyingGetSub(const VaryingSet7& dat, uint8_t index) { + return data[index]; +} +template uint8_t varyingGetLength(const VaryingSet7& data) { + return data.length(); +} template class VaryingSet8 : public std::tuple { @@ -393,6 +423,12 @@ public: Varying asVarying() const { return Varying((*this)); } }; +template Varying varyingGetSub(const VaryingSet8& dat, uint8_t index) { + return data[index]; +} +template uint8_t varyingGetLength(const VaryingSet8& data) { + return data.length(); +} template class VaryingSet9 : public std::tuple { @@ -455,6 +491,12 @@ public: Varying asVarying() const { return Varying((*this)); } }; +template Varying varyingGetSub(const VaryingSet9& dat, uint8_t index) { + return data[index]; +} +template uint8_t varyingGetLength(const VaryingSet9& data) { + return data.length(); +} template < class T, int NUM > class VaryingArray : public std::array { @@ -470,6 +512,13 @@ public: std::copy(list.begin(), list.end(), std::array::begin()); } }; +template Varying varyingGetSub(const VaryingArray& dat, uint8_t index) { + return data[index]; +} +template uint8_t varyingGetLength(const VaryingArray& data) { + return NUM; +} + } #endif // hifi_task_Varying_h