From 07cc7e0c12143a84744abb8dc03eb46eb615b308 Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Fri, 10 May 2019 23:50:01 -0400
Subject: [PATCH] texture_cache: Add ASync Protections

---
 src/video_core/texture_cache/texture_cache.h | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 4ac5668c85..1b8ada9101 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -5,6 +5,7 @@
 #pragma once
 
 #include <memory>
+#include <mutex>
 #include <set>
 #include <tuple>
 #include <unordered_map>
@@ -56,12 +57,16 @@ public:
     }
 
     void InvalidateRegion(CacheAddr addr, std::size_t size) {
+        std::lock_guard lock{mutex};
+
         for (const auto& surface : GetSurfacesInRegion(addr, size)) {
             Unregister(surface);
         }
     }
 
     void FlushRegion(CacheAddr addr, std::size_t size) {
+        std::lock_guard lock{mutex};
+
         auto surfaces = GetSurfacesInRegion(addr, size);
         if (surfaces.empty()) {
             return;
@@ -220,6 +225,8 @@ protected:
                            const Common::Rectangle<u32>& dst_rect) = 0;
 
     void Register(TSurface surface) {
+        std::lock_guard lock{mutex};
+
         const GPUVAddr gpu_addr = surface->GetGpuAddr();
         const CacheAddr cache_ptr = ToCacheAddr(memory_manager->GetPointer(gpu_addr));
         const std::size_t size = surface->GetSizeInBytes();
@@ -237,6 +244,8 @@ protected:
     }
 
     void Unregister(TSurface surface) {
+        std::lock_guard lock{mutex};
+
         if (surface->IsProtected()) {
             return;
         }
@@ -579,6 +588,7 @@ private:
     FramebufferTargetInfo depth_buffer;
 
     std::vector<u8> staging_buffer;
+    std::recursive_mutex mutex;
 };
 
 } // namespace VideoCommon