ソースを参照

texture_cache: Implement Guard mechanism

Fernando Sahmkow 7 年 前
コミット
a79831d9d0

+ 4 - 0
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -424,6 +424,8 @@ std::pair<bool, bool> RasterizerOpenGL::ConfigureFramebuffers(
     }
     current_framebuffer_config_state = fb_config_state;
 
+    texture_cache.Guard(true);
+
     View depth_surface{};
     if (using_depth_fb) {
         depth_surface = texture_cache.GetDepthBufferSurface(preserve_contents);
@@ -500,6 +502,8 @@ std::pair<bool, bool> RasterizerOpenGL::ConfigureFramebuffers(
                                depth_surface->GetSurfaceParams().type == SurfaceType::DepthStencil;
     }
 
+    texture_cache.Guard(false);
+
     current_state.draw.draw_framebuffer = framebuffer_cache.GetFramebuffer(fbkey);
     SyncViewport(current_state);
 

+ 8 - 1
src/video_core/texture_cache/texture_cache.h

@@ -64,6 +64,10 @@ public:
         }
     }
 
+    void Guard(bool new_guard) {
+        guard_cache = new_guard;
+    }
+
     void FlushRegion(CacheAddr addr, std::size_t size) {
         std::lock_guard lock{mutex};
 
@@ -251,7 +255,7 @@ protected:
     void Unregister(TSurface surface) {
         std::lock_guard lock{mutex};
 
-        if (surface->IsProtected()) {
+        if (guard_cache && surface->IsProtected()) {
             return;
         }
         const GPUVAddr gpu_addr = surface->GetGpuAddr();
@@ -573,6 +577,9 @@ private:
 
     u64 ticks{};
 
+    // Guards the cache for protection conflicts.
+    bool guard_cache{};
+
     // The internal Cache is different for the Texture Cache. It's based on buckets
     // of 1MB. This fits better for the purpose of this cache as textures are normaly
     // large in size.