From b7b8e8e6bf5761d1df99660cf7f24f9a98dd79fd Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 26 Nov 2018 00:38:04 -0800 Subject: [PATCH] Trying to group together the debug jobs in a separate task --- .../render-utils/src/RenderDeferredTask.cpp | 90 ++++++++++++++++++- .../render-utils/src/RenderDeferredTask.h | 22 +++++ 2 files changed, 111 insertions(+), 1 deletion(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 4052b6bd5a..bb5ad82a03 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -71,7 +71,6 @@ namespace gr { using graphics::slot::buffer::Buffer; } - RenderDeferredTask::RenderDeferredTask() { } @@ -257,6 +256,8 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("ToneMapping", toneMappingInputs); { // Debug the bounds of the rendered items, still look at the zbuffer + const auto debugInputs = RenderDeferredTaskDebug::Inputs(items.get0(), items.get1(), zones, selectedItems, lightFrame, deferredFramebuffer, lightingFramebuffer, deferredFrameTransform, jitter).asVarying(); + task.addJob("DebugRenderDeferred", input); task.addJob("DrawMetaBounds", metas); task.addJob("DrawOpaqueBounds", opaques); task.addJob("DrawTransparentBounds", transparents); @@ -347,6 +348,93 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("Blit", primaryFramebuffer); } +RenderDeferredTaskDebug::RenderDeferredTaskDebug() { + +} + +void RenderDeferredTaskDebug::configure(const Config& config) { + +} + +void RenderDeferredTaskDebug::build(JobModel& task, const render::Varying& inputs, render::Varying& outputs) { + const auto& inputs = input.get(); + const auto& items = inputs.get0(); + + // 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]; + + { // Debug the bounds of the rendered items, still look at the zbuffer + 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); + } +} + + void DrawDeferred::run(const RenderContextPointer& renderContext, const Inputs& inputs) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index c18daa6d3d..a72cf94b68 100644 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -154,4 +154,26 @@ private: const render::Varying& transparents); }; + +class RenderDeferredTaskDebugConfig : public render::Task::Config { + Q_OBJECT +public: + +signals: + void dirty(); +}; + +class RenderDeferredTaskDebug { +public: + using Input = render::VaryingSet2; + using Config = RenderDeferredTaskConfig; + using JobModel = render::Task::ModelI; + + RenderDeferredTaskDebug(); + + void configure(const Config& config); + void build(JobModel& task, const render::Varying& inputs, render::Varying& outputs); + +private: +}; #endif // hifi_RenderDeferredTask_h