early-access version 3190
This commit is contained in:
		| @@ -1,7 +1,7 @@ | ||||
| yuzu emulator early access | ||||
| ============= | ||||
|  | ||||
| This is the source code for early-access 3189. | ||||
| This is the source code for early-access 3190. | ||||
|  | ||||
| ## Legal Notice | ||||
|  | ||||
|   | ||||
| @@ -16,7 +16,7 @@ DefaultControllerApplet::DefaultControllerApplet(HID::HIDCore& hid_core_) : hid_ | ||||
|  | ||||
| DefaultControllerApplet::~DefaultControllerApplet() = default; | ||||
|  | ||||
| void DefaultControllerApplet::ReconfigureControllers(std::function<void()> callback, | ||||
| void DefaultControllerApplet::ReconfigureControllers(ReconfigureCallback callback, | ||||
|                                                      const ControllerParameters& parameters) const { | ||||
|     LOG_INFO(Service_HID, "called, deducing the best configuration based on the given parameters!"); | ||||
|  | ||||
|   | ||||
| @@ -36,9 +36,11 @@ struct ControllerParameters { | ||||
|  | ||||
| class ControllerApplet { | ||||
| public: | ||||
|     using ReconfigureCallback = std::function<void()>; | ||||
|  | ||||
|     virtual ~ControllerApplet(); | ||||
|  | ||||
|     virtual void ReconfigureControllers(std::function<void()> callback, | ||||
|     virtual void ReconfigureControllers(ReconfigureCallback callback, | ||||
|                                         const ControllerParameters& parameters) const = 0; | ||||
| }; | ||||
|  | ||||
| @@ -47,7 +49,7 @@ public: | ||||
|     explicit DefaultControllerApplet(HID::HIDCore& hid_core_); | ||||
|     ~DefaultControllerApplet() override; | ||||
|  | ||||
|     void ReconfigureControllers(std::function<void()> callback, | ||||
|     void ReconfigureControllers(ReconfigureCallback callback, | ||||
|                                 const ControllerParameters& parameters) const override; | ||||
|  | ||||
| private: | ||||
|   | ||||
| @@ -8,13 +8,13 @@ namespace Core::Frontend { | ||||
|  | ||||
| ErrorApplet::~ErrorApplet() = default; | ||||
|  | ||||
| void DefaultErrorApplet::ShowError(Result error, std::function<void()> finished) const { | ||||
| void DefaultErrorApplet::ShowError(Result error, FinishedCallback finished) const { | ||||
|     LOG_CRITICAL(Service_Fatal, "Application requested error display: {:04}-{:04} (raw={:08X})", | ||||
|                  error.module.Value(), error.description.Value(), error.raw); | ||||
| } | ||||
|  | ||||
| void DefaultErrorApplet::ShowErrorWithTimestamp(Result error, std::chrono::seconds time, | ||||
|                                                 std::function<void()> finished) const { | ||||
|                                                 FinishedCallback finished) const { | ||||
|     LOG_CRITICAL( | ||||
|         Service_Fatal, | ||||
|         "Application requested error display: {:04X}-{:04X} (raw={:08X}) with timestamp={:016X}", | ||||
| @@ -23,7 +23,7 @@ void DefaultErrorApplet::ShowErrorWithTimestamp(Result error, std::chrono::secon | ||||
|  | ||||
| void DefaultErrorApplet::ShowCustomErrorText(Result error, std::string main_text, | ||||
|                                              std::string detail_text, | ||||
|                                              std::function<void()> finished) const { | ||||
|                                              FinishedCallback finished) const { | ||||
|     LOG_CRITICAL(Service_Fatal, | ||||
|                  "Application requested custom error with error_code={:04X}-{:04X} (raw={:08X})", | ||||
|                  error.module.Value(), error.description.Value(), error.raw); | ||||
|   | ||||
| @@ -12,25 +12,27 @@ namespace Core::Frontend { | ||||
|  | ||||
| class ErrorApplet { | ||||
| public: | ||||
|     using FinishedCallback = std::function<void()>; | ||||
|  | ||||
|     virtual ~ErrorApplet(); | ||||
|  | ||||
|     virtual void ShowError(Result error, std::function<void()> finished) const = 0; | ||||
|     virtual void ShowError(Result error, FinishedCallback finished) const = 0; | ||||
|  | ||||
|     virtual void ShowErrorWithTimestamp(Result error, std::chrono::seconds time, | ||||
|                                         std::function<void()> finished) const = 0; | ||||
|                                         FinishedCallback finished) const = 0; | ||||
|  | ||||
|     virtual void ShowCustomErrorText(Result error, std::string dialog_text, | ||||
|                                      std::string fullscreen_text, | ||||
|                                      std::function<void()> finished) const = 0; | ||||
|                                      FinishedCallback finished) const = 0; | ||||
| }; | ||||
|  | ||||
| class DefaultErrorApplet final : public ErrorApplet { | ||||
| public: | ||||
|     void ShowError(Result error, std::function<void()> finished) const override; | ||||
|     void ShowError(Result error, FinishedCallback finished) const override; | ||||
|     void ShowErrorWithTimestamp(Result error, std::chrono::seconds time, | ||||
|                                 std::function<void()> finished) const override; | ||||
|                                 FinishedCallback finished) const override; | ||||
|     void ShowCustomErrorText(Result error, std::string main_text, std::string detail_text, | ||||
|                              std::function<void()> finished) const override; | ||||
|                              FinishedCallback finished) const override; | ||||
| }; | ||||
|  | ||||
| } // namespace Core::Frontend | ||||
|   | ||||
| @@ -8,7 +8,7 @@ namespace Core::Frontend { | ||||
|  | ||||
| MiiEditApplet::~MiiEditApplet() = default; | ||||
|  | ||||
| void DefaultMiiEditApplet::ShowMiiEdit(const std::function<void()>& callback) const { | ||||
| void DefaultMiiEditApplet::ShowMiiEdit(const MiiEditCallback& callback) const { | ||||
|     LOG_WARNING(Service_AM, "(STUBBED) called"); | ||||
|  | ||||
|     callback(); | ||||
|   | ||||
| @@ -9,14 +9,16 @@ namespace Core::Frontend { | ||||
|  | ||||
| class MiiEditApplet { | ||||
| public: | ||||
|     using MiiEditCallback = std::function<void()>; | ||||
|  | ||||
|     virtual ~MiiEditApplet(); | ||||
|  | ||||
|     virtual void ShowMiiEdit(const std::function<void()>& callback) const = 0; | ||||
|     virtual void ShowMiiEdit(const MiiEditCallback& callback) const = 0; | ||||
| }; | ||||
|  | ||||
| class DefaultMiiEditApplet final : public MiiEditApplet { | ||||
| public: | ||||
|     void ShowMiiEdit(const std::function<void()>& callback) const override; | ||||
|     void ShowMiiEdit(const MiiEditCallback& callback) const override; | ||||
| }; | ||||
|  | ||||
| } // namespace Core::Frontend | ||||
|   | ||||
| @@ -9,8 +9,7 @@ namespace Core::Frontend { | ||||
|  | ||||
| ProfileSelectApplet::~ProfileSelectApplet() = default; | ||||
|  | ||||
| void DefaultProfileSelectApplet::SelectProfile( | ||||
|     std::function<void(std::optional<Common::UUID>)> callback) const { | ||||
| void DefaultProfileSelectApplet::SelectProfile(SelectProfileCallback callback) const { | ||||
|     Service::Account::ProfileManager manager; | ||||
|     callback(manager.GetUser(Settings::values.current_user.GetValue()).value_or(Common::UUID{})); | ||||
|     LOG_INFO(Service_ACC, "called, selecting current user instead of prompting..."); | ||||
|   | ||||
| @@ -11,14 +11,16 @@ namespace Core::Frontend { | ||||
|  | ||||
| class ProfileSelectApplet { | ||||
| public: | ||||
|     using SelectProfileCallback = std::function<void(std::optional<Common::UUID>)>; | ||||
|  | ||||
|     virtual ~ProfileSelectApplet(); | ||||
|  | ||||
|     virtual void SelectProfile(std::function<void(std::optional<Common::UUID>)> callback) const = 0; | ||||
|     virtual void SelectProfile(SelectProfileCallback callback) const = 0; | ||||
| }; | ||||
|  | ||||
| class DefaultProfileSelectApplet final : public ProfileSelectApplet { | ||||
| public: | ||||
|     void SelectProfile(std::function<void(std::optional<Common::UUID>)> callback) const override; | ||||
|     void SelectProfile(SelectProfileCallback callback) const override; | ||||
| }; | ||||
|  | ||||
| } // namespace Core::Frontend | ||||
|   | ||||
| @@ -15,10 +15,7 @@ DefaultSoftwareKeyboardApplet::~DefaultSoftwareKeyboardApplet() = default; | ||||
|  | ||||
| void DefaultSoftwareKeyboardApplet::InitializeKeyboard( | ||||
|     bool is_inline, KeyboardInitializeParameters initialize_parameters, | ||||
|     std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)> | ||||
|         submit_normal_callback_, | ||||
|     std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)> | ||||
|         submit_inline_callback_) { | ||||
|     SubmitNormalCallback submit_normal_callback_, SubmitInlineCallback submit_inline_callback_) { | ||||
|     if (is_inline) { | ||||
|         LOG_WARNING( | ||||
|             Service_AM, | ||||
|   | ||||
| @@ -54,14 +54,17 @@ struct InlineTextParameters { | ||||
|  | ||||
| class SoftwareKeyboardApplet { | ||||
| public: | ||||
|     using SubmitInlineCallback = | ||||
|         std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)>; | ||||
|     using SubmitNormalCallback = | ||||
|         std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)>; | ||||
|  | ||||
|     virtual ~SoftwareKeyboardApplet(); | ||||
|  | ||||
|     virtual void InitializeKeyboard( | ||||
|         bool is_inline, KeyboardInitializeParameters initialize_parameters, | ||||
|         std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)> | ||||
|             submit_normal_callback_, | ||||
|         std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)> | ||||
|             submit_inline_callback_) = 0; | ||||
|     virtual void InitializeKeyboard(bool is_inline, | ||||
|                                     KeyboardInitializeParameters initialize_parameters, | ||||
|                                     SubmitNormalCallback submit_normal_callback_, | ||||
|                                     SubmitInlineCallback submit_inline_callback_) = 0; | ||||
|  | ||||
|     virtual void ShowNormalKeyboard() const = 0; | ||||
|  | ||||
| @@ -81,12 +84,9 @@ class DefaultSoftwareKeyboardApplet final : public SoftwareKeyboardApplet { | ||||
| public: | ||||
|     ~DefaultSoftwareKeyboardApplet() override; | ||||
|  | ||||
|     void InitializeKeyboard( | ||||
|         bool is_inline, KeyboardInitializeParameters initialize_parameters, | ||||
|         std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)> | ||||
|             submit_normal_callback_, | ||||
|         std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)> | ||||
|             submit_inline_callback_) override; | ||||
|     void InitializeKeyboard(bool is_inline, KeyboardInitializeParameters initialize_parameters, | ||||
|                             SubmitNormalCallback submit_normal_callback_, | ||||
|                             SubmitInlineCallback submit_inline_callback_) override; | ||||
|  | ||||
|     void ShowNormalKeyboard() const override; | ||||
|  | ||||
| @@ -105,12 +105,10 @@ private: | ||||
|     void SubmitNormalText(std::u16string text) const; | ||||
|     void SubmitInlineText(std::u16string_view text) const; | ||||
|  | ||||
|     KeyboardInitializeParameters parameters; | ||||
|     KeyboardInitializeParameters parameters{}; | ||||
|  | ||||
|     mutable std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)> | ||||
|         submit_normal_callback; | ||||
|     mutable std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)> | ||||
|         submit_inline_callback; | ||||
|     mutable SubmitNormalCallback submit_normal_callback; | ||||
|     mutable SubmitInlineCallback submit_inline_callback; | ||||
| }; | ||||
|  | ||||
| } // namespace Core::Frontend | ||||
|   | ||||
| @@ -10,18 +10,17 @@ WebBrowserApplet::~WebBrowserApplet() = default; | ||||
|  | ||||
| DefaultWebBrowserApplet::~DefaultWebBrowserApplet() = default; | ||||
|  | ||||
| void DefaultWebBrowserApplet::OpenLocalWebPage( | ||||
|     const std::string& local_url, std::function<void()> extract_romfs_callback, | ||||
|     std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const { | ||||
| void DefaultWebBrowserApplet::OpenLocalWebPage(const std::string& local_url, | ||||
|                                                ExtractROMFSCallback extract_romfs_callback, | ||||
|                                                OpenWebPageCallback callback) const { | ||||
|     LOG_WARNING(Service_AM, "(STUBBED) called, backend requested to open local web page at {}", | ||||
|                 local_url); | ||||
|  | ||||
|     callback(Service::AM::Applets::WebExitReason::WindowClosed, "http://localhost/"); | ||||
| } | ||||
|  | ||||
| void DefaultWebBrowserApplet::OpenExternalWebPage( | ||||
|     const std::string& external_url, | ||||
|     std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const { | ||||
| void DefaultWebBrowserApplet::OpenExternalWebPage(const std::string& external_url, | ||||
|                                                   OpenWebPageCallback callback) const { | ||||
|     LOG_WARNING(Service_AM, "(STUBBED) called, backend requested to open external web page at {}", | ||||
|                 external_url); | ||||
|  | ||||
|   | ||||
| @@ -11,29 +11,29 @@ namespace Core::Frontend { | ||||
|  | ||||
| class WebBrowserApplet { | ||||
| public: | ||||
|     using ExtractROMFSCallback = std::function<void()>; | ||||
|     using OpenWebPageCallback = | ||||
|         std::function<void(Service::AM::Applets::WebExitReason, std::string)>; | ||||
|  | ||||
|     virtual ~WebBrowserApplet(); | ||||
|  | ||||
|     virtual void OpenLocalWebPage( | ||||
|         const std::string& local_url, std::function<void()> extract_romfs_callback, | ||||
|         std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const = 0; | ||||
|     virtual void OpenLocalWebPage(const std::string& local_url, | ||||
|                                   ExtractROMFSCallback extract_romfs_callback, | ||||
|                                   OpenWebPageCallback callback) const = 0; | ||||
|  | ||||
|     virtual void OpenExternalWebPage( | ||||
|         const std::string& external_url, | ||||
|         std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const = 0; | ||||
|     virtual void OpenExternalWebPage(const std::string& external_url, | ||||
|                                      OpenWebPageCallback callback) const = 0; | ||||
| }; | ||||
|  | ||||
| class DefaultWebBrowserApplet final : public WebBrowserApplet { | ||||
| public: | ||||
|     ~DefaultWebBrowserApplet() override; | ||||
|  | ||||
|     void OpenLocalWebPage(const std::string& local_url, | ||||
|                           std::function<void()> extract_romfs_callback, | ||||
|                           std::function<void(Service::AM::Applets::WebExitReason, std::string)> | ||||
|                               callback) const override; | ||||
|     void OpenLocalWebPage(const std::string& local_url, ExtractROMFSCallback extract_romfs_callback, | ||||
|                           OpenWebPageCallback callback) const override; | ||||
|  | ||||
|     void OpenExternalWebPage(const std::string& external_url, | ||||
|                              std::function<void(Service::AM::Applets::WebExitReason, std::string)> | ||||
|                                  callback) const override; | ||||
|                              OpenWebPageCallback callback) const override; | ||||
| }; | ||||
|  | ||||
| } // namespace Core::Frontend | ||||
|   | ||||
| @@ -37,7 +37,7 @@ void EmulatedConsole::SetTouchParams() { | ||||
|         touchscreen_param.Set("axis_x", i * 2); | ||||
|         touchscreen_param.Set("axis_y", (i * 2) + 1); | ||||
|         touchscreen_param.Set("button", i); | ||||
|         touch_params[index++] = touchscreen_param; | ||||
|         touch_params[index++] = std::move(touchscreen_param); | ||||
|     } | ||||
|  | ||||
|     const auto button_index = | ||||
| @@ -59,7 +59,7 @@ void EmulatedConsole::SetTouchParams() { | ||||
|         touch_button_params.Set("button", params.Serialize()); | ||||
|         touch_button_params.Set("x", x); | ||||
|         touch_button_params.Set("y", y); | ||||
|         touch_params[index] = touch_button_params; | ||||
|         touch_params[index] = std::move(touch_button_params); | ||||
|         index++; | ||||
|     } | ||||
| } | ||||
| @@ -131,7 +131,7 @@ Common::ParamPackage EmulatedConsole::GetMotionParam() const { | ||||
| } | ||||
|  | ||||
| void EmulatedConsole::SetMotionParam(Common::ParamPackage param) { | ||||
|     motion_params = param; | ||||
|     motion_params = std::move(param); | ||||
|     ReloadInput(); | ||||
| } | ||||
|  | ||||
| @@ -199,7 +199,7 @@ void EmulatedConsole::SetTouch(const Common::Input::CallbackStatus& callback, st | ||||
|  | ||||
|     if (is_new_input) { | ||||
|         touch_value.pressed.value = true; | ||||
|         touch_value.id = static_cast<u32>(index); | ||||
|         touch_value.id = static_cast<int>(index); | ||||
|     } | ||||
|  | ||||
|     touch_value.x = touch_input.x; | ||||
| @@ -284,7 +284,7 @@ void EmulatedConsole::TriggerOnChange(ConsoleTriggerType type) { | ||||
|  | ||||
| int EmulatedConsole::SetCallback(ConsoleUpdateCallback update_callback) { | ||||
|     std::scoped_lock lock{callback_mutex}; | ||||
|     callback_list.insert_or_assign(last_callback_key, update_callback); | ||||
|     callback_list.insert_or_assign(last_callback_key, std::move(update_callback)); | ||||
|     return last_callback_key++; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -424,15 +424,14 @@ void EmulatedController::RestoreConfig() { | ||||
|     ReloadFromSettings(); | ||||
| } | ||||
|  | ||||
| std::vector<Common::ParamPackage> EmulatedController::GetMappedDevices( | ||||
|     EmulatedDeviceIndex device_index) const { | ||||
| std::vector<Common::ParamPackage> EmulatedController::GetMappedDevices() const { | ||||
|     std::vector<Common::ParamPackage> devices; | ||||
|     for (const auto& param : button_params) { | ||||
|         if (!param.Has("engine")) { | ||||
|             continue; | ||||
|         } | ||||
|         const auto devices_it = std::find_if( | ||||
|             devices.begin(), devices.end(), [param](const Common::ParamPackage param_) { | ||||
|             devices.begin(), devices.end(), [¶m](const Common::ParamPackage& param_) { | ||||
|                 return param.Get("engine", "") == param_.Get("engine", "") && | ||||
|                        param.Get("guid", "") == param_.Get("guid", "") && | ||||
|                        param.Get("port", 0) == param_.Get("port", 0) && | ||||
| @@ -441,12 +440,12 @@ std::vector<Common::ParamPackage> EmulatedController::GetMappedDevices( | ||||
|         if (devices_it != devices.end()) { | ||||
|             continue; | ||||
|         } | ||||
|         Common::ParamPackage device{}; | ||||
|  | ||||
|         auto& device = devices.emplace_back(); | ||||
|         device.Set("engine", param.Get("engine", "")); | ||||
|         device.Set("guid", param.Get("guid", "")); | ||||
|         device.Set("port", param.Get("port", 0)); | ||||
|         device.Set("pad", param.Get("pad", 0)); | ||||
|         devices.push_back(device); | ||||
|     } | ||||
|  | ||||
|     for (const auto& param : stick_params) { | ||||
| @@ -457,7 +456,7 @@ std::vector<Common::ParamPackage> EmulatedController::GetMappedDevices( | ||||
|             continue; | ||||
|         } | ||||
|         const auto devices_it = std::find_if( | ||||
|             devices.begin(), devices.end(), [param](const Common::ParamPackage param_) { | ||||
|             devices.begin(), devices.end(), [¶m](const Common::ParamPackage& param_) { | ||||
|                 return param.Get("engine", "") == param_.Get("engine", "") && | ||||
|                        param.Get("guid", "") == param_.Get("guid", "") && | ||||
|                        param.Get("port", 0) == param_.Get("port", 0) && | ||||
| @@ -466,12 +465,12 @@ std::vector<Common::ParamPackage> EmulatedController::GetMappedDevices( | ||||
|         if (devices_it != devices.end()) { | ||||
|             continue; | ||||
|         } | ||||
|         Common::ParamPackage device{}; | ||||
|  | ||||
|         auto& device = devices.emplace_back(); | ||||
|         device.Set("engine", param.Get("engine", "")); | ||||
|         device.Set("guid", param.Get("guid", "")); | ||||
|         device.Set("port", param.Get("port", 0)); | ||||
|         device.Set("pad", param.Get("pad", 0)); | ||||
|         devices.push_back(device); | ||||
|     } | ||||
|     return devices; | ||||
| } | ||||
|   | ||||
| @@ -244,7 +244,7 @@ public: | ||||
|     void RestoreConfig(); | ||||
|  | ||||
|     /// Returns a vector of mapped devices from the mapped button and stick parameters | ||||
|     std::vector<Common::ParamPackage> GetMappedDevices(EmulatedDeviceIndex device_index) const; | ||||
|     std::vector<Common::ParamPackage> GetMappedDevices() const; | ||||
|  | ||||
|     // Returns the current mapped button device | ||||
|     Common::ParamPackage GetButtonParam(std::size_t index) const; | ||||
|   | ||||
| @@ -280,18 +280,19 @@ struct KMemoryInfo { | ||||
|  | ||||
| class KMemoryBlock : public Common::IntrusiveRedBlackTreeBaseNode<KMemoryBlock> { | ||||
| private: | ||||
|     u16 m_device_disable_merge_left_count; | ||||
|     u16 m_device_disable_merge_right_count; | ||||
|     VAddr m_address; | ||||
|     size_t m_num_pages; | ||||
|     KMemoryState m_memory_state; | ||||
|     u16 m_ipc_lock_count; | ||||
|     u16 m_device_use_count; | ||||
|     u16 m_ipc_disable_merge_count; | ||||
|     KMemoryPermission m_permission; | ||||
|     KMemoryPermission m_original_permission; | ||||
|     KMemoryAttribute m_attribute; | ||||
|     KMemoryBlockDisableMergeAttribute m_disable_merge_attribute; | ||||
|     u16 m_device_disable_merge_left_count{}; | ||||
|     u16 m_device_disable_merge_right_count{}; | ||||
|     VAddr m_address{}; | ||||
|     size_t m_num_pages{}; | ||||
|     KMemoryState m_memory_state{KMemoryState::None}; | ||||
|     u16 m_ipc_lock_count{}; | ||||
|     u16 m_device_use_count{}; | ||||
|     u16 m_ipc_disable_merge_count{}; | ||||
|     KMemoryPermission m_permission{KMemoryPermission::None}; | ||||
|     KMemoryPermission m_original_permission{KMemoryPermission::None}; | ||||
|     KMemoryAttribute m_attribute{KMemoryAttribute::None}; | ||||
|     KMemoryBlockDisableMergeAttribute m_disable_merge_attribute{ | ||||
|         KMemoryBlockDisableMergeAttribute::None}; | ||||
|  | ||||
| public: | ||||
|     static constexpr int Compare(const KMemoryBlock& lhs, const KMemoryBlock& rhs) { | ||||
| @@ -367,12 +368,8 @@ public: | ||||
|  | ||||
|     constexpr KMemoryBlock(VAddr addr, size_t np, KMemoryState ms, KMemoryPermission p, | ||||
|                            KMemoryAttribute attr) | ||||
|         : Common::IntrusiveRedBlackTreeBaseNode<KMemoryBlock>(), | ||||
|           m_device_disable_merge_left_count(), m_device_disable_merge_right_count(), | ||||
|           m_address(addr), m_num_pages(np), m_memory_state(ms), m_ipc_lock_count(0), | ||||
|           m_device_use_count(0), m_ipc_disable_merge_count(), m_permission(p), | ||||
|           m_original_permission(KMemoryPermission::None), m_attribute(attr), | ||||
|           m_disable_merge_attribute() {} | ||||
|         : Common::IntrusiveRedBlackTreeBaseNode<KMemoryBlock>(), m_address(addr), m_num_pages(np), | ||||
|           m_memory_state(ms), m_permission(p), m_attribute(attr) {} | ||||
|  | ||||
|     constexpr void Initialize(VAddr addr, size_t np, KMemoryState ms, KMemoryPermission p, | ||||
|                               KMemoryAttribute attr) { | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <array> | ||||
| #include <functional> | ||||
|  | ||||
| #include "common/common_funcs.h" | ||||
| @@ -17,9 +18,9 @@ public: | ||||
|     static constexpr size_t MaxBlocks = 2; | ||||
|  | ||||
| private: | ||||
|     KMemoryBlock* m_blocks[MaxBlocks]; | ||||
|     size_t m_index; | ||||
|     KMemoryBlockSlabManager* m_slab_manager; | ||||
|     std::array<KMemoryBlock*, MaxBlocks> m_blocks{}; | ||||
|     size_t m_index{MaxBlocks}; | ||||
|     KMemoryBlockSlabManager* m_slab_manager{}; | ||||
|  | ||||
| private: | ||||
|     Result Initialize(size_t num_blocks) { | ||||
| @@ -41,7 +42,7 @@ private: | ||||
| public: | ||||
|     KMemoryBlockManagerUpdateAllocator(Result* out_result, KMemoryBlockSlabManager* sm, | ||||
|                                        size_t num_blocks = MaxBlocks) | ||||
|         : m_blocks(), m_index(MaxBlocks), m_slab_manager(sm) { | ||||
|         : m_slab_manager(sm) { | ||||
|         *out_result = this->Initialize(num_blocks); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -74,7 +74,7 @@ public: | ||||
|     static void PostDestroy([[maybe_unused]] uintptr_t arg) {} | ||||
|  | ||||
| private: | ||||
|     Core::DeviceMemory* device_memory; | ||||
|     Core::DeviceMemory* device_memory{}; | ||||
|     KProcess* owner_process{}; | ||||
|     KPageGroup page_list; | ||||
|     Svc::MemoryPermission owner_permission{}; | ||||
|   | ||||
| @@ -784,8 +784,8 @@ private: | ||||
|     std::vector<KSynchronizationObject*> wait_objects_for_debugging; | ||||
|     VAddr mutex_wait_address_for_debugging{}; | ||||
|     ThreadWaitReasonForDebugging wait_reason_for_debugging{}; | ||||
|     uintptr_t argument; | ||||
|     VAddr stack_top; | ||||
|     uintptr_t argument{}; | ||||
|     VAddr stack_top{}; | ||||
|  | ||||
| public: | ||||
|     using ConditionVariableThreadTreeType = ConditionVariableThreadTree; | ||||
|   | ||||
| @@ -891,7 +891,7 @@ struct KernelCore::Impl { | ||||
|     Common::ThreadWorker service_threads_manager; | ||||
|     Common::Barrier service_thread_barrier; | ||||
|  | ||||
|     std::array<KThread*, Core::Hardware::NUM_CPU_CORES> shutdown_threads; | ||||
|     std::array<KThread*, Core::Hardware::NUM_CPU_CORES> shutdown_threads{}; | ||||
|     std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{}; | ||||
|  | ||||
|     bool is_multicore{}; | ||||
|   | ||||
| @@ -85,7 +85,7 @@ private: | ||||
|     std::mutex guard; | ||||
|     std::condition_variable on_interrupt; | ||||
|     std::unique_ptr<Core::ARM_Interface> arm_interface; | ||||
|     bool is_interrupted; | ||||
|     bool is_interrupted{}; | ||||
| }; | ||||
|  | ||||
| } // namespace Kernel | ||||
|   | ||||
| @@ -38,7 +38,7 @@ std::string GetTimestamp() { | ||||
|  | ||||
| using namespace nlohmann; | ||||
|  | ||||
| void SaveToFile(json json, const std::filesystem::path& filename) { | ||||
| void SaveToFile(const json& json, const std::filesystem::path& filename) { | ||||
|     if (!Common::FS::CreateParentDirs(filename)) { | ||||
|         LOG_ERROR(Core, "Failed to create path for '{}' to save report!", | ||||
|                   Common::FS::PathToUTF8String(filename)); | ||||
| @@ -81,8 +81,8 @@ json GetReportCommonData(u64 title_id, Result result, const std::string& timesta | ||||
| } | ||||
|  | ||||
| json GetProcessorStateData(const std::string& architecture, u64 entry_point, u64 sp, u64 pc, | ||||
|                            u64 pstate, std::array<u64, 31> registers, | ||||
|                            std::optional<std::array<u64, 32>> backtrace = {}) { | ||||
|                            u64 pstate, const std::array<u64, 31>& registers, | ||||
|                            const std::optional<std::array<u64, 32>>& backtrace = {}) { | ||||
|     auto out = json{ | ||||
|         {"entry_point", fmt::format("{:016X}", entry_point)}, | ||||
|         {"sp", fmt::format("{:016X}", sp)}, | ||||
| @@ -224,11 +224,11 @@ void Reporter::SaveCrashReport(u64 title_id, Result result, u64 set_flags, u64 e | ||||
|  | ||||
|     out["processor_state"] = std::move(proc_out); | ||||
|  | ||||
|     SaveToFile(std::move(out), GetPath("crash_report", title_id, timestamp)); | ||||
|     SaveToFile(out, GetPath("crash_report", title_id, timestamp)); | ||||
| } | ||||
|  | ||||
| void Reporter::SaveSvcBreakReport(u32 type, bool signal_debugger, u64 info1, u64 info2, | ||||
|                                   std::optional<std::vector<u8>> resolved_buffer) const { | ||||
|                                   const std::optional<std::vector<u8>>& resolved_buffer) const { | ||||
|     if (!IsReportingEnabled()) { | ||||
|         return; | ||||
|     } | ||||
| @@ -250,7 +250,7 @@ void Reporter::SaveSvcBreakReport(u32 type, bool signal_debugger, u64 info1, u64 | ||||
|  | ||||
|     out["svc_break"] = std::move(break_out); | ||||
|  | ||||
|     SaveToFile(std::move(out), GetPath("svc_break_report", title_id, timestamp)); | ||||
|     SaveToFile(out, GetPath("svc_break_report", title_id, timestamp)); | ||||
| } | ||||
|  | ||||
| void Reporter::SaveUnimplementedFunctionReport(Kernel::HLERequestContext& ctx, u32 command_id, | ||||
| @@ -271,13 +271,13 @@ void Reporter::SaveUnimplementedFunctionReport(Kernel::HLERequestContext& ctx, u | ||||
|  | ||||
|     out["function"] = std::move(function_out); | ||||
|  | ||||
|     SaveToFile(std::move(out), GetPath("unimpl_func_report", title_id, timestamp)); | ||||
|     SaveToFile(out, GetPath("unimpl_func_report", title_id, timestamp)); | ||||
| } | ||||
|  | ||||
| void Reporter::SaveUnimplementedAppletReport( | ||||
|     u32 applet_id, u32 common_args_version, u32 library_version, u32 theme_color, | ||||
|     bool startup_sound, u64 system_tick, std::vector<std::vector<u8>> normal_channel, | ||||
|     std::vector<std::vector<u8>> interactive_channel) const { | ||||
|     bool startup_sound, u64 system_tick, const std::vector<std::vector<u8>>& normal_channel, | ||||
|     const std::vector<std::vector<u8>>& interactive_channel) const { | ||||
|     if (!IsReportingEnabled()) { | ||||
|         return; | ||||
|     } | ||||
| @@ -308,10 +308,11 @@ void Reporter::SaveUnimplementedAppletReport( | ||||
|     out["applet_normal_data"] = std::move(normal_out); | ||||
|     out["applet_interactive_data"] = std::move(interactive_out); | ||||
|  | ||||
|     SaveToFile(std::move(out), GetPath("unimpl_applet_report", title_id, timestamp)); | ||||
|     SaveToFile(out, GetPath("unimpl_applet_report", title_id, timestamp)); | ||||
| } | ||||
|  | ||||
| void Reporter::SavePlayReport(PlayReportType type, u64 title_id, std::vector<std::vector<u8>> data, | ||||
| void Reporter::SavePlayReport(PlayReportType type, u64 title_id, | ||||
|                               const std::vector<std::vector<u8>>& data, | ||||
|                               std::optional<u64> process_id, std::optional<u128> user_id) const { | ||||
|     if (!IsReportingEnabled()) { | ||||
|         return; | ||||
| @@ -335,12 +336,12 @@ void Reporter::SavePlayReport(PlayReportType type, u64 title_id, std::vector<std | ||||
|     out["play_report_type"] = fmt::format("{:02}", static_cast<u8>(type)); | ||||
|     out["play_report_data"] = std::move(data_out); | ||||
|  | ||||
|     SaveToFile(std::move(out), GetPath("play_report", title_id, timestamp)); | ||||
|     SaveToFile(out, GetPath("play_report", title_id, timestamp)); | ||||
| } | ||||
|  | ||||
| void Reporter::SaveErrorReport(u64 title_id, Result result, | ||||
|                                std::optional<std::string> custom_text_main, | ||||
|                                std::optional<std::string> custom_text_detail) const { | ||||
|                                const std::optional<std::string>& custom_text_main, | ||||
|                                const std::optional<std::string>& custom_text_detail) const { | ||||
|     if (!IsReportingEnabled()) { | ||||
|         return; | ||||
|     } | ||||
| @@ -354,11 +355,11 @@ void Reporter::SaveErrorReport(u64 title_id, Result result, | ||||
|     out["backtrace"] = GetBacktraceData(system); | ||||
|  | ||||
|     out["error_custom_text"] = { | ||||
|         {"main", *custom_text_main}, | ||||
|         {"detail", *custom_text_detail}, | ||||
|         {"main", custom_text_main.value_or("")}, | ||||
|         {"detail", custom_text_detail.value_or("")}, | ||||
|     }; | ||||
|  | ||||
|     SaveToFile(std::move(out), GetPath("error_report", title_id, timestamp)); | ||||
|     SaveToFile(out, GetPath("error_report", title_id, timestamp)); | ||||
| } | ||||
|  | ||||
| void Reporter::SaveFSAccessLog(std::string_view log_message) const { | ||||
|   | ||||
| @@ -36,7 +36,7 @@ public: | ||||
|  | ||||
|     // Used by syscall svcBreak | ||||
|     void SaveSvcBreakReport(u32 type, bool signal_debugger, u64 info1, u64 info2, | ||||
|                             std::optional<std::vector<u8>> resolved_buffer = {}) const; | ||||
|                             const std::optional<std::vector<u8>>& resolved_buffer = {}) const; | ||||
|  | ||||
|     // Used by HLE service handler | ||||
|     void SaveUnimplementedFunctionReport(Kernel::HLERequestContext& ctx, u32 command_id, | ||||
| @@ -44,10 +44,10 @@ public: | ||||
|                                          const std::string& service_name) const; | ||||
|  | ||||
|     // Used by stub applet implementation | ||||
|     void SaveUnimplementedAppletReport(u32 applet_id, u32 common_args_version, u32 library_version, | ||||
|                                        u32 theme_color, bool startup_sound, u64 system_tick, | ||||
|                                        std::vector<std::vector<u8>> normal_channel, | ||||
|                                        std::vector<std::vector<u8>> interactive_channel) const; | ||||
|     void SaveUnimplementedAppletReport( | ||||
|         u32 applet_id, u32 common_args_version, u32 library_version, u32 theme_color, | ||||
|         bool startup_sound, u64 system_tick, const std::vector<std::vector<u8>>& normal_channel, | ||||
|         const std::vector<std::vector<u8>>& interactive_channel) const; | ||||
|  | ||||
|     enum class PlayReportType { | ||||
|         Old, | ||||
| @@ -56,13 +56,13 @@ public: | ||||
|         System, | ||||
|     }; | ||||
|  | ||||
|     void SavePlayReport(PlayReportType type, u64 title_id, std::vector<std::vector<u8>> data, | ||||
|     void SavePlayReport(PlayReportType type, u64 title_id, const std::vector<std::vector<u8>>& data, | ||||
|                         std::optional<u64> process_id = {}, std::optional<u128> user_id = {}) const; | ||||
|  | ||||
|     // Used by error applet | ||||
|     void SaveErrorReport(u64 title_id, Result result, | ||||
|                          std::optional<std::string> custom_text_main = {}, | ||||
|                          std::optional<std::string> custom_text_detail = {}) const; | ||||
|                          const std::optional<std::string>& custom_text_main = {}, | ||||
|                          const std::optional<std::string>& custom_text_detail = {}) const; | ||||
|  | ||||
|     void SaveFSAccessLog(std::string_view log_message) const; | ||||
|  | ||||
|   | ||||
| @@ -685,7 +685,7 @@ QtControllerSelector::QtControllerSelector(GMainWindow& parent) { | ||||
| QtControllerSelector::~QtControllerSelector() = default; | ||||
|  | ||||
| void QtControllerSelector::ReconfigureControllers( | ||||
|     std::function<void()> callback_, const Core::Frontend::ControllerParameters& parameters) const { | ||||
|     ReconfigureCallback callback_, const Core::Frontend::ControllerParameters& parameters) const { | ||||
|     callback = std::move(callback_); | ||||
|     emit MainWindowReconfigureControllers(parameters); | ||||
| } | ||||
|   | ||||
| @@ -157,7 +157,7 @@ public: | ||||
|     ~QtControllerSelector() override; | ||||
|  | ||||
|     void ReconfigureControllers( | ||||
|         std::function<void()> callback_, | ||||
|         ReconfigureCallback callback_, | ||||
|         const Core::Frontend::ControllerParameters& parameters) const override; | ||||
|  | ||||
| signals: | ||||
| @@ -167,5 +167,5 @@ signals: | ||||
| private: | ||||
|     void MainWindowReconfigureFinished(); | ||||
|  | ||||
|     mutable std::function<void()> callback; | ||||
|     mutable ReconfigureCallback callback; | ||||
| }; | ||||
|   | ||||
| @@ -14,7 +14,7 @@ QtErrorDisplay::QtErrorDisplay(GMainWindow& parent) { | ||||
|  | ||||
| QtErrorDisplay::~QtErrorDisplay() = default; | ||||
|  | ||||
| void QtErrorDisplay::ShowError(Result error, std::function<void()> finished) const { | ||||
| void QtErrorDisplay::ShowError(Result error, FinishedCallback finished) const { | ||||
|     callback = std::move(finished); | ||||
|     emit MainWindowDisplayError( | ||||
|         tr("Error Code: %1-%2 (0x%3)") | ||||
| @@ -25,7 +25,7 @@ void QtErrorDisplay::ShowError(Result error, std::function<void()> finished) con | ||||
| } | ||||
|  | ||||
| void QtErrorDisplay::ShowErrorWithTimestamp(Result error, std::chrono::seconds time, | ||||
|                                             std::function<void()> finished) const { | ||||
|                                             FinishedCallback finished) const { | ||||
|     callback = std::move(finished); | ||||
|  | ||||
|     const QDateTime date_time = QDateTime::fromSecsSinceEpoch(time.count()); | ||||
| @@ -42,7 +42,7 @@ void QtErrorDisplay::ShowErrorWithTimestamp(Result error, std::chrono::seconds t | ||||
|  | ||||
| void QtErrorDisplay::ShowCustomErrorText(Result error, std::string dialog_text, | ||||
|                                          std::string fullscreen_text, | ||||
|                                          std::function<void()> finished) const { | ||||
|                                          FinishedCallback finished) const { | ||||
|     callback = std::move(finished); | ||||
|     emit MainWindowDisplayError( | ||||
|         tr("Error Code: %1-%2 (0x%3)") | ||||
|   | ||||
| @@ -16,11 +16,11 @@ public: | ||||
|     explicit QtErrorDisplay(GMainWindow& parent); | ||||
|     ~QtErrorDisplay() override; | ||||
|  | ||||
|     void ShowError(Result error, std::function<void()> finished) const override; | ||||
|     void ShowError(Result error, FinishedCallback finished) const override; | ||||
|     void ShowErrorWithTimestamp(Result error, std::chrono::seconds time, | ||||
|                                 std::function<void()> finished) const override; | ||||
|                                 FinishedCallback finished) const override; | ||||
|     void ShowCustomErrorText(Result error, std::string dialog_text, std::string fullscreen_text, | ||||
|                              std::function<void()> finished) const override; | ||||
|                              FinishedCallback finished) const override; | ||||
|  | ||||
| signals: | ||||
|     void MainWindowDisplayError(QString error_code, QString error_text) const; | ||||
| @@ -28,5 +28,5 @@ signals: | ||||
| private: | ||||
|     void MainWindowFinishedError(); | ||||
|  | ||||
|     mutable std::function<void()> callback; | ||||
|     mutable FinishedCallback callback; | ||||
| }; | ||||
|   | ||||
| @@ -163,8 +163,7 @@ QtProfileSelector::QtProfileSelector(GMainWindow& parent) { | ||||
|  | ||||
| QtProfileSelector::~QtProfileSelector() = default; | ||||
|  | ||||
| void QtProfileSelector::SelectProfile( | ||||
|     std::function<void(std::optional<Common::UUID>)> callback_) const { | ||||
| void QtProfileSelector::SelectProfile(SelectProfileCallback callback_) const { | ||||
|     callback = std::move(callback_); | ||||
|     emit MainWindowSelectProfile(); | ||||
| } | ||||
|   | ||||
| @@ -65,7 +65,7 @@ public: | ||||
|     explicit QtProfileSelector(GMainWindow& parent); | ||||
|     ~QtProfileSelector() override; | ||||
|  | ||||
|     void SelectProfile(std::function<void(std::optional<Common::UUID>)> callback_) const override; | ||||
|     void SelectProfile(SelectProfileCallback callback_) const override; | ||||
|  | ||||
| signals: | ||||
|     void MainWindowSelectProfile() const; | ||||
| @@ -73,5 +73,5 @@ signals: | ||||
| private: | ||||
|     void MainWindowFinishedSelection(std::optional<Common::UUID> uuid); | ||||
|  | ||||
|     mutable std::function<void(std::optional<Common::UUID>)> callback; | ||||
|     mutable SelectProfileCallback callback; | ||||
| }; | ||||
|   | ||||
| @@ -1566,10 +1566,7 @@ QtSoftwareKeyboard::~QtSoftwareKeyboard() = default; | ||||
|  | ||||
| void QtSoftwareKeyboard::InitializeKeyboard( | ||||
|     bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters, | ||||
|     std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)> | ||||
|         submit_normal_callback_, | ||||
|     std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)> | ||||
|         submit_inline_callback_) { | ||||
|     SubmitNormalCallback submit_normal_callback_, SubmitInlineCallback submit_inline_callback_) { | ||||
|     if (is_inline) { | ||||
|         submit_inline_callback = std::move(submit_inline_callback_); | ||||
|     } else { | ||||
|   | ||||
| @@ -233,12 +233,10 @@ public: | ||||
|     explicit QtSoftwareKeyboard(GMainWindow& parent); | ||||
|     ~QtSoftwareKeyboard() override; | ||||
|  | ||||
|     void InitializeKeyboard( | ||||
|         bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters, | ||||
|         std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)> | ||||
|             submit_normal_callback_, | ||||
|         std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)> | ||||
|             submit_inline_callback_) override; | ||||
|     void InitializeKeyboard(bool is_inline, | ||||
|                             Core::Frontend::KeyboardInitializeParameters initialize_parameters, | ||||
|                             SubmitNormalCallback submit_normal_callback_, | ||||
|                             SubmitInlineCallback submit_inline_callback_) override; | ||||
|  | ||||
|     void ShowNormalKeyboard() const override; | ||||
|  | ||||
| @@ -279,8 +277,6 @@ private: | ||||
|     void SubmitInlineText(Service::AM::Applets::SwkbdReplyType reply_type, | ||||
|                           std::u16string submitted_text, s32 cursor_position) const; | ||||
|  | ||||
|     mutable std::function<void(Service::AM::Applets::SwkbdResult, std::u16string, bool)> | ||||
|         submit_normal_callback; | ||||
|     mutable std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)> | ||||
|         submit_inline_callback; | ||||
|     mutable SubmitNormalCallback submit_normal_callback; | ||||
|     mutable SubmitInlineCallback submit_inline_callback; | ||||
| }; | ||||
|   | ||||
| @@ -401,9 +401,9 @@ QtWebBrowser::QtWebBrowser(GMainWindow& main_window) { | ||||
|  | ||||
| QtWebBrowser::~QtWebBrowser() = default; | ||||
|  | ||||
| void QtWebBrowser::OpenLocalWebPage( | ||||
|     const std::string& local_url, std::function<void()> extract_romfs_callback_, | ||||
|     std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback_) const { | ||||
| void QtWebBrowser::OpenLocalWebPage(const std::string& local_url, | ||||
|                                     ExtractROMFSCallback extract_romfs_callback_, | ||||
|                                     OpenWebPageCallback callback_) const { | ||||
|     extract_romfs_callback = std::move(extract_romfs_callback_); | ||||
|     callback = std::move(callback_); | ||||
|  | ||||
| @@ -416,9 +416,8 @@ void QtWebBrowser::OpenLocalWebPage( | ||||
|     } | ||||
| } | ||||
|  | ||||
| void QtWebBrowser::OpenExternalWebPage( | ||||
|     const std::string& external_url, | ||||
|     std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback_) const { | ||||
| void QtWebBrowser::OpenExternalWebPage(const std::string& external_url, | ||||
|                                        OpenWebPageCallback callback_) const { | ||||
|     callback = std::move(callback_); | ||||
|  | ||||
|     const auto index = external_url.find('?'); | ||||
|   | ||||
| @@ -197,13 +197,11 @@ public: | ||||
|     ~QtWebBrowser() override; | ||||
|  | ||||
|     void OpenLocalWebPage(const std::string& local_url, | ||||
|                           std::function<void()> extract_romfs_callback_, | ||||
|                           std::function<void(Service::AM::Applets::WebExitReason, std::string)> | ||||
|                               callback_) const override; | ||||
|                           ExtractROMFSCallback extract_romfs_callback_, | ||||
|                           OpenWebPageCallback callback_) const override; | ||||
|  | ||||
|     void OpenExternalWebPage(const std::string& external_url, | ||||
|                              std::function<void(Service::AM::Applets::WebExitReason, std::string)> | ||||
|                                  callback_) const override; | ||||
|                              OpenWebPageCallback callback_) const override; | ||||
|  | ||||
| signals: | ||||
|     void MainWindowOpenWebPage(const std::string& main_url, const std::string& additional_args, | ||||
| @@ -215,7 +213,6 @@ private: | ||||
|     void MainWindowWebBrowserClosed(Service::AM::Applets::WebExitReason exit_reason, | ||||
|                                     std::string last_url); | ||||
|  | ||||
|     mutable std::function<void()> extract_romfs_callback; | ||||
|  | ||||
|     mutable std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback; | ||||
|     mutable ExtractROMFSCallback extract_romfs_callback; | ||||
|     mutable OpenWebPageCallback callback; | ||||
| }; | ||||
|   | ||||
| @@ -31,7 +31,7 @@ ConfigureGraphics::ConfigureGraphics(const Core::System& system_, QWidget* paren | ||||
|  | ||||
|     ui->backend->addItem(QStringLiteral("GLSL")); | ||||
|     ui->backend->addItem(tr("GLASM (Assembly Shaders, NVIDIA Only)")); | ||||
|     ui->backend->addItem(QStringLiteral("SPIR-V (Experimental, Mesa Only)")); | ||||
|     ui->backend->addItem(tr("SPIR-V (Experimental, Mesa Only)")); | ||||
|  | ||||
|     SetupPerGameUI(); | ||||
|  | ||||
|   | ||||
| @@ -855,8 +855,7 @@ void ConfigureInputPlayer::UpdateInputDeviceCombobox() { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     const auto devices = | ||||
|         emulated_controller->GetMappedDevices(Core::HID::EmulatedDeviceIndex::AllDevices); | ||||
|     const auto devices = emulated_controller->GetMappedDevices(); | ||||
|     UpdateInputDevices(); | ||||
|  | ||||
|     if (devices.empty()) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user