librashader/librashader-cache/src/d3d.rs
chyyran 604edfb78f cache: implement transparent shader object cache
supported objects:

- SPIR-V artifacts
- Validated DXIL artifacts
- DXBC artifacts
- OpenGL Program Binaries
- Vulkan Pipeline caches
- D3D12 CACHED_PIPELINE_STATE
2023-02-15 18:08:47 -05:00

67 lines
2.1 KiB
Rust

//! Cache implementations for D3D blob types that need to live
//! here because of the orphan rule.
use crate::{Cacheable, CacheKey};
impl CacheKey for windows::Win32::Graphics::Direct3D::ID3DBlob {
fn hash_bytes(&self) -> &[u8] {
unsafe { std::slice::from_raw_parts(self.GetBufferPointer().cast(), self.GetBufferSize()) }
}
}
impl CacheKey for windows::Win32::Graphics::Direct3D::Dxc::IDxcBlob {
fn hash_bytes(&self) -> &[u8] {
unsafe { std::slice::from_raw_parts(self.GetBufferPointer().cast(), self.GetBufferSize()) }
}
}
impl Cacheable for windows::Win32::Graphics::Direct3D::ID3DBlob {
fn from_bytes(bytes: &[u8]) -> Option<Self> {
let Some(blob) = (unsafe { windows::Win32::Graphics::Direct3D::Fxc::D3DCreateBlob(bytes.len()).ok() }) else {
return None;
};
let slice = unsafe {
std::slice::from_raw_parts_mut(blob.GetBufferPointer().cast(), blob.GetBufferSize())
};
slice.copy_from_slice(bytes);
Some(blob)
}
fn to_bytes(&self) -> Option<Vec<u8>> {
let slice = unsafe {
std::slice::from_raw_parts(self.GetBufferPointer().cast(), self.GetBufferSize())
};
Some(Vec::from(slice))
}
}
impl Cacheable for windows::Win32::Graphics::Direct3D::Dxc::IDxcBlob {
fn from_bytes(bytes: &[u8]) -> Option<Self> {
let Some(blob) = (unsafe {
windows::Win32::Graphics::Direct3D::Dxc::DxcCreateInstance(
&windows::Win32::Graphics::Direct3D::Dxc::CLSID_DxcLibrary)
.and_then(|library: windows::Win32::Graphics::Direct3D::Dxc::IDxcUtils| {
library.CreateBlob(bytes.as_ptr().cast(), bytes.len() as u32,
windows::Win32::Graphics::Direct3D::Dxc::DXC_CP(0))
}).ok()
}) else {
return None;
};
Some(blob.into())
}
fn to_bytes(&self) -> Option<Vec<u8>> {
let slice = unsafe {
std::slice::from_raw_parts(self.GetBufferPointer().cast(), self.GetBufferSize())
};
Some(Vec::from(slice))
}
}