From 14560600a9ad770a20c3e02e687fd6ff78d4f1b6 Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Wed, 10 Jan 2024 22:43:42 -0500 Subject: Micro-optimize locking in fences When a fence has been missed, we can avoid locking *most* of the time via the double-checked locking pattern. We still lock before a second check in case the scheduler caused us to miss the fence. If the scheduler did cause us to miss the fence, we can drop the lock prior to executing the callback function, as a second micro-optimization. Signed-off-by: Richard Yao --- src/util/sync/sync_signal.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/util/sync/sync_signal.h b/src/util/sync/sync_signal.h index cdbcae82..44f99eec 100644 --- a/src/util/sync/sync_signal.h +++ b/src/util/sync/sync_signal.h @@ -137,14 +137,22 @@ namespace dxvk::sync { template void setCallback(uint64_t value, Fn&& proc) { + if (value <= this->value()) { + proc(); + return; + } + std::unique_lock lock(m_mutex); + // Verify value is still in the future upon lock. if (value > this->value()) m_callbacks.emplace_back(std::piecewise_construct, std::make_tuple(value), std::make_tuple(proc)); - else + else { + lock.unlock(); proc(); + } } private: -- cgit v1.2.3