From 44b33f1962549886b011f5c0bf0827bae1c05ffa Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 2 Jun 2026 00:44:15 +0200 Subject: [PATCH] Force renderer to default renderer if not supported --- Utilities/Config.h | 5 +++++ rpcs3/Emu/System.cpp | 12 +++++++++++- rpcs3/Emu/System.h | 5 +++++ rpcs3/rpcs3qt/emu_settings.cpp | 15 +++++++++++---- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Utilities/Config.h b/Utilities/Config.h index 4f8e578fde..d17f970dc5 100644 --- a/Utilities/Config.h +++ b/Utilities/Config.h @@ -717,6 +717,11 @@ namespace cfg m_value = std::string(value); return true; } + + void set(std::string_view value) + { + m_value = std::string(value); + } }; // Simple set entry (TODO: template for various types) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 298151e3bf..4b412a2b78 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -121,7 +121,8 @@ namespace rsx } Emulator::Emulator() noexcept - : m_default_renderer(video_renderer::null) + : m_supported_renderers({video_renderer::null}) + , m_default_renderer(video_renderer::null) { s_emulator_available = true; } @@ -303,6 +304,15 @@ static void fixup_settings(const psf::registry* _psf) g_cfg.audio.music.set(music_handler::null); } } + else + { + // Make sure we have a valid renderer + if (!Emu.GetSupportedRenderers().contains(g_cfg.video.renderer.get())) + { + sys_log.warning("The video renderer '%s' is not supported on this device and will therefore be set to '%s'.", g_cfg.video.renderer.get(), Emu.GetDefaultRenderer()); + g_cfg.video.renderer.set(Emu.GetDefaultRenderer()); + } + } // Some settings are not allowed in certain PPU decoders if (g_cfg.core.ppu_decoder != ppu_decoder_type::_static) diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index a765616c0d..e0efebc1d8 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -142,6 +142,7 @@ class Emulator final games_config m_games_config; + std::set m_supported_renderers; video_renderer m_default_renderer; std::string m_default_graphics_adapter; @@ -476,6 +477,10 @@ public: bool IsHeadless() const { return m_headless; } void SetHeadless(bool headless) { m_headless = headless; } + const std::set& GetSupportedRenderers() const { return m_supported_renderers; } + void SetSupportedRenderers(std::set renderers) { m_supported_renderers = std::move(renderers); } + + video_renderer GetDefaultRenderer() const { return m_default_renderer; } void SetDefaultRenderer(video_renderer renderer) { m_default_renderer = renderer; } void SetDefaultGraphicsAdapter(std::string adapter) { m_default_graphics_adapter = std::move(adapter); } diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index 6e90adc8c4..fd48aea94d 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -100,21 +100,28 @@ bool emu_settings::Init() { m_render_creator = new render_creator(this); - if (m_render_creator->abort_requested) + std::set supported_renderers; + supported_renderers.insert(video_renderer::null); + + if (m_render_creator->OpenGL.supported) { - return false; + supported_renderers.insert(video_renderer::opengl); } // Make Vulkan default setting if it is supported - if (m_render_creator->Vulkan.supported && !m_render_creator->Vulkan.adapters.empty()) + if (!m_render_creator->abort_requested && m_render_creator->Vulkan.supported && !m_render_creator->Vulkan.adapters.empty()) { const std::string adapter = ::at32(m_render_creator->Vulkan.adapters, 0).toStdString(); cfg_log.notice("Setting the default renderer to Vulkan. Default GPU: '%s'", adapter); Emu.SetDefaultRenderer(video_renderer::vulkan); Emu.SetDefaultGraphicsAdapter(adapter); + + supported_renderers.insert(video_renderer::vulkan); } - return true; + Emu.SetSupportedRenderers(supported_renderers); + + return !m_render_creator->abort_requested; } void emu_settings::LoadSettings(const std::string& title_id, bool create_config_from_global, const std::string& db_config)