|
@@ -27,6 +27,7 @@
|
|
|
#include "core/file_sys/savedata_factory.h"
|
|
#include "core/file_sys/savedata_factory.h"
|
|
|
#include "core/file_sys/vfs_concat.h"
|
|
#include "core/file_sys/vfs_concat.h"
|
|
|
#include "core/file_sys/vfs_real.h"
|
|
#include "core/file_sys/vfs_real.h"
|
|
|
|
|
+#include "core/gpu_dirty_memory_manager.h"
|
|
|
#include "core/hid/hid_core.h"
|
|
#include "core/hid/hid_core.h"
|
|
|
#include "core/hle/kernel/k_memory_manager.h"
|
|
#include "core/hle/kernel/k_memory_manager.h"
|
|
|
#include "core/hle/kernel/k_process.h"
|
|
#include "core/hle/kernel/k_process.h"
|
|
@@ -54,6 +55,7 @@
|
|
|
#include "video_core/renderer_base.h"
|
|
#include "video_core/renderer_base.h"
|
|
|
#include "video_core/video_core.h"
|
|
#include "video_core/video_core.h"
|
|
|
|
|
|
|
|
|
|
+
|
|
|
MICROPROFILE_DEFINE(ARM_CPU0, "ARM", "CPU 0", MP_RGB(255, 64, 64));
|
|
MICROPROFILE_DEFINE(ARM_CPU0, "ARM", "CPU 0", MP_RGB(255, 64, 64));
|
|
|
MICROPROFILE_DEFINE(ARM_CPU1, "ARM", "CPU 1", MP_RGB(255, 64, 64));
|
|
MICROPROFILE_DEFINE(ARM_CPU1, "ARM", "CPU 1", MP_RGB(255, 64, 64));
|
|
|
MICROPROFILE_DEFINE(ARM_CPU2, "ARM", "CPU 2", MP_RGB(255, 64, 64));
|
|
MICROPROFILE_DEFINE(ARM_CPU2, "ARM", "CPU 2", MP_RGB(255, 64, 64));
|
|
@@ -540,6 +542,9 @@ struct System::Impl {
|
|
|
|
|
|
|
|
std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{};
|
|
std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{};
|
|
|
std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_cpu{};
|
|
std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_cpu{};
|
|
|
|
|
+
|
|
|
|
|
+ std::array<Core::GPUDirtyMemoryManager, Core::Hardware::NUM_CPU_CORES>
|
|
|
|
|
+ gpu_dirty_memory_write_manager{};
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
System::System() : impl{std::make_unique<Impl>(*this)} {}
|
|
System::System() : impl{std::make_unique<Impl>(*this)} {}
|
|
@@ -629,10 +634,31 @@ void System::PrepareReschedule(const u32 core_index) {
|
|
|
impl->kernel.PrepareReschedule(core_index);
|
|
impl->kernel.PrepareReschedule(core_index);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+Core::GPUDirtyMemoryManager& System::CurrentGPUDirtyMemoryManager() {
|
|
|
|
|
+ const std::size_t core = impl->kernel.GetCurrentHostThreadID();
|
|
|
|
|
+ return impl->gpu_dirty_memory_write_manager[core < Core::Hardware::NUM_CPU_CORES
|
|
|
|
|
+ ? core
|
|
|
|
|
+ : Core::Hardware::NUM_CPU_CORES - 1];
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/// Provides a constant reference to the current gou dirty memory manager.
|
|
|
|
|
+const Core::GPUDirtyMemoryManager& System::CurrentGPUDirtyMemoryManager() const {
|
|
|
|
|
+ const std::size_t core = impl->kernel.GetCurrentHostThreadID();
|
|
|
|
|
+ return impl->gpu_dirty_memory_write_manager[core < Core::Hardware::NUM_CPU_CORES
|
|
|
|
|
+ ? core
|
|
|
|
|
+ : Core::Hardware::NUM_CPU_CORES - 1];
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
size_t System::GetCurrentHostThreadID() const {
|
|
size_t System::GetCurrentHostThreadID() const {
|
|
|
return impl->kernel.GetCurrentHostThreadID();
|
|
return impl->kernel.GetCurrentHostThreadID();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void System::GatherGPUDirtyMemory(std::function<void(VAddr, size_t)>& callback) {
|
|
|
|
|
+ for (auto& manager : impl->gpu_dirty_memory_write_manager) {
|
|
|
|
|
+ manager.Gather(callback);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
PerfStatsResults System::GetAndResetPerfStats() {
|
|
PerfStatsResults System::GetAndResetPerfStats() {
|
|
|
return impl->GetAndResetPerfStats();
|
|
return impl->GetAndResetPerfStats();
|
|
|
}
|
|
}
|