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

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.
Lioncash 8 лет назад
Родитель
Сommit
59ea37daa7
1 измененных файлов с 4 добавлено и 2 удалено
  1. 4 2
      src/video_core/renderer_opengl/gl_rasterizer_cache.cpp

+ 4 - 2
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);
         }