summaryrefslogtreecommitdiffstats
path: root/third_party/rust/d3d12/src/sync.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/d3d12/src/sync.rs')
-rw-r--r--third_party/rust/d3d12/src/sync.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/third_party/rust/d3d12/src/sync.rs b/third_party/rust/d3d12/src/sync.rs
new file mode 100644
index 0000000000..f1f3bb9bca
--- /dev/null
+++ b/third_party/rust/d3d12/src/sync.rs
@@ -0,0 +1,39 @@
+use crate::{com::WeakPtr, HRESULT};
+use std::ptr;
+use winapi::um::{d3d12, synchapi, winnt};
+
+#[derive(Copy, Clone)]
+#[repr(transparent)]
+pub struct Event(pub winnt::HANDLE);
+impl Event {
+ pub fn create(manual_reset: bool, initial_state: bool) -> Self {
+ Event(unsafe {
+ synchapi::CreateEventA(
+ ptr::null_mut(),
+ manual_reset as _,
+ initial_state as _,
+ ptr::null(),
+ )
+ })
+ }
+
+ // TODO: return value
+ pub fn wait(&self, timeout_ms: u32) -> u32 {
+ unsafe { synchapi::WaitForSingleObject(self.0, timeout_ms) }
+ }
+}
+
+pub type Fence = WeakPtr<d3d12::ID3D12Fence>;
+impl Fence {
+ pub fn set_event_on_completion(&self, event: Event, value: u64) -> HRESULT {
+ unsafe { self.SetEventOnCompletion(value, event.0) }
+ }
+
+ pub fn get_value(&self) -> u64 {
+ unsafe { self.GetCompletedValue() }
+ }
+
+ pub fn signal(&self, value: u64) -> HRESULT {
+ unsafe { self.Signal(value) }
+ }
+}