1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00
OpenDX/src/dxvk/dxvk_event.cpp
Philip Rebohle 85f0fe729c
[dxvk] Move DxvkEventTracker to dxvk_event.{h,cpp}
The upcoming new event and query classes will follow this design.
Reduces the number of files around these small classes.
2018-11-17 01:17:03 +01:00

84 lines
1.6 KiB
C++

#include "dxvk_event.h"
namespace dxvk {
DxvkEvent::DxvkEvent()
: m_packed(pack({ DxvkEventStatus::Signaled, 0u })) { }
DxvkEvent::~DxvkEvent() {
}
uint32_t DxvkEvent::reset() {
Status info;
uint64_t packed = m_packed.load();
do {
info.status = DxvkEventStatus::Reset;
info.revision = unpack(packed).revision + 1;
} while (!m_packed.compare_exchange_strong(packed, pack(info)));
return info.revision;
}
void DxvkEvent::signal(uint32_t revision) {
uint64_t expected = pack({ DxvkEventStatus::Reset, revision });
uint64_t desired = pack({ DxvkEventStatus::Signaled, revision });
m_packed.compare_exchange_strong(expected, desired);
}
DxvkEventStatus DxvkEvent::getStatus() const {
return unpack(m_packed.load()).status;
}
void DxvkEvent::wait() const {
while (this->getStatus() != DxvkEventStatus::Signaled)
dxvk::this_thread::yield();
}
uint64_t DxvkEvent::pack(Status info) {
return (uint64_t(info.revision))
| (uint64_t(info.status) << 32);
}
DxvkEvent::Status DxvkEvent::unpack(uint64_t packed) {
return { DxvkEventStatus(packed >> 32), uint32_t(packed) };
}
DxvkEventTracker::DxvkEventTracker() {
}
DxvkEventTracker::~DxvkEventTracker() {
}
void DxvkEventTracker::trackEvent(const DxvkEventRevision& event) {
m_events.push_back(event);
}
void DxvkEventTracker::signalEvents() {
for (const DxvkEventRevision& event : m_events)
event.event->signal(event.revision);
}
void DxvkEventTracker::reset() {
m_events.clear();
}
}