Просмотр исходного кода

texture_cache: Add ASync Protections

Fernando Sahmkow 7 лет назад
Родитель
Сommit
07cc7e0c12
1 измененных файлов с 10 добавлено и 0 удалено
  1. 10 0
      src/video_core/texture_cache/texture_cache.h

+ 10 - 0
src/video_core/texture_cache/texture_cache.h

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