// Copyright 2023 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include #include #include #include "core/hle/service/gsp/gsp_interrupt.h" namespace Service::GSP { struct Command; struct FrameBufferInfo; } // namespace Service::GSP namespace Core { class System; } namespace Pica { class DebugContext; class PicaCore; struct RegsLcd; union ColorFill; } // namespace Pica namespace Frontend { class EmuWindow; } namespace VideoCore { /// Measured on hardware to be 2240568 timer cycles or 4481136 ARM11 cycles constexpr u64 FRAME_TICKS = 4481136ull; class GraphicsDebugger; class RendererBase; /** * The GPU class is the high level interface to the video_core for core services. */ class GPU { public: explicit GPU(Core::System& system, Frontend::EmuWindow& emu_window, Frontend::EmuWindow* secondary_window); ~GPU(); /// Sets the function to call for signalling GSP interrupts. void SetInterruptHandler(Service::GSP::InterruptHandler handler); /// Notify rasterizer that any caches of the specified region should be flushed to Switch memory void FlushRegion(PAddr addr, u32 size); /// Notify rasterizer that any caches of the specified region should be invalidated void InvalidateRegion(PAddr addr, u32 size); /// Flushes and invalidates all memory in the rasterizer cache and removes any leftover state. void ClearAll(bool flush); /// Executes the provided GSP command. void Execute(const Service::GSP::Command& command); /// Updates GPU display framebuffer configuration using the specified parameters. void SetBufferSwap(u32 screen_id, const Service::GSP::FrameBufferInfo& info); /// Sets the LCD color fill configuration for the top and bottom screens. void SetColorFill(const Pica::ColorFill& fill); /// Reads a word from the GPU virtual address. u32 ReadReg(VAddr addr); /// Writes the provided value to the GPU virtual address. void WriteReg(VAddr addr, u32 data); /// Synchronizes fixed function renderer state with PICA registers. void Sync(); /// Returns a mutable reference to the renderer. [[nodiscard]] VideoCore::RendererBase& Renderer(); /// Returns a mutable reference to the PICA GPU. [[nodiscard]] Pica::PicaCore& PicaCore(); /// Returns an immutable reference to the PICA GPU. [[nodiscard]] const Pica::PicaCore& PicaCore() const; /// Returns a mutable reference to the pica debugging context. [[nodiscard]] Pica::DebugContext& DebugContext(); /// Returns a mutable reference to the GSP command debugger. [[nodiscard]] GraphicsDebugger& Debugger(); private: void SubmitCmdList(u32 index); void MemoryFill(u32 index); void MemoryTransfer(); void VBlankCallback(uintptr_t user_data, s64 cycles_late); friend class boost::serialization::access; template void serialize(Archive& ar, const u32 file_version); private: struct Impl; std::unique_ptr impl; PAddr VirtualToPhysicalAddress(VAddr addr); }; } // namespace VideoCore