From e6f8dcfdb0c04a0944dc2a08730058ec439631dd Mon Sep 17 00:00:00 2001 From: Benau Date: Sun, 28 Aug 2022 09:27:08 +0800 Subject: [PATCH] Make render scale configurable in ui for vulkan --- .../include/ge_vulkan_driver.hpp | 1 + lib/graphics_engine/src/ge_vulkan_driver.cpp | 19 +++++++++++++++++++ src/graphics/irr_driver.cpp | 2 ++ .../options/options_screen_video.cpp | 19 ++++++++++++++----- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/lib/graphics_engine/include/ge_vulkan_driver.hpp b/lib/graphics_engine/include/ge_vulkan_driver.hpp index 0d85912b3..d395f3b2e 100644 --- a/lib/graphics_engine/include/ge_vulkan_driver.hpp +++ b/lib/graphics_engine/include/ge_vulkan_driver.hpp @@ -337,6 +337,7 @@ namespace GE destroySwapChainRelated(false/*handle_surface*/); createSwapChainRelated(false/*handle_surface*/); } + void updateRenderScale(float value); uint32_t getGraphicsFamily() const { return m_graphics_family; } unsigned getGraphicsQueueCount() const { return m_graphics_queue_count; } diff --git a/lib/graphics_engine/src/ge_vulkan_driver.cpp b/lib/graphics_engine/src/ge_vulkan_driver.cpp index eff630d67..a083b0fa1 100644 --- a/lib/graphics_engine/src/ge_vulkan_driver.cpp +++ b/lib/graphics_engine/src/ge_vulkan_driver.cpp @@ -2413,6 +2413,25 @@ bool GEVulkanDriver::setRenderTarget(video::ITexture* texture, return true; } // setRenderTarget +// ---------------------------------------------------------------------------- +void GEVulkanDriver::updateRenderScale(float value) +{ + if (getGEConfig()->m_render_scale == value) + return; + waitIdle(); + setDisableWaitIdle(true); + destroySwapChainRelated(false/*handle_surface*/); + getGEConfig()->m_render_scale = value; + createSwapChainRelated(false/*handle_surface*/); + for (auto& dc : static_cast( + m_irrlicht_device->getSceneManager())->getDrawCalls()) + dc.second = std::unique_ptr(new GEVulkanDrawCall); + GEVulkanSkyBoxRenderer::destroy(); + GEVulkan2dRenderer::destroy(); + GEVulkan2dRenderer::init(this); + setDisableWaitIdle(false); +} // updateRenderScale + } namespace irr diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index d81e7b8c1..cbabf3229 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -414,6 +414,8 @@ void IrrDriver::initDevice() #ifndef SERVER_ONLY GE::getGEConfig()->m_texture_compression = UserConfigParams::m_texture_compression; + GE::getGEConfig()->m_render_scale = + UserConfigParams::m_scale_rtts_factor; #endif } else diff --git a/src/states_screens/options/options_screen_video.cpp b/src/states_screens/options/options_screen_video.cpp index 60c126af4..4332be641 100644 --- a/src/states_screens/options/options_screen_video.cpp +++ b/src/states_screens/options/options_screen_video.cpp @@ -464,7 +464,10 @@ void OptionsScreenVideo::init() gfx->setActive(!in_game && CVS->isGLSL()); getWidget("custom")->setActive(!in_game || !CVS->isGLSL()); if (getWidget("scale_rtts")->isActivated()) - getWidget("scale_rtts")->setActive(!in_game); + { + getWidget("scale_rtts")->setActive(!in_game || + GE::getDriver()->getDriverType() == video::EDT_VULKAN); + } #endif #if defined(MOBILE_STK) || defined(__SWITCH__) @@ -555,7 +558,8 @@ void OptionsScreenVideo::updateGfxSlider() setActive(UserConfigParams::m_dynamic_lights && CVS->isGLSL()); // Same with Render resolution slider getWidget("scale_rtts")-> - setActive(UserConfigParams::m_dynamic_lights && CVS->isGLSL()); + setActive((UserConfigParams::m_dynamic_lights && CVS->isGLSL()) || + GE::getDriver()->getDriverType() == video::EDT_VULKAN); updateTooltip(); #endif @@ -791,9 +795,11 @@ void OptionsScreenVideo::eventCallback(Widget* widget, const std::string& name, getWidget("blur_level")->setActive(level >= 2); // Same with Render resolution slider +#ifndef SERVER_ONLY getWidget("scale_rtts")-> - setActive(UserConfigParams::m_dynamic_lights); - + setActive(UserConfigParams::m_dynamic_lights || + GE::getDriver()->getDriverType() == video::EDT_VULKAN); +#endif UserConfigParams::m_animated_characters = m_presets[level].animatedCharacters; UserConfigParams::m_particles_effects = m_presets[level].particles; setImageQuality(m_presets[level].image_quality); @@ -844,7 +850,10 @@ void OptionsScreenVideo::eventCallback(Widget* widget, const std::string& name, assert(level < (int)m_scale_rtts_custom_presets.size()); UserConfigParams::m_scale_rtts_factor = m_scale_rtts_custom_presets[level].value; - +#ifndef SERVER_ONLY + if (GE::getVKDriver()) + GE::getVKDriver()->updateRenderScale(UserConfigParams::m_scale_rtts_factor); +#endif updateScaleRTTsSlider(); } else if (name == "rememberWinpos")