use concinnity_core::render::error::RenderResult;
use objc2::rc::Retained;
use objc2::runtime::ProtocolObject;
use objc2_metal::{MTLComputePipelineState, MTLRenderPipelineState, MTLVertexDescriptor};
use super::bindless::BindlessPass;
use crate::metal::cull::build_shadow_cull_pipeline;
use crate::metal::init::InitGpu;
use crate::metal::init::pipelines::build_shadow_bindless_pipeline;
pub(super) struct ShadowCull {
pub(super) pipeline: Option<Retained<ProtocolObject<dyn MTLComputePipelineState>>>,
pub(super) bindless_pipeline: Option<Retained<ProtocolObject<dyn MTLRenderPipelineState>>>,
}
pub(super) fn build_shadow_cull(
gpu: &InitGpu<'_>,
bindless: &BindlessPass,
vert_desc: &MTLVertexDescriptor,
shadow_enabled: bool,
) -> RenderResult<ShadowCull> {
let device = &*gpu.hw.device;
let (pipeline, bindless_pipeline) = if shadow_enabled && bindless.active {
let sc = build_shadow_cull_pipeline(device, gpu.hot_reload)?;
let sb = build_shadow_bindless_pipeline(device, vert_desc, gpu.hot_reload)?;
(Some(sc), Some(sb))
} else {
(None, None)
};
Ok(ShadowCull {
pipeline,
bindless_pipeline,
})
}