|
|
|
@ -66,19 +66,20 @@ const DmaPusher& GPU::DmaPusher() const {
|
|
|
|
|
return *dma_pusher;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GPU::WaitFence(u32 syncpoint_id, u32 value) const {
|
|
|
|
|
void GPU::WaitFence(u32 syncpoint_id, u32 value) {
|
|
|
|
|
// Synced GPU, is always in sync
|
|
|
|
|
if (!is_async) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
MICROPROFILE_SCOPE(GPU_wait);
|
|
|
|
|
while (syncpoints[syncpoint_id].load(std::memory_order_relaxed) < value) {
|
|
|
|
|
}
|
|
|
|
|
std::unique_lock lock{sync_mutex};
|
|
|
|
|
sync_cv.wait(lock, [=]() { return syncpoints[syncpoint_id].load() >= value; });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GPU::IncrementSyncPoint(const u32 syncpoint_id) {
|
|
|
|
|
syncpoints[syncpoint_id]++;
|
|
|
|
|
std::lock_guard lock{sync_mutex};
|
|
|
|
|
sync_cv.notify_all();
|
|
|
|
|
if (!syncpt_interrupts[syncpoint_id].empty()) {
|
|
|
|
|
u32 value = syncpoints[syncpoint_id].load();
|
|
|
|
|
auto it = syncpt_interrupts[syncpoint_id].begin();
|
|
|
|
|