Просмотр исходного кода

gl_state_tracker: Implement dirty flags for primitive restart

ReinUsesLisp 6 лет назад
Родитель
Сommit
46a1888e02

+ 12 - 3
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -1017,10 +1017,19 @@ void RasterizerOpenGL::SyncCullMode() {
 }
 
 void RasterizerOpenGL::SyncPrimitiveRestart() {
-    const auto& regs = system.GPU().Maxwell3D().regs;
+    auto& gpu = system.GPU().Maxwell3D();
+    auto& flags = gpu.dirty.flags;
+    if (!flags[Dirty::PrimitiveRestart]) {
+        return;
+    }
+    flags[Dirty::PrimitiveRestart] = false;
 
-    oglEnable(GL_PRIMITIVE_RESTART, regs.primitive_restart.enabled);
-    glPrimitiveRestartIndex(regs.primitive_restart.index);
+    if (gpu.regs.primitive_restart.enabled) {
+        glEnable(GL_PRIMITIVE_RESTART);
+        glPrimitiveRestartIndex(gpu.regs.primitive_restart.index);
+    } else {
+        glDisable(GL_PRIMITIVE_RESTART);
+    }
 }
 
 void RasterizerOpenGL::SyncDepthTestState() {

+ 5 - 0
src/video_core/renderer_opengl/gl_state_tracker.cpp

@@ -164,6 +164,10 @@ void SetupDirtyBlend(Tables& tables) {
     FillBlock(tables[1], OFF(blend), NUM(blend), BlendStates);
 }
 
+void SetupDirtyPrimitiveRestart(Tables& tables) {
+    FillBlock(tables[0], OFF(primitive_restart), NUM(primitive_restart), PrimitiveRestart);
+}
+
 void SetupDirtyMisc(Tables& tables) {
     auto& table = tables[0];
 
@@ -192,6 +196,7 @@ void StateTracker::Initialize() {
     SetupDirtyDepthTest(tables);
     SetupDirtyStencilTest(tables);
     SetupDirtyBlend(tables);
+    SetupDirtyPrimitiveRestart(tables);
     SetupDirtyMisc(tables);
 
     auto& store = dirty.on_write_stores;

+ 2 - 2
src/video_core/renderer_opengl/gl_state_tracker.h

@@ -56,13 +56,13 @@ enum : u8 {
     Shaders,
     ClipDistances,
 
+    ColorMask,
     FrontFace,
     CullTest,
     DepthMask,
     DepthTest,
-    PrimitiveRestart,
     StencilTest,
-    ColorMask,
+    PrimitiveRestart,
     PolygonOffset,
 
     Last