From 59ea37daa7b822f26737bface58a050ed2899fec Mon Sep 17 00:00:00 2001
From: Lioncash <mathew1800@gmail.com>
Date: Thu, 9 Aug 2018 15:24:17 -0400
Subject: [PATCH] gl_rasterizer_cache: Avoid iterator invalidation issues
 within InvalidateRegion()

A range-based for loop can't be used when the container being iterated
is also being erased from.
---
 src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index 8b6d1b89d..c447e999c 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -761,10 +761,12 @@ void RasterizerCacheOpenGL::FlushRegion(Tegra::GPUVAddr /*addr*/, size_t /*size*
 }
 
 void RasterizerCacheOpenGL::InvalidateRegion(Tegra::GPUVAddr addr, size_t size) {
-    for (const auto& pair : surface_cache) {
-        const auto& surface{pair.second};
+    for (auto iter = surface_cache.cbegin(); iter != surface_cache.cend();) {
+        const auto& surface{iter->second};
         const auto& params{surface->GetSurfaceParams()};
 
+        ++iter;
+
         if (params.IsOverlappingRegion(addr, size)) {
             UnregisterSurface(surface);
         }