diff options
| author | 2020-02-19 13:40:37 -0400 | |
|---|---|---|
| committer | 2020-04-22 11:36:16 -0400 | |
| commit | b7bc3c25496849661846f2fe42f591f2a81fbc87 (patch) | |
| tree | 5c65f286d0ac58dfd46a42325a71548f20522f71 /src/video_core/fence_manager.h | |
| parent | BufferCache: Refactor async managing. (diff) | |
| download | yuzu-b7bc3c25496849661846f2fe42f591f2a81fbc87.tar.gz yuzu-b7bc3c25496849661846f2fe42f591f2a81fbc87.tar.xz yuzu-b7bc3c25496849661846f2fe42f591f2a81fbc87.zip | |
FenceManager: Manage syncpoints and rename fences to semaphores.
Diffstat (limited to 'src/video_core/fence_manager.h')
| -rw-r--r-- | src/video_core/fence_manager.h | 58 |
1 files changed, 49 insertions, 9 deletions
diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h index 72ee50955..417cb113f 100644 --- a/src/video_core/fence_manager.h +++ b/src/video_core/fence_manager.h | |||
| @@ -22,7 +22,11 @@ namespace VideoCommon { | |||
| 22 | 22 | ||
| 23 | class FenceBase { | 23 | class FenceBase { |
| 24 | public: | 24 | public: |
| 25 | FenceBase(GPUVAddr address, u32 payload) : address{address}, payload{payload} {} | 25 | FenceBase(u32 payload, bool is_stubbed) |
| 26 | : address{}, payload{payload}, is_semaphore{false}, is_stubbed{is_stubbed} {} | ||
| 27 | |||
| 28 | FenceBase(GPUVAddr address, u32 payload, bool is_stubbed) | ||
| 29 | : address{address}, payload{payload}, is_semaphore{true}, is_stubbed{is_stubbed} {} | ||
| 26 | 30 | ||
| 27 | constexpr GPUVAddr GetAddress() const { | 31 | constexpr GPUVAddr GetAddress() const { |
| 28 | return address; | 32 | return address; |
| @@ -32,22 +36,49 @@ public: | |||
| 32 | return payload; | 36 | return payload; |
| 33 | } | 37 | } |
| 34 | 38 | ||
| 39 | constexpr bool IsSemaphore() const { | ||
| 40 | return is_semaphore; | ||
| 41 | } | ||
| 42 | |||
| 35 | private: | 43 | private: |
| 36 | GPUVAddr address; | 44 | GPUVAddr address; |
| 37 | u32 payload; | 45 | u32 payload; |
| 46 | bool is_semaphore; | ||
| 47 | |||
| 48 | protected: | ||
| 49 | bool is_stubbed; | ||
| 38 | }; | 50 | }; |
| 39 | 51 | ||
| 40 | template <typename TFence, typename TTextureCache, typename TTBufferCache> | 52 | template <typename TFence, typename TTextureCache, typename TTBufferCache> |
| 41 | class FenceManager { | 53 | class FenceManager { |
| 42 | public: | 54 | public: |
| 43 | void SignalFence(GPUVAddr addr, u32 value) { | 55 | void SignalSemaphore(GPUVAddr addr, u32 value) { |
| 44 | TryReleasePendingFences(); | 56 | TryReleasePendingFences(); |
| 57 | bool should_flush = texture_cache.HasUncommitedFlushes(); | ||
| 58 | should_flush |= buffer_cache.HasUncommitedFlushes(); | ||
| 45 | texture_cache.CommitAsyncFlushes(); | 59 | texture_cache.CommitAsyncFlushes(); |
| 46 | buffer_cache.CommitAsyncFlushes(); | 60 | buffer_cache.CommitAsyncFlushes(); |
| 47 | TFence new_fence = CreateFence(addr, value); | 61 | TFence new_fence = CreateFence(addr, value, !should_flush); |
| 48 | fences.push(new_fence); | 62 | fences.push(new_fence); |
| 49 | QueueFence(new_fence); | 63 | QueueFence(new_fence); |
| 50 | rasterizer.FlushCommands(); | 64 | if (should_flush) { |
| 65 | rasterizer.FlushCommands(); | ||
| 66 | } | ||
| 67 | rasterizer.SyncGuestHost(); | ||
| 68 | } | ||
| 69 | |||
| 70 | void SignalSyncPoint(u32 value) { | ||
| 71 | TryReleasePendingFences(); | ||
| 72 | bool should_flush = texture_cache.HasUncommitedFlushes(); | ||
| 73 | should_flush |= buffer_cache.HasUncommitedFlushes(); | ||
| 74 | texture_cache.CommitAsyncFlushes(); | ||
| 75 | buffer_cache.CommitAsyncFlushes(); | ||
| 76 | TFence new_fence = CreateFence(value, !should_flush); | ||
| 77 | fences.push(new_fence); | ||
| 78 | QueueFence(new_fence); | ||
| 79 | if (should_flush) { | ||
| 80 | rasterizer.FlushCommands(); | ||
| 81 | } | ||
| 51 | rasterizer.SyncGuestHost(); | 82 | rasterizer.SyncGuestHost(); |
| 52 | } | 83 | } |
| 53 | 84 | ||
| @@ -62,8 +93,12 @@ public: | |||
| 62 | texture_cache.PopAsyncFlushes(); | 93 | texture_cache.PopAsyncFlushes(); |
| 63 | buffer_cache.PopAsyncFlushes(); | 94 | buffer_cache.PopAsyncFlushes(); |
| 64 | auto& gpu{system.GPU()}; | 95 | auto& gpu{system.GPU()}; |
| 65 | auto& memory_manager{gpu.MemoryManager()}; | 96 | if (current_fence->IsSemaphore()) { |
| 66 | memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload()); | 97 | auto& memory_manager{gpu.MemoryManager()}; |
| 98 | memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload()); | ||
| 99 | } else { | ||
| 100 | gpu.IncrementSyncPoint(current_fence->GetPayload()); | ||
| 101 | } | ||
| 67 | fences.pop(); | 102 | fences.pop(); |
| 68 | } | 103 | } |
| 69 | } | 104 | } |
| @@ -74,7 +109,8 @@ protected: | |||
| 74 | : system{system}, rasterizer{rasterizer}, texture_cache{texture_cache}, buffer_cache{ | 109 | : system{system}, rasterizer{rasterizer}, texture_cache{texture_cache}, buffer_cache{ |
| 75 | buffer_cache} {} | 110 | buffer_cache} {} |
| 76 | 111 | ||
| 77 | virtual TFence CreateFence(GPUVAddr addr, u32 value) = 0; | 112 | virtual TFence CreateFence(u32 value, bool is_stubbed) = 0; |
| 113 | virtual TFence CreateFence(GPUVAddr addr, u32 value, bool is_stubbed) = 0; | ||
| 78 | virtual void QueueFence(TFence& fence) = 0; | 114 | virtual void QueueFence(TFence& fence) = 0; |
| 79 | virtual bool IsFenceSignaled(TFence& fence) = 0; | 115 | virtual bool IsFenceSignaled(TFence& fence) = 0; |
| 80 | virtual void WaitFence(TFence& fence) = 0; | 116 | virtual void WaitFence(TFence& fence) = 0; |
| @@ -96,8 +132,12 @@ private: | |||
| 96 | texture_cache.PopAsyncFlushes(); | 132 | texture_cache.PopAsyncFlushes(); |
| 97 | buffer_cache.PopAsyncFlushes(); | 133 | buffer_cache.PopAsyncFlushes(); |
| 98 | auto& gpu{system.GPU()}; | 134 | auto& gpu{system.GPU()}; |
| 99 | auto& memory_manager{gpu.MemoryManager()}; | 135 | if (current_fence->IsSemaphore()) { |
| 100 | memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload()); | 136 | auto& memory_manager{gpu.MemoryManager()}; |
| 137 | memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload()); | ||
| 138 | } else { | ||
| 139 | gpu.IncrementSyncPoint(current_fence->GetPayload()); | ||
| 140 | } | ||
| 101 | fences.pop(); | 141 | fences.pop(); |
| 102 | } | 142 | } |
| 103 | } | 143 | } |