diff --git a/Utilities/Config.h b/Utilities/Config.h index 81fbb630fa..91b300adf8 100644 --- a/Utilities/Config.h +++ b/Utilities/Config.h @@ -203,6 +203,11 @@ namespace cfg return m_value; } + void set(T value) + { + m_value = value; + } + void from_default() override { m_value = def; diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index be15780c9c..da4757078b 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -126,6 +126,14 @@ void Emulator::Init() // Reset defaults, cache them g_cfg.from_default(); + + // Not all renderers are known at compile time, so set a provided default if possible + if (m_default_renderer == video_renderer::vulkan && !m_default_graphics_adapter.empty()) + { + g_cfg.video.renderer.set(m_default_renderer); + g_cfg.video.vk.adapter.from_string(m_default_graphics_adapter); + } + g_cfg_defaults = g_cfg.to_string(); // Reload override configuration set via command line diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index eec81247ef..2661d58f56 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -9,6 +9,7 @@ u64 get_system_time(); u64 get_guest_system_time(); enum class localized_string_id; +enum class video_renderer; enum class system_state { @@ -64,6 +65,9 @@ class Emulator final atomic_t m_pause_start_time{0}; // set when paused atomic_t m_pause_amend_time{0}; // increased when resumed + video_renderer m_default_renderer; + std::string m_default_graphics_adapter; + std::string m_config_override_path; std::string m_path; std::string m_path_old; @@ -218,6 +222,8 @@ public: bool HasGui() const { return m_has_gui; } void SetHasGui(bool has_gui) { m_has_gui = has_gui; } + void SetDefaultRenderer(video_renderer renderer) { m_default_renderer = renderer; } + void SetDefaultGraphicsAdapter(std::string adapter) { m_default_graphics_adapter = std::move(adapter); } void SetConfigOverride(std::string path) { m_config_override_path = std::move(path); } std::string GetFormattedTitle(double fps) const; diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index 1c38741cae..06cc6910e2 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -21,7 +21,7 @@ inline std::string sstr(const QVariant& _in) { return sstr(_in.toString()); } // Emit sorted YAML namespace { - static NEVER_INLINE void emitData(YAML::Emitter& out, const YAML::Node& node) + static NEVER_INLINE void emit_data(YAML::Emitter& out, const YAML::Node& node) { // TODO out << node; @@ -63,6 +63,19 @@ emu_settings::emu_settings() : QObject() , m_render_creator(new render_creator(this)) { + if (!m_render_creator) + { + fmt::throw_exception("emu_settings::emu_settings() render_creator is null"); + } + + // Make Vulkan default setting if it is supported + if (m_render_creator->Vulkan.supported && !m_render_creator->Vulkan.adapters.empty()) + { + const std::string adapter = sstr(m_render_creator->Vulkan.adapters.at(0)); + cfg_log.notice("Setting the default renderer to Vulkan. Default GPU: '%s')", adapter); + Emu.SetDefaultRenderer(video_renderer::vulkan); + Emu.SetDefaultGraphicsAdapter(adapter); + } } emu_settings::~emu_settings() @@ -149,7 +162,7 @@ void emu_settings::LoadSettings(const std::string& title_id) void emu_settings::SaveSettings() { YAML::Emitter out; - emitData(out, m_currentSettings); + emit_data(out, m_currentSettings); std::string config_name; diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index 573c97eced..ab710f797a 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -289,8 +289,7 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std if (!r_creator) { - cfg_log.error("settings_dialog::settings_dialog render_creator is null"); - return; + fmt::throw_exception("settings_dialog::settings_dialog() render_creator is null"); } r_creator->update_names( @@ -538,15 +537,15 @@ settings_dialog::settings_dialog(std::shared_ptr gui_settings, std ui->antiAliasing->setCurrentText(renderer.has_msaa ? qstr(m_emu_settings->GetSetting(emu_settings_type::MSAA)) : tr("Disabled", "MSAA")); ui->antiAliasing->blockSignals(false); + ui->graphicsAdapterBox->clear(); + // Fill combobox with placeholder if no adapters needed if (!renderer.has_adapters) { - ui->graphicsAdapterBox->clear(); ui->graphicsAdapterBox->addItem(tr("Not needed for %1 renderer", "Graphics adapter").arg(text)); return; } // Fill combobox - ui->graphicsAdapterBox->clear(); for (const auto& adapter : renderer.adapters) { ui->graphicsAdapterBox->addItem(adapter);