summaryrefslogtreecommitdiff
path: root/src/video_core/fence_manager.h
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-02-19 13:40:37 -0400
committerGravatar Fernando Sahmkow2020-04-22 11:36:16 -0400
commitb7bc3c25496849661846f2fe42f591f2a81fbc87 (patch)
tree5c65f286d0ac58dfd46a42325a71548f20522f71 /src/video_core/fence_manager.h
parentBufferCache: Refactor async managing. (diff)
downloadyuzu-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.h58
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
23class FenceBase { 23class FenceBase {
24public: 24public:
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
35private: 43private:
36 GPUVAddr address; 44 GPUVAddr address;
37 u32 payload; 45 u32 payload;
46 bool is_semaphore;
47
48protected:
49 bool is_stubbed;
38}; 50};
39 51
40template <typename TFence, typename TTextureCache, typename TTBufferCache> 52template <typename TFence, typename TTextureCache, typename TTBufferCache>
41class FenceManager { 53class FenceManager {
42public: 54public:
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 }