diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-12-29 02:12:12 +0100 |
---|---|---|
committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-02-28 21:56:41 +0100 |
commit | 7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1 (patch) | |
tree | a18e0a878c025c613b7dcf6f23db83011afda92e /src/video_core/renderer_opengl/gl_rasterizer.cpp | |
parent | renderer_opengl: Reintroduce dirty flags for render targets (diff) | |
download | yuzu-7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1.tar yuzu-7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1.tar.gz yuzu-7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1.tar.bz2 yuzu-7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1.tar.lz yuzu-7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1.tar.xz yuzu-7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1.tar.zst yuzu-7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1.zip |
Diffstat (limited to 'src/video_core/renderer_opengl/gl_rasterizer.cpp')
-rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index a1675355e..2427b8c07 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -906,13 +906,30 @@ void RasterizerOpenGL::SetupImage(u32 binding, const Tegra::Texture::TICEntry& t } void RasterizerOpenGL::SyncViewport() { - const auto& regs = system.GPU().Maxwell3D().regs; - for (std::size_t i = 0; i < Maxwell::NumViewports; ++i) { - const auto& src = regs.viewports[i]; - const Common::Rectangle<f32> rect{regs.viewport_transform[i].GetRect()}; - glViewportIndexedf(static_cast<GLuint>(i), rect.left, rect.bottom, rect.GetWidth(), - rect.GetHeight()); - glDepthRangef(src.depth_range_near, src.depth_range_far); + auto& gpu = system.GPU().Maxwell3D(); + auto& flags = gpu.dirty.flags; + const auto& regs = gpu.regs; + + if (flags[Dirty::Viewports]) { + flags[Dirty::Viewports] = false; + + const bool force = flags[Dirty::ViewportTransform]; + flags[Dirty::ViewportTransform] = false; + + for (std::size_t i = 0; i < Maxwell::NumViewports; ++i) { + if (!force && !flags[Dirty::Viewport0 + i]) { + continue; + } + flags[Dirty::Viewport0 + i] = false; + + const Common::Rectangle<f32> rect{regs.viewport_transform[i].GetRect()}; + glViewportIndexedf(static_cast<GLuint>(i), rect.left, rect.bottom, rect.GetWidth(), + rect.GetHeight()); + + const auto& src = regs.viewports[i]; + glDepthRangeIndexed(static_cast<GLuint>(i), static_cast<GLdouble>(src.depth_range_near), + static_cast<GLdouble>(src.depth_range_far)); + } } bool flip_y = false; |