summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar Liam2022-11-27 20:37:37 -0500
committerGravatar Liam2022-11-28 19:49:09 -0500
commit89dd7dc1802cc53e828cb71c1f3e2bc0879459ce (patch)
tree718f8fec3534b4fdb77405e347f86bcf37980363 /src/video_core
parentMerge pull request #8829 from Docteh/qt6_0002 (diff)
downloadyuzu-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.txt4
-rw-r--r--src/video_core/renderer_null/null_rasterizer.cpp90
-rw-r--r--src/video_core/renderer_null/null_rasterizer.h78
-rw-r--r--src/video_core/renderer_null/renderer_null.cpp24
-rw-r--r--src/video_core/renderer_null/renderer_null.h36
-rw-r--r--src/video_core/video_core.cpp4
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
8namespace Null {
9
10AccelerateDMA::AccelerateDMA() = default;
11
12bool AccelerateDMA::BufferCopy(GPUVAddr start_address, GPUVAddr end_address, u64 amount) {
13 return true;
14}
15bool AccelerateDMA::BufferClear(GPUVAddr src_address, u64 amount, u32 value) {
16 return true;
17}
18
19RasterizerNull::RasterizerNull(Core::Memory::Memory& cpu_memory_, Tegra::GPU& gpu)
20 : RasterizerAccelerated(cpu_memory_), m_gpu{gpu} {}
21RasterizerNull::~RasterizerNull() = default;
22
23void RasterizerNull::Draw(bool is_indexed, u32 instance_count) {}
24void RasterizerNull::Clear(u32 layer_count) {}
25void RasterizerNull::DispatchCompute() {}
26void RasterizerNull::ResetCounter(VideoCore::QueryType type) {}
27void 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}
38void RasterizerNull::BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr,
39 u32 size) {}
40void RasterizerNull::DisableGraphicsUniformBuffer(size_t stage, u32 index) {}
41void RasterizerNull::FlushAll() {}
42void RasterizerNull::FlushRegion(VAddr addr, u64 size) {}
43bool RasterizerNull::MustFlushRegion(VAddr addr, u64 size) {
44 return false;
45}
46void RasterizerNull::InvalidateRegion(VAddr addr, u64 size) {}
47void RasterizerNull::OnCPUWrite(VAddr addr, u64 size) {}
48void RasterizerNull::InvalidateGPUCache() {}
49void RasterizerNull::UnmapMemory(VAddr addr, u64 size) {}
50void RasterizerNull::ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) {}
51void RasterizerNull::SignalFence(std::function<void()>&& func) {
52 func();
53}
54void RasterizerNull::SyncOperation(std::function<void()>&& func) {
55 func();
56}
57void RasterizerNull::SignalSyncPoint(u32 value) {
58 auto& syncpoint_manager = m_gpu.Host1x().GetSyncpointManager();
59 syncpoint_manager.IncrementGuest(value);
60 syncpoint_manager.IncrementHost(value);
61}
62void RasterizerNull::SignalReference() {}
63void RasterizerNull::ReleaseFences() {}
64void RasterizerNull::FlushAndInvalidateRegion(VAddr addr, u64 size) {}
65void RasterizerNull::WaitForIdle() {}
66void RasterizerNull::FragmentBarrier() {}
67void RasterizerNull::TiledCacheBarrier() {}
68void RasterizerNull::FlushCommands() {}
69void RasterizerNull::TickFrame() {}
70Tegra::Engines::AccelerateDMAInterface& RasterizerNull::AccessAccelerateDMA() {
71 return m_accelerate_dma;
72}
73bool 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}
78void RasterizerNull::AccelerateInlineToMemory(GPUVAddr address, size_t copy_size,
79 std::span<const u8> memory) {}
80bool RasterizerNull::AccelerateDisplay(const Tegra::FramebufferConfig& config,
81 VAddr framebuffer_addr, u32 pixel_stride) {
82 return true;
83}
84void RasterizerNull::LoadDiskResources(u64 title_id, std::stop_token stop_loading,
85 const VideoCore::DiskResourceLoadCallback& callback) {}
86void RasterizerNull::InitializeChannel(Tegra::Control::ChannelState& channel) {}
87void RasterizerNull::BindChannel(Tegra::Control::ChannelState& channel) {}
88void 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
12namespace Core {
13class System;
14}
15
16namespace Null {
17
18class RasterizerNull;
19
20class AccelerateDMA : public Tegra::Engines::AccelerateDMAInterface {
21public:
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
27class RasterizerNull final : public VideoCore::RasterizerAccelerated,
28 protected VideoCommon::ChannelSetupCaches<VideoCommon::ChannelInfo> {
29public:
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
73private:
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
6namespace Null {
7
8RendererNull::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
13RendererNull::~RendererNull() = default;
14
15void 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
12namespace Null {
13
14class RendererNull final : public VideoCore::RendererBase {
15public:
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
31private:
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 }