Skip to content

Commit c4625e9

Browse files
committed
Set dxgi latency to 1 frame
1 parent 11c45a2 commit c4625e9

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

sanzu/src/server_windows.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,34 @@ fn d3d11_get_device_idxgidevice(device: &d3d11::ID3D11Device) -> Result<&dxgi::I
332332
unsafe { p_idxgidevice.as_ref() }.context("Null idxgiadapter")
333333
}
334334

335+
fn d3d11_get_device_idxgidevice1(device: &d3d11::ID3D11Device) -> Result<&dxgi::IDXGIDevice1> {
336+
/* GUID_ENTRY(0x77db970f,0x6276,0x48ba,0xba,0x28,0x07,0x01,0x43,0xb4,0x39,0x2c,IID_IDXGIDevice1) */
337+
let riid_idxgidevice1 = GUID {
338+
Data1: 0x77db970f,
339+
Data2: 0x6276,
340+
Data3: 0x48ba,
341+
Data4: [0xba, 0x28, 0x07, 0x01, 0x43, 0xb4, 0x39, 0x2c],
342+
};
343+
344+
let mut p_idxgidevice1: *mut c_void = null_mut();
345+
346+
let ret = unsafe {
347+
device.QueryInterface(
348+
&riid_idxgidevice1 as *const _,
349+
&mut p_idxgidevice1 as *mut _,
350+
)
351+
};
352+
353+
if SUCCEEDED(ret) {
354+
info!("Query interface success {:?}", p_idxgidevice1);
355+
} else {
356+
error!("Error in queryinterface");
357+
return Err(anyhow!("Error in query interface idxgidevice1"));
358+
}
359+
let p_idxgidevice1: *mut dxgi::IDXGIDevice1 = unsafe { std::mem::transmute(p_idxgidevice1) };
360+
unsafe { p_idxgidevice1.as_ref() }.context("Null idxgiadapter1")
361+
}
362+
335363
fn d3d11_get_idxgidevice_idxgiadapter(
336364
idxgidevice: &dxgi::IDXGIDevice,
337365
) -> Result<&dxgi::IDXGIAdapter> {
@@ -644,6 +672,11 @@ pub fn init_d3d11() -> Result<()> {
644672
let idxgidevice =
645673
d3d11_get_device_idxgidevice(d3d11_device).context("Cannot get idxgidevice")?;
646674

675+
if let Ok(idxgidevice1) = d3d11_get_device_idxgidevice1(d3d11_device) {
676+
let ret = unsafe { idxgidevice1.SetMaximumFrameLatency(1) };
677+
error!("Set max frame latency: {:x}", ret);
678+
}
679+
647680
let idxgiadapter =
648681
d3d11_get_idxgidevice_idxgiadapter(idxgidevice).context("Cannot get idxgiadapter")?;
649682

0 commit comments

Comments
 (0)