diff --git a/crates/renderer/src/render_graph.rs b/crates/renderer/src/render_graph.rs index 8bf17fd..06d4e6b 100644 --- a/crates/renderer/src/render_graph.rs +++ b/crates/renderer/src/render_graph.rs @@ -584,8 +584,10 @@ impl RenderGraph { } } + let pass_count = self.pass_descs.len() as u32; + // build graph from references. - { + let mut dag = { let mut edges = Vec::new(); intervals.iter().for_each(|(&rid, &(from, to))| { @@ -618,12 +620,9 @@ impl RenderGraph { // pass, read, write let mut current_pass = (from, Access::empty(), Access::empty()); - let max_i = self.pass_descs.len() as u32; - eprintln!("{rid:?}:"); - for pass in - PassNode::range_full(from, to, max_i).map(|i| PassNode::from_u32(i, max_i)) + for pass in PassNode::range_full(from, to, pass_count) + .map(|i| PassNode::from_u32(i, pass_count)) { - eprintln!("{pass:?}:"); let mut range = references.range( GraphRef { pass, @@ -637,9 +636,6 @@ impl RenderGraph { ); while let Some(a) = range.next() { - eprintln!("{a:?}"); - eprintln!("made_visible: {made_visible:?}"); - eprintln!("to_make_available: {to_make_available:?}"); if a.pass != current_pass.0 { if current_pass.1 != Access::empty() { last_read = Some(PreviousRef::Read(current_pass.0, current_pass.1)); @@ -841,11 +837,11 @@ impl RenderGraph { }); let mut dag = petgraph::graph::DiGraph::new(); - dag.add_node(PassNode::First); + let root = dag.add_node(PassNode::First); + let output = dag.add_node(PassNode::Last); for i in 0..self.pass_descs.len() { dag.add_node(PassNode::Pass(i)); } - dag.add_node(PassNode::Last); for ((from, to), weight) in edges { dag.add_edge( @@ -855,6 +851,19 @@ impl RenderGraph { ); } + loop { + let sinks = dag + .externals(petgraph::Direction::Outgoing) + .filter(|idx| dag.node_weight(*idx) != Some(&PassNode::Last)) + .collect::>(); + if sinks.is_empty() { + break; + } + for sink in sinks { + dag.remove_node(sink); + } + } + #[cfg(any(debug_assertions, test))] std::fs::write( "render_graph2.dot", @@ -875,7 +884,9 @@ impl RenderGraph { ), ) .expect("writing render_graph repr"); - } + + dag + }; let now = std::time::Instant::now(); let mut dag = petgraph::stable_graph::StableDiGraph::new();