summaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-05-10 22:26:46 -0400
committerGravatar ReinUsesLisp2019-06-20 21:36:12 -0300
commit5192521dc3f752c385de356158706899f523e498 (patch)
tree842809454594da1a44259a4d873b14ff671a7bed /src/video_core/texture_cache
parenttexture_cache: Optimize GetMipBlockHeight and GetMipBlockDepth (diff)
downloadyuzu-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.h37
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};