diff options
| author | 2022-11-27 20:37:37 -0500 | |
|---|---|---|
| committer | 2022-11-28 19:49:09 -0500 | |
| commit | 89dd7dc1802cc53e828cb71c1f3e2bc0879459ce (patch) | |
| tree | 718f8fec3534b4fdb77405e347f86bcf37980363 /src/video_core | |
| parent | Merge pull request #8829 from Docteh/qt6_0002 (diff) | |
| download | yuzu-89dd7dc1802cc53e828cb71c1f3e2bc0879459ce.tar.gz yuzu-89dd7dc1802cc53e828cb71c1f3e2bc0879459ce.tar.xz yuzu-89dd7dc1802cc53e828cb71c1f3e2bc0879459ce.zip | |
video_core: add null backend
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_null/null_rasterizer.cpp | 90 | ||||
| -rw-r--r-- | src/video_core/renderer_null/null_rasterizer.h | 78 | ||||
| -rw-r--r-- | src/video_core/renderer_null/renderer_null.cpp | 24 | ||||
| -rw-r--r-- | src/video_core/renderer_null/renderer_null.h | 36 | ||||
| -rw-r--r-- | src/video_core/video_core.cpp | 4 |
6 files changed, 236 insertions, 0 deletions
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index b03a30992..0d6bf1f0d 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt | |||
| @@ -91,6 +91,10 @@ add_library(video_core STATIC | |||
| 91 | rasterizer_interface.h | 91 | rasterizer_interface.h |
| 92 | renderer_base.cpp | 92 | renderer_base.cpp |
| 93 | renderer_base.h | 93 | renderer_base.h |
| 94 | renderer_null/null_rasterizer.cpp | ||
| 95 | renderer_null/null_rasterizer.h | ||
| 96 | renderer_null/renderer_null.cpp | ||
| 97 | renderer_null/renderer_null.h | ||
| 94 | renderer_opengl/gl_buffer_cache.cpp | 98 | renderer_opengl/gl_buffer_cache.cpp |
| 95 | renderer_opengl/gl_buffer_cache.h | 99 | renderer_opengl/gl_buffer_cache.h |
| 96 | renderer_opengl/gl_compute_pipeline.cpp | 100 | renderer_opengl/gl_compute_pipeline.cpp |
diff --git a/src/video_core/renderer_null/null_rasterizer.cpp b/src/video_core/renderer_null/null_rasterizer.cpp new file mode 100644 index 000000000..9734d84bc --- /dev/null +++ b/src/video_core/renderer_null/null_rasterizer.cpp | |||
| @@ -0,0 +1,90 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include "video_core/host1x/host1x.h" | ||
| 5 | #include "video_core/memory_manager.h" | ||
| 6 | #include "video_core/renderer_null/null_rasterizer.h" | ||
| 7 | |||
| 8 | namespace Null { | ||
| 9 | |||
| 10 | AccelerateDMA::AccelerateDMA() = default; | ||
| 11 | |||
| 12 | bool AccelerateDMA::BufferCopy(GPUVAddr start_address, GPUVAddr end_address, u64 amount) { | ||
| 13 | return true; | ||
| 14 | } | ||
| 15 | bool AccelerateDMA::BufferClear(GPUVAddr src_address, u64 amount, u32 value) { | ||
| 16 | return true; | ||
| 17 | } | ||
| 18 | |||
| 19 | RasterizerNull::RasterizerNull(Core::Memory::Memory& cpu_memory_, Tegra::GPU& gpu) | ||
| 20 | : RasterizerAccelerated(cpu_memory_), m_gpu{gpu} {} | ||
| 21 | RasterizerNull::~RasterizerNull() = default; | ||
| 22 | |||
| 23 | void RasterizerNull::Draw(bool is_indexed, u32 instance_count) {} | ||
| 24 | void RasterizerNull::Clear(u32 layer_count) {} | ||
| 25 | void RasterizerNull::DispatchCompute() {} | ||
| 26 | void RasterizerNull::ResetCounter(VideoCore::QueryType type) {} | ||
| 27 | void RasterizerNull::Query(GPUVAddr gpu_addr, VideoCore::QueryType type, | ||
| 28 | std::optional<u64> timestamp) { | ||
| 29 | if (!gpu_memory) { | ||
| 30 | return; | ||
| 31 | } | ||
| 32 | |||
| 33 | gpu_memory->Write(gpu_addr, u64{0}); | ||
| 34 | if (timestamp) { | ||
| 35 | gpu_memory->Write(gpu_addr + 8, *timestamp); | ||
| 36 | } | ||
| 37 | } | ||
| 38 | void RasterizerNull::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, | ||
| 39 | u32 size) {} | ||
| 40 | void RasterizerNull::DisableGraphicsUniformBuffer(size_t stage, u32 index) {} | ||
| 41 | void RasterizerNull::FlushAll() {} | ||
| 42 | void RasterizerNull::FlushRegion(VAddr addr, u64 size) {} | ||
| 43 | bool RasterizerNull::MustFlushRegion(VAddr addr, u64 size) { | ||
| 44 | return false; | ||
| 45 | } | ||
| 46 | void RasterizerNull::InvalidateRegion(VAddr addr, u64 size) {} | ||
| 47 | void RasterizerNull::OnCPUWrite(VAddr addr, u64 size) {} | ||
| 48 | void RasterizerNull::InvalidateGPUCache() {} | ||
| 49 | void RasterizerNull::UnmapMemory(VAddr addr, u64 size) {} | ||
| 50 | void RasterizerNull::ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) {} | ||
| 51 | void RasterizerNull::SignalFence(std::function<void()>&& func) { | ||
| 52 | func(); | ||
| 53 | } | ||
| 54 | void RasterizerNull::SyncOperation(std::function<void()>&& func) { | ||
| 55 | func(); | ||
| 56 | } | ||
| 57 | void RasterizerNull::SignalSyncPoint(u32 value) { | ||
| 58 | auto& syncpoint_manager = m_gpu.Host1x().GetSyncpointManager(); | ||
| 59 | syncpoint_manager.IncrementGuest(value); | ||
| 60 | syncpoint_manager.IncrementHost(value); | ||
| 61 | } | ||
| 62 | void RasterizerNull::SignalReference() {} | ||
| 63 | void RasterizerNull::ReleaseFences() {} | ||
| 64 | void RasterizerNull::FlushAndInvalidateRegion(VAddr addr, u64 size) {} | ||
| 65 | void RasterizerNull::WaitForIdle() {} | ||
| 66 | void RasterizerNull::FragmentBarrier() {} | ||
| 67 | void RasterizerNull::TiledCacheBarrier() {} | ||
| 68 | void RasterizerNull::FlushCommands() {} | ||
| 69 | void RasterizerNull::TickFrame() {} | ||
| 70 | Tegra::Engines::AccelerateDMAInterface& RasterizerNull::AccessAccelerateDMA() { | ||
| 71 | return m_accelerate_dma; | ||
| 72 | } | ||
| 73 | bool RasterizerNull::AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, | ||
| 74 | const Tegra::Engines::Fermi2D::Surface& dst, | ||
| 75 | const Tegra::Engines::Fermi2D::Config& copy_config) { | ||
| 76 | return true; | ||
| 77 | } | ||
| 78 | void RasterizerNull::AccelerateInlineToMemory(GPUVAddr address, size_t copy_size, | ||
| 79 | std::span<const u8> memory) {} | ||
| 80 | bool RasterizerNull::AccelerateDisplay(const Tegra::FramebufferConfig& config, | ||
| 81 | VAddr framebuffer_addr, u32 pixel_stride) { | ||
| 82 | return true; | ||
| 83 | } | ||
| 84 | void RasterizerNull::LoadDiskResources(u64 title_id, std::stop_token stop_loading, | ||
| 85 | const VideoCore::DiskResourceLoadCallback& callback) {} | ||
| 86 | void RasterizerNull::InitializeChannel(Tegra::Control::ChannelState& channel) {} | ||
| 87 | void RasterizerNull::BindChannel(Tegra::Control::ChannelState& channel) {} | ||
| 88 | void RasterizerNull::ReleaseChannel(s32 channel_id) {} | ||
| 89 | |||
| 90 | } // namespace Null | ||
diff --git a/src/video_core/renderer_null/null_rasterizer.h b/src/video_core/renderer_null/null_rasterizer.h new file mode 100644 index 000000000..ecf77ba42 --- /dev/null +++ b/src/video_core/renderer_null/null_rasterizer.h | |||
| @@ -0,0 +1,78 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #pragma once | ||
| 5 | |||
| 6 | #include "common/common_types.h" | ||
| 7 | #include "video_core/control/channel_state_cache.h" | ||
| 8 | #include "video_core/engines/maxwell_dma.h" | ||
| 9 | #include "video_core/rasterizer_accelerated.h" | ||
| 10 | #include "video_core/rasterizer_interface.h" | ||
| 11 | |||
| 12 | namespace Core { | ||
| 13 | class System; | ||
| 14 | } | ||
| 15 | |||
| 16 | namespace Null { | ||
| 17 | |||
| 18 | class RasterizerNull; | ||
| 19 | |||
| 20 | class AccelerateDMA : public Tegra::Engines::AccelerateDMAInterface { | ||
| 21 | public: | ||
| 22 | explicit AccelerateDMA(); | ||
| 23 | bool BufferCopy(GPUVAddr start_address, GPUVAddr end_address, u64 amount) override; | ||
| 24 | bool BufferClear(GPUVAddr src_address, u64 amount, u32 value) override; | ||
| 25 | }; | ||
| 26 | |||
| 27 | class RasterizerNull final : public VideoCore::RasterizerAccelerated, | ||
| 28 | protected VideoCommon::ChannelSetupCaches<VideoCommon::ChannelInfo> { | ||
| 29 | public: | ||
| 30 | explicit RasterizerNull(Core::Memory::Memory& cpu_memory, Tegra::GPU& gpu); | ||
| 31 | ~RasterizerNull() override; | ||
| 32 | |||
| 33 | void Draw(bool is_indexed, u32 instance_count) override; | ||
| 34 | void Clear(u32 layer_count) override; | ||
| 35 | void DispatchCompute() override; | ||
| 36 | void ResetCounter(VideoCore::QueryType type) override; | ||
| 37 | void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) override; | ||
| 38 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override; | ||
| 39 | void DisableGraphicsUniformBuffer(size_t stage, u32 index) override; | ||
| 40 | void FlushAll() override; | ||
| 41 | void FlushRegion(VAddr addr, u64 size) override; | ||
| 42 | bool MustFlushRegion(VAddr addr, u64 size) override; | ||
| 43 | void InvalidateRegion(VAddr addr, u64 size) override; | ||
| 44 | void OnCPUWrite(VAddr addr, u64 size) override; | ||
| 45 | void InvalidateGPUCache() override; | ||
| 46 | void UnmapMemory(VAddr addr, u64 size) override; | ||
| 47 | void ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) override; | ||
| 48 | void SignalFence(std::function<void()>&& func) override; | ||
| 49 | void SyncOperation(std::function<void()>&& func) override; | ||
| 50 | void SignalSyncPoint(u32 value) override; | ||
| 51 | void SignalReference() override; | ||
| 52 | void ReleaseFences() override; | ||
| 53 | void FlushAndInvalidateRegion(VAddr addr, u64 size) override; | ||
| 54 | void WaitForIdle() override; | ||
| 55 | void FragmentBarrier() override; | ||
| 56 | void TiledCacheBarrier() override; | ||
| 57 | void FlushCommands() override; | ||
| 58 | void TickFrame() override; | ||
| 59 | bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src, | ||
| 60 | const Tegra::Engines::Fermi2D::Surface& dst, | ||
| 61 | const Tegra::Engines::Fermi2D::Config& copy_config) override; | ||
| 62 | Tegra::Engines::AccelerateDMAInterface& AccessAccelerateDMA() override; | ||
| 63 | void AccelerateInlineToMemory(GPUVAddr address, size_t copy_size, | ||
| 64 | std::span<const u8> memory) override; | ||
| 65 | bool AccelerateDisplay(const Tegra::FramebufferConfig& config, VAddr framebuffer_addr, | ||
| 66 | u32 pixel_stride) override; | ||
| 67 | void LoadDiskResources(u64 title_id, std::stop_token stop_loading, | ||
| 68 | const VideoCore::DiskResourceLoadCallback& callback) override; | ||
| 69 | void InitializeChannel(Tegra::Control::ChannelState& channel) override; | ||
| 70 | void BindChannel(Tegra::Control::ChannelState& channel) override; | ||
| 71 | void ReleaseChannel(s32 channel_id) override; | ||
| 72 | |||
| 73 | private: | ||
| 74 | Tegra::GPU& m_gpu; | ||
| 75 | AccelerateDMA m_accelerate_dma; | ||
| 76 | }; | ||
| 77 | |||
| 78 | } // namespace Null | ||
diff --git a/src/video_core/renderer_null/renderer_null.cpp b/src/video_core/renderer_null/renderer_null.cpp new file mode 100644 index 000000000..e2a189b63 --- /dev/null +++ b/src/video_core/renderer_null/renderer_null.cpp | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include "video_core/renderer_null/renderer_null.h" | ||
| 5 | |||
| 6 | namespace Null { | ||
| 7 | |||
| 8 | RendererNull::RendererNull(Core::Frontend::EmuWindow& emu_window, Core::Memory::Memory& cpu_memory, | ||
| 9 | Tegra::GPU& gpu, | ||
| 10 | std::unique_ptr<Core::Frontend::GraphicsContext> context_) | ||
| 11 | : RendererBase(emu_window, std::move(context_)), m_gpu(gpu), m_rasterizer(cpu_memory, gpu) {} | ||
| 12 | |||
| 13 | RendererNull::~RendererNull() = default; | ||
| 14 | |||
| 15 | void RendererNull::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) { | ||
| 16 | if (!framebuffer) { | ||
| 17 | return; | ||
| 18 | } | ||
| 19 | |||
| 20 | m_gpu.RendererFrameEndNotify(); | ||
| 21 | render_window.OnFrameDisplayed(); | ||
| 22 | } | ||
| 23 | |||
| 24 | } // namespace Null | ||
diff --git a/src/video_core/renderer_null/renderer_null.h b/src/video_core/renderer_null/renderer_null.h new file mode 100644 index 000000000..967ff5645 --- /dev/null +++ b/src/video_core/renderer_null/renderer_null.h | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #pragma once | ||
| 5 | |||
| 6 | #include <memory> | ||
| 7 | #include <string> | ||
| 8 | |||
| 9 | #include "video_core/renderer_base.h" | ||
| 10 | #include "video_core/renderer_null/null_rasterizer.h" | ||
| 11 | |||
| 12 | namespace Null { | ||
| 13 | |||
| 14 | class RendererNull final : public VideoCore::RendererBase { | ||
| 15 | public: | ||
| 16 | explicit RendererNull(Core::Frontend::EmuWindow& emu_window, Core::Memory::Memory& cpu_memory, | ||
| 17 | Tegra::GPU& gpu, | ||
| 18 | std::unique_ptr<Core::Frontend::GraphicsContext> context); | ||
| 19 | ~RendererNull() override; | ||
| 20 | |||
| 21 | void SwapBuffers(const Tegra::FramebufferConfig* framebuffer) override; | ||
| 22 | |||
| 23 | VideoCore::RasterizerInterface* ReadRasterizer() override { | ||
| 24 | return &m_rasterizer; | ||
| 25 | } | ||
| 26 | |||
| 27 | [[nodiscard]] std::string GetDeviceVendor() const override { | ||
| 28 | return "NULL"; | ||
| 29 | } | ||
| 30 | |||
| 31 | private: | ||
| 32 | Tegra::GPU& m_gpu; | ||
| 33 | RasterizerNull m_rasterizer; | ||
| 34 | }; | ||
| 35 | |||
| 36 | } // namespace Null | ||
diff --git a/src/video_core/video_core.cpp b/src/video_core/video_core.cpp index 04ac4af11..fedb4a7bb 100644 --- a/src/video_core/video_core.cpp +++ b/src/video_core/video_core.cpp | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include "common/settings.h" | 7 | #include "common/settings.h" |
| 8 | #include "core/core.h" | 8 | #include "core/core.h" |
| 9 | #include "video_core/renderer_base.h" | 9 | #include "video_core/renderer_base.h" |
| 10 | #include "video_core/renderer_null/renderer_null.h" | ||
| 10 | #include "video_core/renderer_opengl/renderer_opengl.h" | 11 | #include "video_core/renderer_opengl/renderer_opengl.h" |
| 11 | #include "video_core/renderer_vulkan/renderer_vulkan.h" | 12 | #include "video_core/renderer_vulkan/renderer_vulkan.h" |
| 12 | #include "video_core/video_core.h" | 13 | #include "video_core/video_core.h" |
| @@ -26,6 +27,9 @@ std::unique_ptr<VideoCore::RendererBase> CreateRenderer( | |||
| 26 | case Settings::RendererBackend::Vulkan: | 27 | case Settings::RendererBackend::Vulkan: |
| 27 | return std::make_unique<Vulkan::RendererVulkan>(telemetry_session, emu_window, cpu_memory, | 28 | return std::make_unique<Vulkan::RendererVulkan>(telemetry_session, emu_window, cpu_memory, |
| 28 | gpu, std::move(context)); | 29 | gpu, std::move(context)); |
| 30 | case Settings::RendererBackend::Null: | ||
| 31 | return std::make_unique<Null::RendererNull>(emu_window, cpu_memory, gpu, | ||
| 32 | std::move(context)); | ||
| 29 | default: | 33 | default: |
| 30 | return nullptr; | 34 | return nullptr; |
| 31 | } | 35 | } |