From ff132fa7128acf44d73136f8e348f13524052d90 Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 19 Jul 2016 02:11:22 -0700 Subject: [PATCH] Gathering the diffusion passes in the SUrfaceGEometryPAss job --- interface/src/Application.cpp | 2 + .../render-utils/src/SurfaceGeometryPass.cpp | 145 ++++++++++++++---- .../render-utils/src/SurfaceGeometryPass.h | 24 ++- libraries/render/src/render/BlurTask.cpp | 11 +- libraries/render/src/render/BlurTask.h | 6 +- .../developer/utilities/render/statsGPU.qml | 5 - .../utilities/render/surfaceGeometryPass.qml | 19 +-- 7 files changed, 146 insertions(+), 66 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index bc65977beb..a29ac19f97 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -305,6 +305,8 @@ public: // Don't actually crash in debug builds, in case this apparent deadlock is simply from // the developer actively debugging code #ifdef NDEBUG + + deadlockDetectionCrash(); #endif } diff --git a/libraries/render-utils/src/SurfaceGeometryPass.cpp b/libraries/render-utils/src/SurfaceGeometryPass.cpp index 3e1930f6ba..95557c99e3 100644 --- a/libraries/render-utils/src/SurfaceGeometryPass.cpp +++ b/libraries/render-utils/src/SurfaceGeometryPass.cpp @@ -282,6 +282,10 @@ void SurfaceGeometryFramebuffer::updateLinearDepth(const gpu::TexturePointer& li void SurfaceGeometryFramebuffer::clear() { _curvatureFramebuffer.reset(); _curvatureTexture.reset(); + _lowCurvatureFramebuffer.reset(); + _lowCurvatureTexture.reset(); + _blurringFramebuffer.reset(); + _blurringTexture.reset(); } gpu::TexturePointer SurfaceGeometryFramebuffer::getLinearDepthTexture() { @@ -293,9 +297,17 @@ void SurfaceGeometryFramebuffer::allocate() { auto width = _frameSize.x; auto height = _frameSize.y; - _curvatureTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element::COLOR_RGBA_32, width >> getResolutionLevel(), height >> getResolutionLevel(), gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT))); + _curvatureTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element::COLOR_RGBA_32, width, height, gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT))); _curvatureFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create()); _curvatureFramebuffer->setRenderBuffer(0, _curvatureTexture); + + _lowCurvatureTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element::COLOR_RGBA_32, width, height, gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT))); + _lowCurvatureFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create()); + _lowCurvatureFramebuffer->setRenderBuffer(0, _lowCurvatureTexture); + + _blurringTexture = gpu::TexturePointer(gpu::Texture::create2D(gpu::Element::COLOR_RGBA_32, width, height, gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR_MIP_POINT))); + _blurringFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create()); + _blurringFramebuffer->setRenderBuffer(0, _blurringTexture); } gpu::FramebufferPointer SurfaceGeometryFramebuffer::getCurvatureFramebuffer() { @@ -312,6 +324,34 @@ gpu::TexturePointer SurfaceGeometryFramebuffer::getCurvatureTexture() { return _curvatureTexture; } +gpu::FramebufferPointer SurfaceGeometryFramebuffer::getLowCurvatureFramebuffer() { + if (!_lowCurvatureFramebuffer) { + allocate(); + } + return _lowCurvatureFramebuffer; +} + +gpu::TexturePointer SurfaceGeometryFramebuffer::getLowCurvatureTexture() { + if (!_lowCurvatureTexture) { + allocate(); + } + return _lowCurvatureTexture; +} + +gpu::FramebufferPointer SurfaceGeometryFramebuffer::getBlurringFramebuffer() { + if (!_blurringFramebuffer) { + allocate(); + } + return _blurringFramebuffer; +} + +gpu::TexturePointer SurfaceGeometryFramebuffer::getBlurringTexture() { + if (!_blurringTexture) { + allocate(); + } + return _blurringTexture; +} + void SurfaceGeometryFramebuffer::setResolutionLevel(int resolutionLevel) { if (resolutionLevel != getResolutionLevel()) { clear(); @@ -320,8 +360,7 @@ void SurfaceGeometryFramebuffer::setResolutionLevel(int resolutionLevel) { } SurfaceGeometryPass::SurfaceGeometryPass() : - _firstBlurPass(false), - _secondBlurPass(true, _firstBlurPass.getParameters()) + _diffusePass(false) { Parameters parameters; _parametersBuffer = gpu::BufferView(std::make_shared(sizeof(Parameters), (const gpu::Byte*) ¶meters)); @@ -345,6 +384,10 @@ void SurfaceGeometryPass::configure(const Config& config) { _surfaceGeometryFramebuffer = std::make_shared(); } _surfaceGeometryFramebuffer->setResolutionLevel(config.resolutionLevel); + + _diffusePass.getParameters()->setFilterRadiusScale(config.diffuseFilterScale); + _diffusePass.getParameters()->setDepthThreshold(config.diffuseDepthThreshold); + } @@ -358,33 +401,52 @@ void SurfaceGeometryPass::run(const render::SceneContextPointer& sceneContext, c const auto deferredFramebuffer = inputs.get1(); const auto linearDepthFramebuffer = inputs.get2(); - auto linearDepthTexture = linearDepthFramebuffer->getHalfLinearDepthTexture(); + + auto linearDepthTexture = linearDepthFramebuffer->getLinearDepthTexture(); + auto normalTexture = deferredFramebuffer->getDeferredNormalTexture(); + auto sourceViewport = args->_viewport; + auto curvatureViewport = sourceViewport; + + if (_surfaceGeometryFramebuffer->getResolutionLevel() > 0) { + linearDepthTexture = linearDepthFramebuffer->getHalfLinearDepthTexture(); + normalTexture = linearDepthFramebuffer->getHalfNormalTexture(); + curvatureViewport = curvatureViewport >> _surfaceGeometryFramebuffer->getResolutionLevel(); + } if (!_surfaceGeometryFramebuffer) { _surfaceGeometryFramebuffer = std::make_shared(); } _surfaceGeometryFramebuffer->updateLinearDepth(linearDepthTexture); - // auto normalTexture = deferredFramebuffer->getDeferredNormalTexture(); - auto normalTexture = linearDepthFramebuffer->getHalfNormalTexture(); - auto curvatureFramebuffer = _surfaceGeometryFramebuffer->getCurvatureFramebuffer(); + auto curvatureTexture = _surfaceGeometryFramebuffer->getCurvatureTexture(); #ifdef USE_STENCIL_TEST - if (curvatureFBO->getDepthStencilBuffer() != deferredFramebuffer->getPrimaryDepthTexture()) { - curvatureFBO->setDepthStencilBuffer(deferredFramebuffer->getPrimaryDepthTexture(), deferredFramebuffer->getPrimaryDepthTexture()->getTexelFormat()); + if (curvatureFramebuffer->getDepthStencilBuffer() != deferredFramebuffer->getPrimaryDepthTexture()) { + curvatureFramebuffer->setDepthStencilBuffer(deferredFramebuffer->getPrimaryDepthTexture(), deferredFramebuffer->getPrimaryDepthTexture()->getTexelFormat()); } #endif - auto curvatureTexture = _surfaceGeometryFramebuffer->getCurvatureTexture(); + + auto lowCurvatureFramebuffer = _surfaceGeometryFramebuffer->getLowCurvatureFramebuffer(); + auto lowCurvatureTexture = _surfaceGeometryFramebuffer->getLowCurvatureTexture(); + + auto blurringFramebuffer = _surfaceGeometryFramebuffer->getBlurringFramebuffer(); + auto blurringTexture = _surfaceGeometryFramebuffer->getBlurringTexture(); outputs.edit0() = _surfaceGeometryFramebuffer; outputs.edit1() = curvatureFramebuffer; + outputs.edit2() = curvatureFramebuffer; + outputs.edit3() = lowCurvatureFramebuffer; auto curvaturePipeline = getCurvaturePipeline(); + auto diffuseVPipeline = _diffusePass.getBlurVPipeline(); + auto diffuseHPipeline = _diffusePass.getBlurHPipeline(); - auto depthViewport = args->_viewport; - auto curvatureViewport = depthViewport >> 1; - // >> _surfaceGeometryFramebuffer->getResolutionLevel(); + glm::ivec2 textureSize(curvatureTexture->getDimensions()); + _diffusePass.getParameters()->setTexcoordTransform(gpu::Framebuffer::evalSubregionTexcoordTransformCoefficients(textureSize, curvatureViewport)); + _diffusePass.getParameters()->setDepthPerspective(args->getViewFrustum().getProjection()[1][1]); + _diffusePass.getParameters()->setLinearDepthPosFar(args->getViewFrustum().getFarClip()); + gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { _gpuTimer.begin(batch); batch.enableStereo(false); @@ -393,43 +455,58 @@ void SurfaceGeometryPass::run(const render::SceneContextPointer& sceneContext, c batch.setViewTransform(Transform()); batch.setViewportTransform(curvatureViewport); - batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(_surfaceGeometryFramebuffer->getCurvatureFrameSize(), curvatureViewport)); - - batch.setUniformBuffer(SurfaceGeometryPass_FrameTransformSlot, frameTransform->getFrameTransformBuffer()); - batch.setUniformBuffer(SurfaceGeometryPass_ParamsSlot, _parametersBuffer); + batch.setModelTransform(gpu::Framebuffer::evalSubregionTexcoordTransform(_surfaceGeometryFramebuffer->getSourceFrameSize(), curvatureViewport)); // Curvature pass + batch.setUniformBuffer(SurfaceGeometryPass_FrameTransformSlot, frameTransform->getFrameTransformBuffer()); + batch.setUniformBuffer(SurfaceGeometryPass_ParamsSlot, _parametersBuffer); batch.setFramebuffer(curvatureFramebuffer); - - // We can avoid the clear by drawing the same clear vallue from the makeCurvature shader. same performances or no worse - + // We can avoid the clear by drawing the same clear vallue from the makeCurvature shader. same performances or no worse #ifdef USE_STENCIL_TEST // Except if stenciling out batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0)); #endif - batch.setPipeline(curvaturePipeline); batch.setResourceTexture(SurfaceGeometryPass_DepthMapSlot, linearDepthTexture); batch.setResourceTexture(SurfaceGeometryPass_NormalMapSlot, normalTexture); batch.draw(gpu::TRIANGLE_STRIP, 4); - batch.setResourceTexture(SurfaceGeometryPass_DepthMapSlot, nullptr); - batch.setResourceTexture(SurfaceGeometryPass_NormalMapSlot, nullptr); + // Diffusion pass + const int BlurTask_ParamsSlot = 0; + const int BlurTask_SourceSlot = 0; + const int BlurTask_DepthSlot = 1; + batch.setUniformBuffer(BlurTask_ParamsSlot, _diffusePass.getParameters()->_parametersBuffer); + + batch.setResourceTexture(BlurTask_DepthSlot, linearDepthTexture); + + batch.setFramebuffer(blurringFramebuffer); + batch.setPipeline(diffuseVPipeline); + batch.setResourceTexture(BlurTask_SourceSlot, curvatureTexture); + batch.draw(gpu::TRIANGLE_STRIP, 4); + + batch.setFramebuffer(curvatureFramebuffer); + batch.setPipeline(diffuseHPipeline); + batch.setResourceTexture(BlurTask_SourceSlot, blurringTexture); + batch.draw(gpu::TRIANGLE_STRIP, 4); + + batch.setFramebuffer(blurringFramebuffer); + batch.setPipeline(diffuseVPipeline); + batch.setResourceTexture(BlurTask_SourceSlot, curvatureTexture); + batch.draw(gpu::TRIANGLE_STRIP, 4); + + batch.setFramebuffer(lowCurvatureFramebuffer); + batch.setPipeline(diffuseHPipeline); + batch.setResourceTexture(BlurTask_SourceSlot, blurringTexture); + batch.draw(gpu::TRIANGLE_STRIP, 4); + + batch.setResourceTexture(BlurTask_SourceSlot, nullptr); + batch.setResourceTexture(BlurTask_DepthSlot, nullptr); + batch.setUniformBuffer(BlurTask_ParamsSlot, nullptr); _gpuTimer.end(batch); }); - - const auto diffuseCurvaturePassInputs = render::BlurGaussianDepthAware::Inputs(curvatureFramebuffer, linearDepthTexture); - gpu::FramebufferPointer midBlurredFramebuffer; - _firstBlurPass.run(sceneContext, renderContext, diffuseCurvaturePassInputs, midBlurredFramebuffer); - - gpu::FramebufferPointer lowBlurredFramebuffer; - _secondBlurPass.run(sceneContext, renderContext, diffuseCurvaturePassInputs, lowBlurredFramebuffer); - + - outputs.edit2() = midBlurredFramebuffer; - outputs.edit3() = lowBlurredFramebuffer; - auto config = std::static_pointer_cast(renderContext->jobConfig); config->gpuTime = _gpuTimer.getAverage(); } diff --git a/libraries/render-utils/src/SurfaceGeometryPass.h b/libraries/render-utils/src/SurfaceGeometryPass.h index d0f79dad76..9a7ff7d964 100644 --- a/libraries/render-utils/src/SurfaceGeometryPass.h +++ b/libraries/render-utils/src/SurfaceGeometryPass.h @@ -112,12 +112,17 @@ public: gpu::FramebufferPointer getCurvatureFramebuffer(); gpu::TexturePointer getCurvatureTexture(); + + gpu::FramebufferPointer getLowCurvatureFramebuffer(); + gpu::TexturePointer getLowCurvatureTexture(); + + gpu::FramebufferPointer getBlurringFramebuffer(); + gpu::TexturePointer getBlurringTexture(); // Update the source framebuffer size which will drive the allocation of all the other resources. void updateLinearDepth(const gpu::TexturePointer& linearDepthBuffer); gpu::TexturePointer getLinearDepthTexture(); const glm::ivec2& getSourceFrameSize() const { return _frameSize; } - glm::ivec2 getCurvatureFrameSize() const { return _frameSize >> _resolutionLevel; } void setResolutionLevel(int level); int getResolutionLevel() const { return _resolutionLevel; } @@ -131,6 +136,12 @@ protected: gpu::FramebufferPointer _curvatureFramebuffer; gpu::TexturePointer _curvatureTexture; + gpu::FramebufferPointer _blurringFramebuffer; + gpu::TexturePointer _blurringTexture; + + gpu::FramebufferPointer _lowCurvatureFramebuffer; + gpu::TexturePointer _lowCurvatureTexture; + glm::ivec2 _frameSize; int _resolutionLevel{ 0 }; }; @@ -143,6 +154,10 @@ class SurfaceGeometryPassConfig : public render::Job::Config { Q_PROPERTY(float basisScale MEMBER basisScale NOTIFY dirty) Q_PROPERTY(float curvatureScale MEMBER curvatureScale NOTIFY dirty) Q_PROPERTY(int resolutionLevel MEMBER resolutionLevel NOTIFY dirty) + + Q_PROPERTY(float diffuseFilterScale MEMBER diffuseFilterScale NOTIFY dirty) + Q_PROPERTY(float diffuseDepthThreshold MEMBER diffuseDepthThreshold NOTIFY dirty) + Q_PROPERTY(double gpuTime READ getGpuTime) public: SurfaceGeometryPassConfig() : render::Job::Config(true) {} @@ -151,6 +166,8 @@ public: float basisScale{ 1.0f }; float curvatureScale{ 10.0f }; int resolutionLevel{ 0 }; + float diffuseFilterScale{ 0.2f }; + float diffuseDepthThreshold{ 1.0f }; double getGpuTime() { return gpuTime; } @@ -191,14 +208,15 @@ private: }; gpu::BufferView _parametersBuffer; + SurfaceGeometryFramebufferPointer _surfaceGeometryFramebuffer; const gpu::PipelinePointer& getCurvaturePipeline(); gpu::PipelinePointer _curvaturePipeline; + + render::BlurGaussianDepthAware _diffusePass; - render::BlurGaussianDepthAware _firstBlurPass; - render::BlurGaussianDepthAware _secondBlurPass; gpu::RangeTimer _gpuTimer; }; diff --git a/libraries/render/src/render/BlurTask.cpp b/libraries/render/src/render/BlurTask.cpp index ddaaa82e31..3849adf588 100644 --- a/libraries/render/src/render/BlurTask.cpp +++ b/libraries/render/src/render/BlurTask.cpp @@ -337,24 +337,23 @@ void BlurGaussianDepthAware::run(const SceneContextPointer& sceneContext, const auto blurHPipeline = getBlurHPipeline(); auto sourceViewport = args->_viewport; - auto blurViewport = sourceViewport >> 1; - _parameters->setWidthHeight(blurViewport.z, blurViewport.w, args->_context->isStereo()); + _parameters->setWidthHeight(sourceViewport.z, sourceViewport.w, args->_context->isStereo()); glm::ivec2 textureSize(blurringResources.sourceTexture->getDimensions()); - _parameters->setTexcoordTransform(gpu::Framebuffer::evalSubregionTexcoordTransformCoefficients(textureSize, blurViewport)); + _parameters->setTexcoordTransform(gpu::Framebuffer::evalSubregionTexcoordTransformCoefficients(textureSize, sourceViewport)); _parameters->setDepthPerspective(args->getViewFrustum().getProjection()[1][1]); _parameters->setLinearDepthPosFar(args->getViewFrustum().getFarClip()); gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { batch.enableStereo(false); - batch.setViewportTransform(blurViewport); + batch.setViewportTransform(sourceViewport); batch.setUniformBuffer(BlurTask_ParamsSlot, _parameters->_parametersBuffer); batch.setResourceTexture(BlurTask_DepthSlot, depthTexture); batch.setFramebuffer(blurringResources.blurringFramebuffer); - // batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0)); + // batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0)); batch.setPipeline(blurVPipeline); batch.setResourceTexture(BlurTask_SourceSlot, blurringResources.sourceTexture); @@ -362,7 +361,7 @@ void BlurGaussianDepthAware::run(const SceneContextPointer& sceneContext, const batch.setFramebuffer(blurringResources.finalFramebuffer); if (_inOutResources._generateOutputFramebuffer) { - // batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0)); + // batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0)); } batch.setPipeline(blurHPipeline); diff --git a/libraries/render/src/render/BlurTask.h b/libraries/render/src/render/BlurTask.h index b54e494a80..f820947d98 100644 --- a/libraries/render/src/render/BlurTask.h +++ b/libraries/render/src/render/BlurTask.h @@ -144,6 +144,9 @@ public: void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& SourceAndDepth, gpu::FramebufferPointer& blurredFramebuffer); const BlurParamsPointer& getParameters() const { return _parameters; } + + gpu::PipelinePointer getBlurVPipeline(); + gpu::PipelinePointer getBlurHPipeline(); protected: @@ -152,9 +155,6 @@ protected: gpu::PipelinePointer _blurVPipeline; gpu::PipelinePointer _blurHPipeline; - gpu::PipelinePointer getBlurVPipeline(); - gpu::PipelinePointer getBlurHPipeline(); - BlurInOutResource _inOutResources; }; diff --git a/scripts/developer/utilities/render/statsGPU.qml b/scripts/developer/utilities/render/statsGPU.qml index 44ea4c4597..74bd376a00 100644 --- a/scripts/developer/utilities/render/statsGPU.qml +++ b/scripts/developer/utilities/render/statsGPU.qml @@ -53,11 +53,6 @@ Item { prop: "gpuTime", label: "SurfaceGeometry", color: "#00FFFF" - },{ - object: Render.getConfig("CurvatureRangeTimer"), - prop: "gpuTime", - label: "Curvature", - color: "#00FF00" }, { object: Render.getConfig("RenderDeferred"), diff --git a/scripts/developer/utilities/render/surfaceGeometryPass.qml b/scripts/developer/utilities/render/surfaceGeometryPass.qml index ad5a9dd03d..3f06e63719 100644 --- a/scripts/developer/utilities/render/surfaceGeometryPass.qml +++ b/scripts/developer/utilities/render/surfaceGeometryPass.qml @@ -41,16 +41,11 @@ Column { min: 0.0 } } - } - - Column{ - CheckBox { - text: "Diffuse Curvature Mid" - checked: true - onCheckedChanged: { Render.getConfig("DiffuseCurvatureMid").enabled = checked } - } + Repeater { - model: [ "Blur Scale:DiffuseCurvatureMid:filterScale:2.0", "Blur Depth Threshold:DiffuseCurvatureMid:depthThreshold:1.0", "Blur Scale2:DiffuseCurvatureLow:filterScale:2.0", "Blur Depth Threshold 2:DiffuseCurvatureLow:depthThreshold:1.0"] + model: [ "Diffusion Scale:SurfaceGeometry:diffuseFilterScale:2.0", + "Diffusion Depth Threshold:SurfaceGeometry:diffuseDepthThreshold:1.0" + ] ConfigSlider { label: qsTr(modelData.split(":")[0]) integral: false @@ -60,12 +55,6 @@ Column { min: 0.0 } } - - CheckBox { - text: "Diffuse Curvature Low" - checked: true - onCheckedChanged: { Render.getConfig("DiffuseCurvatureLow").enabled = checked } - } } } }