| | |
| | |
| |
|
| | #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; |
| | }; |
| |
|
| | } |
| |
|