d3d12: try to do desc heaps
This commit is contained in:
parent
0ceb70d799
commit
92c9836985
52
librashader-runtime-d3d12/src/d3d12_primitives.rs
Normal file
52
librashader-runtime-d3d12/src/d3d12_primitives.rs
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
use std::ptr::NonNull;
|
||||||
|
use windows::Win32::Graphics::Direct3D12::{D3D12_CPU_DESCRIPTOR_HANDLE, D3D12_DESCRIPTOR_HEAP_DESC, D3D12_GPU_DESCRIPTOR_HANDLE, ID3D12DescriptorHeap, ID3D12Device};
|
||||||
|
use crate::error;
|
||||||
|
|
||||||
|
pub struct D3D12DescriptorHeap {
|
||||||
|
heap: ID3D12DescriptorHeap,
|
||||||
|
desc: D3D12_DESCRIPTOR_HEAP_DESC,
|
||||||
|
cpu_handle: D3D12_CPU_DESCRIPTOR_HANDLE,
|
||||||
|
gpu_handle: D3D12_GPU_DESCRIPTOR_HANDLE,
|
||||||
|
alignment: u32,
|
||||||
|
map: Box<[bool]>,
|
||||||
|
start: usize
|
||||||
|
}
|
||||||
|
|
||||||
|
impl D3D12DescriptorHeap {
|
||||||
|
pub fn new(device: &ID3D12Device, desc: D3D12_DESCRIPTOR_HEAP_DESC) -> error::Result<D3D12DescriptorHeap> {
|
||||||
|
unsafe {
|
||||||
|
let heap: ID3D12DescriptorHeap = device.CreateDescriptorHeap(&desc)?;
|
||||||
|
let cpu_handle = heap.GetCPUDescriptorHandleForHeapStart();
|
||||||
|
let gpu_handle = heap.GetGPUDescriptorHandleForHeapStart();
|
||||||
|
let alignment = device.GetDescriptorHandleIncrementSize(desc.Type);
|
||||||
|
let mut map = Vec::new();
|
||||||
|
map.resize(desc.NumDescriptors as usize, false);
|
||||||
|
|
||||||
|
Ok(D3D12DescriptorHeap {
|
||||||
|
heap,
|
||||||
|
desc,
|
||||||
|
cpu_handle,
|
||||||
|
gpu_handle,
|
||||||
|
alignment,
|
||||||
|
map: Box::new([]),
|
||||||
|
start: 0,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn allocate_slot(&mut self) -> error::Result<D3D12_CPU_DESCRIPTOR_HANDLE> {
|
||||||
|
let mut handle = D3D12_CPU_DESCRIPTOR_HANDLE { ptr: 0 };
|
||||||
|
|
||||||
|
for i in self.start..self.desc.NumDescriptors as usize {
|
||||||
|
if !self.map[i] {
|
||||||
|
self.map[i] = true;
|
||||||
|
handle.ptr = self.cpu_handle.ptr + (i * self.alignment) as u64;
|
||||||
|
self.start = i + 1;
|
||||||
|
return Ok(handle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
todo!("error need to fail");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
3
librashader-runtime-d3d12/src/error.rs
Normal file
3
librashader-runtime-d3d12/src/error.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
use std::error::Error;
|
||||||
|
|
||||||
|
pub type Result<T> = std::result::Result<T, Box<dyn Error>>;
|
55
librashader-runtime-d3d12/src/filter_chain.rs
Normal file
55
librashader-runtime-d3d12/src/filter_chain.rs
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
use std::error::Error;
|
||||||
|
use std::path::Path;
|
||||||
|
use rustc_hash::FxHashMap;
|
||||||
|
use windows::Win32::Graphics::Direct3D12::ID3D12Device;
|
||||||
|
use librashader_presets::ShaderPreset;
|
||||||
|
use librashader_reflect::back::targets::HLSL;
|
||||||
|
use librashader_reflect::front::GlslangCompilation;
|
||||||
|
use librashader_reflect::reflect::presets::CompilePresetTarget;
|
||||||
|
use crate::error;
|
||||||
|
|
||||||
|
pub struct FilterChainD3D12 {
|
||||||
|
pub(crate) common: FilterCommon,
|
||||||
|
// pub(crate) passes: Vec<FilterPass>,
|
||||||
|
// pub(crate) output_framebuffers: Box<[OwnedFramebuffer]>,
|
||||||
|
// pub(crate) feedback_framebuffers: Box<[OwnedFramebuffer]>,
|
||||||
|
// pub(crate) history_framebuffers: VecDeque<OwnedFramebuffer>,
|
||||||
|
// pub(crate) draw_quad: DrawQuad,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) struct FilterCommon {
|
||||||
|
pub(crate) d3d12: ID3D12Device,
|
||||||
|
// pub(crate) luts: FxHashMap<usize, LutTexture>,
|
||||||
|
// pub samplers: SamplerSet,
|
||||||
|
// pub output_textures: Box<[Option<InputTexture>]>,
|
||||||
|
// pub feedback_textures: Box<[Option<InputTexture>]>,
|
||||||
|
// pub history_textures: Box<[Option<InputTexture>]>,
|
||||||
|
// pub config: FilterMutable,
|
||||||
|
// pub disable_mipmaps: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FilterChainD3D12 {
|
||||||
|
/// Load the shader preset at the given path into a filter chain.
|
||||||
|
pub fn load_from_path(
|
||||||
|
path: impl AsRef<Path>,
|
||||||
|
options: Option<&()>,
|
||||||
|
) -> error::Result<FilterChainD3D12> {
|
||||||
|
// load passes from preset
|
||||||
|
let preset = ShaderPreset::try_parse(path)?;
|
||||||
|
Self::load_from_preset(preset, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Load a filter chain from a pre-parsed `ShaderPreset`.
|
||||||
|
pub fn load_from_preset(
|
||||||
|
preset: ShaderPreset,
|
||||||
|
options: Option<&()>,
|
||||||
|
) -> error::Result<FilterChainD3D12> {
|
||||||
|
let (passes, semantics) = HLSL::compile_preset_passes::<
|
||||||
|
GlslangCompilation,
|
||||||
|
Box<dyn Error>,
|
||||||
|
>(preset.shaders, &preset.textures)?;
|
||||||
|
|
||||||
|
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
8
librashader-runtime-d3d12/src/samplers.rs
Normal file
8
librashader-runtime-d3d12/src/samplers.rs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
use rustc_hash::FxHashMap;
|
||||||
|
use windows::Win32::Graphics::Direct3D12::D3D12_GPU_DESCRIPTOR_HANDLE;
|
||||||
|
use librashader_common::{FilterMode, WrapMode};
|
||||||
|
|
||||||
|
pub struct SamplerSet {
|
||||||
|
samplers: FxHashMap<(WrapMode, FilterMode), D3D12_GPU_DESCRIPTOR_HANDLE>,
|
||||||
|
heap: D3D12Descriptor_heap
|
||||||
|
}
|
Loading…
Reference in a new issue