use crate::*;
use crate::d3d11::*;
use winapi::um::d3d11shader::*;
use std::marker::PhantomData;
use std::ptr::NonNull;
#[derive(Clone)] #[repr(transparent)]
pub struct ShaderReflectionVariable<'r> {
ptr: NonNull<ID3D11ShaderReflectionVariable>,
phantom: PhantomData<&'r ShaderReflection>,
}
impl<'r> ShaderReflectionVariable<'r> {
pub(crate) unsafe fn from_raw(_: impl ParentOrPhantom<'r>, ptr: *mut ID3D11ShaderReflectionVariable) -> Self {
Self {
ptr: NonNull::new(ptr).expect("ShaderReflectionVariable should never be null"),
phantom: PhantomData,
}
}
}
impl<'r> ShaderReflectionVariable<'r> {
pub fn get_buffer(&self) -> ShaderReflectionConstantBuffer<'r> {
let ptr = unsafe { self.ptr.as_ref().GetBuffer() };
unsafe { ShaderReflectionConstantBuffer::from_raw(self.phantom, ptr) }
}
pub fn get_desc(&self) -> Result<ShaderVariableDesc<'r>, MethodError> {
let mut desc = ShaderVariableDesc::default();
let hr = unsafe { self.ptr.as_ref().GetDesc(desc.as_mut_ptr()) };
MethodError::check("ID3D11ShaderReflectionVariable::GetDesc", hr)?;
Ok(desc)
}
pub fn get_interface_slot(&self, array_index: u32) -> u32 {
unsafe { self.ptr.as_ref().GetInterfaceSlot(array_index) }
}
pub fn get_type(&self) -> ShaderReflectionType<'r> {
let ptr = unsafe { self.ptr.as_ref().GetType() };
unsafe { ShaderReflectionType::from_raw(self.phantom, ptr) }
}
}