use concinnity_core::render::error::RenderResult;
use objc2::runtime::ProtocolObject;
use objc2_metal::MTLDevice;
use super::{Features, InitGpu, pipelines};
use crate::metal::context::MtlTargets;
use crate::metal::post::create_bloom_targets;
use crate::metal::texture::create_hdr_targets;
use crate::metal::transient_pool::{TransientTexturePool, transient_slots};
pub(super) fn build_targets(gpu: &InitGpu<'_>, features: &Features) -> RenderResult<MtlTargets> {
let device = &*gpu.hw.device;
let (render_w, render_h) = features.render;
let (output_w, output_h) = features.output;
let depth_state = pipelines::make_depth_state(device)?;
let depth_state_read_only = pipelines::make_depth_state_read_only(device)?;
let hdr = create_hdr_targets(device, render_w, render_h, features.hdr_samples)?;
let transient_pool = build_transient_pool(
device,
features.ssao_enabled,
features.gbuffer_enabled,
features.render,
features.output,
)?;
let bloom = create_bloom_targets(device, output_w, output_h, transient_pool.bloom_top()?)?;
Ok(MtlTargets {
hdr,
bloom,
transient_pool,
depth_state,
depth_state_read_only,
geometry_less: !features.scene,
})
}
pub(in crate::metal) fn build_transient_pool(
device: &ProtocolObject<dyn MTLDevice>,
ssao_enabled: bool,
gbuffer_enabled: bool,
render: (u32, u32),
output: (u32, u32),
) -> RenderResult<TransientTexturePool> {
TransientTexturePool::build(
device,
&transient_slots(ssao_enabled, gbuffer_enabled, render, output)?,
)
}