| |
| |
|
|
| #pragma once |
|
|
| #include <memory> |
|
|
| #include "common/bit_field.h" |
| #include "common/common_types.h" |
| #include "core/hle/service/nvdrv/nvdata.h" |
| #include "video_core/cdma_pusher.h" |
| #include "video_core/framebuffer_config.h" |
| #include "video_core/rasterizer_download_area.h" |
|
|
| namespace Core { |
| class System; |
| } |
|
|
| namespace VideoCore { |
| class RendererBase; |
| class ShaderNotify; |
| } |
|
|
| namespace Tegra { |
| class DmaPusher; |
| struct CommandList; |
|
|
| |
| enum class RenderTargetFormat : u32 { |
| NONE = 0x0, |
| R32G32B32A32_FLOAT = 0xC0, |
| R32G32B32A32_SINT = 0xC1, |
| R32G32B32A32_UINT = 0xC2, |
| R32G32B32X32_FLOAT = 0xC3, |
| R32G32B32X32_SINT = 0xC4, |
| R32G32B32X32_UINT = 0xC5, |
| R16G16B16A16_UNORM = 0xC6, |
| R16G16B16A16_SNORM = 0xC7, |
| R16G16B16A16_SINT = 0xC8, |
| R16G16B16A16_UINT = 0xC9, |
| R16G16B16A16_FLOAT = 0xCA, |
| R32G32_FLOAT = 0xCB, |
| R32G32_SINT = 0xCC, |
| R32G32_UINT = 0xCD, |
| R16G16B16X16_FLOAT = 0xCE, |
| A8R8G8B8_UNORM = 0xCF, |
| A8R8G8B8_SRGB = 0xD0, |
| A2B10G10R10_UNORM = 0xD1, |
| A2B10G10R10_UINT = 0xD2, |
| A8B8G8R8_UNORM = 0xD5, |
| A8B8G8R8_SRGB = 0xD6, |
| A8B8G8R8_SNORM = 0xD7, |
| A8B8G8R8_SINT = 0xD8, |
| A8B8G8R8_UINT = 0xD9, |
| R16G16_UNORM = 0xDA, |
| R16G16_SNORM = 0xDB, |
| R16G16_SINT = 0xDC, |
| R16G16_UINT = 0xDD, |
| R16G16_FLOAT = 0xDE, |
| A2R10G10B10_UNORM = 0xDF, |
| B10G11R11_FLOAT = 0xE0, |
| R32_SINT = 0xE3, |
| R32_UINT = 0xE4, |
| R32_FLOAT = 0xE5, |
| X8R8G8B8_UNORM = 0xE6, |
| X8R8G8B8_SRGB = 0xE7, |
| R5G6B5_UNORM = 0xE8, |
| A1R5G5B5_UNORM = 0xE9, |
| R8G8_UNORM = 0xEA, |
| R8G8_SNORM = 0xEB, |
| R8G8_SINT = 0xEC, |
| R8G8_UINT = 0xED, |
| R16_UNORM = 0xEE, |
| R16_SNORM = 0xEF, |
| R16_SINT = 0xF0, |
| R16_UINT = 0xF1, |
| R16_FLOAT = 0xF2, |
| R8_UNORM = 0xF3, |
| R8_SNORM = 0xF4, |
| R8_SINT = 0xF5, |
| R8_UINT = 0xF6, |
|
|
| |
| X1R5G5B5_UNORM = 0xF8, |
| X8B8G8R8_UNORM = 0xF9, |
| X8B8G8R8_SRGB = 0xFA, |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| }; |
|
|
| enum class DepthFormat : u32 { |
| Z32_FLOAT = 0xA, |
| Z16_UNORM = 0x13, |
| Z24_UNORM_S8_UINT = 0x14, |
| X8Z24_UNORM = 0x15, |
| S8Z24_UNORM = 0x16, |
| S8_UINT = 0x17, |
| V8Z24_UNORM = 0x18, |
| Z32_FLOAT_X24S8_UINT = 0x19, |
| |
| |
| |
| |
| |
| }; |
|
|
| namespace Engines { |
| class Maxwell3D; |
| class KeplerCompute; |
| } |
|
|
| namespace Control { |
| struct ChannelState; |
| } |
|
|
| namespace Host1x { |
| class Host1x; |
| } |
|
|
| class MemoryManager; |
|
|
| class GPU final { |
| public: |
| explicit GPU(Core::System& system, bool is_async, bool use_nvdec); |
| ~GPU(); |
|
|
| |
| void BindRenderer(std::unique_ptr<VideoCore::RendererBase> renderer); |
|
|
| |
| void FlushCommands(); |
| |
| void InvalidateGPUCache(); |
| |
| void OnCommandListEnd(); |
|
|
| std::shared_ptr<Control::ChannelState> AllocateChannel(); |
|
|
| void InitChannel(Control::ChannelState& to_init, u64 program_id); |
|
|
| void BindChannel(s32 channel_id); |
|
|
| void ReleaseChannel(Control::ChannelState& to_release); |
|
|
| void InitAddressSpace(Tegra::MemoryManager& memory_manager); |
|
|
| |
| [[nodiscard]] u64 RequestFlush(DAddr addr, std::size_t size); |
|
|
| |
| [[nodiscard]] u64 CurrentSyncRequestFence() const; |
|
|
| void WaitForSyncOperation(u64 fence); |
|
|
| |
| void TickWork(); |
|
|
| |
| [[nodiscard]] Host1x::Host1x& Host1x(); |
|
|
| |
| [[nodiscard]] const Host1x::Host1x& Host1x() const; |
|
|
| |
| [[nodiscard]] Engines::Maxwell3D& Maxwell3D(); |
|
|
| |
| [[nodiscard]] const Engines::Maxwell3D& Maxwell3D() const; |
|
|
| |
| [[nodiscard]] Engines::KeplerCompute& KeplerCompute(); |
|
|
| |
| [[nodiscard]] const Engines::KeplerCompute& KeplerCompute() const; |
|
|
| |
| [[nodiscard]] Tegra::DmaPusher& DmaPusher(); |
|
|
| |
| [[nodiscard]] const Tegra::DmaPusher& DmaPusher() const; |
|
|
| |
| [[nodiscard]] VideoCore::RendererBase& Renderer(); |
|
|
| |
| [[nodiscard]] const VideoCore::RendererBase& Renderer() const; |
|
|
| |
| [[nodiscard]] VideoCore::ShaderNotify& ShaderNotify(); |
|
|
| |
| [[nodiscard]] const VideoCore::ShaderNotify& ShaderNotify() const; |
|
|
| [[nodiscard]] u64 GetTicks() const; |
|
|
| [[nodiscard]] bool IsAsync() const; |
|
|
| [[nodiscard]] bool UseNvdec() const; |
|
|
| void RendererFrameEndNotify(); |
|
|
| void RequestComposite(std::vector<Tegra::FramebufferConfig>&& layers, |
| std::vector<Service::Nvidia::NvFence>&& fences); |
|
|
| std::vector<u8> GetAppletCaptureBuffer(); |
|
|
| |
| |
| |
| void Start(); |
|
|
| |
| void NotifyShutdown(); |
|
|
| |
| void ObtainContext(); |
|
|
| |
| void ReleaseContext(); |
|
|
| |
| void PushGPUEntries(s32 channel, Tegra::CommandList&& entries); |
|
|
| |
| void PushCommandBuffer(u32 id, Tegra::ChCommandHeaderList& entries); |
|
|
| |
| void ClearCdmaInstance(u32 id); |
|
|
| |
| void SwapBuffers(const Tegra::FramebufferConfig* framebuffer); |
|
|
| |
| [[nodiscard]] VideoCore::RasterizerDownloadArea OnCPURead(DAddr addr, u64 size); |
|
|
| |
| void FlushRegion(DAddr addr, u64 size); |
|
|
| |
| void InvalidateRegion(DAddr addr, u64 size); |
|
|
| |
| |
| bool OnCPUWrite(DAddr addr, u64 size); |
|
|
| |
| void FlushAndInvalidateRegion(DAddr addr, u64 size); |
|
|
| private: |
| struct Impl; |
| mutable std::unique_ptr<Impl> impl; |
| }; |
|
|
| } |
|
|