fix: uidev dynamic update + flicker (#34)
This commit is contained in:
@@ -72,7 +72,6 @@ impl PreviewState {
|
|||||||
|
|
||||||
let mut canvas = modular_canvas(&config.size, &config.elements, state)?;
|
let mut canvas = modular_canvas(&config.size, &config.elements, state)?;
|
||||||
canvas.init(state)?;
|
canvas.init(state)?;
|
||||||
canvas.render(state).unwrap();
|
|
||||||
let view = canvas.view().unwrap();
|
let view = canvas.view().unwrap();
|
||||||
|
|
||||||
let pipeline = {
|
let pipeline = {
|
||||||
@@ -121,7 +120,6 @@ pub fn uidev_run(panel_name: &str) -> anyhow::Result<()> {
|
|||||||
window.clone(),
|
window.clone(),
|
||||||
panel_name,
|
panel_name,
|
||||||
)?);
|
)?);
|
||||||
let mut previous_frame_end = Some(vulkano::sync::now(graphics.device.clone()).boxed());
|
|
||||||
|
|
||||||
let watch_path = config_io::CONFIG_ROOT_PATH.join(format!("{}.yaml", panel_name));
|
let watch_path = config_io::CONFIG_ROOT_PATH.join(format!("{}.yaml", panel_name));
|
||||||
let mut path_last_modified = watch_path.metadata()?.modified()?;
|
let mut path_last_modified = watch_path.metadata()?.modified()?;
|
||||||
@@ -148,8 +146,6 @@ pub fn uidev_run(panel_name: &str) -> anyhow::Result<()> {
|
|||||||
event: WindowEvent::RedrawRequested,
|
event: WindowEvent::RedrawRequested,
|
||||||
..
|
..
|
||||||
} => {
|
} => {
|
||||||
previous_frame_end.as_mut().unwrap().cleanup_finished();
|
|
||||||
|
|
||||||
let new_modified = watch_path.metadata().unwrap().modified().unwrap();
|
let new_modified = watch_path.metadata().unwrap().modified().unwrap();
|
||||||
if new_modified > path_last_modified {
|
if new_modified > path_last_modified {
|
||||||
recreate = true;
|
recreate = true;
|
||||||
@@ -167,7 +163,7 @@ pub fn uidev_run(panel_name: &str) -> anyhow::Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
let preview = preview.as_ref().unwrap();
|
let preview = preview.as_mut().unwrap();
|
||||||
let (image_index, _, acquire_future) =
|
let (image_index, _, acquire_future) =
|
||||||
match acquire_next_image(preview.swapchain.clone(), None)
|
match acquire_next_image(preview.swapchain.clone(), None)
|
||||||
.map_err(Validated::unwrap)
|
.map_err(Validated::unwrap)
|
||||||
@@ -180,6 +176,11 @@ pub fn uidev_run(panel_name: &str) -> anyhow::Result<()> {
|
|||||||
Err(e) => panic!("failed to acquire next image: {e}"),
|
Err(e) => panic!("failed to acquire next image: {e}"),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if let Err(e) = preview.canvas.render(&mut state) {
|
||||||
|
log::error!("failed to render canvas: {e}");
|
||||||
|
window.request_redraw();
|
||||||
|
};
|
||||||
|
|
||||||
let target = preview.images[image_index as usize].clone();
|
let target = preview.images[image_index as usize].clone();
|
||||||
|
|
||||||
let mut cmd_buf = state
|
let mut cmd_buf = state
|
||||||
@@ -187,16 +188,12 @@ pub fn uidev_run(panel_name: &str) -> anyhow::Result<()> {
|
|||||||
.create_command_buffer(CommandBufferUsage::OneTimeSubmit)
|
.create_command_buffer(CommandBufferUsage::OneTimeSubmit)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
cmd_buf.begin_rendering(target).unwrap();
|
cmd_buf.begin_rendering(target).unwrap();
|
||||||
if cmd_buf.run_ref(&preview.pass).is_err() {
|
cmd_buf.run_ref(&preview.pass).unwrap();
|
||||||
window.request_redraw();
|
|
||||||
}
|
|
||||||
cmd_buf.end_rendering().unwrap();
|
cmd_buf.end_rendering().unwrap();
|
||||||
last_draw = std::time::Instant::now();
|
last_draw = std::time::Instant::now();
|
||||||
|
|
||||||
let command_buffer = cmd_buf.build().unwrap();
|
let command_buffer = cmd_buf.build().unwrap();
|
||||||
let future = previous_frame_end
|
vulkano::sync::now(graphics.device.clone())
|
||||||
.take()
|
|
||||||
.unwrap()
|
|
||||||
.join(acquire_future)
|
.join(acquire_future)
|
||||||
.then_execute(graphics.queue.clone(), command_buffer)
|
.then_execute(graphics.queue.clone(), command_buffer)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
@@ -207,26 +204,14 @@ pub fn uidev_run(panel_name: &str) -> anyhow::Result<()> {
|
|||||||
image_index,
|
image_index,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.then_signal_fence_and_flush();
|
.then_signal_fence_and_flush()
|
||||||
|
.unwrap()
|
||||||
match future.map_err(Validated::unwrap) {
|
.wait(None)
|
||||||
Ok(future) => {
|
.unwrap();
|
||||||
previous_frame_end = Some(future.boxed());
|
|
||||||
}
|
|
||||||
Err(VulkanError::OutOfDate) => {
|
|
||||||
previous_frame_end =
|
|
||||||
Some(vulkano::sync::now(state.graphics.device.clone()).boxed());
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
println!("failed to flush future: {e}");
|
|
||||||
previous_frame_end =
|
|
||||||
Some(vulkano::sync::now(state.graphics.device.clone()).boxed());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::AboutToWait => {
|
Event::AboutToWait => {
|
||||||
if last_draw.elapsed().as_secs() > 1 {
|
if last_draw.elapsed().as_millis() > 100 {
|
||||||
window.request_redraw();
|
window.request_redraw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user