summaryrefslogtreecommitdiff
path: root/src/video_core/fence_manager.h
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-04-15 16:36:14 -0400
committerGravatar Fernando Sahmkow2020-04-22 11:36:18 -0400
commit0649f0590047e8cc0b16a10dec5eb74938fef718 (patch)
treeb56cf7fb42c31f0012b063d356dc2b1eb1126a42 /src/video_core/fence_manager.h
parentOpenGL: Guarantee writes to Buffers. (diff)
downloadyuzu-0649f0590047e8cc0b16a10dec5eb74938fef718.tar.gz
yuzu-0649f0590047e8cc0b16a10dec5eb74938fef718.tar.xz
yuzu-0649f0590047e8cc0b16a10dec5eb74938fef718.zip
QueryCache: Implement Async Flushes.
Diffstat (limited to 'src/video_core/fence_manager.h')
-rw-r--r--src/video_core/fence_manager.h18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h
index 417cb113f..99a138b5b 100644
--- a/src/video_core/fence_manager.h
+++ b/src/video_core/fence_manager.h
@@ -49,15 +49,17 @@ protected:
49 bool is_stubbed; 49 bool is_stubbed;
50}; 50};
51 51
52template <typename TFence, typename TTextureCache, typename TTBufferCache> 52template <typename TFence, typename TTextureCache, typename TTBufferCache, typename TQueryCache>
53class FenceManager { 53class FenceManager {
54public: 54public:
55 void SignalSemaphore(GPUVAddr addr, u32 value) { 55 void SignalSemaphore(GPUVAddr addr, u32 value) {
56 TryReleasePendingFences(); 56 TryReleasePendingFences();
57 bool should_flush = texture_cache.HasUncommitedFlushes(); 57 bool should_flush = texture_cache.HasUncommitedFlushes();
58 should_flush |= buffer_cache.HasUncommitedFlushes(); 58 should_flush |= buffer_cache.HasUncommitedFlushes();
59 should_flush |= query_cache.HasUncommitedFlushes();
59 texture_cache.CommitAsyncFlushes(); 60 texture_cache.CommitAsyncFlushes();
60 buffer_cache.CommitAsyncFlushes(); 61 buffer_cache.CommitAsyncFlushes();
62 query_cache.CommitAsyncFlushes();
61 TFence new_fence = CreateFence(addr, value, !should_flush); 63 TFence new_fence = CreateFence(addr, value, !should_flush);
62 fences.push(new_fence); 64 fences.push(new_fence);
63 QueueFence(new_fence); 65 QueueFence(new_fence);
@@ -71,8 +73,10 @@ public:
71 TryReleasePendingFences(); 73 TryReleasePendingFences();
72 bool should_flush = texture_cache.HasUncommitedFlushes(); 74 bool should_flush = texture_cache.HasUncommitedFlushes();
73 should_flush |= buffer_cache.HasUncommitedFlushes(); 75 should_flush |= buffer_cache.HasUncommitedFlushes();
76 should_flush |= query_cache.HasUncommitedFlushes();
74 texture_cache.CommitAsyncFlushes(); 77 texture_cache.CommitAsyncFlushes();
75 buffer_cache.CommitAsyncFlushes(); 78 buffer_cache.CommitAsyncFlushes();
79 query_cache.CommitAsyncFlushes();
76 TFence new_fence = CreateFence(value, !should_flush); 80 TFence new_fence = CreateFence(value, !should_flush);
77 fences.push(new_fence); 81 fences.push(new_fence);
78 QueueFence(new_fence); 82 QueueFence(new_fence);
@@ -87,11 +91,13 @@ public:
87 TFence& current_fence = fences.front(); 91 TFence& current_fence = fences.front();
88 bool should_wait = texture_cache.ShouldWaitAsyncFlushes(); 92 bool should_wait = texture_cache.ShouldWaitAsyncFlushes();
89 should_wait |= buffer_cache.ShouldWaitAsyncFlushes(); 93 should_wait |= buffer_cache.ShouldWaitAsyncFlushes();
94 should_wait |= query_cache.ShouldWaitAsyncFlushes();
90 if (should_wait) { 95 if (should_wait) {
91 WaitFence(current_fence); 96 WaitFence(current_fence);
92 } 97 }
93 texture_cache.PopAsyncFlushes(); 98 texture_cache.PopAsyncFlushes();
94 buffer_cache.PopAsyncFlushes(); 99 buffer_cache.PopAsyncFlushes();
100 query_cache.PopAsyncFlushes();
95 auto& gpu{system.GPU()}; 101 auto& gpu{system.GPU()};
96 if (current_fence->IsSemaphore()) { 102 if (current_fence->IsSemaphore()) {
97 auto& memory_manager{gpu.MemoryManager()}; 103 auto& memory_manager{gpu.MemoryManager()};
@@ -105,9 +111,10 @@ public:
105 111
106protected: 112protected:
107 FenceManager(Core::System& system, VideoCore::RasterizerInterface& rasterizer, 113 FenceManager(Core::System& system, VideoCore::RasterizerInterface& rasterizer,
108 TTextureCache& texture_cache, TTBufferCache& buffer_cache) 114 TTextureCache& texture_cache, TTBufferCache& buffer_cache,
109 : system{system}, rasterizer{rasterizer}, texture_cache{texture_cache}, buffer_cache{ 115 TQueryCache& query_cache)
110 buffer_cache} {} 116 : system{system}, rasterizer{rasterizer}, texture_cache{texture_cache},
117 buffer_cache{buffer_cache}, query_cache{query_cache} {}
111 118
112 virtual TFence CreateFence(u32 value, bool is_stubbed) = 0; 119 virtual TFence CreateFence(u32 value, bool is_stubbed) = 0;
113 virtual TFence CreateFence(GPUVAddr addr, u32 value, bool is_stubbed) = 0; 120 virtual TFence CreateFence(GPUVAddr addr, u32 value, bool is_stubbed) = 0;
@@ -119,6 +126,7 @@ protected:
119 VideoCore::RasterizerInterface& rasterizer; 126 VideoCore::RasterizerInterface& rasterizer;
120 TTextureCache& texture_cache; 127 TTextureCache& texture_cache;
121 TTBufferCache& buffer_cache; 128 TTBufferCache& buffer_cache;
129 TQueryCache& query_cache;
122 130
123private: 131private:
124 void TryReleasePendingFences() { 132 void TryReleasePendingFences() {
@@ -126,11 +134,13 @@ private:
126 TFence& current_fence = fences.front(); 134 TFence& current_fence = fences.front();
127 bool should_wait = texture_cache.ShouldWaitAsyncFlushes(); 135 bool should_wait = texture_cache.ShouldWaitAsyncFlushes();
128 should_wait |= buffer_cache.ShouldWaitAsyncFlushes(); 136 should_wait |= buffer_cache.ShouldWaitAsyncFlushes();
137 should_wait |= query_cache.ShouldWaitAsyncFlushes();
129 if (should_wait && !IsFenceSignaled(current_fence)) { 138 if (should_wait && !IsFenceSignaled(current_fence)) {
130 return; 139 return;
131 } 140 }
132 texture_cache.PopAsyncFlushes(); 141 texture_cache.PopAsyncFlushes();
133 buffer_cache.PopAsyncFlushes(); 142 buffer_cache.PopAsyncFlushes();
143 query_cache.PopAsyncFlushes();
134 auto& gpu{system.GPU()}; 144 auto& gpu{system.GPU()};
135 if (current_fence->IsSemaphore()) { 145 if (current_fence->IsSemaphore()) {
136 auto& memory_manager{gpu.MemoryManager()}; 146 auto& memory_manager{gpu.MemoryManager()};