From 3e484db1c52d7f8b950df40f971d384947972aa8 Mon Sep 17 00:00:00 2001 From: bunnei Date: Tue, 1 Oct 2019 23:53:43 -0400 Subject: [PATCH] android: video_core: gl_rasterizer_cache: Make cache access thread safe. --- src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | 8 ++++++++ src/video_core/renderer_opengl/gl_rasterizer_cache.h | 3 +++ 2 files changed, 11 insertions(+) diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp index dd80587fb..2b35636fc 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp @@ -1818,6 +1818,8 @@ void RasterizerCacheOpenGL::ClearAll(bool flush) { } void RasterizerCacheOpenGL::FlushRegion(PAddr addr, u32 size, Surface flush_surface) { + std::lock_guard lock{mutex}; + if (size == 0) return; @@ -1854,6 +1856,8 @@ void RasterizerCacheOpenGL::FlushAll() { } void RasterizerCacheOpenGL::InvalidateRegion(PAddr addr, u32 size, const Surface& region_owner) { + std::lock_guard lock{mutex}; + if (size == 0) return; @@ -1930,6 +1934,8 @@ Surface RasterizerCacheOpenGL::CreateSurface(const SurfaceParams& params) { } void RasterizerCacheOpenGL::RegisterSurface(const Surface& surface) { + std::lock_guard lock{mutex}; + if (surface->registered) { return; } @@ -1939,6 +1945,8 @@ void RasterizerCacheOpenGL::RegisterSurface(const Surface& surface) { } void RasterizerCacheOpenGL::UnregisterSurface(const Surface& surface) { + std::lock_guard lock{mutex}; + if (!surface->registered) { return; } diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h index 1a9b6a3b3..a9ee8effa 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #ifdef __GNUC__ @@ -325,6 +326,8 @@ private: std::unordered_map texture_cube_cache; + std::recursive_mutex mutex; + public: std::unique_ptr texture_filterer; std::unique_ptr format_reinterpreter;