@@ -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+
335363fn 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