From 687eef37da50f6f79bf44df210b9f15c0b2142e9 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 23 Dec 2015 18:20:20 -0800 Subject: [PATCH] Move final blit into RenderDeferredTask - Also changes color buffer clearing, such that anything run through Blit will now clear BUFFER_COLOR0 to 0,0,1,0. - Blit will always be added to RenderDeferredTask, but will only run if renderArgs._blitFramebuffer is set. --- interface/src/Application.cpp | 79 ++----------------- .../render-utils/src/RenderDeferredTask.cpp | 73 +++++++++++++++++ .../render-utils/src/RenderDeferredTask.h | 7 ++ libraries/shared/src/RenderArgs.h | 2 + 4 files changed, 89 insertions(+), 72 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e36ad051b9..d383ee3339 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1207,23 +1207,12 @@ void Application::paintGL() { auto primaryFbo = DependencyManager::get()->getPrimaryFramebuffer(); renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; + renderArgs._blitFramebuffer = DependencyManager::get()->getSelfieFramebuffer(); + renderRearViewMirror(&renderArgs, _mirrorViewRect); + + renderArgs._blitFramebuffer.reset(); renderArgs._renderMode = RenderArgs::DEFAULT_RENDER_MODE; - - { - float ratio = ((float)QApplication::desktop()->windowHandle()->devicePixelRatio() * getRenderResolutionScale()); - // Flip the src and destination rect horizontally to do the mirror - auto mirrorRect = glm::ivec4(0, 0, _mirrorViewRect.width() * ratio, _mirrorViewRect.height() * ratio); - auto mirrorRectDest = glm::ivec4(mirrorRect.z, mirrorRect.y, mirrorRect.x, mirrorRect.w); - - auto selfieFbo = DependencyManager::get()->getSelfieFramebuffer(); - gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { - batch.setFramebuffer(selfieFbo); - batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); - batch.blit(primaryFbo, mirrorRect, selfieFbo, mirrorRectDest); - batch.setFramebuffer(nullptr); - }); - } } { @@ -1394,65 +1383,11 @@ void Application::paintGL() { renderArgs._context->setStereoProjections(eyeProjections); renderArgs._context->setStereoViews(eyeOffsets); } + renderArgs._blitFramebuffer = finalFramebuffer; displaySide(&renderArgs, _myCamera); + + renderArgs._blitFramebuffer.reset(); renderArgs._context->enableStereo(false); - - // Blit primary to final FBO - auto primaryFbo = framebufferCache->getPrimaryFramebuffer(); - - if (renderArgs._renderMode == RenderArgs::MIRROR_RENDER_MODE) { - if (displayPlugin->isStereo()) { - gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { - gpu::Vec4i srcRectLeft; - srcRectLeft.z = size.width() / 2; - srcRectLeft.w = size.height(); - - gpu::Vec4i srcRectRight; - srcRectRight.x = size.width() / 2; - srcRectRight.z = size.width(); - srcRectRight.w = size.height(); - - gpu::Vec4i destRectLeft; - destRectLeft.x = srcRectLeft.z; - destRectLeft.z = srcRectLeft.x; - destRectLeft.y = srcRectLeft.y; - destRectLeft.w = srcRectLeft.w; - - gpu::Vec4i destRectRight; - destRectRight.x = srcRectRight.z; - destRectRight.z = srcRectRight.x; - destRectRight.y = srcRectRight.y; - destRectRight.w = srcRectRight.w; - - batch.setFramebuffer(finalFramebuffer); - batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 1.0f, 0.0f)); - // BLit left to right and right to left in stereo - batch.blit(primaryFbo, srcRectRight, finalFramebuffer, destRectLeft); - batch.blit(primaryFbo, srcRectLeft, finalFramebuffer, destRectRight); - }); - } else { - gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { - gpu::Vec4i srcRect; - srcRect.z = size.width(); - srcRect.w = size.height(); - gpu::Vec4i destRect; - destRect.x = size.width(); - destRect.y = 0; - destRect.z = 0; - destRect.w = size.height(); - batch.setFramebuffer(finalFramebuffer); - batch.blit(primaryFbo, srcRect, finalFramebuffer, destRect); - }); - } - } else { - gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { - gpu::Vec4i rect; - rect.z = size.width(); - rect.w = size.height(); - batch.setFramebuffer(finalFramebuffer); - batch.blit(primaryFbo, rect, finalFramebuffer, rect); - }); - } } // Overlay Composition, needs to occur after screen space effects have completed diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index cf60fcfe37..9c99307684 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -126,6 +126,8 @@ RenderDeferredTask::RenderDeferredTask() : Task() { _jobs.push_back(Job(new HitEffect::JobModel("HitEffect"))); _jobs.back().setEnabled(false); _drawHitEffectJobIndex = (int)_jobs.size() -1; + + _jobs.push_back(Job(new Blit::JobModel("Blit"))); } RenderDeferredTask::~RenderDeferredTask() { @@ -385,6 +387,77 @@ void DrawBackgroundDeferred::run(const SceneContextPointer& sceneContext, const args->_batch = nullptr; } +void Blit::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { + assert(renderContext->getArgs()); + assert(renderContext->getArgs()->_context); + + RenderArgs* renderArgs = renderContext->getArgs(); + auto blitFbo = renderArgs->_blitFramebuffer; + + if (!blitFbo) { + return; + } + + // Determine size from viewport + int width = renderArgs->_viewport.z; + int height = renderArgs->_viewport.w; + + // Blit primary to blit FBO + auto framebufferCache = DependencyManager::get(); + auto primaryFbo = framebufferCache->getPrimaryFramebuffer(); + + gpu::doInBatch(renderArgs->_context, [=](gpu::Batch& batch) { + batch.setFramebuffer(blitFbo); + batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 1.0f, 0.0f)); + + if (renderArgs->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { + if (renderArgs->_context->isStereo()) { + gpu::Vec4i srcRectLeft; + srcRectLeft.z = width / 2; + srcRectLeft.w = height; + + gpu::Vec4i srcRectRight; + srcRectRight.x = width / 2; + srcRectRight.z = width; + srcRectRight.w = height; + + gpu::Vec4i destRectLeft; + destRectLeft.x = srcRectLeft.z; + destRectLeft.z = srcRectLeft.x; + destRectLeft.y = srcRectLeft.y; + destRectLeft.w = srcRectLeft.w; + + gpu::Vec4i destRectRight; + destRectRight.x = srcRectRight.z; + destRectRight.z = srcRectRight.x; + destRectRight.y = srcRectRight.y; + destRectRight.w = srcRectRight.w; + + // Blit left to right and right to left in stereo + batch.blit(primaryFbo, srcRectRight, blitFbo, destRectLeft); + batch.blit(primaryFbo, srcRectLeft, blitFbo, destRectRight); + } else { + gpu::Vec4i srcRect; + srcRect.z = width; + srcRect.w = height; + + gpu::Vec4i destRect; + destRect.x = width; + destRect.y = 0; + destRect.z = 0; + destRect.w = height; + + batch.blit(primaryFbo, srcRect, blitFbo, destRect); + } + } else { + gpu::Vec4i rect; + rect.z = width; + rect.w = height; + + batch.blit(primaryFbo, rect, blitFbo, rect); + } + }); +} void RenderDeferredTask::setToneMappingExposure(float exposure) { if (_toneMappingJobIndex >= 0) { diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index b84db31a26..051faa3238 100755 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -90,6 +90,13 @@ public: typedef render::Job::Model JobModel; }; +class Blit { +public: + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext); + + typedef render::Job::Model JobModel; +}; + class RenderDeferredTask : public render::Task { public: diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index 399b94bcef..640ccdcb1f 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -24,6 +24,7 @@ namespace gpu { class Batch; class Context; class Texture; +class Framebuffer; } class RenderDetails { @@ -101,6 +102,7 @@ public: } std::shared_ptr _context = nullptr; + std::shared_ptr _blitFramebuffer = nullptr; OctreeRenderer* _renderer = nullptr; ViewFrustum* _viewFrustum = nullptr; glm::ivec4 _viewport{ 0, 0, 1, 1 };