summaryrefslogtreecommitdiff
path: root/src/video_core/fence_manager.h
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-02-18 17:20:39 -0400
committerGravatar Fernando Sahmkow2020-04-22 11:36:15 -0400
commitb10db7e4a5f43414679b7969ea309b1829937a37 (patch)
tree5a2df21d974ee17488ee01960a823ae6f89d9edb /src/video_core/fence_manager.h
parentRasterizer: Document SignalFence & ReleaseFences and setup skeletons on Vulkan. (diff)
downloadyuzu-b10db7e4a5f43414679b7969ea309b1829937a37.tar.gz
yuzu-b10db7e4a5f43414679b7969ea309b1829937a37.tar.xz
yuzu-b10db7e4a5f43414679b7969ea309b1829937a37.zip
FenceManager: Implement async buffer cache flushes on High settings
Diffstat (limited to 'src/video_core/fence_manager.h')
-rw-r--r--src/video_core/fence_manager.h15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h
index 036f3996c..c4b190503 100644
--- a/src/video_core/fence_manager.h
+++ b/src/video_core/fence_manager.h
@@ -6,8 +6,8 @@
6 6
7#include <algorithm> 7#include <algorithm>
8#include <array> 8#include <array>
9#include <queue>
10#include <memory> 9#include <memory>
10#include <queue>
11 11
12#include "common/assert.h" 12#include "common/assert.h"
13#include "common/common_types.h" 13#include "common/common_types.h"
@@ -37,7 +37,7 @@ private:
37 u32 payload; 37 u32 payload;
38}; 38};
39 39
40template <typename TFence, typename TTextureCache> 40template <typename TFence, typename TTextureCache, typename TTBufferCache>
41class FenceManager { 41class FenceManager {
42public: 42public:
43 void SignalFence(GPUVAddr addr, u32 value) { 43 void SignalFence(GPUVAddr addr, u32 value) {
@@ -46,6 +46,7 @@ public:
46 QueueFence(new_fence); 46 QueueFence(new_fence);
47 fences.push(new_fence); 47 fences.push(new_fence);
48 texture_cache.CommitAsyncFlushes(); 48 texture_cache.CommitAsyncFlushes();
49 buffer_cache.CommitAsyncFlushes();
49 rasterizer.FlushCommands(); 50 rasterizer.FlushCommands();
50 rasterizer.SyncGuestHost(); 51 rasterizer.SyncGuestHost();
51 } 52 }
@@ -54,10 +55,12 @@ public:
54 while (!fences.empty()) { 55 while (!fences.empty()) {
55 TFence& current_fence = fences.front(); 56 TFence& current_fence = fences.front();
56 bool should_wait = texture_cache.ShouldWaitAsyncFlushes(); 57 bool should_wait = texture_cache.ShouldWaitAsyncFlushes();
58 should_wait |= buffer_cache.ShouldWaitAsyncFlushes();
57 if (should_wait) { 59 if (should_wait) {
58 WaitFence(current_fence); 60 WaitFence(current_fence);
59 } 61 }
60 texture_cache.PopAsyncFlushes(); 62 texture_cache.PopAsyncFlushes();
63 buffer_cache.PopAsyncFlushes();
61 auto& gpu{system.GPU()}; 64 auto& gpu{system.GPU()};
62 auto& memory_manager{gpu.MemoryManager()}; 65 auto& memory_manager{gpu.MemoryManager()};
63 memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload()); 66 memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload());
@@ -67,8 +70,9 @@ public:
67 70
68protected: 71protected:
69 FenceManager(Core::System& system, VideoCore::RasterizerInterface& rasterizer, 72 FenceManager(Core::System& system, VideoCore::RasterizerInterface& rasterizer,
70 TTextureCache& texture_cache) 73 TTextureCache& texture_cache, TTBufferCache& buffer_cache)
71 : system{system}, rasterizer{rasterizer}, texture_cache{texture_cache} {} 74 : system{system}, rasterizer{rasterizer}, texture_cache{texture_cache}, buffer_cache{
75 buffer_cache} {}
72 76
73 virtual TFence CreateFence(GPUVAddr addr, u32 value) = 0; 77 virtual TFence CreateFence(GPUVAddr addr, u32 value) = 0;
74 virtual void QueueFence(TFence& fence) = 0; 78 virtual void QueueFence(TFence& fence) = 0;
@@ -78,16 +82,19 @@ protected:
78 Core::System& system; 82 Core::System& system;
79 VideoCore::RasterizerInterface& rasterizer; 83 VideoCore::RasterizerInterface& rasterizer;
80 TTextureCache& texture_cache; 84 TTextureCache& texture_cache;
85 TTBufferCache& buffer_cache;
81 86
82private: 87private:
83 void TryReleasePendingFences() { 88 void TryReleasePendingFences() {
84 while (!fences.empty()) { 89 while (!fences.empty()) {
85 TFence& current_fence = fences.front(); 90 TFence& current_fence = fences.front();
86 bool should_wait = texture_cache.ShouldWaitAsyncFlushes(); 91 bool should_wait = texture_cache.ShouldWaitAsyncFlushes();
92 should_wait |= buffer_cache.ShouldWaitAsyncFlushes();
87 if (should_wait && !IsFenceSignaled(current_fence)) { 93 if (should_wait && !IsFenceSignaled(current_fence)) {
88 return; 94 return;
89 } 95 }
90 texture_cache.PopAsyncFlushes(); 96 texture_cache.PopAsyncFlushes();
97 buffer_cache.PopAsyncFlushes();
91 auto& gpu{system.GPU()}; 98 auto& gpu{system.GPU()};
92 auto& memory_manager{gpu.MemoryManager()}; 99 auto& memory_manager{gpu.MemoryManager()};
93 memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload()); 100 memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload());