From e2457418dae19b889b2ad85255bb95d4cd0e4bff Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 30 Aug 2018 10:50:54 -0400 Subject: 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. --- src/core/core.h | 138 ++++++++++++++++---------------------------------------- 1 file changed, 38 insertions(+), 100 deletions(-) (limited to 'src/core/core.h') 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: * This function should only be used by GDB Stub to support breakpoints, memory updates and * step/continue commands. */ - void InvalidateCpuInstructionCaches() { - for (auto& cpu : cpu_cores) { - cpu->ArmInterface().ClearInstructionCache(); - } - } + void InvalidateCpuInstructionCaches(); /// Shutdown the emulated system. void Shutdown(); @@ -117,17 +113,13 @@ public: * application). * @returns True if the emulated system is powered on, otherwise false. */ - bool IsPoweredOn() const { - return cpu_barrier && cpu_barrier->IsAlive(); - } + bool IsPoweredOn() const; /** * Returns a reference to the telemetry session for this emulation session. * @returns Reference to the telemetry session. */ - Core::TelemetrySession& TelemetrySession() const { - return *telemetry_session; - } + Core::TelemetrySession& TelemetrySession() const; /// Prepare the core emulation for a reschedule void PrepareReschedule(); @@ -136,14 +128,13 @@ public: PerfStats::Results GetAndResetPerfStats(); /// Gets an ARM interface to the CPU core that is currently running - ARM_Interface& CurrentArmInterface() { - return CurrentCpuCore().ArmInterface(); - } + ARM_Interface& CurrentArmInterface(); /// Gets the index of the currently running CPU core - size_t CurrentCoreIndex() { - return CurrentCpuCore().CoreIndex(); - } + size_t CurrentCoreIndex(); + + /// Gets the scheduler for the CPU core that is currently running + Kernel::Scheduler& CurrentScheduler(); /// Gets an ARM interface to the CPU core with the specified index ARM_Interface& ArmInterface(size_t core_index); @@ -151,43 +142,26 @@ public: /// Gets a CPU interface to the CPU core with the specified index Cpu& CpuCore(size_t core_index); + /// Gets the exclusive monitor + ExclusiveMonitor& Monitor(); + /// Gets a mutable reference to the GPU interface - Tegra::GPU& GPU() { - return *gpu_core; - } + Tegra::GPU& GPU(); /// Gets an immutable reference to the GPU interface. - const Tegra::GPU& GPU() const { - return *gpu_core; - } + const Tegra::GPU& GPU() const; /// Gets a mutable reference to the renderer. - VideoCore::RendererBase& Renderer() { - return *renderer; - } + VideoCore::RendererBase& Renderer(); /// Gets an immutable reference to the renderer. - const VideoCore::RendererBase& Renderer() const { - return *renderer; - } - - /// Gets the scheduler for the CPU core that is currently running - Kernel::Scheduler& CurrentScheduler() { - return *CurrentCpuCore().Scheduler(); - } - - /// Gets the exclusive monitor - ExclusiveMonitor& Monitor() { - return *cpu_exclusive_monitor; - } + const VideoCore::RendererBase& Renderer() const; /// Gets the scheduler for the CPU core with the specified index const std::shared_ptr& Scheduler(size_t core_index); /// Gets the current process - Kernel::SharedPtr& CurrentProcess() { - return current_process; - } + Kernel::SharedPtr& CurrentProcess(); /// Provides a reference to the kernel instance. Kernel::KernelCore& Kernel(); @@ -195,49 +169,37 @@ public: /// Provides a constant reference to the kernel instance. const Kernel::KernelCore& Kernel() const; - /// Gets the name of the current game - Loader::ResultStatus GetGameName(std::string& out) const { - if (app_loader == nullptr) - return Loader::ResultStatus::ErrorNotInitialized; - return app_loader->ReadTitle(out); - } + /// Provides a reference to the internal PerfStats instance. + Core::PerfStats& GetPerfStats(); - PerfStats perf_stats; - FrameLimiter frame_limiter; + /// Provides a constant reference to the internal PerfStats instance. + const Core::PerfStats& GetPerfStats() const; - void SetStatus(ResultStatus new_status, const char* details = nullptr) { - status = new_status; - if (details) { - status_details = details; - } - } + /// Provides a reference to the frame limiter; + Core::FrameLimiter& FrameLimiter(); - const std::string& GetStatusDetails() const { - return status_details; - } + /// Provides a constant referent to the frame limiter + const Core::FrameLimiter& FrameLimiter() const; - Loader::AppLoader& GetAppLoader() const { - return *app_loader; - } + /// Gets the name of the current game + Loader::ResultStatus GetGameName(std::string& out) const; + + void SetStatus(ResultStatus new_status, const char* details); + + const std::string& GetStatusDetails() const; + + Loader::AppLoader& GetAppLoader() const; Service::SM::ServiceManager& ServiceManager(); const Service::SM::ServiceManager& ServiceManager() const; - void SetGPUDebugContext(std::shared_ptr context) { - debug_context = std::move(context); - } + void SetGPUDebugContext(std::shared_ptr context); - std::shared_ptr GetGPUDebugContext() const { - return debug_context; - } + std::shared_ptr GetGPUDebugContext() const; - void SetFilesystem(FileSys::VirtualFilesystem vfs) { - virtual_filesystem = std::move(vfs); - } + void SetFilesystem(FileSys::VirtualFilesystem vfs); - FileSys::VirtualFilesystem GetFilesystem() const { - return virtual_filesystem; - } + FileSys::VirtualFilesystem GetFilesystem() const; private: System(); @@ -253,34 +215,10 @@ private: */ ResultStatus Init(Frontend::EmuWindow& emu_window); - Kernel::KernelCore kernel; - /// RealVfsFilesystem instance - FileSys::VirtualFilesystem virtual_filesystem; - /// AppLoader used to load the current executing application - std::unique_ptr app_loader; - std::unique_ptr renderer; - std::unique_ptr gpu_core; - std::shared_ptr debug_context; - Kernel::SharedPtr current_process; - std::shared_ptr cpu_exclusive_monitor; - std::shared_ptr cpu_barrier; - std::array, NUM_CPU_CORES> cpu_cores; - std::array, NUM_CPU_CORES - 1> cpu_core_threads; - size_t active_core{}; ///< Active core, only used in single thread mode - - /// Service manager - std::shared_ptr service_manager; - - /// Telemetry session for this emulation session - std::unique_ptr telemetry_session; + struct Impl; + std::unique_ptr impl; static System s_instance; - - ResultStatus status = ResultStatus::Success; - std::string status_details = ""; - - /// Map of guest threads to CPU cores - std::map> thread_to_cpu; }; inline ARM_Interface& CurrentArmInterface() { -- cgit v1.2.3