From 9f91dd5bfcfbe5474f7c5785b7889ecda0b482fc Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 13 Jul 2016 10:19:42 -0700 Subject: [PATCH] Cleaning the gpu-test app to work with the new deferred pipeline --- .../src/DeferredLightingEffect.cpp | 28 +++++++++------- .../render-utils/src/DeferredLightingEffect.h | 2 +- libraries/render-utils/src/LightingModel.cpp | 2 +- .../render-utils/src/RenderDeferredTask.cpp | 1 + tests/gpu-test/src/TestWindow.cpp | 33 ++++++++++++------- tests/gpu-test/src/TestWindow.h | 11 +++++-- 6 files changed, 50 insertions(+), 27 deletions(-) diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 57b079dab0..a55a87a46e 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -397,7 +397,7 @@ void RenderDeferredSetup::run(const render::SceneContextPointer& sceneContext, c const DeferredFramebufferPointer& deferredFramebuffer, const LightingModelPointer& lightingModel, const SurfaceGeometryFramebufferPointer& surfaceGeometryFramebuffer, - const gpu::TexturePointer& lowCurvatureNormal, + const gpu::FramebufferPointer& lowCurvatureNormalFramebuffer, const SubsurfaceScatteringResourcePointer& subsurfaceScatteringResource) { auto args = renderContext->args; @@ -441,15 +441,17 @@ void RenderDeferredSetup::run(const render::SceneContextPointer& sceneContext, c batch.setUniformBuffer(LIGHTING_MODEL_BUFFER_SLOT, lightingModel->getParametersBuffer()); // Subsurface scattering specific - batch.setResourceTexture(DEFERRED_BUFFER_CURVATURE_UNIT, surfaceGeometryFramebuffer->getCurvatureTexture()); - batch.setResourceTexture(DEFERRED_BUFFER_DIFFUSED_CURVATURE_UNIT, lowCurvatureNormal); - - batch.setUniformBuffer(SCATTERING_PARAMETERS_BUFFER_SLOT, subsurfaceScatteringResource->getParametersBuffer()); - - - batch.setResourceTexture(SCATTERING_LUT_UNIT, subsurfaceScatteringResource->getScatteringTable()); - batch.setResourceTexture(SCATTERING_SPECULAR_UNIT, subsurfaceScatteringResource->getScatteringSpecular()); - + if (surfaceGeometryFramebuffer) { + batch.setResourceTexture(DEFERRED_BUFFER_CURVATURE_UNIT, surfaceGeometryFramebuffer->getCurvatureTexture()); + } + if (lowCurvatureNormalFramebuffer) { + batch.setResourceTexture(DEFERRED_BUFFER_DIFFUSED_CURVATURE_UNIT, lowCurvatureNormalFramebuffer->getRenderBuffer(0)); + } + if (subsurfaceScatteringResource) { + batch.setUniformBuffer(SCATTERING_PARAMETERS_BUFFER_SLOT, subsurfaceScatteringResource->getParametersBuffer()); + batch.setResourceTexture(SCATTERING_LUT_UNIT, subsurfaceScatteringResource->getScatteringTable()); + batch.setResourceTexture(SCATTERING_SPECULAR_UNIT, subsurfaceScatteringResource->getScatteringSpecular()); + } // Global directional light and ambient pass @@ -673,10 +675,12 @@ void RenderDeferred::run(const SceneContextPointer& sceneContext, const RenderCo auto deferredFramebuffer = inputs.get1(); auto lightingModel = inputs.get2(); auto surfaceGeometryFramebuffer = inputs.get3(); - auto lowCurvatureNormal = inputs.get4()->getRenderBuffer(0); + auto lowCurvatureNormalFramebuffer = inputs.get4(); auto subsurfaceScatteringResource = inputs.get5(); - setupJob.run(sceneContext, renderContext, deferredTransform, deferredFramebuffer, lightingModel, surfaceGeometryFramebuffer, lowCurvatureNormal, subsurfaceScatteringResource); + + + setupJob.run(sceneContext, renderContext, deferredTransform, deferredFramebuffer, lightingModel, surfaceGeometryFramebuffer, lowCurvatureNormalFramebuffer, subsurfaceScatteringResource); lightsJob.run(sceneContext, renderContext, deferredTransform, lightingModel->isPointLightEnabled(), lightingModel->isSpotLightEnabled()); diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index af884c0102..552bd1f006 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -138,7 +138,7 @@ public: const DeferredFramebufferPointer& deferredFramebuffer, const LightingModelPointer& lightingModel, const SurfaceGeometryFramebufferPointer& surfaceGeometryFramebuffer, - const gpu::TexturePointer& diffusedCurvature2, + const gpu::FramebufferPointer& lowCurvatureNormalFramebuffer, const SubsurfaceScatteringResourcePointer& subsurfaceScatteringResource); }; diff --git a/libraries/render-utils/src/LightingModel.cpp b/libraries/render-utils/src/LightingModel.cpp index 14aea67662..891b59a726 100644 --- a/libraries/render-utils/src/LightingModel.cpp +++ b/libraries/render-utils/src/LightingModel.cpp @@ -147,5 +147,5 @@ void MakeLightingModel::configure(const Config& config) { void MakeLightingModel::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, LightingModelPointer& lightingModel) { - lightingModel = _lightingModel; + lightingModel = _lightingModel; } \ No newline at end of file diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 2a0864c22b..d186b1ac1c 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -117,6 +117,7 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { const auto curvatureFramebuffer = surfaceGeometryPassOutputs.getN(1); const auto linearDepthTexture = surfaceGeometryPassOutputs.getN(2); + // TODO: Push this 2 diffusion stages into surfaceGeometryPass as they are working together const auto diffuseCurvaturePassInputs = BlurGaussianDepthAware::Inputs(curvatureFramebuffer, linearDepthTexture).hasVarying(); const auto midCurvatureNormalFramebuffer = addJob("DiffuseCurvatureMid", diffuseCurvaturePassInputs); const auto lowCurvatureNormalFramebuffer = addJob("DiffuseCurvatureLow", diffuseCurvaturePassInputs, true); // THis blur pass generates it s render resource diff --git a/tests/gpu-test/src/TestWindow.cpp b/tests/gpu-test/src/TestWindow.cpp index 2d08993436..f0cc3f9592 100644 --- a/tests/gpu-test/src/TestWindow.cpp +++ b/tests/gpu-test/src/TestWindow.cpp @@ -97,9 +97,26 @@ void TestWindow::beginFrame() { _renderArgs->_context->syncCache(); #ifdef DEFERRED_LIGHTING - auto deferredLightingEffect = DependencyManager::get(); - _prepareDeferred.run(_sceneContext, _renderContext, _deferredFramebuffer); + gpu::FramebufferPointer primaryFramebuffer; + _preparePrimaryFramebuffer.run(_sceneContext, _renderContext, primaryFramebuffer); + + DeferredFrameTransformPointer frameTransform; + _generateDeferredFrameTransform.run(_sceneContext, _renderContext, frameTransform); + + LightingModelPointer lightingModel; + _generateLightingModel.run(_sceneContext, _renderContext, lightingModel); + + _prepareDeferredInputs.edit0() = primaryFramebuffer; + _prepareDeferredInputs.edit1() = lightingModel; + _prepareDeferred.run(_sceneContext, _renderContext, _prepareDeferredInputs, _prepareDeferredOutputs); + + + _renderDeferredInputs.edit0() = frameTransform; // Pass the deferredFrameTransform + _renderDeferredInputs.edit1() = _prepareDeferredOutputs.get0(); // Pass the deferredFramebuffer + _renderDeferredInputs.edit2() = lightingModel; // Pass the lightingModel + // the rest of the renderDeferred inputs can be omitted + #else gpu::doInBatch(_renderArgs->_context, [&](gpu::Batch& batch) { batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLORS, { 0.0f, 0.1f, 0.2f, 1.0f }); @@ -120,7 +137,7 @@ void TestWindow::endFrame() { RenderArgs* args = _renderContext->args; gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { args->_batch = &batch; - auto deferredFboColorDepthStencil = DependencyManager::get()->getDeferredFramebufferDepthColor(); + auto deferredFboColorDepthStencil = _prepareDeferredOutputs.get0()->getDeferredFramebufferDepthColor(); batch.setViewportTransform(args->_viewport); batch.setStateScissorRect(args->_viewport); batch.setFramebuffer(deferredFboColorDepthStencil); @@ -129,20 +146,14 @@ void TestWindow::endFrame() { batch.setResourceTexture(0, nullptr); }); - DeferredFrameTransformPointer frameTransform; - _generateDeferredFrameTransform.run(_sceneContext, _renderContext, frameTransform); - - RenderDeferred::Inputs deferredInputs; - deferredInputs.edit0() = frameTransform; - deferredInputs.edit1() = _deferredFramebuffer; - _renderDeferred.run(_sceneContext, _renderContext, deferredInputs); + _renderDeferred.run(_sceneContext, _renderContext, _renderDeferredInputs); gpu::doInBatch(_renderArgs->_context, [&](gpu::Batch& batch) { PROFILE_RANGE_BATCH(batch, "blit"); // Blit to screen auto framebufferCache = DependencyManager::get(); // auto framebuffer = framebufferCache->getLightingFramebuffer(); - auto framebuffer = _deferredFramebuffer->getLightingFramebuffer(); + auto framebuffer = _prepareDeferredOutputs.get0()->getLightingFramebuffer(); batch.blit(framebuffer, _renderArgs->_viewport, nullptr, _renderArgs->_viewport); }); #endif diff --git a/tests/gpu-test/src/TestWindow.h b/tests/gpu-test/src/TestWindow.h index 1260b519eb..c8d09825aa 100644 --- a/tests/gpu-test/src/TestWindow.h +++ b/tests/gpu-test/src/TestWindow.h @@ -35,11 +35,18 @@ protected: render::RenderContextPointer _renderContext{ std::make_shared() }; gpu::PipelinePointer _opaquePipeline; model::LightPointer _light { std::make_shared() }; - + GenerateDeferredFrameTransform _generateDeferredFrameTransform; - DeferredFramebufferPointer _deferredFramebuffer; + MakeLightingModel _generateLightingModel; + PreparePrimaryFramebuffer _preparePrimaryFramebuffer; + + PrepareDeferred::Inputs _prepareDeferredInputs; PrepareDeferred _prepareDeferred; + PrepareDeferred::Outputs _prepareDeferredOutputs; + + RenderDeferred::Inputs _renderDeferredInputs; RenderDeferred _renderDeferred; + #endif RenderArgs* _renderArgs { new RenderArgs() };