#![deny(unsafe_op_in_unsafe_fn)]
use concinnity_core::render::error::RenderResult;
use concinnity_core::render::post::bloom::{BloomInputs, BloomPass};
use concinnity_core::render::post::device::PostExtent;
use objc2::runtime::ProtocolObject;
use crate::metal::context::MtlContext;
use crate::metal::post::post_device::{MtlPostDevice, MtlPostPipeline, MtlPostTarget};
pub(crate) type MtlBloomPass = BloomPass<MtlPostPipeline, MtlPostTarget>;
pub(crate) fn build_bloom_pass(
device: &MtlPostDevice,
width: u32,
height: u32,
) -> RenderResult<MtlBloomPass> {
BloomPass::new(device, PostExtent { width, height })
}
impl MtlContext {
pub(in crate::metal) fn encode_bloom(
&self,
cmd_buf: &ProtocolObject<dyn objc2_metal::MTLCommandBuffer>,
scene_color: &ProtocolObject<dyn objc2_metal::MTLTexture>,
) -> RenderResult<u32> {
let Some(pass) = &self.bloom else {
return Ok(0);
};
let top = self.targets.transient_pool.bloom_top()?;
pass.encode(
&self.post_device(),
cmd_buf,
BloomInputs {
scene: scene_color,
top,
top_ref: top,
},
&self.post_process,
)?;
Ok(0)
}
}