diff options
| author | 2018-08-09 15:24:17 -0400 | |
|---|---|---|
| committer | 2018-08-09 15:30:20 -0400 | |
| commit | 59ea37daa7b822f26737bface58a050ed2899fec (patch) | |
| tree | 4054818d5fa4096173b656aa8a2994c3a2ec0c22 /src | |
| parent | Merge pull request #992 from bunnei/declr-pred (diff) | |
| download | yuzu-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.cpp | 6 |
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 | ||
| 763 | void RasterizerCacheOpenGL::InvalidateRegion(Tegra::GPUVAddr addr, size_t size) { | 763 | void 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 | } |