use winapi::shared::d3d9::{IDirect3DPixelShader9, IDirect3DVertexShader9};
use winapi::um::unknwnbase::IUnknown;
use crate::*;
use crate::d3d9::*;
use std::convert::*;
use std::ptr::null_mut;
#[derive(Clone)] #[repr(transparent)]
pub struct PixelShader(pub(crate) mcom::Rc<IDirect3DPixelShader9>);
#[derive(Clone)] #[repr(transparent)]
pub struct VertexShader(pub(crate) mcom::Rc<IDirect3DVertexShader9>);
unsafe impl AsSafe<IUnknown> for PixelShader { fn as_safe(&self) -> &IUnknown { &**self.0 } }
unsafe impl AsSafe<IUnknown> for VertexShader { fn as_safe(&self) -> &IUnknown { &**self.0 } }
unsafe impl AsSafe<IDirect3DPixelShader9 > for PixelShader { fn as_safe(&self) -> &IDirect3DPixelShader9 { &*self.0 } }
unsafe impl AsSafe<IDirect3DVertexShader9> for VertexShader { fn as_safe(&self) -> &IDirect3DVertexShader9 { &*self.0 } }
pub trait IDirect3DPixelShader9Ext : AsSafe<IDirect3DPixelShader9> {
fn get_device(&self) -> Result<Device, MethodError> {
let mut device = null_mut();
let hr = unsafe { self.as_winapi().GetDevice(&mut device) };
MethodError::check("IDirect3DPixelShader9::GetDevice", hr)?;
Ok(unsafe { Device::from_raw(device) })
}
fn get_function_size(&self) -> Result<u32, MethodError> {
let mut size = 0;
let hr = unsafe { self.as_winapi().GetFunction(null_mut(), &mut size) };
MethodError::check("IDirect3DPixelShader9::GetFunction", hr)?;
Ok(size)
}
fn get_function_inplace<'d>(&self, data: &'d mut [u8]) -> Result<&'d [u8], MethodError> {
let mut size = data.len().try_into().map_err(|_| MethodError("PixelShader::get_function_inplace", D3DERR::INVALIDCALL))?;
let hr = unsafe { self.as_winapi().GetFunction(data.as_mut_ptr().cast(), &mut size) };
MethodError::check("IDirect3DPixelShader9::GetFunction", hr)?;
Ok(&data[0..(size as usize)])
}
fn get_function(&self) -> Result<Vec<u8>, MethodError> {
let mut size = self.get_function_size()?;
let mut data = vec![0u8; size as usize];
let hr = unsafe { self.as_winapi().GetFunction(data.as_mut_ptr().cast(), &mut size) };
MethodError::check("IDirect3DPixelShader9::GetFunction", hr)?;
debug_assert_eq!(data.len(), size as usize);
Ok(data)
}
}
impl<T: AsSafe<IDirect3DPixelShader9>> IDirect3DPixelShader9Ext for T {}
pub trait IDirect3DVertexShader9Ext : AsSafe<IDirect3DVertexShader9> {
fn get_device(&self) -> Result<Device, MethodError> {
let mut device = null_mut();
let hr = unsafe { self.as_winapi().GetDevice(&mut device) };
MethodError::check("IDirect3DVertexShader9::GetDevice", hr)?;
Ok(unsafe { Device::from_raw(device) })
}
fn get_function_size(&self) -> Result<u32, MethodError> {
let mut size = 0;
let hr = unsafe { self.as_winapi().GetFunction(null_mut(), &mut size) };
MethodError::check("IDirect3DVertexShader9::GetFunction", hr)?;
Ok(size)
}
fn get_function_inplace<'d>(&self, data: &'d mut [u8]) -> Result<&'d [u8], MethodError> {
let mut size = data.len().try_into().map_err(|_| MethodError("VertexShader::get_function_inplace", D3DERR::INVALIDCALL))?;
let hr = unsafe { self.as_winapi().GetFunction(data.as_mut_ptr().cast(), &mut size) };
MethodError::check("IDirect3DVertexShader9::GetFunction", hr)?;
Ok(&data[0..(size as usize)])
}
fn get_function(&self) -> Result<Vec<u8>, MethodError> {
let mut size = self.get_function_size()?;
let mut data = vec![0u8; size as usize];
let hr = unsafe { self.as_winapi().GetFunction(data.as_mut_ptr().cast(), &mut size) };
MethodError::check("IDirect3DVertexShader9::GetFunction", hr)?;
debug_assert_eq!(data.len(), size as usize);
Ok(data)
}
}
impl<T: AsSafe<IDirect3DVertexShader9>> IDirect3DVertexShader9Ext for T {}