diff options
5 files changed, 58 insertions, 10 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 2427b8c07..2ec4c9f55 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -1102,12 +1102,28 @@ void RasterizerOpenGL::SyncLogicOpState() { | |||
| 1102 | } | 1102 | } |
| 1103 | 1103 | ||
| 1104 | void RasterizerOpenGL::SyncScissorTest() { | 1104 | void RasterizerOpenGL::SyncScissorTest() { |
| 1105 | const auto& regs = system.GPU().Maxwell3D().regs; | 1105 | auto& gpu = system.GPU().Maxwell3D(); |
| 1106 | auto& flags = gpu.dirty.flags; | ||
| 1107 | if (!flags[Dirty::Scissors]) { | ||
| 1108 | return; | ||
| 1109 | } | ||
| 1110 | flags[Dirty::Scissors] = false; | ||
| 1111 | |||
| 1112 | const auto& regs = gpu.regs; | ||
| 1106 | for (std::size_t index = 0; index < Maxwell::NumViewports; ++index) { | 1113 | for (std::size_t index = 0; index < Maxwell::NumViewports; ++index) { |
| 1114 | if (!flags[Dirty::Scissor0 + index]) { | ||
| 1115 | continue; | ||
| 1116 | } | ||
| 1117 | flags[Dirty::Scissor0 + index] = false; | ||
| 1118 | |||
| 1107 | const auto& src = regs.scissor_test[index]; | 1119 | const auto& src = regs.scissor_test[index]; |
| 1108 | oglEnablei(GL_SCISSOR_TEST, src.enable, static_cast<GLuint>(index)); | 1120 | if (src.enable) { |
| 1109 | glScissorIndexed(static_cast<GLuint>(index), src.min_x, src.min_y, src.max_x - src.min_x, | 1121 | glEnablei(GL_SCISSOR_TEST, static_cast<GLuint>(index)); |
| 1110 | src.max_y - src.min_y); | 1122 | glScissorIndexed(static_cast<GLuint>(index), src.min_x, src.min_y, |
| 1123 | src.max_x - src.min_x, src.max_y - src.min_y); | ||
| 1124 | } else { | ||
| 1125 | glDisablei(GL_SCISSOR_TEST, static_cast<GLuint>(index)); | ||
| 1126 | } | ||
| 1111 | } | 1127 | } |
| 1112 | } | 1128 | } |
| 1113 | 1129 | ||
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.cpp b/src/video_core/renderer_opengl/gl_state_tracker.cpp index 6293f6102..9e1db59ae 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.cpp +++ b/src/video_core/renderer_opengl/gl_state_tracker.cpp | |||
| @@ -77,6 +77,14 @@ void SetupDirtyViewports(Tables& tables) { | |||
| 77 | tables[1][OFF(viewport_transform_enabled)] = Viewports; | 77 | tables[1][OFF(viewport_transform_enabled)] = Viewports; |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | void SetupDirtyScissors(Tables& tables) { | ||
| 81 | for (std::size_t i = 0; i < Regs::NumViewports; ++i) { | ||
| 82 | const std::size_t offset = OFF(scissor_test) + i * NUM(scissor_test[0]); | ||
| 83 | FillBlock(tables[0], offset, NUM(scissor_test[0]), Scissor0 + i); | ||
| 84 | } | ||
| 85 | FillBlock(tables[1], OFF(scissor_test), NUM(scissor_test), Scissors); | ||
| 86 | } | ||
| 87 | |||
| 80 | } // Anonymous namespace | 88 | } // Anonymous namespace |
| 81 | 89 | ||
| 82 | StateTracker::StateTracker(Core::System& system) : system{system} {} | 90 | StateTracker::StateTracker(Core::System& system) : system{system} {} |
| @@ -97,6 +105,7 @@ void StateTracker::Initialize() { | |||
| 97 | auto& tables = dirty.tables; | 105 | auto& tables = dirty.tables; |
| 98 | SetupDirtyRenderTargets(tables); | 106 | SetupDirtyRenderTargets(tables); |
| 99 | SetupDirtyViewports(tables); | 107 | SetupDirtyViewports(tables); |
| 108 | SetupDirtyScissors(tables); | ||
| 100 | } | 109 | } |
| 101 | 110 | ||
| 102 | } // namespace OpenGL | 111 | } // 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 93c64a44a..5153dc5d1 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.h +++ b/src/video_core/renderer_opengl/gl_state_tracker.h | |||
| @@ -15,15 +15,30 @@ class System; | |||
| 15 | namespace OpenGL { | 15 | namespace OpenGL { |
| 16 | 16 | ||
| 17 | namespace Dirty { | 17 | namespace Dirty { |
| 18 | |||
| 18 | enum : u8 { | 19 | enum : u8 { |
| 19 | First = VideoCommon::Dirty::LastCommonEntry, | 20 | First = VideoCommon::Dirty::LastCommonEntry, |
| 20 | 21 | ||
| 21 | VertexFormats, | 22 | VertexFormats, |
| 23 | |||
| 22 | VertexBuffers, | 24 | VertexBuffers, |
| 25 | VertexBuffer0, | ||
| 26 | VertexBuffer31 = VertexBuffer0 + 31, | ||
| 27 | |||
| 23 | VertexInstances, | 28 | VertexInstances, |
| 24 | Shaders, | 29 | VertexInstance0, |
| 25 | Viewports, | 30 | VertexInstance31 = VertexInstance0 + 31, |
| 31 | |||
| 26 | ViewportTransform, | 32 | ViewportTransform, |
| 33 | Viewports, | ||
| 34 | Viewport0, | ||
| 35 | Viewport15 = Viewport0 + 15, | ||
| 36 | |||
| 37 | Scissors, | ||
| 38 | Scissor0, | ||
| 39 | Scissor15 = Scissor0 + 15, | ||
| 40 | |||
| 41 | Shaders, | ||
| 27 | CullTestEnable, | 42 | CullTestEnable, |
| 28 | FrontFace, | 43 | FrontFace, |
| 29 | CullFace, | 44 | CullFace, |
| @@ -34,11 +49,11 @@ enum : u8 { | |||
| 34 | BlendState, | 49 | BlendState, |
| 35 | PolygonOffset, | 50 | PolygonOffset, |
| 36 | 51 | ||
| 37 | Viewport0, | 52 | Last |
| 38 | VertexBuffer0 = Viewport0 + 16, | ||
| 39 | VertexInstance0 = VertexBuffer0 + 32, | ||
| 40 | }; | 53 | }; |
| 41 | } | 54 | static_assert(Last <= 0xff); |
| 55 | |||
| 56 | } // namespace Dirty | ||
| 42 | 57 | ||
| 43 | class StateTracker { | 58 | class StateTracker { |
| 44 | public: | 59 | public: |
| @@ -52,6 +67,12 @@ public: | |||
| 52 | flags[OpenGL::Dirty::Viewport0] = true; | 67 | flags[OpenGL::Dirty::Viewport0] = true; |
| 53 | } | 68 | } |
| 54 | 69 | ||
| 70 | void NotifyScissor0() { | ||
| 71 | auto& flags = system.GPU().Maxwell3D().dirty.flags; | ||
| 72 | flags[OpenGL::Dirty::Scissors] = true; | ||
| 73 | flags[OpenGL::Dirty::Scissor0] = true; | ||
| 74 | } | ||
| 75 | |||
| 55 | void NotifyFramebuffer() { | 76 | void NotifyFramebuffer() { |
| 56 | auto& flags = system.GPU().Maxwell3D().dirty.flags; | 77 | auto& flags = system.GPU().Maxwell3D().dirty.flags; |
| 57 | flags[VideoCommon::Dirty::RenderTargets] = true; | 78 | flags[VideoCommon::Dirty::RenderTargets] = true; |
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 1cadcf287..a02326b9f 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp | |||
| @@ -519,6 +519,7 @@ void TextureCacheOpenGL::ImageBlit(View& src_view, View& dst_view, | |||
| 519 | UNIMPLEMENTED_IF(dst_params.target == SurfaceTarget::Texture3D); | 519 | UNIMPLEMENTED_IF(dst_params.target == SurfaceTarget::Texture3D); |
| 520 | 520 | ||
| 521 | // TODO: Signal state tracker about these changes | 521 | // TODO: Signal state tracker about these changes |
| 522 | state_tracker.NotifyScissor0(); | ||
| 522 | state_tracker.NotifyFramebuffer(); | 523 | state_tracker.NotifyFramebuffer(); |
| 523 | 524 | ||
| 524 | if (dst_params.srgb_conversion) { | 525 | if (dst_params.srgb_conversion) { |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 73d2d9027..f2b07ac81 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -577,6 +577,7 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) { | |||
| 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.NotifyViewport0(); |
| 580 | state_tracker.NotifyScissor0(); | ||
| 580 | state_tracker.NotifyFramebuffer(); | 581 | state_tracker.NotifyFramebuffer(); |
| 581 | 582 | ||
| 582 | program_manager.UseVertexShader(vertex_program.handle); | 583 | program_manager.UseVertexShader(vertex_program.handle); |