diff options
| author | 2024-01-07 07:52:09 +0100 | |
|---|---|---|
| committer | 2024-01-18 21:12:30 -0500 | |
| commit | 648ed55fe61f4f55f2a8c58d9bc2d4dca934cd37 (patch) | |
| tree | a04969c1af408b377981b395a8f437b852f8b208 /src | |
| parent | Core: Eliminate core/memory dependancies. (diff) | |
| download | yuzu-648ed55fe61f4f55f2a8c58d9bc2d4dca934cd37.tar.gz yuzu-648ed55fe61f4f55f2a8c58d9bc2d4dca934cd37.tar.xz yuzu-648ed55fe61f4f55f2a8c58d9bc2d4dca934cd37.zip | |
Core: Make sure GPU Dirty Managers ae shared by all processes.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/core.cpp | 12 | ||||
| -rw-r--r-- | src/core/core.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_process.cpp | 14 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_process.h | 4 |
4 files changed, 19 insertions, 15 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index 04e1f13ff..2392fe136 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include "core/file_sys/savedata_factory.h" | 28 | #include "core/file_sys/savedata_factory.h" |
| 29 | #include "core/file_sys/vfs_concat.h" | 29 | #include "core/file_sys/vfs_concat.h" |
| 30 | #include "core/file_sys/vfs_real.h" | 30 | #include "core/file_sys/vfs_real.h" |
| 31 | #include "core/gpu_dirty_memory_manager.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" |
| 33 | #include "core/hle/kernel/k_resource_limit.h" | 34 | #include "core/hle/kernel/k_resource_limit.h" |
| @@ -565,6 +566,9 @@ struct System::Impl { | |||
| 565 | std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{}; | 566 | std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{}; |
| 566 | std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_cpu{}; | 567 | std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_cpu{}; |
| 567 | 568 | ||
| 569 | std::array<Core::GPUDirtyMemoryManager, Core::Hardware::NUM_CPU_CORES> | ||
| 570 | gpu_dirty_memory_managers; | ||
| 571 | |||
| 568 | std::deque<std::vector<u8>> user_channel; | 572 | std::deque<std::vector<u8>> user_channel; |
| 569 | }; | 573 | }; |
| 570 | 574 | ||
| @@ -651,8 +655,14 @@ size_t System::GetCurrentHostThreadID() const { | |||
| 651 | return impl->kernel.GetCurrentHostThreadID(); | 655 | return impl->kernel.GetCurrentHostThreadID(); |
| 652 | } | 656 | } |
| 653 | 657 | ||
| 658 | std::span<GPUDirtyMemoryManager> System::GetGPUDirtyMemoryManager() { | ||
| 659 | return impl->gpu_dirty_memory_managers; | ||
| 660 | } | ||
| 661 | |||
| 654 | void System::GatherGPUDirtyMemory(std::function<void(PAddr, size_t)>& callback) { | 662 | void System::GatherGPUDirtyMemory(std::function<void(PAddr, size_t)>& callback) { |
| 655 | return this->ApplicationProcess()->GatherGPUDirtyMemory(callback); | 663 | for (auto& manager : impl->gpu_dirty_memory_managers) { |
| 664 | manager.Gather(callback); | ||
| 665 | } | ||
| 656 | } | 666 | } |
| 657 | 667 | ||
| 658 | PerfStatsResults System::GetAndResetPerfStats() { | 668 | PerfStatsResults System::GetAndResetPerfStats() { |
diff --git a/src/core/core.h b/src/core/core.h index 20ec2ffff..80446f385 100644 --- a/src/core/core.h +++ b/src/core/core.h | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include <functional> | 8 | #include <functional> |
| 9 | #include <memory> | 9 | #include <memory> |
| 10 | #include <mutex> | 10 | #include <mutex> |
| 11 | #include <span> | ||
| 11 | #include <string> | 12 | #include <string> |
| 12 | #include <vector> | 13 | #include <vector> |
| 13 | 14 | ||
| @@ -116,6 +117,7 @@ class CpuManager; | |||
| 116 | class Debugger; | 117 | class Debugger; |
| 117 | class DeviceMemory; | 118 | class DeviceMemory; |
| 118 | class ExclusiveMonitor; | 119 | class ExclusiveMonitor; |
| 120 | class GPUDirtyMemoryManager; | ||
| 119 | class PerfStats; | 121 | class PerfStats; |
| 120 | class Reporter; | 122 | class Reporter; |
| 121 | class SpeedLimiter; | 123 | class SpeedLimiter; |
| @@ -224,6 +226,8 @@ public: | |||
| 224 | /// Prepare the core emulation for a reschedule | 226 | /// Prepare the core emulation for a reschedule |
| 225 | void PrepareReschedule(u32 core_index); | 227 | void PrepareReschedule(u32 core_index); |
| 226 | 228 | ||
| 229 | std::span<GPUDirtyMemoryManager> GetGPUDirtyMemoryManager(); | ||
| 230 | |||
| 227 | void GatherGPUDirtyMemory(std::function<void(PAddr, size_t)>& callback); | 231 | void GatherGPUDirtyMemory(std::function<void(PAddr, size_t)>& callback); |
| 228 | 232 | ||
| 229 | [[nodiscard]] size_t GetCurrentHostThreadID() const; | 233 | [[nodiscard]] size_t GetCurrentHostThreadID() const; |
diff --git a/src/core/hle/kernel/k_process.cpp b/src/core/hle/kernel/k_process.cpp index 53735a225..0b08e877e 100644 --- a/src/core/hle/kernel/k_process.cpp +++ b/src/core/hle/kernel/k_process.cpp | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include "common/scope_exit.h" | 5 | #include "common/scope_exit.h" |
| 6 | #include "common/settings.h" | 6 | #include "common/settings.h" |
| 7 | #include "core/core.h" | 7 | #include "core/core.h" |
| 8 | #include "core/gpu_dirty_memory_manager.h" | ||
| 8 | #include "core/hle/kernel/k_process.h" | 9 | #include "core/hle/kernel/k_process.h" |
| 9 | #include "core/hle/kernel/k_scoped_resource_reservation.h" | 10 | #include "core/hle/kernel/k_scoped_resource_reservation.h" |
| 10 | #include "core/hle/kernel/k_shared_memory.h" | 11 | #include "core/hle/kernel/k_shared_memory.h" |
| @@ -320,7 +321,7 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params, const KPa | |||
| 320 | 321 | ||
| 321 | // Ensure our memory is initialized. | 322 | // Ensure our memory is initialized. |
| 322 | m_memory.SetCurrentPageTable(*this); | 323 | m_memory.SetCurrentPageTable(*this); |
| 323 | m_memory.SetGPUDirtyManagers(m_dirty_memory_managers); | 324 | m_memory.SetGPUDirtyManagers(m_kernel.System().GetGPUDirtyMemoryManager()); |
| 324 | 325 | ||
| 325 | // Ensure we can insert the code region. | 326 | // Ensure we can insert the code region. |
| 326 | R_UNLESS(m_page_table.CanContain(params.code_address, params.code_num_pages * PageSize, | 327 | R_UNLESS(m_page_table.CanContain(params.code_address, params.code_num_pages * PageSize, |
| @@ -417,7 +418,7 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params, | |||
| 417 | 418 | ||
| 418 | // Ensure our memory is initialized. | 419 | // Ensure our memory is initialized. |
| 419 | m_memory.SetCurrentPageTable(*this); | 420 | m_memory.SetCurrentPageTable(*this); |
| 420 | m_memory.SetGPUDirtyManagers(m_dirty_memory_managers); | 421 | m_memory.SetGPUDirtyManagers(m_kernel.System().GetGPUDirtyMemoryManager()); |
| 421 | 422 | ||
| 422 | // Ensure we can insert the code region. | 423 | // Ensure we can insert the code region. |
| 423 | R_UNLESS(m_page_table.CanContain(params.code_address, code_size, KMemoryState::Code), | 424 | R_UNLESS(m_page_table.CanContain(params.code_address, code_size, KMemoryState::Code), |
| @@ -1141,8 +1142,7 @@ void KProcess::Switch(KProcess* cur_process, KProcess* next_process) {} | |||
| 1141 | KProcess::KProcess(KernelCore& kernel) | 1142 | KProcess::KProcess(KernelCore& kernel) |
| 1142 | : KAutoObjectWithSlabHeapAndContainer(kernel), m_page_table{kernel}, m_state_lock{kernel}, | 1143 | : KAutoObjectWithSlabHeapAndContainer(kernel), m_page_table{kernel}, m_state_lock{kernel}, |
| 1143 | m_list_lock{kernel}, m_cond_var{kernel.System()}, m_address_arbiter{kernel.System()}, | 1144 | m_list_lock{kernel}, m_cond_var{kernel.System()}, m_address_arbiter{kernel.System()}, |
| 1144 | m_handle_table{kernel}, m_dirty_memory_managers{}, | 1145 | m_handle_table{kernel}, m_exclusive_monitor{}, m_memory{kernel.System()} {} |
| 1145 | m_exclusive_monitor{}, m_memory{kernel.System()} {} | ||
| 1146 | KProcess::~KProcess() = default; | 1146 | KProcess::~KProcess() = default; |
| 1147 | 1147 | ||
| 1148 | Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size, | 1148 | Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size, |
| @@ -1324,10 +1324,4 @@ bool KProcess::RemoveWatchpoint(KProcessAddress addr, u64 size, DebugWatchpointT | |||
| 1324 | return true; | 1324 | return true; |
| 1325 | } | 1325 | } |
| 1326 | 1326 | ||
| 1327 | void KProcess::GatherGPUDirtyMemory(std::function<void(VAddr, size_t)>& callback) { | ||
| 1328 | for (auto& manager : m_dirty_memory_managers) { | ||
| 1329 | manager.Gather(callback); | ||
| 1330 | } | ||
| 1331 | } | ||
| 1332 | |||
| 1333 | } // namespace Kernel | 1327 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_process.h b/src/core/hle/kernel/k_process.h index 53c0e3316..ab1358a12 100644 --- a/src/core/hle/kernel/k_process.h +++ b/src/core/hle/kernel/k_process.h | |||
| @@ -7,7 +7,6 @@ | |||
| 7 | 7 | ||
| 8 | #include "core/arm/arm_interface.h" | 8 | #include "core/arm/arm_interface.h" |
| 9 | #include "core/file_sys/program_metadata.h" | 9 | #include "core/file_sys/program_metadata.h" |
| 10 | #include "core/gpu_dirty_memory_manager.h" | ||
| 11 | #include "core/hle/kernel/code_set.h" | 10 | #include "core/hle/kernel/code_set.h" |
| 12 | #include "core/hle/kernel/k_address_arbiter.h" | 11 | #include "core/hle/kernel/k_address_arbiter.h" |
| 13 | #include "core/hle/kernel/k_capabilities.h" | 12 | #include "core/hle/kernel/k_capabilities.h" |
| @@ -128,7 +127,6 @@ private: | |||
| 128 | #ifdef HAS_NCE | 127 | #ifdef HAS_NCE |
| 129 | std::unordered_map<u64, u64> m_post_handlers{}; | 128 | std::unordered_map<u64, u64> m_post_handlers{}; |
| 130 | #endif | 129 | #endif |
| 131 | std::array<Core::GPUDirtyMemoryManager, Core::Hardware::NUM_CPU_CORES> m_dirty_memory_managers; | ||
| 132 | std::unique_ptr<Core::ExclusiveMonitor> m_exclusive_monitor; | 130 | std::unique_ptr<Core::ExclusiveMonitor> m_exclusive_monitor; |
| 133 | Core::Memory::Memory m_memory; | 131 | Core::Memory::Memory m_memory; |
| 134 | 132 | ||
| @@ -511,8 +509,6 @@ public: | |||
| 511 | return m_memory; | 509 | return m_memory; |
| 512 | } | 510 | } |
| 513 | 511 | ||
| 514 | void GatherGPUDirtyMemory(std::function<void(VAddr, size_t)>& callback); | ||
| 515 | |||
| 516 | Core::ExclusiveMonitor& GetExclusiveMonitor() const { | 512 | Core::ExclusiveMonitor& GetExclusiveMonitor() const { |
| 517 | return *m_exclusive_monitor; | 513 | return *m_exclusive_monitor; |
| 518 | } | 514 | } |