From 17203692f06e4e3787938ac42c0865fa5d9b5d52 Mon Sep 17 00:00:00 2001 From: chyyran Date: Tue, 31 Jan 2023 01:25:45 -0500 Subject: [PATCH] d3d12: make framebuffer --- librashader-runtime-d3d11/src/framebuffer.rs | 6 -- librashader-runtime-d3d11/src/util.rs | 4 +- librashader-runtime-d3d12/src/filter_chain.rs | 30 +++++-- librashader-runtime-d3d12/src/filter_pass.rs | 3 +- librashader-runtime-d3d12/src/framebuffer.rs | 85 +++++++++++++++++++ librashader-runtime-d3d12/src/lib.rs | 1 + librashader-runtime-d3d12/src/util.rs | 3 +- 7 files changed, 113 insertions(+), 19 deletions(-) create mode 100644 librashader-runtime-d3d12/src/framebuffer.rs diff --git a/librashader-runtime-d3d11/src/framebuffer.rs b/librashader-runtime-d3d11/src/framebuffer.rs index e31542e..3a84b07 100644 --- a/librashader-runtime-d3d11/src/framebuffer.rs +++ b/librashader-runtime-d3d11/src/framebuffer.rs @@ -25,7 +25,6 @@ pub(crate) struct OwnedFramebuffer { format: DXGI_FORMAT, device: ID3D11Device, context: ID3D11DeviceContext, - is_raw: bool, max_mipmap: u32, } @@ -56,7 +55,6 @@ impl OwnedFramebuffer { format, device: device.clone(), context: context.clone(), - is_raw: false, max_mipmap: if mipmap { size.calculate_miplevels() } else { @@ -74,10 +72,6 @@ impl OwnedFramebuffer { source_size: &Size, should_mipmap: bool, ) -> error::Result> { - if self.is_raw { - return Ok(self.size); - } - let size = source_size.scale_viewport(scaling, *viewport_size); if self.size != size diff --git a/librashader-runtime-d3d11/src/util.rs b/librashader-runtime-d3d11/src/util.rs index 5c4a9df..4b5efe0 100644 --- a/librashader-runtime-d3d11/src/util.rs +++ b/librashader-runtime-d3d11/src/util.rs @@ -126,8 +126,8 @@ pub fn d3d_compile_shader(source: &[u8], entry: &[u8], version: &[u8]) -> error: None, )?; - // SAFETY: if D3DCompile succeeds then blob is Some - Ok(blob.unwrap()) + assume_d3d11_init!(blob, "D3DCompile"); + Ok(blob) } } diff --git a/librashader-runtime-d3d12/src/filter_chain.rs b/librashader-runtime-d3d12/src/filter_chain.rs index 5d23508..e9a0324 100644 --- a/librashader-runtime-d3d12/src/filter_chain.rs +++ b/librashader-runtime-d3d12/src/filter_chain.rs @@ -34,6 +34,11 @@ use crate::quad_render::DrawQuad; type ShaderPassMeta = ShaderPassArtifact>; +pub struct FilterMutable { + pub(crate) passes_enabled: usize, + pub(crate) parameters: FxHashMap, +} + pub struct FilterChainD3D12 { pub(crate) common: FilterCommon, // pub(crate) passes: Vec, @@ -41,24 +46,23 @@ pub struct FilterChainD3D12 { // pub(crate) feedback_framebuffers: Box<[OwnedFramebuffer]>, // pub(crate) history_framebuffers: VecDeque, // pub(crate) draw_quad: DrawQuad, - pub(crate) filters: Vec, + pub(crate) passes: Vec, } pub(crate) struct FilterCommon { pub(crate) d3d12: ID3D12Device, - // pub(crate) luts: FxHashMap, pub samplers: SamplerSet, // pub output_textures: Box<[Option]>, // pub feedback_textures: Box<[Option]>, // pub history_textures: Box<[Option]>, - // pub config: FilterMutable, + pub config: FilterMutable, // pub disable_mipmaps: bool, lut_heap: D3D12DescriptorHeap, - luts: FxHashMap, - mipmap_gen: D3D12MipmapGen, - root_signature: D3D12RootSignature, - work_heap: D3D12DescriptorHeap, - draw_quad: DrawQuad, + pub luts: FxHashMap, + pub mipmap_gen: D3D12MipmapGen, + pub root_signature: D3D12RootSignature, + pub work_heap: D3D12DescriptorHeap, + pub draw_quad: DrawQuad, } impl FilterChainD3D12 { @@ -109,8 +113,16 @@ impl FilterChainD3D12 { root_signature, work_heap, draw_quad, + config: FilterMutable { + passes_enabled: preset.shader_count as usize, + parameters: preset + .parameters + .into_iter() + .map(|param| (param.name, param.value)) + .collect(), + }, }, - filters + passes: filters }) } diff --git a/librashader-runtime-d3d12/src/filter_pass.rs b/librashader-runtime-d3d12/src/filter_pass.rs index 14a5a07..6713ba7 100644 --- a/librashader-runtime-d3d12/src/filter_pass.rs +++ b/librashader-runtime-d3d12/src/filter_pass.rs @@ -14,4 +14,5 @@ pub(crate) struct FilterPass { pub uniform_storage: UniformStorage, pub(crate) push_cbuffer: Option, pub(crate) ubo_cbuffer: Option, -} \ No newline at end of file +} + diff --git a/librashader-runtime-d3d12/src/framebuffer.rs b/librashader-runtime-d3d12/src/framebuffer.rs new file mode 100644 index 0000000..ec35b7c --- /dev/null +++ b/librashader-runtime-d3d12/src/framebuffer.rs @@ -0,0 +1,85 @@ +use windows::Win32::Graphics::Direct3D12::{D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_FEATURE_DATA_FORMAT_SUPPORT, D3D12_FORMAT_SUPPORT1_MIP, D3D12_FORMAT_SUPPORT1_RENDER_TARGET, D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE, D3D12_FORMAT_SUPPORT1_TEXTURE2D, D3D12_FORMAT_SUPPORT2_UAV_TYPED_STORE, D3D12_HEAP_FLAG_NONE, D3D12_HEAP_PROPERTIES, D3D12_HEAP_TYPE_DEFAULT, D3D12_MEMORY_POOL_UNKNOWN, D3D12_RESOURCE_DESC, D3D12_RESOURCE_DIMENSION_TEXTURE2D, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, ID3D12Device, ID3D12Resource}; +use windows::Win32::Graphics::Dxgi::Common::{DXGI_FORMAT, DXGI_SAMPLE_DESC}; +use librashader_common::{ImageFormat, Size}; +use librashader_runtime::scaling::MipmapSize; +use crate::error; +use crate::error::assume_d3d12_init; +use crate::util::d3d12_get_closest_format; + +#[derive(Debug, Clone)] +pub(crate) struct OwnedImage { + render: ID3D12Resource, + pub(crate) size: Size, + format: DXGI_FORMAT, + device: ID3D12Device, + max_mipmap: u16, +} + +pub fn new( + device: &ID3D12Device, + size: Size, + format: ImageFormat, + mipmap: bool, +) -> error::Result { + unsafe { + let miplevels = source.size.calculate_miplevels() as u16; + let mut desc = D3D12_RESOURCE_DESC { + Dimension: D3D12_RESOURCE_DIMENSION_TEXTURE2D, + Alignment: 0, + Width: size.width as u64, + Height: size.height, + DepthOrArraySize: 1, + MipLevels: if mipmap { miplevels } else { 1 }, + Format: format.into(), + SampleDesc: DXGI_SAMPLE_DESC { + Count: 1, + Quality: 0, + }, + Layout: Default::default(), + Flags: Default::default(), + }; + + let mut format_support = D3D12_FEATURE_DATA_FORMAT_SUPPORT { + Format: desc.Format, + Support1: D3D12_FORMAT_SUPPORT1_TEXTURE2D + | D3D12_FORMAT_SUPPORT1_SHADER_SAMPLE + | D3D12_FORMAT_SUPPORT1_RENDER_TARGET, + ..Default::default() + }; + + if mipmap { + desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS; + format_support.Support1 |= D3D12_FORMAT_SUPPORT1_MIP; + format_support.Support2 |= D3D12_FORMAT_SUPPORT2_UAV_TYPED_STORE; + } + + desc.Format = d3d12_get_closest_format(device, desc.Format, format_support); + + let mut resource: Option = None; + unsafe { + device.CreateCommittedResource( + &D3D12_HEAP_PROPERTIES { + Type: D3D12_HEAP_TYPE_DEFAULT, + CPUPageProperty: D3D12_CPU_PAGE_PROPERTY_UNKNOWN, + MemoryPoolPreference: D3D12_MEMORY_POOL_UNKNOWN, + CreationNodeMask: 1, + VisibleNodeMask: 1, + }, + D3D12_HEAP_FLAG_NONE, + &desc, + D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, + None, + &mut resource, + )?; + } + assume_d3d12_init!(resource, "CreateCommittedResource"); + + Ok(OwnedImage { + render: resource, + size, + format: desc.Format, + device: device.clone(), + max_mipmap: miplevels, + }) + } +} \ No newline at end of file diff --git a/librashader-runtime-d3d12/src/lib.rs b/librashader-runtime-d3d12/src/lib.rs index bfee59f..92ea5e9 100644 --- a/librashader-runtime-d3d12/src/lib.rs +++ b/librashader-runtime-d3d12/src/lib.rs @@ -13,6 +13,7 @@ mod filter_pass; mod quad_render; mod graphics_pipeline; mod buffer; +mod framebuffer; #[cfg(test)] mod tests { diff --git a/librashader-runtime-d3d12/src/util.rs b/librashader-runtime-d3d12/src/util.rs index 8cd9dd5..79b05e4 100644 --- a/librashader-runtime-d3d12/src/util.rs +++ b/librashader-runtime-d3d12/src/util.rs @@ -138,7 +138,8 @@ pub fn d3d_compile_shader(source: &[u8], entry: &[u8], version: &[u8]) -> error: None, )?; - Ok(blob.unwrap()) + assume_d3d12_init!(blob, "D3DCompile"); + Ok(blob) } }