From 5a31aa175d9e4ee0e7f6b16e8f5bc79563b26495 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 3b30ec4c4..262a936cf 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp @@ -1832,6 +1832,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; @@ -1868,6 +1870,8 @@ void RasterizerCacheOpenGL::FlushAll() { } void RasterizerCacheOpenGL::InvalidateRegion(PAddr addr, u32 size, const Surface& region_owner) { + std::lock_guard lock{mutex}; + if (size == 0) return; @@ -1943,6 +1947,8 @@ Surface RasterizerCacheOpenGL::CreateSurface(const SurfaceParams& params) { } void RasterizerCacheOpenGL::RegisterSurface(const Surface& surface) { + std::lock_guard lock{mutex}; + if (surface->registered) { return; } @@ -1952,6 +1958,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 108aa7bad..6f7b7443a 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__ @@ -365,6 +366,8 @@ private: std::unordered_map texture_cube_cache; + std::recursive_mutex mutex; + public: OGLTexture AllocateSurfaceTexture(const FormatTuple& format_tuple, u32 width, u32 height);