From 87a8ad128933097be800b5e0b476d4f7cb4e5792 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 13 Dec 2016 20:48:05 -0500 Subject: [PATCH] strip forward render task to clear and blit --- .../render-utils/src/RenderForwardTask.cpp | 177 +++++------------- .../render-utils/src/RenderForwardTask.h | 11 +- 2 files changed, 54 insertions(+), 134 deletions(-) diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 533b26a5ce..da7fcf5cdd 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -93,140 +93,10 @@ RenderForwardTask::RenderForwardTask(CullFunctor cullFunctor) { const auto overlayTransparents = addJob("DepthSortOverlayTransparent", filteredNonspatialBuckets[TRANSPARENT_SHAPE_BUCKET], DepthSortItems(false)); const auto background = filteredNonspatialBuckets[BACKGROUND_BUCKET]; - // Prepare deferred, generate the shared Deferred Frame Transform - const auto deferredFrameTransform = addJob("DeferredFrameTransform"); - const auto lightingModel = addJob("LightingModel"); - - - // GPU jobs: Start preparing the primary, deferred and lighting buffer - const auto primaryFramebuffer = addJob("PreparePrimaryBuffer"); - - // const auto fullFrameRangeTimer = addJob("BeginRangeTimer"); - const auto opaqueRangeTimer = addJob("BeginOpaqueRangeTimer", "DrawOpaques"); - - const auto prepareDeferredInputs = PrepareDeferred::Inputs(primaryFramebuffer, lightingModel).hasVarying(); - const auto prepareDeferredOutputs = addJob("PrepareDeferred", prepareDeferredInputs); - const auto deferredFramebuffer = prepareDeferredOutputs.getN(0); - const auto lightingFramebuffer = prepareDeferredOutputs.getN(1); - - // Render opaque objects in DeferredBuffer - const auto opaqueInputs = DrawStateSortDeferred::Inputs(opaques, lightingModel).hasVarying(); - addJob("DrawOpaqueDeferred", opaqueInputs, shapePlumber); - - // Once opaque is all rendered create stencil background - addJob("DrawOpaqueStencil", deferredFramebuffer); - - addJob("OpaqueRangeTimer", opaqueRangeTimer); - - - // Opaque all rendered - - // Linear Depth Pass - const auto linearDepthPassInputs = LinearDepthPass::Inputs(deferredFrameTransform, deferredFramebuffer).hasVarying(); - const auto linearDepthPassOutputs = addJob("LinearDepth", linearDepthPassInputs); - const auto linearDepthTarget = linearDepthPassOutputs.getN(0); - - // Curvature pass - const auto surfaceGeometryPassInputs = SurfaceGeometryPass::Inputs(deferredFrameTransform, deferredFramebuffer, linearDepthTarget).hasVarying(); - const auto surfaceGeometryPassOutputs = addJob("SurfaceGeometry", surfaceGeometryPassInputs); - const auto surfaceGeometryFramebuffer = surfaceGeometryPassOutputs.getN(0); - const auto curvatureFramebuffer = surfaceGeometryPassOutputs.getN(1); - const auto midCurvatureNormalFramebuffer = surfaceGeometryPassOutputs.getN(2); - const auto lowCurvatureNormalFramebuffer = surfaceGeometryPassOutputs.getN(3); - - // Simply update the scattering resource - const auto scatteringResource = addJob("Scattering"); - - // AO job - const auto ambientOcclusionInputs = AmbientOcclusionEffect::Inputs(deferredFrameTransform, deferredFramebuffer, linearDepthTarget).hasVarying(); - const auto ambientOcclusionOutputs = addJob("AmbientOcclusion", ambientOcclusionInputs); - const auto ambientOcclusionFramebuffer = ambientOcclusionOutputs.getN(0); - const auto ambientOcclusionUniforms = ambientOcclusionOutputs.getN(1); - - - // Draw Lights just add the lights to the current list of lights to deal with. NOt really gpu job for now. - addJob("DrawLight", lights); - - // Light Clustering - // Create the cluster grid of lights, cpu job for now - const auto lightClusteringPassInputs = LightClusteringPass::Inputs(deferredFrameTransform, lightingModel, linearDepthTarget).hasVarying(); - const auto lightClusters = addJob("LightClustering", lightClusteringPassInputs); - - - // DeferredBuffer is complete, now let's shade it into the LightingBuffer - const auto deferredLightingInputs = RenderDeferred::Inputs(deferredFrameTransform, deferredFramebuffer, lightingModel, - surfaceGeometryFramebuffer, ambientOcclusionFramebuffer, scatteringResource, lightClusters).hasVarying(); - - addJob("RenderDeferred", deferredLightingInputs); - - // Use Stencil and draw background in Lighting buffer to complete filling in the opaque - const auto backgroundInputs = DrawBackgroundDeferred::Inputs(background, lightingModel).hasVarying(); - addJob("DrawBackgroundDeferred", backgroundInputs); - - - // Render transparent objects forward in LightingBuffer - const auto transparentsInputs = DrawDeferred::Inputs(transparents, lightingModel).hasVarying(); - addJob("DrawTransparentDeferred", transparentsInputs, shapePlumber); - - // LIght Cluster Grid Debuging job - { - const auto debugLightClustersInputs = DebugLightClusters::Inputs(deferredFrameTransform, deferredFramebuffer, lightingModel, linearDepthTarget, lightClusters).hasVarying(); - addJob("DebugLightClusters", debugLightClustersInputs); - } - - const auto toneAndPostRangeTimer = addJob("BeginToneAndPostRangeTimer", "PostToneOverlaysAntialiasing"); - - // Lighting Buffer ready for tone mapping - const auto toneMappingInputs = render::Varying(ToneMappingDeferred::Inputs(lightingFramebuffer, primaryFramebuffer)); - addJob("ToneMapping", toneMappingInputs); - - // Overlays - const auto overlayOpaquesInputs = DrawOverlay3D::Inputs(overlayOpaques, lightingModel).hasVarying(); - const auto overlayTransparentsInputs = DrawOverlay3D::Inputs(overlayTransparents, lightingModel).hasVarying(); - addJob("DrawOverlay3DOpaque", overlayOpaquesInputs, true); - addJob("DrawOverlay3DTransparent", overlayTransparentsInputs, false); - - - // Debugging stages - { - // Debugging Deferred buffer job - const auto debugFramebuffers = render::Varying(DebugDeferredBuffer::Inputs(deferredFramebuffer, linearDepthTarget, surfaceGeometryFramebuffer, ambientOcclusionFramebuffer)); - addJob("DebugDeferredBuffer", debugFramebuffers); - - const auto debugSubsurfaceScatteringInputs = DebugSubsurfaceScattering::Inputs(deferredFrameTransform, deferredFramebuffer, lightingModel, - surfaceGeometryFramebuffer, ambientOcclusionFramebuffer, scatteringResource).hasVarying(); - addJob("DebugScattering", debugSubsurfaceScatteringInputs); - - const auto debugAmbientOcclusionInputs = DebugAmbientOcclusion::Inputs(deferredFrameTransform, deferredFramebuffer, linearDepthTarget, ambientOcclusionUniforms).hasVarying(); - addJob("DebugAmbientOcclusion", debugAmbientOcclusionInputs); - - - // Scene Octree Debuging job - { - addJob("DrawSceneOctree", spatialSelection); - 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); - addJob("DrawStatus", opaques, DrawStatus(statusIconMap)); - } - } - - - // AA job to be revisited - addJob("Antialiasing", primaryFramebuffer); - - addJob("ToneAndPostRangeTimer", toneAndPostRangeTimer); + const auto framebuffer = addJob("PrepareFramebuffer"); // Blit! - addJob("Blit", primaryFramebuffer); - - // addJob("RangeTimer", fullFrameRangeTimer); - + addJob("Blit", framebuffer); } void RenderForwardTask::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { @@ -248,3 +118,46 @@ void RenderForwardTask::run(const SceneContextPointer& sceneContext, const Rende job.run(sceneContext, renderContext); } } + +void PrepareFramebuffer::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, gpu::FramebufferPointer& framebuffer) { + auto framebufferCache = DependencyManager::get(); + auto framebufferSize = framebufferCache->getFrameBufferSize(); + glm::uvec2 frameSize(framebufferSize.width(), framebufferSize.height()); + + // Resizing framebuffers instead of re-building them seems to cause issues with threaded rendering + if (_framebuffer && _framebuffer->getSize() != frameSize) { + _framebuffer.reset(); + } + + if (!_framebuffer) { + _framebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("forward")); + + auto colorFormat = gpu::Element::COLOR_SRGBA_32; + auto defaultSampler = gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT); + auto colorTexture = gpu::TexturePointer(gpu::Texture::create2D(colorFormat, frameSize.x, frameSize.y, defaultSampler)); + _framebuffer->setRenderBuffer(0, colorTexture); + + auto depthFormat = gpu::Element(gpu::SCALAR, gpu::UINT32, gpu::DEPTH_STENCIL); // Depth24_Stencil8 texel format + auto depthTexture = gpu::TexturePointer(gpu::Texture::create2D(depthFormat, frameSize.x, frameSize.y, defaultSampler)); + _framebuffer->setDepthStencilBuffer(depthTexture, depthFormat); + } + + auto args = renderContext->args; + gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { + batch.enableStereo(false); + batch.setViewportTransform(args->_viewport); + batch.setStateScissorRect(args->_viewport); + + batch.setFramebuffer(_framebuffer); + batch.clearFramebuffer( + gpu::Framebuffer::BUFFER_COLOR0 | + gpu::Framebuffer::BUFFER_COLOR1 | + gpu::Framebuffer::BUFFER_COLOR2 | + gpu::Framebuffer::BUFFER_COLOR3 | + gpu::Framebuffer::BUFFER_DEPTH | + gpu::Framebuffer::BUFFER_STENCIL, + vec4(vec3(0), 0), 1.0, 0.0, true); + }); + + framebuffer = _framebuffer; +} diff --git a/libraries/render-utils/src/RenderForwardTask.h b/libraries/render-utils/src/RenderForwardTask.h index 0d6da2fbd3..9c4634a8ee 100755 --- a/libraries/render-utils/src/RenderForwardTask.h +++ b/libraries/render-utils/src/RenderForwardTask.h @@ -27,9 +27,16 @@ public: void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); using JobModel = Model; +}; -protected: - gpu::RangeTimerPointer _gpuTimer; +class PrepareFramebuffer { +public: + using JobModel = render::Job::ModelO; + + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, gpu::FramebufferPointer& framebuffer); + +private: + gpu::FramebufferPointer _framebuffer; }; #endif // hifi_RenderForwardTask_h