summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-12-28 21:45:56 -0300
committerGravatar ReinUsesLisp2020-02-28 17:56:41 -0300
commitdacf83ac0257727a48c971ca1cfcd220976c461f (patch)
treed511c48c449859ef44884c8d6c6b4c5a84b740f2 /src
parentmaxwell_3d: Flatten cull and front face registers (diff)
downloadyuzu-dacf83ac0257727a48c971ca1cfcd220976c461f.tar.gz
yuzu-dacf83ac0257727a48c971ca1cfcd220976c461f.tar.xz
yuzu-dacf83ac0257727a48c971ca1cfcd220976c461f.zip
renderer_opengl: Reintroduce dirty flags for render targets
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp20
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h6
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.cpp85
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.h56
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp7
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.h5
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp6
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.h3
-rw-r--r--src/video_core/texture_cache/texture_cache.h20
9 files changed, 195 insertions, 13 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 2fb8ec33b..a1675355e 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -99,11 +99,12 @@ void oglEnablei(GLenum cap, bool state, GLuint index) {
99} // Anonymous namespace 99} // Anonymous namespace
100 100
101RasterizerOpenGL::RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window, 101RasterizerOpenGL::RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window,
102 ScreenInfo& info, GLShader::ProgramManager& program_manager) 102 ScreenInfo& info, GLShader::ProgramManager& program_manager,
103 : RasterizerAccelerated{system.Memory()}, texture_cache{system, *this, device}, 103 StateTracker& state_tracker)
104 : RasterizerAccelerated{system.Memory()}, texture_cache{system, *this, device, state_tracker},
104 shader_cache{*this, system, emu_window, device}, query_cache{system, *this}, system{system}, 105 shader_cache{*this, system, emu_window, device}, query_cache{system, *this}, system{system},
105 screen_info{info}, program_manager{program_manager}, buffer_cache{*this, system, device, 106 screen_info{info}, program_manager{program_manager}, state_tracker{state_tracker},
106 STREAM_BUFFER_SIZE} { 107 buffer_cache{*this, system, device, STREAM_BUFFER_SIZE} {
107 CheckExtensions(); 108 CheckExtensions();
108} 109}
109 110
@@ -320,9 +321,17 @@ void RasterizerOpenGL::LoadDiskResources(const std::atomic_bool& stop_loading,
320 shader_cache.LoadDiskCache(stop_loading, callback); 321 shader_cache.LoadDiskCache(stop_loading, callback);
321} 322}
322 323
324void RasterizerOpenGL::SetupDirtyFlags() {
325 state_tracker.Initialize();
326}
327
323void RasterizerOpenGL::ConfigureFramebuffers() { 328void RasterizerOpenGL::ConfigureFramebuffers() {
324 MICROPROFILE_SCOPE(OpenGL_Framebuffer); 329 MICROPROFILE_SCOPE(OpenGL_Framebuffer);
325 auto& gpu = system.GPU().Maxwell3D(); 330 auto& gpu = system.GPU().Maxwell3D();
331 if (!gpu.dirty.flags[VideoCommon::Dirty::RenderTargets]) {
332 return;
333 }
334 gpu.dirty.flags[VideoCommon::Dirty::RenderTargets] = false;
326 335
327 texture_cache.GuardRenderTargets(true); 336 texture_cache.GuardRenderTargets(true);
328 337
@@ -361,8 +370,6 @@ void RasterizerOpenGL::ConfigureFramebuffers() {
361 370
362void RasterizerOpenGL::ConfigureClearFramebuffer(bool using_color_fb, bool using_depth_fb, 371void RasterizerOpenGL::ConfigureClearFramebuffer(bool using_color_fb, bool using_depth_fb,
363 bool using_stencil_fb) { 372 bool using_stencil_fb) {
364 using VideoCore::Surface::SurfaceType;
365
366 auto& gpu = system.GPU().Maxwell3D(); 373 auto& gpu = system.GPU().Maxwell3D();
367 const auto& regs = gpu.regs; 374 const auto& regs = gpu.regs;
368 375
@@ -381,6 +388,7 @@ void RasterizerOpenGL::ConfigureClearFramebuffer(bool using_color_fb, bool using
381 key.colors[0] = color_surface; 388 key.colors[0] = color_surface;
382 key.zeta = depth_surface; 389 key.zeta = depth_surface;
383 390
391 state_tracker.NotifyFramebuffer();
384 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer_cache.GetFramebuffer(key)); 392 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer_cache.GetFramebuffer(key));
385} 393}
386 394
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index 48443bdff..22a3a3352 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -30,6 +30,7 @@
30#include "video_core/renderer_opengl/gl_shader_cache.h" 30#include "video_core/renderer_opengl/gl_shader_cache.h"
31#include "video_core/renderer_opengl/gl_shader_decompiler.h" 31#include "video_core/renderer_opengl/gl_shader_decompiler.h"
32#include "video_core/renderer_opengl/gl_shader_manager.h" 32#include "video_core/renderer_opengl/gl_shader_manager.h"
33#include "video_core/renderer_opengl/gl_state_tracker.h"
33#include "video_core/renderer_opengl/gl_texture_cache.h" 34#include "video_core/renderer_opengl/gl_texture_cache.h"
34#include "video_core/renderer_opengl/utils.h" 35#include "video_core/renderer_opengl/utils.h"
35#include "video_core/textures/texture.h" 36#include "video_core/textures/texture.h"
@@ -54,7 +55,8 @@ struct DrawParameters;
54class RasterizerOpenGL : public VideoCore::RasterizerAccelerated { 55class RasterizerOpenGL : public VideoCore::RasterizerAccelerated {
55public: 56public:
56 explicit RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window, 57 explicit RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window,
57 ScreenInfo& info, GLShader::ProgramManager& program_manager); 58 ScreenInfo& info, GLShader::ProgramManager& program_manager,
59 StateTracker& state_tracker);
58 ~RasterizerOpenGL() override; 60 ~RasterizerOpenGL() override;
59 61
60 void Draw(bool is_indexed, bool is_instanced) override; 62 void Draw(bool is_indexed, bool is_instanced) override;
@@ -75,6 +77,7 @@ public:
75 u32 pixel_stride) override; 77 u32 pixel_stride) override;
76 void LoadDiskResources(const std::atomic_bool& stop_loading, 78 void LoadDiskResources(const std::atomic_bool& stop_loading,
77 const VideoCore::DiskResourceLoadCallback& callback) override; 79 const VideoCore::DiskResourceLoadCallback& callback) override;
80 void SetupDirtyFlags() override;
78 81
79 /// Returns true when there are commands queued to the OpenGL server. 82 /// Returns true when there are commands queued to the OpenGL server.
80 bool AnyCommandQueued() const { 83 bool AnyCommandQueued() const {
@@ -216,6 +219,7 @@ private:
216 Core::System& system; 219 Core::System& system;
217 ScreenInfo& screen_info; 220 ScreenInfo& screen_info;
218 GLShader::ProgramManager& program_manager; 221 GLShader::ProgramManager& program_manager;
222 StateTracker& state_tracker;
219 223
220 static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024; 224 static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024;
221 OGLBufferCache buffer_cache; 225 OGLBufferCache buffer_cache;
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.cpp b/src/video_core/renderer_opengl/gl_state_tracker.cpp
index e69de29bb..268b9351e 100644
--- a/src/video_core/renderer_opengl/gl_state_tracker.cpp
+++ b/src/video_core/renderer_opengl/gl_state_tracker.cpp
@@ -0,0 +1,85 @@
1// Copyright 2019 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <algorithm>
6#include <array>
7#include <cstddef>
8#include <type_traits>
9
10#include "common/common_types.h"
11#include "core/core.h"
12#include "video_core/engines/maxwell_3d.h"
13#include "video_core/gpu.h"
14#include "video_core/renderer_opengl/gl_state_tracker.h"
15
16#define OFF(field_name) MAXWELL3D_REG_INDEX(field_name)
17#define NUM(field_name) (sizeof(Maxwell3D::Regs::field_name) / sizeof(u32))
18
19namespace OpenGL {
20
21namespace {
22
23using namespace Dirty;
24using namespace VideoCommon::Dirty;
25using Tegra::Engines::Maxwell3D;
26using Regs = Maxwell3D::Regs;
27using Dirty = std::remove_reference_t<decltype(Maxwell3D::dirty)>;
28using Tables = std::remove_reference_t<decltype(Maxwell3D::dirty.tables)>;
29using Table = std::remove_reference_t<decltype(Maxwell3D::dirty.tables[0])>;
30
31template <typename Integer>
32void FillBlock(Table& table, std::size_t begin, std::size_t num, Integer dirty_index) {
33 const auto it = std::begin(table) + begin;
34 std::fill(it, it + num, static_cast<u8>(dirty_index));
35}
36
37template <typename Integer1, typename Integer2>
38void FillBlock(Tables& tables, std::size_t begin, std::size_t num, Integer1 index_a,
39 Integer2 index_b) {
40 FillBlock(tables[0], begin, num, index_a);
41 FillBlock(tables[1], begin, num, index_b);
42}
43
44void SetupDirtyRenderTargets(Tables& tables) {
45 static constexpr std::size_t num_per_rt = NUM(rt[0]);
46 static constexpr std::size_t begin = OFF(rt);
47 static constexpr std::size_t num = num_per_rt * Regs::NumRenderTargets;
48 for (std::size_t rt = 0; rt < Regs::NumRenderTargets; ++rt) {
49 FillBlock(tables[0], begin + rt * num_per_rt, num_per_rt, ColorBuffer0 + rt);
50 }
51 FillBlock(tables[1], begin, num, RenderTargets);
52
53 static constexpr std::array zeta_flags{ZetaBuffer, RenderTargets};
54 for (std::size_t i = 0; i < std::size(zeta_flags); ++i) {
55 const u8 flag = zeta_flags[i];
56 auto& table = tables[i];
57 table[OFF(zeta_enable)] = flag;
58 table[OFF(zeta_width)] = flag;
59 table[OFF(zeta_height)] = flag;
60 FillBlock(table, OFF(zeta), NUM(zeta), flag);
61 }
62}
63
64} // Anonymous namespace
65
66StateTracker::StateTracker(Core::System& system) : system{system} {}
67
68void StateTracker::Initialize() {
69 auto& dirty = system.GPU().Maxwell3D().dirty;
70 std::size_t entry_index = 0;
71 const auto AddEntry = [&dirty, &entry_index](std::size_t dirty_register) {
72 dirty.on_write_stores[entry_index++] = static_cast<u8>(dirty_register);
73 };
74
75 AddEntry(RenderTargets);
76 for (std::size_t i = 0; i < Regs::NumRenderTargets; ++i) {
77 AddEntry(ColorBuffer0 + i);
78 }
79 AddEntry(ZetaBuffer);
80
81 auto& tables = dirty.tables;
82 SetupDirtyRenderTargets(tables);
83}
84
85} // namespace OpenGL
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.h b/src/video_core/renderer_opengl/gl_state_tracker.h
index e69de29bb..91d4bb8d3 100644
--- a/src/video_core/renderer_opengl/gl_state_tracker.h
+++ b/src/video_core/renderer_opengl/gl_state_tracker.h
@@ -0,0 +1,56 @@
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 "common/common_types.h"
8#include "video_core/dirty_flags.h"
9#include "video_core/engines/maxwell_3d.h"
10
11namespace Core {
12class System;
13}
14
15namespace OpenGL {
16
17namespace Dirty {
18enum : u8 {
19 First = VideoCommon::Dirty::LastCommonEntry,
20
21 VertexFormats,
22 VertexBuffers,
23 VertexInstances,
24 Shaders,
25 Viewports,
26 CullTestEnable,
27 FrontFace,
28 CullFace,
29 PrimitiveRestart,
30 DepthTest,
31 StencilTest,
32 ColorMask,
33 BlendState,
34 PolygonOffset,
35
36 VertexBuffer0 = PolygonOffset + 8,
37 VertexInstance0 = VertexBuffer0 + 32,
38};
39}
40
41class StateTracker {
42public:
43 explicit StateTracker(Core::System& system);
44
45 void Initialize();
46
47 void NotifyFramebuffer() {
48 auto& flags = system.GPU().Maxwell3D().dirty.flags;
49 flags[VideoCommon::Dirty::RenderTargets] = true;
50 }
51
52private:
53 Core::System& system;
54};
55
56} // namespace OpenGL
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp
index e2a58f0ad..1cadcf287 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp
@@ -10,6 +10,7 @@
10#include "core/core.h" 10#include "core/core.h"
11#include "video_core/morton.h" 11#include "video_core/morton.h"
12#include "video_core/renderer_opengl/gl_resource_manager.h" 12#include "video_core/renderer_opengl/gl_resource_manager.h"
13#include "video_core/renderer_opengl/gl_state_tracker.h"
13#include "video_core/renderer_opengl/gl_texture_cache.h" 14#include "video_core/renderer_opengl/gl_texture_cache.h"
14#include "video_core/renderer_opengl/utils.h" 15#include "video_core/renderer_opengl/utils.h"
15#include "video_core/texture_cache/surface_base.h" 16#include "video_core/texture_cache/surface_base.h"
@@ -479,8 +480,8 @@ OGLTextureView CachedSurfaceView::CreateTextureView() const {
479 480
480TextureCacheOpenGL::TextureCacheOpenGL(Core::System& system, 481TextureCacheOpenGL::TextureCacheOpenGL(Core::System& system,
481 VideoCore::RasterizerInterface& rasterizer, 482 VideoCore::RasterizerInterface& rasterizer,
482 const Device& device) 483 const Device& device, StateTracker& state_tracker)
483 : TextureCacheBase{system, rasterizer} { 484 : TextureCacheBase{system, rasterizer}, state_tracker{state_tracker} {
484 src_framebuffer.Create(); 485 src_framebuffer.Create();
485 dst_framebuffer.Create(); 486 dst_framebuffer.Create();
486} 487}
@@ -518,6 +519,8 @@ void TextureCacheOpenGL::ImageBlit(View& src_view, View& dst_view,
518 UNIMPLEMENTED_IF(dst_params.target == SurfaceTarget::Texture3D); 519 UNIMPLEMENTED_IF(dst_params.target == SurfaceTarget::Texture3D);
519 520
520 // TODO: Signal state tracker about these changes 521 // TODO: Signal state tracker about these changes
522 state_tracker.NotifyFramebuffer();
523
521 if (dst_params.srgb_conversion) { 524 if (dst_params.srgb_conversion) {
522 glEnable(GL_FRAMEBUFFER_SRGB); 525 glEnable(GL_FRAMEBUFFER_SRGB);
523 } else { 526 } else {
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h
index 303534ca6..6658c6ffd 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.h
+++ b/src/video_core/renderer_opengl/gl_texture_cache.h
@@ -27,6 +27,7 @@ using VideoCommon::ViewParams;
27class CachedSurfaceView; 27class CachedSurfaceView;
28class CachedSurface; 28class CachedSurface;
29class TextureCacheOpenGL; 29class TextureCacheOpenGL;
30class StateTracker;
30 31
31using Surface = std::shared_ptr<CachedSurface>; 32using Surface = std::shared_ptr<CachedSurface>;
32using View = std::shared_ptr<CachedSurfaceView>; 33using View = std::shared_ptr<CachedSurfaceView>;
@@ -127,7 +128,7 @@ private:
127class TextureCacheOpenGL final : public TextureCacheBase { 128class TextureCacheOpenGL final : public TextureCacheBase {
128public: 129public:
129 explicit TextureCacheOpenGL(Core::System& system, VideoCore::RasterizerInterface& rasterizer, 130 explicit TextureCacheOpenGL(Core::System& system, VideoCore::RasterizerInterface& rasterizer,
130 const Device& device); 131 const Device& device, StateTracker& state_tracker);
131 ~TextureCacheOpenGL(); 132 ~TextureCacheOpenGL();
132 133
133protected: 134protected:
@@ -144,6 +145,8 @@ protected:
144private: 145private:
145 GLuint FetchPBO(std::size_t buffer_size); 146 GLuint FetchPBO(std::size_t buffer_size);
146 147
148 StateTracker& state_tracker;
149
147 OGLFramebuffer src_framebuffer; 150 OGLFramebuffer src_framebuffer;
148 OGLFramebuffer dst_framebuffer; 151 OGLFramebuffer dst_framebuffer;
149 std::unordered_map<u32, OGLBuffer> copy_pbo_cache; 152 std::unordered_map<u32, OGLBuffer> copy_pbo_cache;
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index 5e16bb99b..36c634e0d 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -482,8 +482,8 @@ void RendererOpenGL::CreateRasterizer() {
482 if (rasterizer) { 482 if (rasterizer) {
483 return; 483 return;
484 } 484 }
485 rasterizer = 485 rasterizer = std::make_unique<RasterizerOpenGL>(system, emu_window, screen_info,
486 std::make_unique<RasterizerOpenGL>(system, emu_window, screen_info, program_manager); 486 program_manager, state_tracker);
487} 487}
488 488
489void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture, 489void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture,
@@ -576,6 +576,8 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) {
576 glNamedBufferSubData(vertex_buffer.handle, 0, sizeof(vertices), std::data(vertices)); 576 glNamedBufferSubData(vertex_buffer.handle, 0, sizeof(vertices), std::data(vertices));
577 577
578 // TODO: Signal state tracker about these changes 578 // TODO: Signal state tracker about these changes
579 state_tracker.NotifyFramebuffer();
580
579 program_manager.UseVertexShader(vertex_program.handle); 581 program_manager.UseVertexShader(vertex_program.handle);
580 program_manager.UseGeometryShader(0); 582 program_manager.UseGeometryShader(0);
581 program_manager.UseFragmentShader(fragment_program.handle); 583 program_manager.UseFragmentShader(fragment_program.handle);
diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h
index ca670e7c8..33073ce5b 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.h
+++ b/src/video_core/renderer_opengl/renderer_opengl.h
@@ -11,6 +11,7 @@
11#include "video_core/renderer_base.h" 11#include "video_core/renderer_base.h"
12#include "video_core/renderer_opengl/gl_resource_manager.h" 12#include "video_core/renderer_opengl/gl_resource_manager.h"
13#include "video_core/renderer_opengl/gl_shader_manager.h" 13#include "video_core/renderer_opengl/gl_shader_manager.h"
14#include "video_core/renderer_opengl/gl_state_tracker.h"
14 15
15namespace Core { 16namespace Core {
16class System; 17class System;
@@ -91,6 +92,8 @@ private:
91 Core::Frontend::EmuWindow& emu_window; 92 Core::Frontend::EmuWindow& emu_window;
92 Core::System& system; 93 Core::System& system;
93 94
95 StateTracker state_tracker{system};
96
94 // OpenGL object IDs 97 // OpenGL object IDs
95 OGLBuffer vertex_buffer; 98 OGLBuffer vertex_buffer;
96 OGLProgram vertex_program; 99 OGLProgram vertex_program;
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index ec6dfa49e..51373b687 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -22,6 +22,7 @@
22#include "core/core.h" 22#include "core/core.h"
23#include "core/memory.h" 23#include "core/memory.h"
24#include "core/settings.h" 24#include "core/settings.h"
25#include "video_core/dirty_flags.h"
25#include "video_core/engines/fermi_2d.h" 26#include "video_core/engines/fermi_2d.h"
26#include "video_core/engines/maxwell_3d.h" 27#include "video_core/engines/maxwell_3d.h"
27#include "video_core/gpu.h" 28#include "video_core/gpu.h"
@@ -142,6 +143,10 @@ public:
142 TView GetDepthBufferSurface(bool preserve_contents) { 143 TView GetDepthBufferSurface(bool preserve_contents) {
143 std::lock_guard lock{mutex}; 144 std::lock_guard lock{mutex};
144 auto& maxwell3d = system.GPU().Maxwell3D(); 145 auto& maxwell3d = system.GPU().Maxwell3D();
146 if (!maxwell3d.dirty.flags[VideoCommon::Dirty::ZetaBuffer]) {
147 return depth_buffer.view;
148 }
149 maxwell3d.dirty.flags[VideoCommon::Dirty::ZetaBuffer] = false;
145 150
146 const auto& regs{maxwell3d.regs}; 151 const auto& regs{maxwell3d.regs};
147 const auto gpu_addr{regs.zeta.Address()}; 152 const auto gpu_addr{regs.zeta.Address()};
@@ -170,6 +175,10 @@ public:
170 std::lock_guard lock{mutex}; 175 std::lock_guard lock{mutex};
171 ASSERT(index < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets); 176 ASSERT(index < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets);
172 auto& maxwell3d = system.GPU().Maxwell3D(); 177 auto& maxwell3d = system.GPU().Maxwell3D();
178 if (!maxwell3d.dirty.flags[VideoCommon::Dirty::ColorBuffer0 + index]) {
179 return render_targets[index].view;
180 }
181 maxwell3d.dirty.flags[VideoCommon::Dirty::ColorBuffer0 + index] = false;
173 182
174 const auto& regs{maxwell3d.regs}; 183 const auto& regs{maxwell3d.regs};
175 if (index >= regs.rt_control.count || regs.rt[index].Address() == 0 || 184 if (index >= regs.rt_control.count || regs.rt[index].Address() == 0 ||
@@ -310,7 +319,16 @@ protected:
310 // and reading it from a separate buffer. 319 // and reading it from a separate buffer.
311 virtual void BufferCopy(TSurface& src_surface, TSurface& dst_surface) = 0; 320 virtual void BufferCopy(TSurface& src_surface, TSurface& dst_surface) = 0;
312 321
313 void ManageRenderTargetUnregister([[maybe_unused]] TSurface& surface) {} 322 void ManageRenderTargetUnregister(TSurface& surface) {
323 auto& dirty = system.GPU().Maxwell3D().dirty;
324 const u32 index = surface->GetRenderTarget();
325 if (index == DEPTH_RT) {
326 dirty.flags[VideoCommon::Dirty::ZetaBuffer] = true;
327 } else {
328 dirty.flags[VideoCommon::Dirty::ColorBuffer0 + index] = true;
329 }
330 dirty.flags[VideoCommon::Dirty::RenderTargets] = true;
331 }
314 332
315 void Register(TSurface surface) { 333 void Register(TSurface surface) {
316 const GPUVAddr gpu_addr = surface->GetGpuAddr(); 334 const GPUVAddr gpu_addr = surface->GetGpuAddr();