diff options
Diffstat (limited to 'third_party/rust/d3d12/src/debug.rs')
-rw-r--r-- | third_party/rust/d3d12/src/debug.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/third_party/rust/d3d12/src/debug.rs b/third_party/rust/d3d12/src/debug.rs new file mode 100644 index 0000000000..d7768191b7 --- /dev/null +++ b/third_party/rust/d3d12/src/debug.rs @@ -0,0 +1,43 @@ +use crate::com::WeakPtr; +use winapi::um::d3d12sdklayers; +#[cfg(any(feature = "libloading", feature = "implicit-link"))] +use winapi::Interface as _; + +pub type Debug = WeakPtr<d3d12sdklayers::ID3D12Debug>; + +#[cfg(feature = "libloading")] +impl crate::D3D12Lib { + pub fn get_debug_interface(&self) -> Result<crate::D3DResult<Debug>, libloading::Error> { + type Fun = extern "system" fn( + winapi::shared::guiddef::REFIID, + *mut *mut winapi::ctypes::c_void, + ) -> crate::HRESULT; + + let mut debug = Debug::null(); + let hr = unsafe { + let func: libloading::Symbol<Fun> = self.lib.get(b"D3D12GetDebugInterface")?; + func(&d3d12sdklayers::ID3D12Debug::uuidof(), debug.mut_void()) + }; + + Ok((debug, hr)) + } +} + +impl Debug { + #[cfg(feature = "implicit-link")] + pub fn get_interface() -> crate::D3DResult<Self> { + let mut debug = Debug::null(); + let hr = unsafe { + winapi::um::d3d12::D3D12GetDebugInterface( + &d3d12sdklayers::ID3D12Debug::uuidof(), + debug.mut_void(), + ) + }; + + (debug, hr) + } + + pub fn enable_layer(&self) { + unsafe { self.EnableDebugLayer() } + } +} |