use concinnity_core::render::error::RenderResult;
use concinnity_core::render::post::device::PostExtent;
use concinnity_core::render::post::reflection_composite::{
ReflectionCompositeInputs, ReflectionCompositePass,
};
use windows::Win32::Graphics::Direct3D12::*;
use crate::directx::context::DxContext;
use crate::directx::descriptor_slot::SrvSlot;
use crate::directx::post::post_device::{DxPostDevice, PostPipeline, PostTarget};
pub(in crate::directx) type DxReflectionCompositePass =
ReflectionCompositePass<PostPipeline, PostTarget>;
pub(in crate::directx) fn build_reflection_composite(
device: &DxPostDevice,
blur_scale: u32,
width: u32,
height: u32,
) -> RenderResult<DxReflectionCompositePass> {
ReflectionCompositePass::new(device, blur_scale, PostExtent { width, height })
}
impl DxContext {
pub(in crate::directx) fn encode_reflection_composite(
&self,
cmd: &ID3D12GraphicsCommandList,
frame_idx: usize,
reflection_srv: SrvSlot,
) {
let (Some(rc), Some(gbuffer)) = (&self.reflection_composite, &self.gbuffer) else {
return;
};
if let Err(e) = rc.encode(
&self.post_device(frame_idx),
cmd,
ReflectionCompositeInputs {
reflection: reflection_srv,
scene: self.targets.hdr.srv_gpu,
normal_depth: gbuffer.normal_depth_srv_gpu,
roughness: gbuffer.roughness_srv_gpu,
},
) {
tracing::error!("reflection composite: {e}");
}
}
}