diff options
| author | 2021-02-16 20:52:12 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:22 -0400 | |
| commit | c67d64365a712830fe140dd36e24e2efd9b8a812 (patch) | |
| tree | 9287589f2b72d1cbd0cb113c2024b2bc531408c3 /src/video_core/engines | |
| parent | shader: Add XMAD multiplication folding optimization (diff) | |
| download | yuzu-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.h | 103 | ||||
| -rw-r--r-- | src/video_core/engines/kepler_compute.cpp | 44 | ||||
| -rw-r--r-- | src/video_core/engines/kepler_compute.h | 20 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 38 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 20 |
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 | |||
| 15 | namespace Tegra::Engines { | ||
| 16 | |||
| 17 | struct 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 | }; | ||
| 87 | static_assert(std::is_trivially_copyable_v<SamplerDescriptor>); | ||
| 88 | |||
| 89 | class ConstBufferEngineInterface { | ||
| 90 | public: | ||
| 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 | ||
| 60 | u32 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 | |||
| 68 | SamplerDescriptor KeplerCompute::AccessBoundSampler(ShaderType stage, u64 offset) const { | ||
| 69 | return AccessBindlessSampler(stage, regs.tex_cb_index, offset * sizeof(Texture::TextureHandle)); | ||
| 70 | } | ||
| 71 | |||
| 72 | SamplerDescriptor 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 | |||
| 80 | SamplerDescriptor 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 | |||
| 90 | VideoCore::GuestDriverProfile& KeplerCompute::AccessGuestDriverProfile() { | ||
| 91 | return rasterizer->AccessGuestDriverProfile(); | ||
| 92 | } | ||
| 93 | |||
| 94 | const VideoCore::GuestDriverProfile& KeplerCompute::AccessGuestDriverProfile() const { | ||
| 95 | return rasterizer->AccessGuestDriverProfile(); | ||
| 96 | } | ||
| 97 | |||
| 98 | void KeplerCompute::ProcessLaunch() { | 60 | void 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 | ||
| 109 | Texture::TICEntry KeplerCompute::GetTICEntry(u32 tic_index) const { | 67 | Texture::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 | ||
| 43 | class KeplerCompute final : public ConstBufferEngineInterface, public EngineInterface { | 42 | class KeplerCompute final : public EngineInterface { |
| 44 | public: | 43 | public: |
| 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 | |||
| 229 | private: | 211 | private: |
| 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 | ||
| 673 | u32 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 | |||
| 680 | SamplerDescriptor Maxwell3D::AccessBoundSampler(ShaderType stage, u64 offset) const { | ||
| 681 | return AccessBindlessSampler(stage, regs.tex_cb_index, offset * sizeof(Texture::TextureHandle)); | ||
| 682 | } | ||
| 683 | |||
| 684 | SamplerDescriptor 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 | |||
| 693 | SamplerDescriptor 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 | |||
| 703 | VideoCore::GuestDriverProfile& Maxwell3D::AccessGuestDriverProfile() { | ||
| 704 | return rasterizer->AccessGuestDriverProfile(); | ||
| 705 | } | ||
| 706 | |||
| 707 | const 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 | ||
| 52 | class Maxwell3D final : public ConstBufferEngineInterface, public EngineInterface { | 51 | class Maxwell3D final : public EngineInterface { |
| 53 | public: | 52 | public: |
| 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 | } |