diff options
| author | 2019-12-30 00:22:43 -0300 | |
|---|---|---|
| committer | 2020-02-28 17:56:42 -0300 | |
| commit | 9e46953580eab7b5b1e7b813db0284a9d2f78f27 (patch) | |
| tree | 24d2afbe0569e069f680d02664819ce15b2b4fc9 /src | |
| parent | gl_state_tracker: Implement dirty flags for primitive restart (diff) | |
| download | yuzu-9e46953580eab7b5b1e7b813db0284a9d2f78f27.tar.gz yuzu-9e46953580eab7b5b1e7b813db0284a9d2f78f27.tar.xz yuzu-9e46953580eab7b5b1e7b813db0284a9d2f78f27.zip | |
gl_state_tracker: Implement dirty flags for polygon offsets
Diffstat (limited to 'src')
4 files changed, 24 insertions, 2 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index ebb072d91..78838b8d1 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -1249,9 +1249,14 @@ void RasterizerOpenGL::SyncPointState() { | |||
| 1249 | } | 1249 | } |
| 1250 | 1250 | ||
| 1251 | void RasterizerOpenGL::SyncPolygonOffset() { | 1251 | void RasterizerOpenGL::SyncPolygonOffset() { |
| 1252 | auto& maxwell3d = system.GPU().Maxwell3D(); | 1252 | auto& gpu = system.GPU().Maxwell3D(); |
| 1253 | const auto& regs = maxwell3d.regs; | 1253 | auto& flags = gpu.dirty.flags; |
| 1254 | if (!flags[Dirty::PolygonOffset]) { | ||
| 1255 | return; | ||
| 1256 | } | ||
| 1257 | flags[Dirty::PolygonOffset] = false; | ||
| 1254 | 1258 | ||
| 1259 | const auto& regs = gpu.regs; | ||
| 1255 | oglEnable(GL_POLYGON_OFFSET_FILL, regs.polygon_offset_fill_enable); | 1260 | oglEnable(GL_POLYGON_OFFSET_FILL, regs.polygon_offset_fill_enable); |
| 1256 | oglEnable(GL_POLYGON_OFFSET_LINE, regs.polygon_offset_line_enable); | 1261 | oglEnable(GL_POLYGON_OFFSET_LINE, regs.polygon_offset_line_enable); |
| 1257 | oglEnable(GL_POLYGON_OFFSET_POINT, regs.polygon_offset_point_enable); | 1262 | oglEnable(GL_POLYGON_OFFSET_POINT, regs.polygon_offset_point_enable); |
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.cpp b/src/video_core/renderer_opengl/gl_state_tracker.cpp index c07b7f136..7cb874ac9 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.cpp +++ b/src/video_core/renderer_opengl/gl_state_tracker.cpp | |||
| @@ -168,6 +168,16 @@ void SetupDirtyPrimitiveRestart(Tables& tables) { | |||
| 168 | FillBlock(tables[0], OFF(primitive_restart), NUM(primitive_restart), PrimitiveRestart); | 168 | FillBlock(tables[0], OFF(primitive_restart), NUM(primitive_restart), PrimitiveRestart); |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | void SetupDirtyPolygonOffset(Tables& tables) { | ||
| 172 | auto& table = tables[0]; | ||
| 173 | table[OFF(polygon_offset_fill_enable)] = PolygonOffset; | ||
| 174 | table[OFF(polygon_offset_line_enable)] = PolygonOffset; | ||
| 175 | table[OFF(polygon_offset_point_enable)] = PolygonOffset; | ||
| 176 | table[OFF(polygon_offset_factor)] = PolygonOffset; | ||
| 177 | table[OFF(polygon_offset_units)] = PolygonOffset; | ||
| 178 | table[OFF(polygon_offset_clamp)] = PolygonOffset; | ||
| 179 | } | ||
| 180 | |||
| 171 | void SetupDirtyMisc(Tables& tables) { | 181 | void SetupDirtyMisc(Tables& tables) { |
| 172 | auto& table = tables[0]; | 182 | auto& table = tables[0]; |
| 173 | 183 | ||
| @@ -197,6 +207,7 @@ void StateTracker::Initialize() { | |||
| 197 | SetupDirtyStencilTest(tables); | 207 | SetupDirtyStencilTest(tables); |
| 198 | SetupDirtyBlend(tables); | 208 | SetupDirtyBlend(tables); |
| 199 | SetupDirtyPrimitiveRestart(tables); | 209 | SetupDirtyPrimitiveRestart(tables); |
| 210 | SetupDirtyPolygonOffset(tables); | ||
| 200 | SetupDirtyMisc(tables); | 211 | SetupDirtyMisc(tables); |
| 201 | 212 | ||
| 202 | auto& store = dirty.on_write_stores; | 213 | auto& store = dirty.on_write_stores; |
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.h b/src/video_core/renderer_opengl/gl_state_tracker.h index af50b1a29..20c63595c 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.h +++ b/src/video_core/renderer_opengl/gl_state_tracker.h | |||
| @@ -140,6 +140,11 @@ public: | |||
| 140 | flags[OpenGL::Dirty::StencilTest] = true; | 140 | flags[OpenGL::Dirty::StencilTest] = true; |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | void NotifyPolygonOffset() { | ||
| 144 | auto& flags = system.GPU().Maxwell3D().dirty.flags; | ||
| 145 | flags[OpenGL::Dirty::PolygonOffset] = true; | ||
| 146 | } | ||
| 147 | |||
| 143 | private: | 148 | private: |
| 144 | Core::System& system; | 149 | Core::System& system; |
| 145 | }; | 150 | }; |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 2449e28ac..630406044 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -586,6 +586,7 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) { | |||
| 586 | state_tracker.NotifyCullTest(); | 586 | state_tracker.NotifyCullTest(); |
| 587 | state_tracker.NotifyDepthTest(); | 587 | state_tracker.NotifyDepthTest(); |
| 588 | state_tracker.NotifyStencilTest(); | 588 | state_tracker.NotifyStencilTest(); |
| 589 | state_tracker.NotifyPolygonOffset(); | ||
| 589 | 590 | ||
| 590 | program_manager.UseVertexShader(vertex_program.handle); | 591 | program_manager.UseVertexShader(vertex_program.handle); |
| 591 | program_manager.UseGeometryShader(0); | 592 | program_manager.UseGeometryShader(0); |