From 518a1421ab721fc5338cb78e3974399a9a09aece Mon Sep 17 00:00:00 2001 From: vladislavbelov Date: Fri, 11 Mar 2022 22:26:49 +0000 Subject: [PATCH] Clears the color attachment of the main framebuffer only if needed. Differential Revision: https://code.wildfiregames.com/D4539 This was SVN commit r26623. --- source/renderer/SceneRenderer.cpp | 30 ++++++++----------- source/renderer/SkyManager.cpp | 13 ++------ source/renderer/SkyManager.h | 10 +++---- .../tools/atlas/GameInterface/ActorViewer.cpp | 6 ++-- 4 files changed, 23 insertions(+), 36 deletions(-) diff --git a/source/renderer/SceneRenderer.cpp b/source/renderer/SceneRenderer.cpp index bfcc7a8475..80d9331fd7 100644 --- a/source/renderer/SceneRenderer.cpp +++ b/source/renderer/SceneRenderer.cpp @@ -580,23 +580,15 @@ void CSceneRenderer::RenderReflections( deviceCommandContext->SetFramebuffer(wm.m_ReflectionFramebuffer.get()); deviceCommandContext->ClearFramebuffer(); - if (!g_RenderingOptions.GetWaterReflection()) - { - m->skyManager.RenderSky(deviceCommandContext); - ogl_WarnIfError(); - } - else - { - CShaderDefines reflectionsContext = context; - reflectionsContext.Add(str_PASS_REFLECTIONS, str_1); - // Render terrain and models - RenderPatches(deviceCommandContext, reflectionsContext, CULL_REFLECTIONS); - ogl_WarnIfError(); - RenderModels(deviceCommandContext, reflectionsContext, CULL_REFLECTIONS); - ogl_WarnIfError(); - RenderTransparentModels(deviceCommandContext, reflectionsContext, CULL_REFLECTIONS, TRANSPARENT); - ogl_WarnIfError(); - } + CShaderDefines reflectionsContext = context; + reflectionsContext.Add(str_PASS_REFLECTIONS, str_1); + // Render terrain and models + RenderPatches(deviceCommandContext, reflectionsContext, CULL_REFLECTIONS); + ogl_WarnIfError(); + RenderModels(deviceCommandContext, reflectionsContext, CULL_REFLECTIONS); + ogl_WarnIfError(); + RenderTransparentModels(deviceCommandContext, reflectionsContext, CULL_REFLECTIONS, TRANSPARENT); + ogl_WarnIfError(); // Particles are always oriented to face the camera in the vertex shader, // so they don't need the inverted cull face. @@ -837,7 +829,9 @@ void CSceneRenderer::RenderSubmissions( { PROFILE3_GPU("clear buffers"); - deviceCommandContext->ClearFramebuffer(); + // We don't need to clear the color attachment of the framebuffer if the sky + // is going to be rendered. Because it covers the whole view. + deviceCommandContext->ClearFramebuffer(!m->skyManager.IsSkyVisible(), true, true); } m->skyManager.RenderSky(deviceCommandContext); diff --git a/source/renderer/SkyManager.cpp b/source/renderer/SkyManager.cpp index 314f37a289..6652d92df2 100644 --- a/source/renderer/SkyManager.cpp +++ b/source/renderer/SkyManager.cpp @@ -25,7 +25,6 @@ #include "graphics/TextureManager.h" #include "lib/bits.h" #include "lib/tex/tex.h" -#include "lib/timer.h" #include "maths/MathUtil.h" #include "ps/CLogger.h" #include "ps/ConfigDB.h" @@ -33,9 +32,7 @@ #include "ps/CStrInternStatic.h" #include "ps/Filesystem.h" #include "ps/Game.h" -#include "ps/Loader.h" #include "ps/VideoMode.h" -#include "ps/World.h" #include "renderer/backend/gl/Device.h" #include "renderer/Renderer.h" #include "renderer/SceneRenderer.h" @@ -46,7 +43,7 @@ SkyManager::SkyManager() : m_VertexArray(Renderer::Backend::GL::CBuffer::Type::VERTEX, false) { - CFG_GET_VAL("showsky", m_RenderSky); + CFG_GET_VAL("showsky", m_SkyVisible); } void SkyManager::LoadAndUploadSkyTexturesIfNeeded( @@ -195,11 +192,8 @@ void SkyManager::RenderSky( Renderer::Backend::GL::CDeviceCommandContext* deviceCommandContext) { GPU_SCOPED_LABEL(deviceCommandContext, "Render sky"); -#if CONFIG2_GLES - UNUSED2(deviceCommandContext); -#warning TODO: implement SkyManager::RenderSky for GLES -#else - if (!m_RenderSky) + + if (!m_SkyVisible) return; // Do nothing unless SetSkySet was called @@ -251,7 +245,6 @@ void SkyManager::RenderSky( deviceCommandContext->Draw(0, m_VertexArray.GetNumberOfVertices()); skytech->EndPass(); -#endif } void SkyManager::CreateSkyCube() diff --git a/source/renderer/SkyManager.h b/source/renderer/SkyManager.h index f06f33f557..9084d79e3c 100644 --- a/source/renderer/SkyManager.h +++ b/source/renderer/SkyManager.h @@ -68,14 +68,14 @@ public: */ std::vector GetSkySets() const; - bool GetRenderSky() const + bool IsSkyVisible() const { - return m_RenderSky; + return m_SkyVisible; } - void SetRenderSky(bool value) + void SetSkyVisible(bool value) { - m_RenderSky = value; + m_SkyVisible = value; } /** @@ -87,7 +87,7 @@ public: private: void CreateSkyCube(); - bool m_RenderSky = true; + bool m_SkyVisible = true; /// Name of current skyset (a directory within art/textures/skies) CStrW m_SkySet; diff --git a/source/tools/atlas/GameInterface/ActorViewer.cpp b/source/tools/atlas/GameInterface/ActorViewer.cpp index 1109b13b8e..47eb7a35d6 100644 --- a/source/tools/atlas/GameInterface/ActorViewer.cpp +++ b/source/tools/atlas/GameInterface/ActorViewer.cpp @@ -447,8 +447,8 @@ void ActorViewer::SetEnabled(bool enabled) m.OldShadows = g_RenderingOptions.GetShadows(); SetShadowsEnabled(m.ShadowsEnabled); - m.OldSky = g_Renderer.GetSceneRenderer().GetSkyManager().GetRenderSky(); - g_Renderer.GetSceneRenderer().GetSkyManager().SetRenderSky(false); + m.OldSky = g_Renderer.GetSceneRenderer().GetSkyManager().IsSkyVisible(); + g_Renderer.GetSceneRenderer().GetSkyManager().SetSkyVisible(false); m.OldWater = g_Renderer.GetSceneRenderer().GetWaterManager().m_RenderWater; g_Renderer.GetSceneRenderer().GetWaterManager().m_RenderWater = m.WaterEnabled; @@ -457,7 +457,7 @@ void ActorViewer::SetEnabled(bool enabled) { // Restore the old renderer state SetShadowsEnabled(m.OldShadows); - g_Renderer.GetSceneRenderer().GetSkyManager().SetRenderSky(m.OldSky); + g_Renderer.GetSceneRenderer().GetSkyManager().SetSkyVisible(m.OldSky); g_Renderer.GetSceneRenderer().GetWaterManager().m_RenderWater = m.OldWater; } }