From ca107953fe2d4495740ac77598a60c82c7420492 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Wed, 3 Mar 2021 09:40:52 +0100 Subject: [PATCH] Vulkan renderer setting was reset to off when starting a game --- core/cfg/option.h | 30 +++++++++++++++++++----------- core/nullDC.cpp | 3 +-- core/rend/gui.cpp | 2 +- core/rend/mainui.cpp | 22 ++++++++-------------- core/rend/mainui.h | 1 - core/wsi/context.h | 7 ++++++- core/wsi/switcher.cpp | 7 ------- 7 files changed, 35 insertions(+), 37 deletions(-) diff --git a/core/cfg/option.h b/core/cfg/option.h index 030b1e058..5bf18ccc5 100644 --- a/core/cfg/option.h +++ b/core/cfg/option.h @@ -23,8 +23,6 @@ #include "cfg.h" #include "hw/maple/maple_cfg.h" -extern int renderer_changed; - namespace config { class BaseOption { @@ -113,7 +111,7 @@ public: } virtual void reset() override { - value = defaultValue; + set(defaultValue); overridden = false; } @@ -316,25 +314,35 @@ public: bool isOpenGL() const { return value == RenderType::OpenGL || value == RenderType::OpenGL_OIT; } + void set(RenderType v) + { + newValue = v; + } RenderType& operator=(const RenderType& v) { set(v); return value; } virtual void load() override { RenderType current = value; Option::load(); - if (current != value) { - ::renderer_changed = (int)value; - value = current; - } + newValue = value; + value = current; } virtual void reset() override { RenderType current = value; Option::reset(); - if (current != value) { - ::renderer_changed = (int)value; - value = current; - } + newValue = value; + value = current; } + + bool pendingChange() { + return newValue != value; + } + void commit() { + value = newValue; + } + +private: + RenderType newValue = RenderType(); }; extern RendererOption RendererType; extern Option UseMipmaps; diff --git a/core/nullDC.cpp b/core/nullDC.cpp index ed8dbe1c6..3da5cf4d9 100644 --- a/core/nullDC.cpp +++ b/core/nullDC.cpp @@ -405,8 +405,7 @@ int reicast_init(int argc, char* argv[]) config::Settings::instance().load(false); } // Force the renderer type now since we're not switching - if (renderer_changed != -1) - config::RendererType = (RenderType)renderer_changed; + config::RendererType.commit(); os_CreateWindow(); os_SetupInput(); diff --git a/core/rend/gui.cpp b/core/rend/gui.cpp index 1a25a14d8..228b10602 100644 --- a/core/rend/gui.cpp +++ b/core/rend/gui.cpp @@ -1613,7 +1613,7 @@ static void gui_display_settings() if (vulkan != !config::RendererType.isOpenGL()) pvr_rend = !vulkan ? RenderType::OpenGL : config::RendererType == RenderType::OpenGL_OIT ? RenderType::Vulkan_OIT : RenderType::Vulkan; - renderer_changed = (int)pvr_rend; + config::RendererType = pvr_rend; } void gui_display_notification(const char *msg, int duration) diff --git a/core/rend/mainui.cpp b/core/rend/mainui.cpp index a50519d40..7906c7361 100644 --- a/core/rend/mainui.cpp +++ b/core/rend/mainui.cpp @@ -26,8 +26,8 @@ #include "cfg/option.h" bool mainui_enabled; -int renderer_changed = -1; // Signals the renderer thread to switch renderer u32 MainFrameCount; +static bool forceReinit; void UpdateInputState(); @@ -69,7 +69,6 @@ void mainui_term() void mainui_loop() { mainui_enabled = true; - renderer_changed = (int)(RenderType)config::RendererType; mainui_init(); while (mainui_enabled) @@ -84,21 +83,16 @@ void mainui_loop() #endif } - if (renderer_changed != (int)(RenderType)config::RendererType) + if (config::RendererType.pendingChange() || forceReinit) { + bool openGl = config::RendererType.isOpenGL(); mainui_term(); - if (renderer_changed == -1 - || config::RendererType.isOpenGL() != ((RenderType)renderer_changed == RenderType::OpenGL || (RenderType)renderer_changed == RenderType::OpenGL_OIT)) - { + config::RendererType.commit(); + if (openGl != config::RendererType.isOpenGL() || forceReinit) // Switch between vulkan and opengl (or full reinit) - SwitchRenderApi(renderer_changed == -1 ? config::RendererType : (RenderType)renderer_changed); - } - else - { - config::RendererType = (RenderType)renderer_changed; - } - renderer_changed = (int)(RenderType)config::RendererType; + SwitchRenderApi(); mainui_init(); + forceReinit = false; } } @@ -112,5 +106,5 @@ void mainui_stop() void mainui_reinit() { - renderer_changed = -1; + forceReinit = true; } diff --git a/core/rend/mainui.h b/core/rend/mainui.h index 5fe4e9d04..c3e5f9e3d 100644 --- a/core/rend/mainui.h +++ b/core/rend/mainui.h @@ -20,7 +20,6 @@ #include "types.h" extern bool mainui_enabled; // Signals the UI thread to exit -extern int renderer_changed; // Signals the UI thread to switch renderer when different from settings.pvr.rend extern u32 MainFrameCount; bool mainui_rend_frame(); diff --git a/core/wsi/context.h b/core/wsi/context.h index de2c7a482..afdce0312 100644 --- a/core/wsi/context.h +++ b/core/wsi/context.h @@ -26,6 +26,11 @@ extern VulkanContext theVulkanContext; #endif void InitRenderApi(); -void SwitchRenderApi(RenderType newApi); void TermRenderApi(); +static inline void SwitchRenderApi() +{ + TermRenderApi(); + InitRenderApi(); +} + diff --git a/core/wsi/switcher.cpp b/core/wsi/switcher.cpp index 8b08645bd..d4c3623ef 100644 --- a/core/wsi/switcher.cpp +++ b/core/wsi/switcher.cpp @@ -42,13 +42,6 @@ void InitRenderApi() exit(1); } -void SwitchRenderApi(RenderType newApi) -{ - TermRenderApi(); - config::RendererType = newApi; - InitRenderApi(); -} - void TermRenderApi() { #ifdef USE_VULKAN