#![deny(unsafe_op_in_unsafe_fn)]
use concinnity_core::render::error::RenderResult;
use concinnity_core::render::post::device::PostExtent;
use concinnity_core::render::post::reflection_composite::{
ReflectionCompositeInputs, ReflectionCompositePass,
};
use objc2::runtime::ProtocolObject;
use crate::metal::context::MtlContext;
use crate::metal::post::post_device::{MtlPostDevice, MtlPostPipeline, MtlPostTarget};
pub(crate) type MtlReflectionCompositePass =
ReflectionCompositePass<MtlPostPipeline, MtlPostTarget>;
pub(crate) fn build_reflection_composite(
device: &MtlPostDevice,
blur_scale: u32,
render: (u32, u32),
) -> RenderResult<MtlReflectionCompositePass> {
ReflectionCompositePass::new(
device,
blur_scale,
PostExtent {
width: render.0,
height: render.1,
},
)
}
impl MtlContext {
pub(in crate::metal) fn encode_reflection_composite(
&self,
cmd_buf: &ProtocolObject<dyn objc2_metal::MTLCommandBuffer>,
) -> RenderResult<()> {
let (Some(pass), Some(reflection), Some(normal_depth), Some(roughness)) = (
&self.ssr.composite,
&self.ssr.reflection,
self.gbuffer_normal_depth(),
self.gbuffer_roughness(),
) else {
return Ok(());
};
pass.encode(
&self.post_device(),
cmd_buf,
ReflectionCompositeInputs {
reflection: reflection.as_ref(),
scene: self.targets.hdr.hdr_resolve.as_ref(),
normal_depth,
roughness,
},
)
}
}