diff options
| author | 2019-05-10 22:26:46 -0400 | |
|---|---|---|
| committer | 2019-06-20 21:36:12 -0300 | |
| commit | 5192521dc3f752c385de356158706899f523e498 (patch) | |
| tree | 842809454594da1a44259a4d873b14ff671a7bed /src/video_core/texture_cache | |
| parent | texture_cache: Optimize GetMipBlockHeight and GetMipBlockDepth (diff) | |
| download | yuzu-5192521dc3f752c385de356158706899f523e498.tar.gz yuzu-5192521dc3f752c385de356158706899f523e498.tar.xz yuzu-5192521dc3f752c385de356158706899f523e498.zip | |
texture_cache: Implement GPU Dirty Flags
Diffstat (limited to 'src/video_core/texture_cache')
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index ad0fbd7ce..8aa0d6515 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -81,17 +81,22 @@ public: | |||
| 81 | if (!gpu_addr) { | 81 | if (!gpu_addr) { |
| 82 | return {}; | 82 | return {}; |
| 83 | } | 83 | } |
| 84 | if (gpu_addr == 0x1b7ec0000) { | ||
| 85 | // __debugbreak(); | ||
| 86 | } | ||
| 87 | const auto params{SurfaceParams::CreateForTexture(system, config, entry)}; | 84 | const auto params{SurfaceParams::CreateForTexture(system, config, entry)}; |
| 88 | return GetSurface(gpu_addr, params, true).second; | 85 | return GetSurface(gpu_addr, params, true).second; |
| 89 | } | 86 | } |
| 90 | 87 | ||
| 91 | TView GetDepthBufferSurface(bool preserve_contents) { | 88 | TView GetDepthBufferSurface(bool preserve_contents) { |
| 92 | const auto& regs{system.GPU().Maxwell3D().regs}; | 89 | auto& maxwell3d = system.GPU().Maxwell3D(); |
| 90 | |||
| 91 | if (!maxwell3d.dirty_flags.zeta_buffer) { | ||
| 92 | return depth_buffer.view; | ||
| 93 | } | ||
| 94 | maxwell3d.dirty_flags.zeta_buffer = false; | ||
| 95 | |||
| 96 | const auto& regs{maxwell3d.regs}; | ||
| 93 | const auto gpu_addr{regs.zeta.Address()}; | 97 | const auto gpu_addr{regs.zeta.Address()}; |
| 94 | if (!gpu_addr || !regs.zeta_enable) { | 98 | if (!gpu_addr || !regs.zeta_enable) { |
| 99 | SetEmptyDepthBuffer(); | ||
| 95 | return {}; | 100 | return {}; |
| 96 | } | 101 | } |
| 97 | const auto depth_params{SurfaceParams::CreateForDepthBuffer( | 102 | const auto depth_params{SurfaceParams::CreateForDepthBuffer( |
| @@ -101,6 +106,8 @@ public: | |||
| 101 | auto surface_view = GetSurface(gpu_addr, depth_params, preserve_contents); | 106 | auto surface_view = GetSurface(gpu_addr, depth_params, preserve_contents); |
| 102 | if (depth_buffer.target) | 107 | if (depth_buffer.target) |
| 103 | depth_buffer.target->MarkAsProtected(false); | 108 | depth_buffer.target->MarkAsProtected(false); |
| 109 | depth_buffer.target = surface_view.first; | ||
| 110 | depth_buffer.view = surface_view.second; | ||
| 104 | if (depth_buffer.target) | 111 | if (depth_buffer.target) |
| 105 | depth_buffer.target->MarkAsProtected(true); | 112 | depth_buffer.target->MarkAsProtected(true); |
| 106 | return surface_view.second; | 113 | return surface_view.second; |
| @@ -108,8 +115,13 @@ public: | |||
| 108 | 115 | ||
| 109 | TView GetColorBufferSurface(std::size_t index, bool preserve_contents) { | 116 | TView GetColorBufferSurface(std::size_t index, bool preserve_contents) { |
| 110 | ASSERT(index < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets); | 117 | ASSERT(index < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets); |
| 118 | auto& maxwell3d = system.GPU().Maxwell3D(); | ||
| 119 | if (!maxwell3d.dirty_flags.color_buffer[index]) { | ||
| 120 | return render_targets[index].view; | ||
| 121 | } | ||
| 122 | maxwell3d.dirty_flags.color_buffer.reset(index); | ||
| 111 | 123 | ||
| 112 | const auto& regs{system.GPU().Maxwell3D().regs}; | 124 | const auto& regs{maxwell3d.regs}; |
| 113 | if (index >= regs.rt_control.count || regs.rt[index].Address() == 0 || | 125 | if (index >= regs.rt_control.count || regs.rt[index].Address() == 0 || |
| 114 | regs.rt[index].format == Tegra::RenderTargetFormat::NONE) { | 126 | regs.rt[index].format == Tegra::RenderTargetFormat::NONE) { |
| 115 | SetEmptyColorBuffer(index); | 127 | SetEmptyColorBuffer(index); |
| @@ -128,6 +140,7 @@ public: | |||
| 128 | if (render_targets[index].target) | 140 | if (render_targets[index].target) |
| 129 | render_targets[index].target->MarkAsProtected(false); | 141 | render_targets[index].target->MarkAsProtected(false); |
| 130 | render_targets[index].target = surface_view.first; | 142 | render_targets[index].target = surface_view.first; |
| 143 | render_targets[index].view = surface_view.second; | ||
| 131 | if (render_targets[index].target) | 144 | if (render_targets[index].target) |
| 132 | render_targets[index].target->MarkAsProtected(true); | 145 | render_targets[index].target->MarkAsProtected(true); |
| 133 | return surface_view.second; | 146 | return surface_view.second; |
| @@ -154,7 +167,6 @@ public: | |||
| 154 | void SetEmptyColorBuffer(std::size_t index) { | 167 | void SetEmptyColorBuffer(std::size_t index) { |
| 155 | if (render_targets[index].target != nullptr) { | 168 | if (render_targets[index].target != nullptr) { |
| 156 | render_targets[index].target->MarkAsProtected(false); | 169 | render_targets[index].target->MarkAsProtected(false); |
| 157 | std::memset(&render_targets[index].config, sizeof(RenderTargetConfig), 0); | ||
| 158 | render_targets[index].target = nullptr; | 170 | render_targets[index].target = nullptr; |
| 159 | render_targets[index].view = nullptr; | 171 | render_targets[index].view = nullptr; |
| 160 | } | 172 | } |
| @@ -545,13 +557,7 @@ private: | |||
| 545 | return {}; | 557 | return {}; |
| 546 | } | 558 | } |
| 547 | 559 | ||
| 548 | struct RenderInfo { | 560 | struct FramebufferTargetInfo { |
| 549 | RenderTargetConfig config; | ||
| 550 | TSurface target; | ||
| 551 | TView view; | ||
| 552 | }; | ||
| 553 | |||
| 554 | struct DepthBufferInfo { | ||
| 555 | TSurface target; | 561 | TSurface target; |
| 556 | TView view; | 562 | TView view; |
| 557 | }; | 563 | }; |
| @@ -580,8 +586,9 @@ private: | |||
| 580 | /// previously been used. This is to prevent surfaces from being constantly created and | 586 | /// previously been used. This is to prevent surfaces from being constantly created and |
| 581 | /// destroyed when used with different surface parameters. | 587 | /// destroyed when used with different surface parameters. |
| 582 | std::unordered_map<SurfaceParams, std::vector<TSurface>> surface_reserve; | 588 | std::unordered_map<SurfaceParams, std::vector<TSurface>> surface_reserve; |
| 583 | std::array<RenderInfo, Tegra::Engines::Maxwell3D::Regs::NumRenderTargets> render_targets; | 589 | std::array<FramebufferTargetInfo, Tegra::Engines::Maxwell3D::Regs::NumRenderTargets> |
| 584 | DepthBufferInfo depth_buffer; | 590 | render_targets; |
| 591 | FramebufferTargetInfo depth_buffer; | ||
| 585 | 592 | ||
| 586 | std::vector<u8> staging_buffer; | 593 | std::vector<u8> staging_buffer; |
| 587 | }; | 594 | }; |