summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2018-08-09 15:24:17 -0400
committerGravatar Lioncash2018-08-09 15:30:20 -0400
commit59ea37daa7b822f26737bface58a050ed2899fec (patch)
tree4054818d5fa4096173b656aa8a2994c3a2ec0c22 /src
parentMerge pull request #992 from bunnei/declr-pred (diff)
downloadyuzu-59ea37daa7b822f26737bface58a050ed2899fec.tar.gz
yuzu-59ea37daa7b822f26737bface58a050ed2899fec.tar.xz
yuzu-59ea37daa7b822f26737bface58a050ed2899fec.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp6
1 files 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*
761} 761}
762 762
763void RasterizerCacheOpenGL::InvalidateRegion(Tegra::GPUVAddr addr, size_t size) { 763void RasterizerCacheOpenGL::InvalidateRegion(Tegra::GPUVAddr addr, size_t size) {
764 for (const auto& pair : surface_cache) { 764 for (auto iter = surface_cache.cbegin(); iter != surface_cache.cend();) {
765 const auto& surface{pair.second}; 765 const auto& surface{iter->second};
766 const auto& params{surface->GetSurfaceParams()}; 766 const auto& params{surface->GetSurfaceParams()};
767 767
768 ++iter;
769
768 if (params.IsOverlappingRegion(addr, size)) { 770 if (params.IsOverlappingRegion(addr, size)) {
769 UnregisterSurface(surface); 771 UnregisterSurface(surface);
770 } 772 }