mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-20 19:54:19 +01:00
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 <richard.yao@alumni.stonybrook.edu>
This commit is contained in:
parent
854e06d3f0
commit
14560600a9
@ -137,14 +137,22 @@ namespace dxvk::sync {
|
||||
|
||||
template<typename Fn>
|
||||
void setCallback(uint64_t value, Fn&& proc) {
|
||||
if (value <= this->value()) {
|
||||
proc();
|
||||
return;
|
||||
}
|
||||
|
||||
std::unique_lock<dxvk::mutex> 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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user