rafx-plugins 0.0.16

Rendering framework built on an extensible asset pipeline
Documentation
use super::BasicPipelineContext;
use crate::phases::DepthPrepassRenderPhase;
use rafx::api::RafxDepthStencilClearValue;
use rafx::graph::*;
use rafx::render_features::RenderJobCommandBufferContext;

pub(super) struct DepthPrepass {
    #[allow(dead_code)]
    pub(super) node: RenderGraphNodeId,
    pub(super) depth: RenderGraphImageUsageId,
}

pub(super) fn depth_prepass(context: &mut BasicPipelineContext) -> Option<DepthPrepass> {
    if !context
        .main_view
        .phase_is_relevant::<DepthPrepassRenderPhase>()
    {
        return None;
    }

    let node = context
        .graph
        .add_renderpass_node("DepthPrepass", RenderGraphQueue::DefaultGraphics);

    let depth = context.graph.create_depth_attachment(
        node,
        Some(RafxDepthStencilClearValue {
            depth: 0.0,
            stencil: 0,
        }),
        RenderGraphImageConstraint {
            samples: Some(context.graph_config.samples),
            format: Some(context.graph_config.depth_format),
            ..Default::default()
        },
        Default::default(),
    );
    context.graph.set_image_name(depth, "depth");

    context
        .graph
        .add_render_phase_dependency::<DepthPrepassRenderPhase>(node);

    let main_view = context.main_view.clone();

    context.graph.set_renderpass_callback(node, move |args| {
        profiling::scope!("Depth Prepass");
        let mut write_context =
            RenderJobCommandBufferContext::from_graph_visit_render_pass_args(&args);
        args.graph_context
            .prepared_render_data()
            .write_view_phase::<DepthPrepassRenderPhase>(&main_view, &mut write_context)
    });

    Some(DepthPrepass { node, depth })
}