diff options
| author | 2021-11-05 15:52:31 +0100 | |
|---|---|---|
| committer | 2022-10-06 21:00:51 +0200 | |
| commit | 139ea93512aeead8a4aee3910a3de86eb109a838 (patch) | |
| tree | 857643fc08617b7035656a51728c399f30c8c2cb /src/video_core/shader_cache.cpp | |
| parent | NVASGPU: Fix Remap. (diff) | |
| download | yuzu-139ea93512aeead8a4aee3910a3de86eb109a838.tar.gz yuzu-139ea93512aeead8a4aee3910a3de86eb109a838.tar.xz yuzu-139ea93512aeead8a4aee3910a3de86eb109a838.zip | |
VideoCore: implement channels on gpu caches.
Diffstat (limited to 'src/video_core/shader_cache.cpp')
| -rw-r--r-- | src/video_core/shader_cache.cpp | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/src/video_core/shader_cache.cpp b/src/video_core/shader_cache.cpp index 164e4ee0e..f53066579 100644 --- a/src/video_core/shader_cache.cpp +++ b/src/video_core/shader_cache.cpp | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include "common/assert.h" | 8 | #include "common/assert.h" |
| 9 | #include "shader_recompiler/frontend/maxwell/control_flow.h" | 9 | #include "shader_recompiler/frontend/maxwell/control_flow.h" |
| 10 | #include "shader_recompiler/object_pool.h" | 10 | #include "shader_recompiler/object_pool.h" |
| 11 | #include "video_core/control/channel_state.h" | ||
| 11 | #include "video_core/dirty_flags.h" | 12 | #include "video_core/dirty_flags.h" |
| 12 | #include "video_core/engines/kepler_compute.h" | 13 | #include "video_core/engines/kepler_compute.h" |
| 13 | #include "video_core/engines/maxwell_3d.h" | 14 | #include "video_core/engines/maxwell_3d.h" |
| @@ -33,29 +34,25 @@ void ShaderCache::SyncGuestHost() { | |||
| 33 | RemovePendingShaders(); | 34 | RemovePendingShaders(); |
| 34 | } | 35 | } |
| 35 | 36 | ||
| 36 | ShaderCache::ShaderCache(VideoCore::RasterizerInterface& rasterizer_, | 37 | ShaderCache::ShaderCache(VideoCore::RasterizerInterface& rasterizer_) : rasterizer{rasterizer_} {} |
| 37 | Tegra::MemoryManager& gpu_memory_, Tegra::Engines::Maxwell3D& maxwell3d_, | ||
| 38 | Tegra::Engines::KeplerCompute& kepler_compute_) | ||
| 39 | : gpu_memory{gpu_memory_}, maxwell3d{maxwell3d_}, kepler_compute{kepler_compute_}, | ||
| 40 | rasterizer{rasterizer_} {} | ||
| 41 | 38 | ||
| 42 | bool ShaderCache::RefreshStages(std::array<u64, 6>& unique_hashes) { | 39 | bool ShaderCache::RefreshStages(std::array<u64, 6>& unique_hashes) { |
| 43 | auto& dirty{maxwell3d.dirty.flags}; | 40 | auto& dirty{maxwell3d->dirty.flags}; |
| 44 | if (!dirty[VideoCommon::Dirty::Shaders]) { | 41 | if (!dirty[VideoCommon::Dirty::Shaders]) { |
| 45 | return last_shaders_valid; | 42 | return last_shaders_valid; |
| 46 | } | 43 | } |
| 47 | dirty[VideoCommon::Dirty::Shaders] = false; | 44 | dirty[VideoCommon::Dirty::Shaders] = false; |
| 48 | 45 | ||
| 49 | const GPUVAddr base_addr{maxwell3d.regs.code_address.CodeAddress()}; | 46 | const GPUVAddr base_addr{maxwell3d->regs.code_address.CodeAddress()}; |
| 50 | for (size_t index = 0; index < Tegra::Engines::Maxwell3D::Regs::MaxShaderProgram; ++index) { | 47 | for (size_t index = 0; index < Tegra::Engines::Maxwell3D::Regs::MaxShaderProgram; ++index) { |
| 51 | if (!maxwell3d.regs.IsShaderConfigEnabled(index)) { | 48 | if (!maxwell3d->regs.IsShaderConfigEnabled(index)) { |
| 52 | unique_hashes[index] = 0; | 49 | unique_hashes[index] = 0; |
| 53 | continue; | 50 | continue; |
| 54 | } | 51 | } |
| 55 | const auto& shader_config{maxwell3d.regs.shader_config[index]}; | 52 | const auto& shader_config{maxwell3d->regs.shader_config[index]}; |
| 56 | const auto program{static_cast<Tegra::Engines::Maxwell3D::Regs::ShaderProgram>(index)}; | 53 | const auto program{static_cast<Tegra::Engines::Maxwell3D::Regs::ShaderProgram>(index)}; |
| 57 | const GPUVAddr shader_addr{base_addr + shader_config.offset}; | 54 | const GPUVAddr shader_addr{base_addr + shader_config.offset}; |
| 58 | const std::optional<VAddr> cpu_shader_addr{gpu_memory.GpuToCpuAddress(shader_addr)}; | 55 | const std::optional<VAddr> cpu_shader_addr{gpu_memory->GpuToCpuAddress(shader_addr)}; |
| 59 | if (!cpu_shader_addr) { | 56 | if (!cpu_shader_addr) { |
| 60 | LOG_ERROR(HW_GPU, "Invalid GPU address for shader 0x{:016x}", shader_addr); | 57 | LOG_ERROR(HW_GPU, "Invalid GPU address for shader 0x{:016x}", shader_addr); |
| 61 | last_shaders_valid = false; | 58 | last_shaders_valid = false; |
| @@ -64,7 +61,7 @@ bool ShaderCache::RefreshStages(std::array<u64, 6>& unique_hashes) { | |||
| 64 | const ShaderInfo* shader_info{TryGet(*cpu_shader_addr)}; | 61 | const ShaderInfo* shader_info{TryGet(*cpu_shader_addr)}; |
| 65 | if (!shader_info) { | 62 | if (!shader_info) { |
| 66 | const u32 start_address{shader_config.offset}; | 63 | const u32 start_address{shader_config.offset}; |
| 67 | GraphicsEnvironment env{maxwell3d, gpu_memory, program, base_addr, start_address}; | 64 | GraphicsEnvironment env{*maxwell3d, *gpu_memory, program, base_addr, start_address}; |
| 68 | shader_info = MakeShaderInfo(env, *cpu_shader_addr); | 65 | shader_info = MakeShaderInfo(env, *cpu_shader_addr); |
| 69 | } | 66 | } |
| 70 | shader_infos[index] = shader_info; | 67 | shader_infos[index] = shader_info; |
| @@ -75,10 +72,10 @@ bool ShaderCache::RefreshStages(std::array<u64, 6>& unique_hashes) { | |||
| 75 | } | 72 | } |
| 76 | 73 | ||
| 77 | const ShaderInfo* ShaderCache::ComputeShader() { | 74 | const ShaderInfo* ShaderCache::ComputeShader() { |
| 78 | const GPUVAddr program_base{kepler_compute.regs.code_loc.Address()}; | 75 | const GPUVAddr program_base{kepler_compute->regs.code_loc.Address()}; |
| 79 | const auto& qmd{kepler_compute.launch_description}; | 76 | const auto& qmd{kepler_compute->launch_description}; |
| 80 | const GPUVAddr shader_addr{program_base + qmd.program_start}; | 77 | const GPUVAddr shader_addr{program_base + qmd.program_start}; |
| 81 | const std::optional<VAddr> cpu_shader_addr{gpu_memory.GpuToCpuAddress(shader_addr)}; | 78 | const std::optional<VAddr> cpu_shader_addr{gpu_memory->GpuToCpuAddress(shader_addr)}; |
| 82 | if (!cpu_shader_addr) { | 79 | if (!cpu_shader_addr) { |
| 83 | LOG_ERROR(HW_GPU, "Invalid GPU address for shader 0x{:016x}", shader_addr); | 80 | LOG_ERROR(HW_GPU, "Invalid GPU address for shader 0x{:016x}", shader_addr); |
| 84 | return nullptr; | 81 | return nullptr; |
| @@ -86,22 +83,22 @@ const ShaderInfo* ShaderCache::ComputeShader() { | |||
| 86 | if (const ShaderInfo* const shader = TryGet(*cpu_shader_addr)) { | 83 | if (const ShaderInfo* const shader = TryGet(*cpu_shader_addr)) { |
| 87 | return shader; | 84 | return shader; |
| 88 | } | 85 | } |
| 89 | ComputeEnvironment env{kepler_compute, gpu_memory, program_base, qmd.program_start}; | 86 | ComputeEnvironment env{*kepler_compute, *gpu_memory, program_base, qmd.program_start}; |
| 90 | return MakeShaderInfo(env, *cpu_shader_addr); | 87 | return MakeShaderInfo(env, *cpu_shader_addr); |
| 91 | } | 88 | } |
| 92 | 89 | ||
| 93 | void ShaderCache::GetGraphicsEnvironments(GraphicsEnvironments& result, | 90 | void ShaderCache::GetGraphicsEnvironments(GraphicsEnvironments& result, |
| 94 | const std::array<u64, NUM_PROGRAMS>& unique_hashes) { | 91 | const std::array<u64, NUM_PROGRAMS>& unique_hashes) { |
| 95 | size_t env_index{}; | 92 | size_t env_index{}; |
| 96 | const GPUVAddr base_addr{maxwell3d.regs.code_address.CodeAddress()}; | 93 | const GPUVAddr base_addr{maxwell3d->regs.code_address.CodeAddress()}; |
| 97 | for (size_t index = 0; index < NUM_PROGRAMS; ++index) { | 94 | for (size_t index = 0; index < NUM_PROGRAMS; ++index) { |
| 98 | if (unique_hashes[index] == 0) { | 95 | if (unique_hashes[index] == 0) { |
| 99 | continue; | 96 | continue; |
| 100 | } | 97 | } |
| 101 | const auto program{static_cast<Tegra::Engines::Maxwell3D::Regs::ShaderProgram>(index)}; | 98 | const auto program{static_cast<Tegra::Engines::Maxwell3D::Regs::ShaderProgram>(index)}; |
| 102 | auto& env{result.envs[index]}; | 99 | auto& env{result.envs[index]}; |
| 103 | const u32 start_address{maxwell3d.regs.shader_config[index].offset}; | 100 | const u32 start_address{maxwell3d->regs.shader_config[index].offset}; |
| 104 | env = GraphicsEnvironment{maxwell3d, gpu_memory, program, base_addr, start_address}; | 101 | env = GraphicsEnvironment{*maxwell3d, *gpu_memory, program, base_addr, start_address}; |
| 105 | env.SetCachedSize(shader_infos[index]->size_bytes); | 102 | env.SetCachedSize(shader_infos[index]->size_bytes); |
| 106 | result.env_ptrs[env_index++] = &env; | 103 | result.env_ptrs[env_index++] = &env; |
| 107 | } | 104 | } |