fix: check for layout transition is always necessary, layout in eguiprepass
This commit is contained in:
parent
dbc4294c09
commit
d623b8fc46
|
@ -279,13 +279,24 @@ pub fn egui_pre_pass(
|
||||||
},
|
},
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
|
|
||||||
let to_barrier = image_barrier(
|
let to_barrier = image_barrier(
|
||||||
texture.handle(),
|
texture.handle(),
|
||||||
texture.format(),
|
texture.format(),
|
||||||
Access {
|
Access {
|
||||||
stage: vk::PipelineStageFlags2::NONE,
|
stage: vk::PipelineStageFlags2::NONE,
|
||||||
mask: vk::AccessFlags2::empty(),
|
mask: vk::AccessFlags2::empty(),
|
||||||
layout: vk::ImageLayout::GENERAL,
|
// TODO: this is somewhat sub-optimal, but I think
|
||||||
|
// perfectly legal to not-care about the layout of a
|
||||||
|
// texture? In this case, the entire texture is
|
||||||
|
// overwritten, so the layout doesn't matter, and else
|
||||||
|
// the layout will be `GENERAL` because the texture was
|
||||||
|
// previously written to.
|
||||||
|
layout: if alias.size() == texture.size() {
|
||||||
|
vk::ImageLayout::UNDEFINED
|
||||||
|
} else {
|
||||||
|
vk::ImageLayout::GENERAL
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Access {
|
Access {
|
||||||
stage: vk::PipelineStageFlags2::TRANSFER,
|
stage: vk::PipelineStageFlags2::TRANSFER,
|
||||||
|
|
|
@ -918,6 +918,22 @@ mod graph_resolver {
|
||||||
let write = self.get_writes_for_rid_pass(rid, pass);
|
let write = self.get_writes_for_rid_pass(rid, pass);
|
||||||
if let Some(write) = write {
|
if let Some(write) = write {
|
||||||
tracing::trace!("write: {:?}", write);
|
tracing::trace!("write: {:?}", write);
|
||||||
|
|
||||||
|
if let Some(last) = last_ref.as_ref()
|
||||||
|
&& last.access().layout != write.layout
|
||||||
|
{
|
||||||
|
let before = last.access();
|
||||||
|
edges.push(Edge {
|
||||||
|
from: last.node(),
|
||||||
|
to: pass,
|
||||||
|
rid,
|
||||||
|
barrier: Barrier::LayoutTransition {
|
||||||
|
src: (before.stage, before.layout),
|
||||||
|
dst: (write.stage, write.layout),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
match last_ref.as_ref() {
|
match last_ref.as_ref() {
|
||||||
Some(Ref::Read(node, before)) => {
|
Some(Ref::Read(node, before)) => {
|
||||||
// execution barrier to ward against write-after-read
|
// execution barrier to ward against write-after-read
|
||||||
|
@ -932,20 +948,6 @@ mod graph_resolver {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Some(Ref::Write(node, before)) => {
|
|
||||||
// check for layout transition here
|
|
||||||
if before.layout != write.layout {
|
|
||||||
edges.push(Edge {
|
|
||||||
from: *node,
|
|
||||||
to: pass,
|
|
||||||
rid,
|
|
||||||
barrier: Barrier::LayoutTransition {
|
|
||||||
src: (before.stage, before.layout),
|
|
||||||
dst: (write.stage, write.layout),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue