d3d11 0.3.3

Safe(r) bindings to the D3D11 API
Documentation
use d3d11_ffi::{Direct3D::WKPDID_D3DDebugObjectName, Direct3D11::ID3D11DeviceChild};

use crate::device::Device;

pub trait DeviceChild {
    fn as_device_child(&self) -> &ID3D11DeviceChild;

    fn get_device(&self) -> Device {
        unsafe {
            let device = self.as_device_child().GetDevice().unwrap();
            Device(device)
        }
    }

    fn set_debug_name(&self, name: impl AsRef<str>) {
        let name_cstr = std::ffi::CString::new(name.as_ref()).unwrap();
        unsafe {
            let _ = self.as_device_child().SetPrivateData(
                &WKPDID_D3DDebugObjectName,
                name_cstr.to_bytes().len() as _,
                Some(name_cstr.as_ptr() as _),
            );
        }
    }
}

#[macro_export]
macro_rules! impl_device_child {
    ($name:ident) => {
        impl $crate::device_child::DeviceChild for $name {
            fn as_device_child(&self) -> &d3d11_ffi::Direct3D11::ID3D11DeviceChild {
                &self.0
            }
        }
    };
}