summaryrefslogtreecommitdiff
path: root/src/video_core/engines
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-02-16 20:52:12 -0300
committerGravatar ameerj2021-07-22 21:51:22 -0400
commitc67d64365a712830fe140dd36e24e2efd9b8a812 (patch)
tree9287589f2b72d1cbd0cb113c2024b2bc531408c3 /src/video_core/engines
parentshader: Add XMAD multiplication folding optimization (diff)
downloadyuzu-c67d64365a712830fe140dd36e24e2efd9b8a812.tar.gz
yuzu-c67d64365a712830fe140dd36e24e2efd9b8a812.tar.xz
yuzu-c67d64365a712830fe140dd36e24e2efd9b8a812.zip
shader: Remove old shader management
Diffstat (limited to 'src/video_core/engines')
-rw-r--r--src/video_core/engines/const_buffer_engine_interface.h103
-rw-r--r--src/video_core/engines/kepler_compute.cpp44
-rw-r--r--src/video_core/engines/kepler_compute.h20
-rw-r--r--src/video_core/engines/maxwell_3d.cpp38
-rw-r--r--src/video_core/engines/maxwell_3d.h20
5 files changed, 3 insertions, 222 deletions
diff --git a/src/video_core/engines/const_buffer_engine_interface.h b/src/video_core/engines/const_buffer_engine_interface.h
deleted file mode 100644
index f46e81bb7..000000000
--- a/src/video_core/engines/const_buffer_engine_interface.h
+++ /dev/null
@@ -1,103 +0,0 @@
1// Copyright 2019 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <type_traits>
8#include "common/bit_field.h"
9#include "common/common_types.h"
10#include "video_core/engines/shader_bytecode.h"
11#include "video_core/engines/shader_type.h"
12#include "video_core/guest_driver.h"
13#include "video_core/textures/texture.h"
14
15namespace Tegra::Engines {
16
17struct SamplerDescriptor {
18 union {
19 u32 raw = 0;
20 BitField<0, 2, Tegra::Shader::TextureType> texture_type;
21 BitField<2, 3, Tegra::Texture::ComponentType> r_type;
22 BitField<5, 1, u32> is_array;
23 BitField<6, 1, u32> is_buffer;
24 BitField<7, 1, u32> is_shadow;
25 BitField<8, 3, Tegra::Texture::ComponentType> g_type;
26 BitField<11, 3, Tegra::Texture::ComponentType> b_type;
27 BitField<14, 3, Tegra::Texture::ComponentType> a_type;
28 BitField<17, 7, Tegra::Texture::TextureFormat> format;
29 };
30
31 bool operator==(const SamplerDescriptor& rhs) const noexcept {
32 return raw == rhs.raw;
33 }
34
35 bool operator!=(const SamplerDescriptor& rhs) const noexcept {
36 return !operator==(rhs);
37 }
38
39 static SamplerDescriptor FromTIC(const Tegra::Texture::TICEntry& tic) {
40 using Tegra::Shader::TextureType;
41 SamplerDescriptor result;
42
43 result.format.Assign(tic.format.Value());
44 result.r_type.Assign(tic.r_type.Value());
45 result.g_type.Assign(tic.g_type.Value());
46 result.b_type.Assign(tic.b_type.Value());
47 result.a_type.Assign(tic.a_type.Value());
48
49 switch (tic.texture_type.Value()) {
50 case Tegra::Texture::TextureType::Texture1D:
51 result.texture_type.Assign(TextureType::Texture1D);
52 return result;
53 case Tegra::Texture::TextureType::Texture2D:
54 result.texture_type.Assign(TextureType::Texture2D);
55 return result;
56 case Tegra::Texture::TextureType::Texture3D:
57 result.texture_type.Assign(TextureType::Texture3D);
58 return result;
59 case Tegra::Texture::TextureType::TextureCubemap:
60 result.texture_type.Assign(TextureType::TextureCube);
61 return result;
62 case Tegra::Texture::TextureType::Texture1DArray:
63 result.texture_type.Assign(TextureType::Texture1D);
64 result.is_array.Assign(1);
65 return result;
66 case Tegra::Texture::TextureType::Texture2DArray:
67 result.texture_type.Assign(TextureType::Texture2D);
68 result.is_array.Assign(1);
69 return result;
70 case Tegra::Texture::TextureType::Texture1DBuffer:
71 result.texture_type.Assign(TextureType::Texture1D);
72 result.is_buffer.Assign(1);
73 return result;
74 case Tegra::Texture::TextureType::Texture2DNoMipmap:
75 result.texture_type.Assign(TextureType::Texture2D);
76 return result;
77 case Tegra::Texture::TextureType::TextureCubeArray:
78 result.texture_type.Assign(TextureType::TextureCube);
79 result.is_array.Assign(1);
80 return result;
81 default:
82 result.texture_type.Assign(TextureType::Texture2D);
83 return result;
84 }
85 }
86};
87static_assert(std::is_trivially_copyable_v<SamplerDescriptor>);
88
89class ConstBufferEngineInterface {
90public:
91 virtual ~ConstBufferEngineInterface() = default;
92 virtual u32 AccessConstBuffer32(ShaderType stage, u64 const_buffer, u64 offset) const = 0;
93 virtual SamplerDescriptor AccessBoundSampler(ShaderType stage, u64 offset) const = 0;
94 virtual SamplerDescriptor AccessBindlessSampler(ShaderType stage, u64 const_buffer,
95 u64 offset) const = 0;
96 virtual SamplerDescriptor AccessSampler(u32 handle) const = 0;
97 virtual u32 GetBoundBuffer() const = 0;
98
99 virtual VideoCore::GuestDriverProfile& AccessGuestDriverProfile() = 0;
100 virtual const VideoCore::GuestDriverProfile& AccessGuestDriverProfile() const = 0;
101};
102
103} // namespace Tegra::Engines
diff --git a/src/video_core/engines/kepler_compute.cpp b/src/video_core/engines/kepler_compute.cpp
index a9b75091e..cae93c470 100644
--- a/src/video_core/engines/kepler_compute.cpp
+++ b/src/video_core/engines/kepler_compute.cpp
@@ -57,53 +57,11 @@ void KeplerCompute::CallMultiMethod(u32 method, const u32* base_start, u32 amoun
57 } 57 }
58} 58}
59 59
60u32 KeplerCompute::AccessConstBuffer32(ShaderType stage, u64 const_buffer, u64 offset) const {
61 ASSERT(stage == ShaderType::Compute);
62 const auto& buffer = launch_description.const_buffer_config[const_buffer];
63 u32 result;
64 std::memcpy(&result, memory_manager.GetPointer(buffer.Address() + offset), sizeof(u32));
65 return result;
66}
67
68SamplerDescriptor KeplerCompute::AccessBoundSampler(ShaderType stage, u64 offset) const {
69 return AccessBindlessSampler(stage, regs.tex_cb_index, offset * sizeof(Texture::TextureHandle));
70}
71
72SamplerDescriptor KeplerCompute::AccessBindlessSampler(ShaderType stage, u64 const_buffer,
73 u64 offset) const {
74 ASSERT(stage == ShaderType::Compute);
75 const auto& tex_info_buffer = launch_description.const_buffer_config[const_buffer];
76 const GPUVAddr tex_info_address = tex_info_buffer.Address() + offset;
77 return AccessSampler(memory_manager.Read<u32>(tex_info_address));
78}
79
80SamplerDescriptor KeplerCompute::AccessSampler(u32 handle) const {
81 const Texture::TextureHandle tex_handle{handle};
82 const Texture::TICEntry tic = GetTICEntry(tex_handle.tic_id);
83 const Texture::TSCEntry tsc = GetTSCEntry(tex_handle.tsc_id);
84
85 SamplerDescriptor result = SamplerDescriptor::FromTIC(tic);
86 result.is_shadow.Assign(tsc.depth_compare_enabled.Value());
87 return result;
88}
89
90VideoCore::GuestDriverProfile& KeplerCompute::AccessGuestDriverProfile() {
91 return rasterizer->AccessGuestDriverProfile();
92}
93
94const VideoCore::GuestDriverProfile& KeplerCompute::AccessGuestDriverProfile() const {
95 return rasterizer->AccessGuestDriverProfile();
96}
97
98void KeplerCompute::ProcessLaunch() { 60void KeplerCompute::ProcessLaunch() {
99 const GPUVAddr launch_desc_loc = regs.launch_desc_loc.Address(); 61 const GPUVAddr launch_desc_loc = regs.launch_desc_loc.Address();
100 memory_manager.ReadBlockUnsafe(launch_desc_loc, &launch_description, 62 memory_manager.ReadBlockUnsafe(launch_desc_loc, &launch_description,
101 LaunchParams::NUM_LAUNCH_PARAMETERS * sizeof(u32)); 63 LaunchParams::NUM_LAUNCH_PARAMETERS * sizeof(u32));
102 64 rasterizer->DispatchCompute();
103 const GPUVAddr code_addr = regs.code_loc.Address() + launch_description.program_start;
104 LOG_TRACE(HW_GPU, "Compute invocation launched at address 0x{:016x}", code_addr);
105
106 rasterizer->DispatchCompute(code_addr);
107} 65}
108 66
109Texture::TICEntry KeplerCompute::GetTICEntry(u32 tic_index) const { 67Texture::TICEntry KeplerCompute::GetTICEntry(u32 tic_index) const {
diff --git a/src/video_core/engines/kepler_compute.h b/src/video_core/engines/kepler_compute.h
index 7c40cba38..0d7683c2d 100644
--- a/src/video_core/engines/kepler_compute.h
+++ b/src/video_core/engines/kepler_compute.h
@@ -10,7 +10,6 @@
10#include "common/bit_field.h" 10#include "common/bit_field.h"
11#include "common/common_funcs.h" 11#include "common/common_funcs.h"
12#include "common/common_types.h" 12#include "common/common_types.h"
13#include "video_core/engines/const_buffer_engine_interface.h"
14#include "video_core/engines/engine_interface.h" 13#include "video_core/engines/engine_interface.h"
15#include "video_core/engines/engine_upload.h" 14#include "video_core/engines/engine_upload.h"
16#include "video_core/engines/shader_type.h" 15#include "video_core/engines/shader_type.h"
@@ -40,7 +39,7 @@ namespace Tegra::Engines {
40#define KEPLER_COMPUTE_REG_INDEX(field_name) \ 39#define KEPLER_COMPUTE_REG_INDEX(field_name) \
41 (offsetof(Tegra::Engines::KeplerCompute::Regs, field_name) / sizeof(u32)) 40 (offsetof(Tegra::Engines::KeplerCompute::Regs, field_name) / sizeof(u32))
42 41
43class KeplerCompute final : public ConstBufferEngineInterface, public EngineInterface { 42class KeplerCompute final : public EngineInterface {
44public: 43public:
45 explicit KeplerCompute(Core::System& system, MemoryManager& memory_manager); 44 explicit KeplerCompute(Core::System& system, MemoryManager& memory_manager);
46 ~KeplerCompute(); 45 ~KeplerCompute();
@@ -209,23 +208,6 @@ public:
209 void CallMultiMethod(u32 method, const u32* base_start, u32 amount, 208 void CallMultiMethod(u32 method, const u32* base_start, u32 amount,
210 u32 methods_pending) override; 209 u32 methods_pending) override;
211 210
212 u32 AccessConstBuffer32(ShaderType stage, u64 const_buffer, u64 offset) const override;
213
214 SamplerDescriptor AccessBoundSampler(ShaderType stage, u64 offset) const override;
215
216 SamplerDescriptor AccessBindlessSampler(ShaderType stage, u64 const_buffer,
217 u64 offset) const override;
218
219 SamplerDescriptor AccessSampler(u32 handle) const override;
220
221 u32 GetBoundBuffer() const override {
222 return regs.tex_cb_index;
223 }
224
225 VideoCore::GuestDriverProfile& AccessGuestDriverProfile() override;
226
227 const VideoCore::GuestDriverProfile& AccessGuestDriverProfile() const override;
228
229private: 211private:
230 void ProcessLaunch(); 212 void ProcessLaunch();
231 213
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp
index aab6b8f7a..103a51fd0 100644
--- a/src/video_core/engines/maxwell_3d.cpp
+++ b/src/video_core/engines/maxwell_3d.cpp
@@ -670,42 +670,4 @@ void Maxwell3D::ProcessClearBuffers() {
670 rasterizer->Clear(); 670 rasterizer->Clear();
671} 671}
672 672
673u32 Maxwell3D::AccessConstBuffer32(ShaderType stage, u64 const_buffer, u64 offset) const {
674 ASSERT(stage != ShaderType::Compute);
675 const auto& shader_stage = state.shader_stages[static_cast<std::size_t>(stage)];
676 const auto& buffer = shader_stage.const_buffers[const_buffer];
677 return memory_manager.Read<u32>(buffer.address + offset);
678}
679
680SamplerDescriptor Maxwell3D::AccessBoundSampler(ShaderType stage, u64 offset) const {
681 return AccessBindlessSampler(stage, regs.tex_cb_index, offset * sizeof(Texture::TextureHandle));
682}
683
684SamplerDescriptor Maxwell3D::AccessBindlessSampler(ShaderType stage, u64 const_buffer,
685 u64 offset) const {
686 ASSERT(stage != ShaderType::Compute);
687 const auto& shader = state.shader_stages[static_cast<std::size_t>(stage)];
688 const auto& tex_info_buffer = shader.const_buffers[const_buffer];
689 const GPUVAddr tex_info_address = tex_info_buffer.address + offset;
690 return AccessSampler(memory_manager.Read<u32>(tex_info_address));
691}
692
693SamplerDescriptor Maxwell3D::AccessSampler(u32 handle) const {
694 const Texture::TextureHandle tex_handle{handle};
695 const Texture::TICEntry tic = GetTICEntry(tex_handle.tic_id);
696 const Texture::TSCEntry tsc = GetTSCEntry(tex_handle.tsc_id);
697
698 SamplerDescriptor result = SamplerDescriptor::FromTIC(tic);
699 result.is_shadow.Assign(tsc.depth_compare_enabled.Value());
700 return result;
701}
702
703VideoCore::GuestDriverProfile& Maxwell3D::AccessGuestDriverProfile() {
704 return rasterizer->AccessGuestDriverProfile();
705}
706
707const VideoCore::GuestDriverProfile& Maxwell3D::AccessGuestDriverProfile() const {
708 return rasterizer->AccessGuestDriverProfile();
709}
710
711} // namespace Tegra::Engines 673} // namespace Tegra::Engines
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h
index 335383955..cbf94412b 100644
--- a/src/video_core/engines/maxwell_3d.h
+++ b/src/video_core/engines/maxwell_3d.h
@@ -17,7 +17,6 @@
17#include "common/common_funcs.h" 17#include "common/common_funcs.h"
18#include "common/common_types.h" 18#include "common/common_types.h"
19#include "common/math_util.h" 19#include "common/math_util.h"
20#include "video_core/engines/const_buffer_engine_interface.h"
21#include "video_core/engines/const_buffer_info.h" 20#include "video_core/engines/const_buffer_info.h"
22#include "video_core/engines/engine_interface.h" 21#include "video_core/engines/engine_interface.h"
23#include "video_core/engines/engine_upload.h" 22#include "video_core/engines/engine_upload.h"
@@ -49,7 +48,7 @@ namespace Tegra::Engines {
49#define MAXWELL3D_REG_INDEX(field_name) \ 48#define MAXWELL3D_REG_INDEX(field_name) \
50 (offsetof(Tegra::Engines::Maxwell3D::Regs, field_name) / sizeof(u32)) 49 (offsetof(Tegra::Engines::Maxwell3D::Regs, field_name) / sizeof(u32))
51 50
52class Maxwell3D final : public ConstBufferEngineInterface, public EngineInterface { 51class Maxwell3D final : public EngineInterface {
53public: 52public:
54 explicit Maxwell3D(Core::System& system, MemoryManager& memory_manager); 53 explicit Maxwell3D(Core::System& system, MemoryManager& memory_manager);
55 ~Maxwell3D(); 54 ~Maxwell3D();
@@ -1424,23 +1423,6 @@ public:
1424 1423
1425 void FlushMMEInlineDraw(); 1424 void FlushMMEInlineDraw();
1426 1425
1427 u32 AccessConstBuffer32(ShaderType stage, u64 const_buffer, u64 offset) const override;
1428
1429 SamplerDescriptor AccessBoundSampler(ShaderType stage, u64 offset) const override;
1430
1431 SamplerDescriptor AccessBindlessSampler(ShaderType stage, u64 const_buffer,
1432 u64 offset) const override;
1433
1434 SamplerDescriptor AccessSampler(u32 handle) const override;
1435
1436 u32 GetBoundBuffer() const override {
1437 return regs.tex_cb_index;
1438 }
1439
1440 VideoCore::GuestDriverProfile& AccessGuestDriverProfile() override;
1441
1442 const VideoCore::GuestDriverProfile& AccessGuestDriverProfile() const override;
1443
1444 bool ShouldExecute() const { 1426 bool ShouldExecute() const {
1445 return execute_on; 1427 return execute_on;
1446 } 1428 }