(display: Display)
| 61 | |
| 62 | impl Capturer { |
| 63 | pub fn new(display: Display) -> io::Result<Capturer> { |
| 64 | let mut device = ptr::null_mut(); |
| 65 | let mut context = ptr::null_mut(); |
| 66 | let mut duplication = ptr::null_mut(); |
| 67 | #[allow(invalid_value)] |
| 68 | let mut desc = unsafe { mem::MaybeUninit::uninit().assume_init() }; |
| 69 | #[allow(invalid_value)] |
| 70 | let mut adapter_desc1 = unsafe { mem::MaybeUninit::uninit().assume_init() }; |
| 71 | let mut gdi_capturer = None; |
| 72 | |
| 73 | let mut res = if display.gdi { |
| 74 | wrap_hresult(1) |
| 75 | } else { |
| 76 | let res = wrap_hresult(unsafe { |
| 77 | D3D11CreateDevice( |
| 78 | display.adapter.0 as *mut _, |
| 79 | D3D_DRIVER_TYPE_UNKNOWN, |
| 80 | ptr::null_mut(), // No software rasterizer. |
| 81 | 0, // No device flags. |
| 82 | ptr::null_mut(), // Feature levels. |
| 83 | 0, // Feature levels' length. |
| 84 | D3D11_SDK_VERSION, |
| 85 | &mut device, |
| 86 | ptr::null_mut(), |
| 87 | &mut context, |
| 88 | ) |
| 89 | }); |
| 90 | if res.is_ok() { |
| 91 | wrap_hresult(unsafe { (*display.adapter.0).GetDesc1(&mut adapter_desc1) }) |
| 92 | } else { |
| 93 | res |
| 94 | } |
| 95 | }; |
| 96 | let device = ComPtr(device); |
| 97 | let context = ComPtr(context); |
| 98 | |
| 99 | if res.is_err() { |
| 100 | gdi_capturer = display.create_gdi(); |
| 101 | println!("Fallback to GDI"); |
| 102 | if gdi_capturer.is_some() { |
| 103 | res = Ok(()); |
| 104 | } |
| 105 | } else { |
| 106 | res = wrap_hresult(unsafe { |
| 107 | let hres = (*display.inner.0).DuplicateOutput(device.0 as *mut _, &mut duplication); |
| 108 | if hres != S_OK { |
| 109 | gdi_capturer = display.create_gdi(); |
| 110 | println!("Fallback to GDI"); |
| 111 | if gdi_capturer.is_some() { |
| 112 | S_OK |
| 113 | } else { |
| 114 | hres |
| 115 | } |
| 116 | } else { |
| 117 | hres |
| 118 | } |
| 119 | // NVFBC(NVIDIA Capture SDK) which xpra used already deprecated, https://developer.nvidia.com/capture-sdk |
| 120 |
nothing calls this directly
no test coverage detected