|
|
@ -54,7 +54,7 @@ class FenceManager { |
|
|
public: |
|
|
public: |
|
|
void SignalSemaphore(GPUVAddr addr, u32 value) { |
|
|
void SignalSemaphore(GPUVAddr addr, u32 value) { |
|
|
TryReleasePendingFences(); |
|
|
TryReleasePendingFences(); |
|
|
bool should_flush = ShouldFlush(); |
|
|
|
|
|
|
|
|
const bool should_flush = ShouldFlush(); |
|
|
CommitAsyncFlushes(); |
|
|
CommitAsyncFlushes(); |
|
|
TFence new_fence = CreateFence(addr, value, !should_flush); |
|
|
TFence new_fence = CreateFence(addr, value, !should_flush); |
|
|
fences.push(new_fence); |
|
|
fences.push(new_fence); |
|
|
@ -67,7 +67,7 @@ public: |
|
|
|
|
|
|
|
|
void SignalSyncPoint(u32 value) { |
|
|
void SignalSyncPoint(u32 value) { |
|
|
TryReleasePendingFences(); |
|
|
TryReleasePendingFences(); |
|
|
bool should_flush = ShouldFlush(); |
|
|
|
|
|
|
|
|
const bool should_flush = ShouldFlush(); |
|
|
CommitAsyncFlushes(); |
|
|
CommitAsyncFlushes(); |
|
|
TFence new_fence = CreateFence(value, !should_flush); |
|
|
TFence new_fence = CreateFence(value, !should_flush); |
|
|
fences.push(new_fence); |
|
|
fences.push(new_fence); |
|
|
@ -79,15 +79,15 @@ public: |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void WaitPendingFences() { |
|
|
void WaitPendingFences() { |
|
|
|
|
|
auto& gpu{system.GPU()}; |
|
|
|
|
|
auto& memory_manager{gpu.MemoryManager()}; |
|
|
while (!fences.empty()) { |
|
|
while (!fences.empty()) { |
|
|
TFence& current_fence = fences.front(); |
|
|
TFence& current_fence = fences.front(); |
|
|
if (ShouldWait()) { |
|
|
if (ShouldWait()) { |
|
|
WaitFence(current_fence); |
|
|
WaitFence(current_fence); |
|
|
} |
|
|
} |
|
|
PopAsyncFlushes(); |
|
|
PopAsyncFlushes(); |
|
|
auto& gpu{system.GPU()}; |
|
|
|
|
|
if (current_fence->IsSemaphore()) { |
|
|
if (current_fence->IsSemaphore()) { |
|
|
auto& memory_manager{gpu.MemoryManager()}; |
|
|
|
|
|
memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload()); |
|
|
memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload()); |
|
|
} else { |
|
|
} else { |
|
|
gpu.IncrementSyncPoint(current_fence->GetPayload()); |
|
|
gpu.IncrementSyncPoint(current_fence->GetPayload()); |
|
|
@ -125,15 +125,15 @@ protected: |
|
|
|
|
|
|
|
|
private: |
|
|
private: |
|
|
void TryReleasePendingFences() { |
|
|
void TryReleasePendingFences() { |
|
|
|
|
|
auto& gpu{system.GPU()}; |
|
|
|
|
|
auto& memory_manager{gpu.MemoryManager()}; |
|
|
while (!fences.empty()) { |
|
|
while (!fences.empty()) { |
|
|
TFence& current_fence = fences.front(); |
|
|
TFence& current_fence = fences.front(); |
|
|
if (ShouldWait() && !IsFenceSignaled(current_fence)) { |
|
|
if (ShouldWait() && !IsFenceSignaled(current_fence)) { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
PopAsyncFlushes(); |
|
|
PopAsyncFlushes(); |
|
|
auto& gpu{system.GPU()}; |
|
|
|
|
|
if (current_fence->IsSemaphore()) { |
|
|
if (current_fence->IsSemaphore()) { |
|
|
auto& memory_manager{gpu.MemoryManager()}; |
|
|
|
|
|
memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload()); |
|
|
memory_manager.Write<u32>(current_fence->GetAddress(), current_fence->GetPayload()); |
|
|
} else { |
|
|
} else { |
|
|
gpu.IncrementSyncPoint(current_fence->GetPayload()); |
|
|
gpu.IncrementSyncPoint(current_fence->GetPayload()); |
|
|
|