From c0f60b890cfc622e1bcf269e5caa5a4236518755 Mon Sep 17 00:00:00 2001 From: janis Date: Sun, 25 Oct 2026 02:49:20 +0200 Subject: [PATCH] dont consider imported resources in the lifetimes building --- crates/renderer_rendergraph/src/graph.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/crates/renderer_rendergraph/src/graph.rs b/crates/renderer_rendergraph/src/graph.rs index 92a48f3..c16e0f2 100644 --- a/crates/renderer_rendergraph/src/graph.rs +++ b/crates/renderer_rendergraph/src/graph.rs @@ -69,16 +69,17 @@ pub struct ResourceInterference { impl ResourceInterference { /// Build a symmetric interference graph from inclusive resource lifetimes. - pub fn from_lifetimes(lifetimes: &HashMap) -> Self { + pub fn from_lifetimes( + lifetimes: impl IntoIterator, + ) -> Self { let mut max_id = ResourceId(0); let mut resources: Vec<_> = lifetimes - .iter() + .into_iter() .inspect(|(id, _)| { - if **id > max_id { - max_id = **id; + if *id > max_id { + max_id = *id; } }) - .map(|(&id, lifetime)| (id, *lifetime)) .collect(); let mut edges = vec![BTreeSet::new(); max_id.index() + 1]; @@ -419,7 +420,14 @@ impl<'a> GraphCompiler<'a> { } } - let interference = ResourceInterference::from_lifetimes(&lifetimes); + let interference = ResourceInterference::from_lifetimes( + lifetimes + .iter() + // TODO: consider resource usage across multiple queues. + // when two resources do not overlap in time but their last-first commands are not connected via an edge in the dag, they must be marked as interfering. + .filter(|&(id, _)| self.resources[id.0 as usize].is_created()) + .map(|(&id, &lifetime)| (id, lifetime)), + ); // Skeleton aliasing policy: resources with non-overlapping lifetimes may // share a heap offset. The graph test is equivalent to the previous @@ -895,7 +903,9 @@ mod tests { }, ), ]); - let interference = ResourceInterference::from_lifetimes(&lifetimes); + let interference = ResourceInterference::from_lifetimes( + lifetimes.iter().map(|(&id, &lifetime)| (id, lifetime)), + ); assert!(interference.interferes(ResourceId(0), ResourceId(1))); assert!(interference.interferes(ResourceId(1), ResourceId(0)));