1use crate::util::Share;
2use std::{ffi::c_void, sync::OnceLock};
3use windows::{
4 Win32::Graphics::{Direct3D11::ID3D11Device, Dxgi::IDXGISwapChain},
5 core::{Interface, InterfaceRef},
6};
7
8static DXGI_SWAP_CHAIN: OnceLock<Share<InterfaceRef<'static, IDXGISwapChain>>> = OnceLock::new();
10
11#[inline]
13pub fn dxgi_swap_chain() -> Option<IDXGISwapChain> {
14 DXGI_SWAP_CHAIN
15 .get()
16 .map(|swap_chain| (*unsafe { swap_chain.get() }).to_owned())
17}
18
19#[inline]
21pub fn d3d11_device() -> Option<ID3D11Device> {
22 let swap_chain = dxgi_swap_chain()?;
23 unsafe { swap_chain.GetDevice() }.ok()
24}
25
26pub unsafe fn init_dxgi(id3d: *mut c_void) {
28 if !id3d.is_null() {
29 let swap_chain =
30 unsafe { IDXGISwapChain::from_raw_borrowed(&id3d) }.expect("invalid swap chain");
31 DXGI_SWAP_CHAIN
32 .get_or_init(|| unsafe { Share::new(InterfaceRef::from_interface(swap_chain)) });
33 }
34}