summaryrefslogtreecommitdiff
path: root/src/core/core.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/core.cpp')
-rw-r--r--src/core/core.cpp32
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,
130struct System::Impl { 131struct 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
545System::System() : impl{std::make_unique<Impl>(*this)} {} 554System::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
641Core::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.
649const 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
632size_t System::GetCurrentHostThreadID() const { 656size_t System::GetCurrentHostThreadID() const {
633 return impl->kernel.GetCurrentHostThreadID(); 657 return impl->kernel.GetCurrentHostThreadID();
634} 658}
635 659
660void 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
636PerfStatsResults System::GetAndResetPerfStats() { 666PerfStatsResults System::GetAndResetPerfStats() {
637 return impl->GetAndResetPerfStats(); 667 return impl->GetAndResetPerfStats();
638} 668}