diff options
| author | 2018-08-30 10:50:54 -0400 | |
|---|---|---|
| committer | 2018-08-31 07:16:57 -0400 | |
| commit | e2457418dae19b889b2ad85255bb95d4cd0e4bff (patch) | |
| tree | 76ad194f1cc1933f7907223dbb2542b3614576e5 /src/core/core.h | |
| parent | Merge pull request #1198 from lioncash/kernel (diff) | |
| download | yuzu-e2457418dae19b889b2ad85255bb95d4cd0e4bff.tar.gz yuzu-e2457418dae19b889b2ad85255bb95d4cd0e4bff.tar.xz yuzu-e2457418dae19b889b2ad85255bb95d4cd0e4bff.zip | |
core: Make the main System class use the PImpl idiom
core.h is kind of a massive header in terms what it includes within
itself. It includes VFS utilities, kernel headers, file_sys header,
ARM-related headers, etc. This means that changing anything in the
headers included by core.h essentially requires you to rebuild almost
all of core.
Instead, we can modify the System class to use the PImpl idiom, which
allows us to move all of those headers to the cpp file and forward
declare the bulk of the types that would otherwise be included, reducing
compile times. This change specifically only performs the PImpl portion.
Diffstat (limited to 'src/core/core.h')
| -rw-r--r-- | src/core/core.h | 138 |
1 files changed, 38 insertions, 100 deletions
diff --git a/src/core/core.h b/src/core/core.h index 2c18f7193..984e8f94c 100644 --- a/src/core/core.h +++ b/src/core/core.h | |||
| @@ -94,11 +94,7 @@ public: | |||
| 94 | * This function should only be used by GDB Stub to support breakpoints, memory updates and | 94 | * This function should only be used by GDB Stub to support breakpoints, memory updates and |
| 95 | * step/continue commands. | 95 | * step/continue commands. |
| 96 | */ | 96 | */ |
| 97 | void InvalidateCpuInstructionCaches() { | 97 | void InvalidateCpuInstructionCaches(); |
| 98 | for (auto& cpu : cpu_cores) { | ||
| 99 | cpu->ArmInterface().ClearInstructionCache(); | ||
| 100 | } | ||
| 101 | } | ||
| 102 | 98 | ||
| 103 | /// Shutdown the emulated system. | 99 | /// Shutdown the emulated system. |
| 104 | void Shutdown(); | 100 | void Shutdown(); |
| @@ -117,17 +113,13 @@ public: | |||
| 117 | * application). | 113 | * application). |
| 118 | * @returns True if the emulated system is powered on, otherwise false. | 114 | * @returns True if the emulated system is powered on, otherwise false. |
| 119 | */ | 115 | */ |
| 120 | bool IsPoweredOn() const { | 116 | bool IsPoweredOn() const; |
| 121 | return cpu_barrier && cpu_barrier->IsAlive(); | ||
| 122 | } | ||
| 123 | 117 | ||
| 124 | /** | 118 | /** |
| 125 | * Returns a reference to the telemetry session for this emulation session. | 119 | * Returns a reference to the telemetry session for this emulation session. |
| 126 | * @returns Reference to the telemetry session. | 120 | * @returns Reference to the telemetry session. |
| 127 | */ | 121 | */ |
| 128 | Core::TelemetrySession& TelemetrySession() const { | 122 | Core::TelemetrySession& TelemetrySession() const; |
| 129 | return *telemetry_session; | ||
| 130 | } | ||
| 131 | 123 | ||
| 132 | /// Prepare the core emulation for a reschedule | 124 | /// Prepare the core emulation for a reschedule |
| 133 | void PrepareReschedule(); | 125 | void PrepareReschedule(); |
| @@ -136,14 +128,13 @@ public: | |||
| 136 | PerfStats::Results GetAndResetPerfStats(); | 128 | PerfStats::Results GetAndResetPerfStats(); |
| 137 | 129 | ||
| 138 | /// Gets an ARM interface to the CPU core that is currently running | 130 | /// Gets an ARM interface to the CPU core that is currently running |
| 139 | ARM_Interface& CurrentArmInterface() { | 131 | ARM_Interface& CurrentArmInterface(); |
| 140 | return CurrentCpuCore().ArmInterface(); | ||
| 141 | } | ||
| 142 | 132 | ||
| 143 | /// Gets the index of the currently running CPU core | 133 | /// Gets the index of the currently running CPU core |
| 144 | size_t CurrentCoreIndex() { | 134 | size_t CurrentCoreIndex(); |
| 145 | return CurrentCpuCore().CoreIndex(); | 135 | |
| 146 | } | 136 | /// Gets the scheduler for the CPU core that is currently running |
| 137 | Kernel::Scheduler& CurrentScheduler(); | ||
| 147 | 138 | ||
| 148 | /// Gets an ARM interface to the CPU core with the specified index | 139 | /// Gets an ARM interface to the CPU core with the specified index |
| 149 | ARM_Interface& ArmInterface(size_t core_index); | 140 | ARM_Interface& ArmInterface(size_t core_index); |
| @@ -151,43 +142,26 @@ public: | |||
| 151 | /// Gets a CPU interface to the CPU core with the specified index | 142 | /// Gets a CPU interface to the CPU core with the specified index |
| 152 | Cpu& CpuCore(size_t core_index); | 143 | Cpu& CpuCore(size_t core_index); |
| 153 | 144 | ||
| 145 | /// Gets the exclusive monitor | ||
| 146 | ExclusiveMonitor& Monitor(); | ||
| 147 | |||
| 154 | /// Gets a mutable reference to the GPU interface | 148 | /// Gets a mutable reference to the GPU interface |
| 155 | Tegra::GPU& GPU() { | 149 | Tegra::GPU& GPU(); |
| 156 | return *gpu_core; | ||
| 157 | } | ||
| 158 | 150 | ||
| 159 | /// Gets an immutable reference to the GPU interface. | 151 | /// Gets an immutable reference to the GPU interface. |
| 160 | const Tegra::GPU& GPU() const { | 152 | const Tegra::GPU& GPU() const; |
| 161 | return *gpu_core; | ||
| 162 | } | ||
| 163 | 153 | ||
| 164 | /// Gets a mutable reference to the renderer. | 154 | /// Gets a mutable reference to the renderer. |
| 165 | VideoCore::RendererBase& Renderer() { | 155 | VideoCore::RendererBase& Renderer(); |
| 166 | return *renderer; | ||
| 167 | } | ||
| 168 | 156 | ||
| 169 | /// Gets an immutable reference to the renderer. | 157 | /// Gets an immutable reference to the renderer. |
| 170 | const VideoCore::RendererBase& Renderer() const { | 158 | const VideoCore::RendererBase& Renderer() const; |
| 171 | return *renderer; | ||
| 172 | } | ||
| 173 | |||
| 174 | /// Gets the scheduler for the CPU core that is currently running | ||
| 175 | Kernel::Scheduler& CurrentScheduler() { | ||
| 176 | return *CurrentCpuCore().Scheduler(); | ||
| 177 | } | ||
| 178 | |||
| 179 | /// Gets the exclusive monitor | ||
| 180 | ExclusiveMonitor& Monitor() { | ||
| 181 | return *cpu_exclusive_monitor; | ||
| 182 | } | ||
| 183 | 159 | ||
| 184 | /// Gets the scheduler for the CPU core with the specified index | 160 | /// Gets the scheduler for the CPU core with the specified index |
| 185 | const std::shared_ptr<Kernel::Scheduler>& Scheduler(size_t core_index); | 161 | const std::shared_ptr<Kernel::Scheduler>& Scheduler(size_t core_index); |
| 186 | 162 | ||
| 187 | /// Gets the current process | 163 | /// Gets the current process |
| 188 | Kernel::SharedPtr<Kernel::Process>& CurrentProcess() { | 164 | Kernel::SharedPtr<Kernel::Process>& CurrentProcess(); |
| 189 | return current_process; | ||
| 190 | } | ||
| 191 | 165 | ||
| 192 | /// Provides a reference to the kernel instance. | 166 | /// Provides a reference to the kernel instance. |
| 193 | Kernel::KernelCore& Kernel(); | 167 | Kernel::KernelCore& Kernel(); |
| @@ -195,49 +169,37 @@ public: | |||
| 195 | /// Provides a constant reference to the kernel instance. | 169 | /// Provides a constant reference to the kernel instance. |
| 196 | const Kernel::KernelCore& Kernel() const; | 170 | const Kernel::KernelCore& Kernel() const; |
| 197 | 171 | ||
| 198 | /// Gets the name of the current game | 172 | /// Provides a reference to the internal PerfStats instance. |
| 199 | Loader::ResultStatus GetGameName(std::string& out) const { | 173 | Core::PerfStats& GetPerfStats(); |
| 200 | if (app_loader == nullptr) | ||
| 201 | return Loader::ResultStatus::ErrorNotInitialized; | ||
| 202 | return app_loader->ReadTitle(out); | ||
| 203 | } | ||
| 204 | 174 | ||
| 205 | PerfStats perf_stats; | 175 | /// Provides a constant reference to the internal PerfStats instance. |
| 206 | FrameLimiter frame_limiter; | 176 | const Core::PerfStats& GetPerfStats() const; |
| 207 | 177 | ||
| 208 | void SetStatus(ResultStatus new_status, const char* details = nullptr) { | 178 | /// Provides a reference to the frame limiter; |
| 209 | status = new_status; | 179 | Core::FrameLimiter& FrameLimiter(); |
| 210 | if (details) { | ||
| 211 | status_details = details; | ||
| 212 | } | ||
| 213 | } | ||
| 214 | 180 | ||
| 215 | const std::string& GetStatusDetails() const { | 181 | /// Provides a constant referent to the frame limiter |
| 216 | return status_details; | 182 | const Core::FrameLimiter& FrameLimiter() const; |
| 217 | } | ||
| 218 | 183 | ||
| 219 | Loader::AppLoader& GetAppLoader() const { | 184 | /// Gets the name of the current game |
| 220 | return *app_loader; | 185 | Loader::ResultStatus GetGameName(std::string& out) const; |
| 221 | } | 186 | |
| 187 | void SetStatus(ResultStatus new_status, const char* details); | ||
| 188 | |||
| 189 | const std::string& GetStatusDetails() const; | ||
| 190 | |||
| 191 | Loader::AppLoader& GetAppLoader() const; | ||
| 222 | 192 | ||
| 223 | Service::SM::ServiceManager& ServiceManager(); | 193 | Service::SM::ServiceManager& ServiceManager(); |
| 224 | const Service::SM::ServiceManager& ServiceManager() const; | 194 | const Service::SM::ServiceManager& ServiceManager() const; |
| 225 | 195 | ||
| 226 | void SetGPUDebugContext(std::shared_ptr<Tegra::DebugContext> context) { | 196 | void SetGPUDebugContext(std::shared_ptr<Tegra::DebugContext> context); |
| 227 | debug_context = std::move(context); | ||
| 228 | } | ||
| 229 | 197 | ||
| 230 | std::shared_ptr<Tegra::DebugContext> GetGPUDebugContext() const { | 198 | std::shared_ptr<Tegra::DebugContext> GetGPUDebugContext() const; |
| 231 | return debug_context; | ||
| 232 | } | ||
| 233 | 199 | ||
| 234 | void SetFilesystem(FileSys::VirtualFilesystem vfs) { | 200 | void SetFilesystem(FileSys::VirtualFilesystem vfs); |
| 235 | virtual_filesystem = std::move(vfs); | ||
| 236 | } | ||
| 237 | 201 | ||
| 238 | FileSys::VirtualFilesystem GetFilesystem() const { | 202 | FileSys::VirtualFilesystem GetFilesystem() const; |
| 239 | return virtual_filesystem; | ||
| 240 | } | ||
| 241 | 203 | ||
| 242 | private: | 204 | private: |
| 243 | System(); | 205 | System(); |
| @@ -253,34 +215,10 @@ private: | |||
| 253 | */ | 215 | */ |
| 254 | ResultStatus Init(Frontend::EmuWindow& emu_window); | 216 | ResultStatus Init(Frontend::EmuWindow& emu_window); |
| 255 | 217 | ||
| 256 | Kernel::KernelCore kernel; | 218 | struct Impl; |
| 257 | /// RealVfsFilesystem instance | 219 | std::unique_ptr<Impl> impl; |
| 258 | FileSys::VirtualFilesystem virtual_filesystem; | ||
| 259 | /// AppLoader used to load the current executing application | ||
| 260 | std::unique_ptr<Loader::AppLoader> app_loader; | ||
| 261 | std::unique_ptr<VideoCore::RendererBase> renderer; | ||
| 262 | std::unique_ptr<Tegra::GPU> gpu_core; | ||
| 263 | std::shared_ptr<Tegra::DebugContext> debug_context; | ||
| 264 | Kernel::SharedPtr<Kernel::Process> current_process; | ||
| 265 | std::shared_ptr<ExclusiveMonitor> cpu_exclusive_monitor; | ||
| 266 | std::shared_ptr<CpuBarrier> cpu_barrier; | ||
| 267 | std::array<std::shared_ptr<Cpu>, NUM_CPU_CORES> cpu_cores; | ||
| 268 | std::array<std::unique_ptr<std::thread>, NUM_CPU_CORES - 1> cpu_core_threads; | ||
| 269 | size_t active_core{}; ///< Active core, only used in single thread mode | ||
| 270 | |||
| 271 | /// Service manager | ||
| 272 | std::shared_ptr<Service::SM::ServiceManager> service_manager; | ||
| 273 | |||
| 274 | /// Telemetry session for this emulation session | ||
| 275 | std::unique_ptr<Core::TelemetrySession> telemetry_session; | ||
| 276 | 220 | ||
| 277 | static System s_instance; | 221 | static System s_instance; |
| 278 | |||
| 279 | ResultStatus status = ResultStatus::Success; | ||
| 280 | std::string status_details = ""; | ||
| 281 | |||
| 282 | /// Map of guest threads to CPU cores | ||
| 283 | std::map<std::thread::id, std::shared_ptr<Cpu>> thread_to_cpu; | ||
| 284 | }; | 222 | }; |
| 285 | 223 | ||
| 286 | inline ARM_Interface& CurrentArmInterface() { | 224 | inline ARM_Interface& CurrentArmInterface() { |