summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-12-28 22:12:12 -0300
committerGravatar ReinUsesLisp2020-02-28 17:56:41 -0300
commit7f52efdf61d16d6eaa7eea2500ceb28d9f1041e1 (patch)
treea18e0a878c025c613b7dcf6f23db83011afda92e /src
parentrenderer_opengl: Reintroduce dirty flags for render targets (diff)
downloadyuzu-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.cpp31
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.cpp17
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.h10
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp5
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
908void RasterizerOpenGL::SyncViewport() { 908void 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
64void 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
66StateTracker::StateTracker(Core::System& system) : system{system} {} 82StateTracker::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));