diff options
Diffstat (limited to 'src/core/core.cpp')
| -rw-r--r-- | src/core/core.cpp | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index b74fd0a58..9e3eb3795 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include "core/file_sys/savedata_factory.h" | 27 | #include "core/file_sys/savedata_factory.h" |
| 28 | #include "core/file_sys/vfs_concat.h" | 28 | #include "core/file_sys/vfs_concat.h" |
| 29 | #include "core/file_sys/vfs_real.h" | 29 | #include "core/file_sys/vfs_real.h" |
| 30 | #include "core/gpu_dirty_memory_manager.h" | ||
| 30 | #include "core/hid/hid_core.h" | 31 | #include "core/hid/hid_core.h" |
| 31 | #include "core/hle/kernel/k_memory_manager.h" | 32 | #include "core/hle/kernel/k_memory_manager.h" |
| 32 | #include "core/hle/kernel/k_process.h" | 33 | #include "core/hle/kernel/k_process.h" |
| @@ -130,7 +131,10 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, | |||
| 130 | struct System::Impl { | 131 | struct System::Impl { |
| 131 | explicit Impl(System& system) | 132 | explicit Impl(System& system) |
| 132 | : kernel{system}, fs_controller{system}, memory{system}, hid_core{}, room_network{}, | 133 | : kernel{system}, fs_controller{system}, memory{system}, hid_core{}, room_network{}, |
| 133 | cpu_manager{system}, reporter{system}, applet_manager{system}, time_manager{system} {} | 134 | cpu_manager{system}, reporter{system}, applet_manager{system}, time_manager{system}, |
| 135 | gpu_dirty_memory_write_manager{} { | ||
| 136 | memory.SetGPUDirtyManagers(gpu_dirty_memory_write_manager); | ||
| 137 | } | ||
| 134 | 138 | ||
| 135 | void Initialize(System& system) { | 139 | void Initialize(System& system) { |
| 136 | device_memory = std::make_unique<Core::DeviceMemory>(); | 140 | device_memory = std::make_unique<Core::DeviceMemory>(); |
| @@ -234,6 +238,8 @@ struct System::Impl { | |||
| 234 | // Setting changes may require a full system reinitialization (e.g., disabling multicore). | 238 | // Setting changes may require a full system reinitialization (e.g., disabling multicore). |
| 235 | ReinitializeIfNecessary(system); | 239 | ReinitializeIfNecessary(system); |
| 236 | 240 | ||
| 241 | memory.SetGPUDirtyManagers(gpu_dirty_memory_write_manager); | ||
| 242 | |||
| 237 | kernel.Initialize(); | 243 | kernel.Initialize(); |
| 238 | cpu_manager.Initialize(); | 244 | cpu_manager.Initialize(); |
| 239 | 245 | ||
| @@ -540,6 +546,9 @@ struct System::Impl { | |||
| 540 | 546 | ||
| 541 | std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{}; | 547 | std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{}; |
| 542 | std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_cpu{}; | 548 | std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_cpu{}; |
| 549 | |||
| 550 | std::array<Core::GPUDirtyMemoryManager, Core::Hardware::NUM_CPU_CORES> | ||
| 551 | gpu_dirty_memory_write_manager{}; | ||
| 543 | }; | 552 | }; |
| 544 | 553 | ||
| 545 | System::System() : impl{std::make_unique<Impl>(*this)} {} | 554 | System::System() : impl{std::make_unique<Impl>(*this)} {} |
| @@ -629,10 +638,31 @@ void System::PrepareReschedule(const u32 core_index) { | |||
| 629 | impl->kernel.PrepareReschedule(core_index); | 638 | impl->kernel.PrepareReschedule(core_index); |
| 630 | } | 639 | } |
| 631 | 640 | ||
| 641 | Core::GPUDirtyMemoryManager& System::CurrentGPUDirtyMemoryManager() { | ||
| 642 | const std::size_t core = impl->kernel.GetCurrentHostThreadID(); | ||
| 643 | return impl->gpu_dirty_memory_write_manager[core < Core::Hardware::NUM_CPU_CORES | ||
| 644 | ? core | ||
| 645 | : Core::Hardware::NUM_CPU_CORES - 1]; | ||
| 646 | } | ||
| 647 | |||
| 648 | /// Provides a constant reference to the current gou dirty memory manager. | ||
| 649 | const Core::GPUDirtyMemoryManager& System::CurrentGPUDirtyMemoryManager() const { | ||
| 650 | const std::size_t core = impl->kernel.GetCurrentHostThreadID(); | ||
| 651 | return impl->gpu_dirty_memory_write_manager[core < Core::Hardware::NUM_CPU_CORES | ||
| 652 | ? core | ||
| 653 | : Core::Hardware::NUM_CPU_CORES - 1]; | ||
| 654 | } | ||
| 655 | |||
| 632 | size_t System::GetCurrentHostThreadID() const { | 656 | size_t System::GetCurrentHostThreadID() const { |
| 633 | return impl->kernel.GetCurrentHostThreadID(); | 657 | return impl->kernel.GetCurrentHostThreadID(); |
| 634 | } | 658 | } |
| 635 | 659 | ||
| 660 | void System::GatherGPUDirtyMemory(std::function<void(VAddr, size_t)>& callback) { | ||
| 661 | for (auto& manager : impl->gpu_dirty_memory_write_manager) { | ||
| 662 | manager.Gather(callback); | ||
| 663 | } | ||
| 664 | } | ||
| 665 | |||
| 636 | PerfStatsResults System::GetAndResetPerfStats() { | 666 | PerfStatsResults System::GetAndResetPerfStats() { |
| 637 | return impl->GetAndResetPerfStats(); | 667 | return impl->GetAndResetPerfStats(); |
| 638 | } | 668 | } |