diff options
| author | 2020-02-18 17:20:39 -0400 | |
|---|---|---|
| committer | 2020-04-22 11:36:15 -0400 | |
| commit | b10db7e4a5f43414679b7969ea309b1829937a37 (patch) | |
| tree | 5a2df21d974ee17488ee01960a823ae6f89d9edb /src/video_core/fence_manager.h | |
| parent | Rasterizer: Document SignalFence & ReleaseFences and setup skeletons on Vulkan. (diff) | |
| download | yuzu-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.h | 15 |
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 | ||
| 40 | template <typename TFence, typename TTextureCache> | 40 | template <typename TFence, typename TTextureCache, typename TTBufferCache> |
| 41 | class FenceManager { | 41 | class FenceManager { |
| 42 | public: | 42 | public: |
| 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 | ||
| 68 | protected: | 71 | protected: |
| 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 | ||
| 82 | private: | 87 | private: |
| 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()); |