From 61d473887fbc2ddc9a17ec815dfdb7d407085a13 Mon Sep 17 00:00:00 2001 From: MasTraER Date: Fri, 27 Nov 2020 17:38:46 +0900 Subject: [PATCH] Fix clearing Rendertarget multiple times This fixes a bug Renderer clearing a render target multiple times when the first time and back again. Usually the default RenderTarget is unintentionally cleared/discarded in the current behavior. 1) Renderer renders a view without custom RenderTarget having full-screen viewport, 2) Renderer renders a view with custom RenderTarget 3) And Renderer renders an another view without custom RenderTarget having different viewport from 1) You may see junk or empty pixels in outside of the viewport of the view 3), depending on ClearOptions and the backend. This fix make Renderer put cleared RenderTargets into a set and check them to be cleared only for the first time, instead of comparing the previous RenderTarget to the current RenderTarget. --- filament/src/Renderer.cpp | 6 +++--- filament/src/details/Renderer.h | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/filament/src/Renderer.cpp b/filament/src/Renderer.cpp index 062312ffc5..67fdc561b3 100644 --- a/filament/src/Renderer.cpp +++ b/filament/src/Renderer.cpp @@ -229,9 +229,9 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { } FRenderTarget* currentRenderTarget = upcast(view.getRenderTarget()); - if (mPreviousRenderTarget != currentRenderTarget) { + if (mPreviousRenderTargets.find(currentRenderTarget) == mPreviousRenderTargets.end()) { + mPreviousRenderTargets.insert(currentRenderTarget); initializeClearFlags(); - mPreviousRenderTarget = currentRenderTarget; } view.prepare(engine, driver, arena, svp, getShaderUserTime()); @@ -906,7 +906,7 @@ bool FRenderer::beginFrame(FSwapChain* swapChain, uint64_t vsyncSteadyClockTimeN mShaderUserTime = { h, l, 0, 0 }; initializeClearFlags(); - mPreviousRenderTarget = nullptr; + mPreviousRenderTargets.clear(); mBeginFrameInternal = {}; diff --git a/filament/src/details/Renderer.h b/filament/src/details/Renderer.h index 8c2de657d8..35aba44c36 100644 --- a/filament/src/details/Renderer.h +++ b/filament/src/details/Renderer.h @@ -40,6 +40,8 @@ #include #include +#include + namespace filament { namespace backend { @@ -192,7 +194,7 @@ private: ClearOptions mClearOptions; backend::TargetBufferFlags mDiscardedFlags{}; backend::TargetBufferFlags mClearFlags{}; - FRenderTarget* mPreviousRenderTarget = nullptr; + tsl::robin_set mPreviousRenderTargets; std::function mBeginFrameInternal; // per-frame arena for this Renderer