diff options
| author | 2019-12-28 22:12:12 -0300 | |
|---|---|---|
| committer | 2020-02-28 17:56:41 -0300 | |
| commit | 7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1 (patch) | |
| tree | a18e0a878c025c613b7dcf6f23db83011afda92e /src | |
| parent | renderer_opengl: Reintroduce dirty flags for render targets (diff) | |
| download | yuzu-7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1.tar.gz yuzu-7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1.tar.xz yuzu-7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1.zip | |
gl_state_tracker: Implement dirty flags for viewports
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 31 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state_tracker.cpp | 17 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state_tracker.h | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 5 |
4 files changed, 54 insertions, 9 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 | |||
| 906 | } | 906 | } |
| 907 | 907 | ||
| 908 | void RasterizerOpenGL::SyncViewport() { | 908 | void RasterizerOpenGL::SyncViewport() { |
| 909 | const auto& regs = system.GPU().Maxwell3D().regs; | 909 | auto& gpu = system.GPU().Maxwell3D(); |
| 910 | for (std::size_t i = 0; i < Maxwell::NumViewports; ++i) { | 910 | auto& flags = gpu.dirty.flags; |
| 911 | const auto& src = regs.viewports[i]; | 911 | const auto& regs = gpu.regs; |
| 912 | const Common::Rectangle<f32> rect{regs.viewport_transform[i].GetRect()}; | 912 | |
| 913 | glViewportIndexedf(static_cast<GLuint>(i), rect.left, rect.bottom, rect.GetWidth(), | 913 | if (flags[Dirty::Viewports]) { |
| 914 | rect.GetHeight()); | 914 | flags[Dirty::Viewports] = false; |
| 915 | glDepthRangef(src.depth_range_near, src.depth_range_far); | 915 | |
| 916 | const bool force = flags[Dirty::ViewportTransform]; | ||
| 917 | flags[Dirty::ViewportTransform] = false; | ||
| 918 | |||
| 919 | for (std::size_t i = 0; i < Maxwell::NumViewports; ++i) { | ||
| 920 | if (!force && !flags[Dirty::Viewport0 + i]) { | ||
| 921 | continue; | ||
| 922 | } | ||
| 923 | flags[Dirty::Viewport0 + i] = false; | ||
| 924 | |||
| 925 | const Common::Rectangle<f32> rect{regs.viewport_transform[i].GetRect()}; | ||
| 926 | glViewportIndexedf(static_cast<GLuint>(i), rect.left, rect.bottom, rect.GetWidth(), | ||
| 927 | rect.GetHeight()); | ||
| 928 | |||
| 929 | const auto& src = regs.viewports[i]; | ||
| 930 | glDepthRangeIndexed(static_cast<GLuint>(i), static_cast<GLdouble>(src.depth_range_near), | ||
| 931 | static_cast<GLdouble>(src.depth_range_far)); | ||
| 932 | } | ||
| 916 | } | 933 | } |
| 917 | 934 | ||
| 918 | bool flip_y = false; | 935 | bool flip_y = false; |
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.cpp b/src/video_core/renderer_opengl/gl_state_tracker.cpp index 268b9351e..6293f6102 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.cpp +++ b/src/video_core/renderer_opengl/gl_state_tracker.cpp | |||
| @@ -61,6 +61,22 @@ void SetupDirtyRenderTargets(Tables& tables) { | |||
| 61 | } | 61 | } |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | void SetupDirtyViewports(Tables& tables) { | ||
| 65 | for (std::size_t i = 0; i < Regs::NumViewports; ++i) { | ||
| 66 | const std::size_t transf_offset = OFF(viewport_transform) + i * NUM(viewport_transform[0]); | ||
| 67 | const std::size_t viewport_offset = OFF(viewports) + i * NUM(viewports[0]); | ||
| 68 | |||
| 69 | FillBlock(tables[0], transf_offset, NUM(viewport_transform[0]), Viewport0 + i); | ||
| 70 | FillBlock(tables[0], viewport_offset, NUM(viewports[0]), Viewport0 + i); | ||
| 71 | } | ||
| 72 | |||
| 73 | FillBlock(tables[1], OFF(viewport_transform), NUM(viewport_transform), Viewports); | ||
| 74 | FillBlock(tables[1], OFF(viewports), NUM(viewports), Viewports); | ||
| 75 | |||
| 76 | tables[0][OFF(viewport_transform_enabled)] = ViewportTransform; | ||
| 77 | tables[1][OFF(viewport_transform_enabled)] = Viewports; | ||
| 78 | } | ||
| 79 | |||
| 64 | } // Anonymous namespace | 80 | } // Anonymous namespace |
| 65 | 81 | ||
| 66 | StateTracker::StateTracker(Core::System& system) : system{system} {} | 82 | StateTracker::StateTracker(Core::System& system) : system{system} {} |
| @@ -80,6 +96,7 @@ void StateTracker::Initialize() { | |||
| 80 | 96 | ||
| 81 | auto& tables = dirty.tables; | 97 | auto& tables = dirty.tables; |
| 82 | SetupDirtyRenderTargets(tables); | 98 | SetupDirtyRenderTargets(tables); |
| 99 | SetupDirtyViewports(tables); | ||
| 83 | } | 100 | } |
| 84 | 101 | ||
| 85 | } // namespace OpenGL | 102 | } // 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 91d4bb8d3..93c64a44a 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.h +++ b/src/video_core/renderer_opengl/gl_state_tracker.h | |||
| @@ -23,6 +23,7 @@ enum : u8 { | |||
| 23 | VertexInstances, | 23 | VertexInstances, |
| 24 | Shaders, | 24 | Shaders, |
| 25 | Viewports, | 25 | Viewports, |
| 26 | ViewportTransform, | ||
| 26 | CullTestEnable, | 27 | CullTestEnable, |
| 27 | FrontFace, | 28 | FrontFace, |
| 28 | CullFace, | 29 | CullFace, |
| @@ -33,7 +34,8 @@ enum : u8 { | |||
| 33 | BlendState, | 34 | BlendState, |
| 34 | PolygonOffset, | 35 | PolygonOffset, |
| 35 | 36 | ||
| 36 | VertexBuffer0 = PolygonOffset + 8, | 37 | Viewport0, |
| 38 | VertexBuffer0 = Viewport0 + 16, | ||
| 37 | VertexInstance0 = VertexBuffer0 + 32, | 39 | VertexInstance0 = VertexBuffer0 + 32, |
| 38 | }; | 40 | }; |
| 39 | } | 41 | } |
| @@ -44,6 +46,12 @@ public: | |||
| 44 | 46 | ||
| 45 | void Initialize(); | 47 | void Initialize(); |
| 46 | 48 | ||
| 49 | void NotifyViewport0() { | ||
| 50 | auto& flags = system.GPU().Maxwell3D().dirty.flags; | ||
| 51 | flags[OpenGL::Dirty::Viewports] = true; | ||
| 52 | flags[OpenGL::Dirty::Viewport0] = true; | ||
| 53 | } | ||
| 54 | |||
| 47 | void NotifyFramebuffer() { | 55 | void NotifyFramebuffer() { |
| 48 | auto& flags = system.GPU().Maxwell3D().dirty.flags; | 56 | auto& flags = system.GPU().Maxwell3D().dirty.flags; |
| 49 | flags[VideoCommon::Dirty::RenderTargets] = true; | 57 | flags[VideoCommon::Dirty::RenderTargets] = true; |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 36c634e0d..73d2d9027 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -576,6 +576,7 @@ 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.NotifyViewport0(); | ||
| 579 | state_tracker.NotifyFramebuffer(); | 580 | state_tracker.NotifyFramebuffer(); |
| 580 | 581 | ||
| 581 | program_manager.UseVertexShader(vertex_program.handle); | 582 | program_manager.UseVertexShader(vertex_program.handle); |
| @@ -601,7 +602,9 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) { | |||
| 601 | glFrontFace(GL_CW); | 602 | glFrontFace(GL_CW); |
| 602 | glColorMaski(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); | 603 | glColorMaski(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); |
| 603 | glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE); | 604 | glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE); |
| 604 | glViewport(0, 0, layout.width, layout.height); | 605 | glViewportIndexedf(0, 0.0f, 0.0f, static_cast<GLfloat>(layout.width), |
| 606 | static_cast<GLfloat>(layout.height)); | ||
| 607 | glDepthRangeIndexed(0, 0.0, 0.0); | ||
| 605 | 608 | ||
| 606 | glVertexAttribFormat(PositionLocation, 2, GL_FLOAT, GL_FALSE, | 609 | glVertexAttribFormat(PositionLocation, 2, GL_FLOAT, GL_FALSE, |
| 607 | offsetof(ScreenRectVertex, position)); | 610 | offsetof(ScreenRectVertex, position)); |