From 259a97c43ad46490daf5de8e75a614816f62adb3 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Sun, 2 Dec 2018 23:41:57 -0800 Subject: [PATCH] Exploring varying with names --- .../render-utils/src/RenderDeferredTask.cpp | 125 ++++-------------- libraries/task/src/task/Task.h | 2 +- libraries/task/src/task/Varying.h | 34 ++++- 3 files changed, 57 insertions(+), 104 deletions(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 95e1298de8..b6565b0c85 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -83,9 +83,9 @@ public: class RenderDeferredTaskDebug { public: - using Input = render::VaryingSet8; + PrepareDeferred::Outputs, GenerateDeferredFrameTransform::Output, JitterSample::Output, LightingModel>; // using Config = RenderDeferredTaskConfig; using JobModel = render::Task::ModelI; @@ -138,28 +138,17 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren initDeferredPipelines(*shapePlumber, fadeEffect->getBatchSetter(), fadeEffect->getItemUniformSetter()); // Extract opaques / transparents / lights / metas / overlays / background - /* const auto& opaques = items.get0()[RenderFetchCullSortTask::OPAQUE_SHAPE]; - const auto& transparents = items.get0()[RenderFetchCullSortTask::TRANSPARENT_SHAPE]; - const auto& lights = items.get0()[RenderFetchCullSortTask::LIGHT]; - const auto& metas = items.get0()[RenderFetchCullSortTask::META]; - const auto& overlayOpaques = items.get0()[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE]; - const auto& overlayTransparents = items.get0()[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE]; -*/ const auto& opaques = items[RenderFetchCullSortTask::OPAQUE_SHAPE]; const auto& transparents = items[RenderFetchCullSortTask::TRANSPARENT_SHAPE]; const auto& lights = items[RenderFetchCullSortTask::LIGHT]; const auto& metas = items[RenderFetchCullSortTask::META]; const auto& overlayOpaques = items[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE]; const auto& overlayTransparents = items[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE]; - const auto& overlayOpaques = items[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE]; - const auto& overlayTransparents = items[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE]; const auto& overlaysInFrontOpaque = items[RenderFetchCullSortTask::LAYER_FRONT_OPAQUE_SHAPE]; const auto& overlaysInFrontTransparent = items[RenderFetchCullSortTask::LAYER_FRONT_TRANSPARENT_SHAPE]; const auto& overlaysHUDOpaque = items[RenderFetchCullSortTask::LAYER_HUD_OPAQUE_SHAPE]; const auto& overlaysHUDTransparent = items[RenderFetchCullSortTask::LAYER_HUD_TRANSPARENT_SHAPE]; - -//const auto& background = items.get0()[RenderFetchCullSortTask::BACKGROUND]; const auto& spatialSelection = fetchedItems[1]; fadeEffect->build(task, opaques); @@ -268,24 +257,12 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("HighlightRangeTimer", outlineRangeTimer); - const auto overlaysInFrontRangeTimer = task.addJob("BeginOverlaysInFrontRangeTimer", "BeginOverlaysInFrontRangeTimer"); - - // Layered Overlays - const auto filteredOverlaysOpaque = task.addJob("FilterOverlaysLayeredOpaque", overlayOpaques, render::hifi::LAYER_3D_FRONT); - const auto filteredOverlaysTransparent = task.addJob("FilterOverlaysLayeredTransparent", overlayTransparents, render::hifi::LAYER_3D_FRONT); - const auto overlaysInFrontOpaque = filteredOverlaysOpaque.getN(0); - const auto overlaysInFrontTransparent = filteredOverlaysTransparent.getN(0); - - // We don't want the overlay to clear the deferred frame buffer depth because we would like to keep it for debugging visualisation - // task.addJob("SeparateDepthForOverlay", deferredFramebuffer); - + // Layered Over (in front) const auto overlayInFrontOpaquesInputs = DrawOverlay3D::Inputs(overlaysInFrontOpaque, lightingModel, jitter).asVarying(); const auto overlayInFrontTransparentsInputs = DrawOverlay3D::Inputs(overlaysInFrontTransparent, lightingModel, jitter).asVarying(); task.addJob("DrawOverlayInFrontOpaque", overlayInFrontOpaquesInputs, true); task.addJob("DrawOverlayInFrontTransparent", overlayInFrontTransparentsInputs, false); - task.addJob("OverlaysInFrontRangeTimer", overlaysInFrontRangeTimer); - const auto toneAndPostRangeTimer = task.addJob("BeginToneAndPostRangeTimer", "PostToneOverlaysAntialiasing"); // AA job before bloom to limit flickering @@ -300,71 +277,10 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren const auto toneMappingInputs = ToneMappingDeferred::Inputs(lightingFramebuffer, scaledPrimaryFramebuffer).asVarying(); task.addJob("ToneMapping", toneMappingInputs); + // 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).asVarying(); + const auto debugInputs = RenderDeferredTaskDebug::Input(fetchedItems, inputs[1], zones, selectedItems, currentStageFrames, prepareDeferredOutputs, deferredFrameTransform, jitter, lightingModel).asVarying(); task.addJob("DebugRenderDeferredTask", debugInputs); - /*task.addJob("DrawMetaBounds", metas); - task.addJob("DrawOpaqueBounds", opaques); - task.addJob("DrawTransparentBounds", transparents); - - task.addJob("DrawLightBounds", lights); - task.addJob("DrawZones", zones); - const auto frustums = task.addJob("ExtractFrustums", lightFrame); - const auto viewFrustum = frustums.getN(ExtractFrustums::VIEW_FRUSTUM); - task.addJob("DrawViewFrustum", viewFrustum, glm::vec3(0.0f, 1.0f, 0.0f)); - for (auto i = 0; i < ExtractFrustums::SHADOW_CASCADE_FRUSTUM_COUNT; i++) { - const auto shadowFrustum = frustums.getN(ExtractFrustums::SHADOW_CASCADE0_FRUSTUM + i); - float tint = 1.0f - i / float(ExtractFrustums::SHADOW_CASCADE_FRUSTUM_COUNT - 1); - char jobName[64]; - sprintf(jobName, "DrawShadowFrustum%d", i); - task.addJob(jobName, shadowFrustum, glm::vec3(0.0f, tint, 1.0f)); - if (!inputs[1].isNull()) { - const auto& shadowCascadeSceneBBoxes = inputs.get1(); - const auto shadowBBox = shadowCascadeSceneBBoxes[ExtractFrustums::SHADOW_CASCADE0_FRUSTUM + i]; - sprintf(jobName, "DrawShadowBBox%d", i); - task.addJob(jobName, shadowBBox, glm::vec3(1.0f, tint, 0.0f)); - } - } - - // Render.getConfig("RenderMainView.DrawSelectionBounds").enabled = true - task.addJob("DrawSelectionBounds", selectedItems);*/ - } - - { // Debug the bounds of the rendered Overlay items that are marked drawInFront, still look at the zbuffer - task.addJob("DrawOverlayInFrontOpaqueBounds", overlaysInFrontOpaque); - task.addJob("DrawOverlayInFrontTransparentBounds", overlaysInFrontTransparent); - } - - // Debugging stages - { - // Debugging Deferred buffer job - const auto debugFramebuffers = render::Varying(DebugDeferredBuffer::Inputs(deferredFramebuffer, linearDepthTarget, surfaceGeometryFramebuffer, ambientOcclusionFramebuffer, velocityBuffer, deferredFrameTransform, lightFrame)); - task.addJob("DebugDeferredBuffer", debugFramebuffers); - - const auto debugSubsurfaceScatteringInputs = DebugSubsurfaceScattering::Inputs(deferredFrameTransform, deferredFramebuffer, lightingModel, - surfaceGeometryFramebuffer, ambientOcclusionFramebuffer, scatteringResource).asVarying(); - task.addJob("DebugScattering", debugSubsurfaceScatteringInputs); - - const auto debugAmbientOcclusionInputs = DebugAmbientOcclusion::Inputs(deferredFrameTransform, deferredFramebuffer, linearDepthTarget, ambientOcclusionUniforms).asVarying(); - task.addJob("DebugAmbientOcclusion", debugAmbientOcclusionInputs); -/* - // Scene Octree Debugging job - { - task.addJob("DrawSceneOctree", spatialSelection); - task.addJob("DrawItemSelection", spatialSelection); - } - - // Status icon rendering job - { - // Grab a texture map representing the different status icons and assign that to the drawStatsuJob - auto iconMapPath = PathUtils::resourcesPath() + "icons/statusIconAtlas.svg"; - auto statusIconMap = DependencyManager::get()->getImageTexture(iconMapPath, image::TextureUsage::STRICT_TEXTURE); - const auto drawStatusInputs = DrawStatus::Input(opaques, jitter).asVarying(); - task.addJob("DrawStatus", drawStatusInputs, DrawStatus(statusIconMap)); - } - - const auto debugZoneInputs = DebugZoneLighting::Inputs(deferredFrameTransform, lightFrame, backgroundFrame).asVarying(); - task.addJob("DrawZoneStack", debugZoneInputs);*/ } // Upscale to finale resolution @@ -373,20 +289,12 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren // Composite the HUD and HUD overlays task.addJob("HUD"); - const auto overlaysHUDOpaque = filteredOverlaysOpaque.getN(1); - const auto overlaysHUDTransparent = filteredOverlaysTransparent.getN(1); const auto nullJitter = Varying(glm::vec2(0.0f, 0.0f)); - const auto overlayHUDOpaquesInputs = DrawOverlay3D::Inputs(overlaysHUDOpaque, lightingModel, nullJitter).asVarying(); const auto overlayHUDTransparentsInputs = DrawOverlay3D::Inputs(overlaysHUDTransparent, lightingModel, nullJitter).asVarying(); task.addJob("DrawOverlayHUDOpaque", overlayHUDOpaquesInputs, true); task.addJob("DrawOverlayHUDTransparent", overlayHUDTransparentsInputs, false); - { // Debug the bounds of the rendered Overlay items that are marked drawHUDLayer, still look at the zbuffer - task.addJob("DrawOverlayHUDOpaqueBounds", overlaysHUDOpaque); - task.addJob("DrawOverlayHUDTransparentBounds", overlaysHUDTransparent); - } - task.addJob("ToneAndPostRangeTimer", toneAndPostRangeTimer); // Blit! @@ -413,13 +321,17 @@ void RenderDeferredTaskDebug::build(JobModel& task, const render::Varying& input const auto& items = fetchCullSortTaskOut.get0(); const auto& spatialSelection = fetchCullSortTaskOut[1]; - // Extract opaques / transparents / lights / metas / overlays / background + // Extract opaques / transparents / lights / metas / overlays InFront and HUD / background const auto& opaques = items[RenderFetchCullSortTask::OPAQUE_SHAPE]; const auto& transparents = items[RenderFetchCullSortTask::TRANSPARENT_SHAPE]; const auto& lights = items[RenderFetchCullSortTask::LIGHT]; const auto& metas = items[RenderFetchCullSortTask::META]; const auto& overlayOpaques = items[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE]; const auto& overlayTransparents = items[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE]; + const auto& overlaysInFrontOpaque = items[RenderFetchCullSortTask::LAYER_FRONT_OPAQUE_SHAPE]; + const auto& overlaysInFrontTransparent = items[RenderFetchCullSortTask::LAYER_FRONT_TRANSPARENT_SHAPE]; + const auto& overlaysHUDOpaque = items[RenderFetchCullSortTask::LAYER_HUD_OPAQUE_SHAPE]; + const auto& overlaysHUDTransparent = items[RenderFetchCullSortTask::LAYER_HUD_TRANSPARENT_SHAPE]; // RenderShadowTask out const auto& renderShadowTaskOut = inputs[1]; @@ -446,6 +358,9 @@ void RenderDeferredTaskDebug::build(JobModel& task, const render::Varying& input // Jitter out const auto& jitter = inputs[7]; + // Lighting Model out + const auto& lightingModel = inputs[8]; + { // Debug the bounds of the rendered items, still look at the zbuffer task.addJob("DrawMetaBounds", metas); @@ -476,14 +391,19 @@ void RenderDeferredTaskDebug::build(JobModel& task, const render::Varying& input } { // Debug the bounds of the rendered Overlay items that are marked drawInFront, still look at the zbuffer - /* task.addJob("DrawOverlayInFrontOpaqueBounds", overlaysInFrontOpaque); + task.addJob("DrawOverlayInFrontOpaqueBounds", overlaysInFrontOpaque); task.addJob("DrawOverlayInFrontTransparentBounds", overlaysInFrontTransparent); - */ } + } + + { // Debug the bounds of the rendered Overlay items that are marked drawHUDLayer, still look at the zbuffer + task.addJob("DrawOverlayHUDOpaqueBounds", overlaysHUDOpaque); + task.addJob("DrawOverlayHUDTransparentBounds", overlaysHUDTransparent); + } // Debugging stages { // Debugging Deferred buffer job - /* const auto debugFramebuffers = render::Varying(DebugDeferredBuffer::Inputs(deferredFramebuffer, linearDepthTarget, surfaceGeometryFramebuffer, ambientOcclusionFramebuffer, velocityBuffer, deferredFrameTransform, lightFrame)); + /* const auto debugFramebuffers = render::Varying(DebugDeferredBuffer::Inputs(deferredFramebuffer, linearDepthTarget, surfaceGeometryFramebuffer, ambientOcclusionFramebuffer, velocityBuffer, deferredFrameTransform, lightFrame)); task.addJob("DebugDeferredBuffer", debugFramebuffers); const auto debugSubsurfaceScatteringInputs = DebugSubsurfaceScattering::Inputs(deferredFrameTransform, deferredFramebuffer, lightingModel, @@ -510,7 +430,10 @@ void RenderDeferredTaskDebug::build(JobModel& task, const render::Varying& input const auto debugZoneInputs = DebugZoneLighting::Inputs(deferredFrameTransform, lightFrame, backgroundFrame).asVarying(); task.addJob("DrawZoneStack", debugZoneInputs); + } + + } diff --git a/libraries/task/src/task/Task.h b/libraries/task/src/task/Task.h index e8e95b4df4..87e7090d64 100644 --- a/libraries/task/src/task/Task.h +++ b/libraries/task/src/task/Task.h @@ -146,7 +146,7 @@ public: Concept(name, config), _data(Data(std::forward(args)...)), _input(input), - _output(Output()) { + _output(Output(), name + ".o") { applyConfiguration(); } diff --git a/libraries/task/src/task/Varying.h b/libraries/task/src/task/Varying.h index 2da0111bc2..6b076b0b27 100644 --- a/libraries/task/src/task/Varying.h +++ b/libraries/task/src/task/Varying.h @@ -27,12 +27,13 @@ public: _concept = var._concept; return (*this); } - template Varying(const T& data) : _concept(std::make_shared>(data)) {} + template Varying(const T& data, const std::string& name = "noname") : _concept(std::make_shared>(data, name)) {} template bool canCast() const { return !!std::dynamic_pointer_cast>(_concept); } template const T& get() const { return std::static_pointer_cast>(_concept)->_data; } template T& edit() { return std::static_pointer_cast>(_concept)->_data; } + const std::string& name() const { return _concept->name(); } // access potential sub varyings contained in this one. Varying operator[] (uint8_t index) const { return (*_concept)[index]; } @@ -46,16 +47,22 @@ public: protected: class Concept { public: + Concept(const std::string& name) : _name(name) {} + virtual ~Concept() = default; virtual Varying operator[] (uint8_t index) const = 0; virtual uint8_t length() const = 0; + + const std::string name() { return _name; } + + const std::string _name; }; template class Model : public Concept { public: using Data = T; - Model(const Data& data) : _data(data) {} + Model(const Data& data, const std::string& name) : Concept(name), _data(data) {} virtual ~Model() = default; virtual Varying operator[] (uint8_t index) const override { @@ -406,6 +413,29 @@ public: const T8& get8() const { return std::get<8>((*this)).template get(); } T8& edit8() { return std::get<8>((*this)).template edit(); } + virtual Varying operator[] (uint8_t index) const { + switch (index) { + default: + return std::get<0>((*this)); + case 1: + return std::get<1>((*this)); + case 2: + return std::get<2>((*this)); + case 3: + return std::get<3>((*this)); + case 4: + return std::get<4>((*this)); + case 5: + return std::get<5>((*this)); + case 6: + return std::get<6>((*this)); + case 7: + return std::get<7>((*this)); + case 8: + return std::get<8>((*this)); + }; + } + virtual uint8_t length() const { return 9; } Varying asVarying() const { return Varying((*this)); } };