diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h
index 8edfa6a342..beaf3ffb62 100644
--- a/src/video_core/engines/maxwell_3d.h
+++ b/src/video_core/engines/maxwell_3d.h
@@ -1273,9 +1273,7 @@ public:
 
     /// Notify a memory write has happened.
     void OnMemoryWrite() {
-        for (const u8 store : dirty.on_write_stores) {
-            dirty.flags[store] = true;
-        }
+        dirty.flags |= dirty.on_write_stores;
     }
 
     enum class MMEDrawMode : u32 {
@@ -1295,8 +1293,8 @@ public:
 
     struct {
         std::bitset<std::numeric_limits<u8>::max()> flags;
+        std::bitset<std::numeric_limits<u8>::max()> on_write_stores;
         std::array<std::array<u8, Regs::NUM_REGS>, 3> tables{};
-        std::array<u8, 32> on_write_stores{};
     } dirty;
 
 private:
diff --git a/src/video_core/renderer_opengl/gl_state_tracker.cpp b/src/video_core/renderer_opengl/gl_state_tracker.cpp
index 572a438566..319fd825bb 100644
--- a/src/video_core/renderer_opengl/gl_state_tracker.cpp
+++ b/src/video_core/renderer_opengl/gl_state_tracker.cpp
@@ -110,23 +110,23 @@ StateTracker::StateTracker(Core::System& system) : system{system} {}
 
 void StateTracker::Initialize() {
     auto& dirty = system.GPU().Maxwell3D().dirty;
-    std::size_t entry_index = 0;
-    const auto AddEntry = [&dirty, &entry_index](std::size_t dirty_register) {
-        dirty.on_write_stores[entry_index++] = static_cast<u8>(dirty_register);
-    };
-
-    AddEntry(RenderTargets);
-    for (std::size_t i = 0; i < Regs::NumRenderTargets; ++i) {
-        AddEntry(ColorBuffer0 + i);
-    }
-    AddEntry(ZetaBuffer);
-
     auto& tables = dirty.tables;
     SetupDirtyRenderTargets(tables);
     SetupDirtyColorMasks(tables);
     SetupDirtyViewports(tables);
     SetupDirtyScissors(tables);
     SetupDirtyVertexFormat(tables);
+
+    auto& store = dirty.on_write_stores;
+    store[RenderTargets] = true;
+    store[ZetaBuffer] = true;
+    for (std::size_t i = 0; i < Regs::NumRenderTargets; ++i) {
+        store[ColorBuffer0 + i] = true;
+    }
+    store[VertexBuffers] = true;
+    for (std::size_t i = 0; i < Regs::NumVertexArrays; ++i) {
+        store[VertexBuffer0 + i] = true;
+    }
 }
 
 } // 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 7add22d888..a368aefd75 100644
--- a/src/video_core/renderer_opengl/gl_state_tracker.h
+++ b/src/video_core/renderer_opengl/gl_state_tracker.h
@@ -4,6 +4,8 @@
 
 #pragma once
 
+#include <limits>
+
 #include "common/common_types.h"
 #include "video_core/dirty_flags.h"
 #include "video_core/engines/maxwell_3d.h"
@@ -58,7 +60,7 @@ enum : u8 {
 
     Last
 };
-static_assert(Last <= 0xff);
+static_assert(Last <= std::numeric_limits<u8>::max());
 
 } // namespace Dirty