summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp24
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.cpp9
-rw-r--r--src/video_core/renderer_opengl/gl_state_tracker.h33
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp1
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp1
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
1104void RasterizerOpenGL::SyncScissorTest() { 1104void 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
80void 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
82StateTracker::StateTracker(Core::System& system) : system{system} {} 90StateTracker::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;
15namespace OpenGL { 15namespace OpenGL {
16 16
17namespace Dirty { 17namespace Dirty {
18
18enum : u8 { 19enum : 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} 54static_assert(Last <= 0xff);
55
56} // namespace Dirty
42 57
43class StateTracker { 58class StateTracker {
44public: 59public:
@@ -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);