Skip to main content

arcdps\globals/
dxgi.rs

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
8/// DirectX 11 swap chain.
9static DXGI_SWAP_CHAIN: OnceLock<Share<InterfaceRef<'static, IDXGISwapChain>>> = OnceLock::new();
10
11/// Returns the DirectX swap chain, if available.
12#[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/// Returns the DirectX 11 device, if available.
20#[inline]
21pub fn d3d11_device() -> Option<ID3D11Device> {
22    let swap_chain = dxgi_swap_chain()?;
23    unsafe { swap_chain.GetDevice() }.ok()
24}
25
26/// Initializes DirectX information.
27pub 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}