diff options
| author | 2020-04-15 16:36:14 -0400 | |
|---|---|---|
| committer | 2020-04-22 11:36:18 -0400 | |
| commit | 0649f0590047e8cc0b16a10dec5eb74938fef718 (patch) | |
| tree | b56cf7fb42c31f0012b063d356dc2b1eb1126a42 /src/video_core/fence_manager.h | |
| parent | OpenGL: Guarantee writes to Buffers. (diff) | |
| download | yuzu-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.h | 18 |
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 | ||
| 52 | template <typename TFence, typename TTextureCache, typename TTBufferCache> | 52 | template <typename TFence, typename TTextureCache, typename TTBufferCache, typename TQueryCache> |
| 53 | class FenceManager { | 53 | class FenceManager { |
| 54 | public: | 54 | public: |
| 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 | ||
| 106 | protected: | 112 | protected: |
| 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 | ||
| 123 | private: | 131 | private: |
| 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()}; |