diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/core.cpp | 25 | ||||
| -rw-r--r-- | src/core/core_timing.cpp | 23 | ||||
| -rw-r--r-- | src/core/core_timing.h | 2 |
3 files changed, 36 insertions, 14 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index 2c4c0dbe4..622a20510 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -155,6 +155,24 @@ struct System::Impl { | |||
| 155 | 155 | ||
| 156 | // Create default implementations of applets if one is not provided. | 156 | // Create default implementations of applets if one is not provided. |
| 157 | applet_manager.SetDefaultAppletsIfMissing(); | 157 | applet_manager.SetDefaultAppletsIfMissing(); |
| 158 | |||
| 159 | is_async_gpu = Settings::values.use_asynchronous_gpu_emulation.GetValue(); | ||
| 160 | |||
| 161 | kernel.SetMulticore(is_multicore); | ||
| 162 | cpu_manager.SetMulticore(is_multicore); | ||
| 163 | cpu_manager.SetAsyncGpu(is_async_gpu); | ||
| 164 | } | ||
| 165 | |||
| 166 | void ReinitializeIfNecessary(System& system) { | ||
| 167 | if (is_multicore == Settings::values.use_multi_core.GetValue()) { | ||
| 168 | return; | ||
| 169 | } | ||
| 170 | |||
| 171 | LOG_DEBUG(Kernel, "Re-initializing"); | ||
| 172 | |||
| 173 | is_multicore = Settings::values.use_multi_core.GetValue(); | ||
| 174 | |||
| 175 | Initialize(system); | ||
| 158 | } | 176 | } |
| 159 | 177 | ||
| 160 | SystemResultStatus Run() { | 178 | SystemResultStatus Run() { |
| @@ -205,11 +223,8 @@ struct System::Impl { | |||
| 205 | SystemResultStatus SetupForMainProcess(System& system, Frontend::EmuWindow& emu_window) { | 223 | SystemResultStatus SetupForMainProcess(System& system, Frontend::EmuWindow& emu_window) { |
| 206 | LOG_DEBUG(Core, "initialized OK"); | 224 | LOG_DEBUG(Core, "initialized OK"); |
| 207 | 225 | ||
| 208 | is_async_gpu = Settings::values.use_asynchronous_gpu_emulation.GetValue(); | 226 | // Setting changes may require a full system reinitialization (e.g., disabling multicore). |
| 209 | 227 | ReinitializeIfNecessary(system); | |
| 210 | kernel.SetMulticore(is_multicore); | ||
| 211 | cpu_manager.SetMulticore(is_multicore); | ||
| 212 | cpu_manager.SetAsyncGpu(is_async_gpu); | ||
| 213 | 228 | ||
| 214 | kernel.Initialize(); | 229 | kernel.Initialize(); |
| 215 | cpu_manager.Initialize(); | 230 | cpu_manager.Initialize(); |
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp index 2afb2696c..0e7b5f943 100644 --- a/src/core/core_timing.cpp +++ b/src/core/core_timing.cpp | |||
| @@ -41,15 +41,7 @@ CoreTiming::CoreTiming() | |||
| 41 | : clock{Common::CreateBestMatchingClock(Hardware::BASE_CLOCK_RATE, Hardware::CNTFREQ)} {} | 41 | : clock{Common::CreateBestMatchingClock(Hardware::BASE_CLOCK_RATE, Hardware::CNTFREQ)} {} |
| 42 | 42 | ||
| 43 | CoreTiming::~CoreTiming() { | 43 | CoreTiming::~CoreTiming() { |
| 44 | paused = true; | 44 | Reset(); |
| 45 | shutting_down = true; | ||
| 46 | pause_event.Set(); | ||
| 47 | event.Set(); | ||
| 48 | if (timer_thread) { | ||
| 49 | timer_thread->join(); | ||
| 50 | } | ||
| 51 | timer_thread.reset(); | ||
| 52 | has_started = false; | ||
| 53 | } | 45 | } |
| 54 | 46 | ||
| 55 | void CoreTiming::ThreadEntry(CoreTiming& instance) { | 47 | void CoreTiming::ThreadEntry(CoreTiming& instance) { |
| @@ -63,6 +55,7 @@ void CoreTiming::ThreadEntry(CoreTiming& instance) { | |||
| 63 | } | 55 | } |
| 64 | 56 | ||
| 65 | void CoreTiming::Initialize(std::function<void()>&& on_thread_init_) { | 57 | void CoreTiming::Initialize(std::function<void()>&& on_thread_init_) { |
| 58 | Reset(); | ||
| 66 | on_thread_init = std::move(on_thread_init_); | 59 | on_thread_init = std::move(on_thread_init_); |
| 67 | event_fifo_id = 0; | 60 | event_fifo_id = 0; |
| 68 | shutting_down = false; | 61 | shutting_down = false; |
| @@ -304,6 +297,18 @@ void CoreTiming::ThreadLoop() { | |||
| 304 | } | 297 | } |
| 305 | } | 298 | } |
| 306 | 299 | ||
| 300 | void CoreTiming::Reset() { | ||
| 301 | paused = true; | ||
| 302 | shutting_down = true; | ||
| 303 | pause_event.Set(); | ||
| 304 | event.Set(); | ||
| 305 | if (timer_thread) { | ||
| 306 | timer_thread->join(); | ||
| 307 | } | ||
| 308 | timer_thread.reset(); | ||
| 309 | has_started = false; | ||
| 310 | } | ||
| 311 | |||
| 307 | std::chrono::nanoseconds CoreTiming::GetGlobalTimeNs() const { | 312 | std::chrono::nanoseconds CoreTiming::GetGlobalTimeNs() const { |
| 308 | if (is_multicore) { | 313 | if (is_multicore) { |
| 309 | return clock->GetTimeNS(); | 314 | return clock->GetTimeNS(); |
diff --git a/src/core/core_timing.h b/src/core/core_timing.h index bd21dd904..b5925193c 100644 --- a/src/core/core_timing.h +++ b/src/core/core_timing.h | |||
| @@ -134,6 +134,8 @@ private: | |||
| 134 | static void ThreadEntry(CoreTiming& instance); | 134 | static void ThreadEntry(CoreTiming& instance); |
| 135 | void ThreadLoop(); | 135 | void ThreadLoop(); |
| 136 | 136 | ||
| 137 | void Reset(); | ||
| 138 | |||
| 137 | std::unique_ptr<Common::WallClock> clock; | 139 | std::unique_ptr<Common::WallClock> clock; |
| 138 | 140 | ||
| 139 | s64 global_timer = 0; | 141 | s64 global_timer = 0; |