#![deny(unsafe_op_in_unsafe_fn)]
use concinnity_core::gfx::render_types;
use concinnity_core::render::error::{RenderError, RenderResult};
use concinnity_core::render::post::ssgi::settings::SsgiSettings;
use concinnity_core::render::post::ssgi::{SsgiInputs, SsgiPass};
use objc2::runtime::ProtocolObject;
use crate::metal::context::MtlContext;
use crate::metal::post::post_device::{MtlPostPipeline, MtlPostTarget};
pub(crate) type MtlSsgiPass = SsgiPass<MtlPostPipeline, MtlPostTarget>;
pub(crate) struct SsgiState {
pub settings: Option<SsgiSettings>,
pub pass: Option<MtlSsgiPass>,
}
impl MtlContext {
pub(in crate::metal) fn encode_ssgi(
&self,
cmd_buf: &ProtocolObject<dyn objc2_metal::MTLCommandBuffer>,
ssgi_params: &render_types::SsgiParams,
) -> RenderResult<u32> {
let (Some(pass), Some(normal_depth)) = (&self.ssgi.pass, self.gbuffer_normal_depth())
else {
return Ok(0);
};
let velocity = self.gbuffer_velocity().ok_or_else(|| {
RenderError::Other("SSGI enabled but the pooled G-buffer velocity is missing".into())
})?;
let scene = self.targets.hdr.hdr_resolve.as_ref();
pass.encode(
&self.post_device(),
cmd_buf,
SsgiInputs {
scene,
scene_target: scene,
normal_depth,
velocity,
},
ssgi_params,
)?;
Ok(0)
}
}