From 5c2ea2c5ea15b7f0b491af63815912f4a177f870 Mon Sep 17 00:00:00 2001 From: let Date: Sat, 13 Jan 2024 18:53:21 +0100 Subject: [PATCH 01/23] Updated winit and egui. --- Cargo.toml | 8 ++++---- examples/demo_app.rs | 2 +- src/integration.rs | 11 ++++------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c7d41a9..1e10af9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,14 +18,14 @@ clipboard = ["egui-winit/clipboard"] [dependencies] ahash = "0.8.3" -egui-winit = "0.24" -egui = "0.24" +egui-winit = "0.25" +egui = "0.25" image = "0.24.5" -winit = "0.28.2" +winit = { version = "0.29.9", features = [ "rwh_05" ] } vulkano = "0.34" vulkano-shaders = "0.34" [dev-dependencies] cgmath = "0.18.0" -egui_demo_lib = "0.24" +egui_demo_lib = "0.25" vulkano-util = "0.34" diff --git a/examples/demo_app.rs b/examples/demo_app.rs index f134dbd..eb0cbee 100644 --- a/examples/demo_app.rs +++ b/examples/demo_app.rs @@ -22,7 +22,7 @@ use winit::{ pub fn main() { // Winit event loop - let event_loop = EventLoop::new(); + let event_loop = EventLoop::new().unwrap(); // Vulkano context let context = VulkanoContext::new(VulkanoConfig::default()); // Vulkano windows (create one) diff --git a/src/integration.rs b/src/integration.rs index e2b712b..e1ca10a 100644 --- a/src/integration.rs +++ b/src/integration.rs @@ -123,6 +123,7 @@ impl Gui { as usize; let egui_ctx: egui::Context = Default::default(); let egui_winit = egui_winit::State::new( + egui_ctx.clone(), egui_ctx.viewport_id(), event_loop, Some(surface_window(&surface).scale_factor() as f32), @@ -156,8 +157,8 @@ impl Gui { /// and only when this returns `false` pass on the events to your game. /// /// Note that egui uses `tab` to move focus between elements, so this will always return `true` for tabs. - pub fn update(&mut self, winit_event: &winit::event::WindowEvent<'_>) -> bool { - self.egui_winit.on_window_event(&self.egui_ctx, winit_event).consumed + pub fn update(&mut self, winit_event: &winit::event::WindowEvent) -> bool { + self.egui_winit.on_window_event(surface_window(&self.surface), winit_event).consumed } /// Begins Egui frame & determines what will be drawn later. This must be called before draw, and after `update` (winit event). @@ -246,11 +247,7 @@ impl Gui { viewport_output: _, } = self.egui_ctx.end_frame(); - self.egui_winit.handle_platform_output( - surface_window(&self.surface), - &self.egui_ctx, - platform_output, - ); + self.egui_winit.handle_platform_output(surface_window(&self.surface), platform_output); self.shapes = shapes; self.textures_delta = textures_delta; } From 6ee6a47a3107661b31a1bbf8c343d2f5d390a628 Mon Sep 17 00:00:00 2001 From: let Date: Wed, 7 Feb 2024 19:47:00 +0100 Subject: [PATCH 02/23] Pulled from upstream --- Cargo.toml | 6 +- examples/demo_app.rs | 114 ++++++----- examples/minimal.rs | 140 ++++++------- examples/multisample.rs | 220 +++++++++++--------- examples/paint_callback.rs | 144 ++++++------- examples/subpass.rs | 226 +++++++++++---------- examples/wholesome/frame_system.rs | 29 +-- examples/wholesome/main.rs | 134 ++++++------ examples/wholesome/renderer.rs | 2 +- examples/wholesome/triangle_draw_system.rs | 29 +-- run_all_examples.ps1 | 1 + run_all_examples.sh | 1 + src/integration.rs | 3 +- src/renderer.rs | 102 +++++----- src/utils.rs | 23 ++- 15 files changed, 625 insertions(+), 549 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1e10af9..f16431d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,11 +21,11 @@ ahash = "0.8.3" egui-winit = "0.25" egui = "0.25" image = "0.24.5" -winit = { version = "0.29.9", features = [ "rwh_05" ] } -vulkano = "0.34" +winit = { version = "0.29.10", features = [ "rwh_05" ] } +vulkano = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} vulkano-shaders = "0.34" [dev-dependencies] cgmath = "0.18.0" egui_demo_lib = "0.25" -vulkano-util = "0.34" +vulkano-util = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} diff --git a/examples/demo_app.rs b/examples/demo_app.rs index eb0cbee..2315b5d 100644 --- a/examples/demo_app.rs +++ b/examples/demo_app.rs @@ -14,7 +14,7 @@ use vulkano_util::{ }; use winit::{ event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + event_loop::EventLoop, }; // Simply create egui demo apps to test everything works correctly. @@ -78,64 +78,66 @@ pub fn main() { let mut egui_test1 = egui_demo_lib::ColorTest::default(); let mut egui_test2 = egui_demo_lib::ColorTest::default(); - event_loop.run(move |event, _, control_flow| { - for (wi, renderer) in windows.iter_mut() { - // Quick and ugly... - let gui = if *wi == window1 { &mut gui1 } else { &mut gui2 }; - let demo_app = if *wi == window1 { &mut demo_app1 } else { &mut demo_app2 }; - let egui_test = if *wi == window1 { &mut egui_test1 } else { &mut egui_test2 }; - match &event { - Event::WindowEvent { event, window_id } if window_id == wi => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => (), - } - } - Event::RedrawRequested(window_id) if window_id == wi => { - // Set immediate UI in redraw here - gui.immediate_ui(|gui| { - let ctx = gui.context(); - demo_app.ui(&ctx); + event_loop + .run(move |event, window| { + for (wi, renderer) in windows.iter_mut() { + // Quick and ugly... + let gui = if *wi == window1 { &mut gui1 } else { &mut gui2 }; + let demo_app = if *wi == window1 { &mut demo_app1 } else { &mut demo_app2 }; + let egui_test = if *wi == window1 { &mut egui_test1 } else { &mut egui_test2 }; + match &event { + Event::WindowEvent { event, window_id } if window_id == wi => { + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(event); + match event { + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + window.exit(); + } + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here + gui.immediate_ui(|gui| { + let ctx = gui.context(); + demo_app.ui(&ctx); - egui::Window::new("Colors").vscroll(true).show(&ctx, |ui| { - egui_test.ui(ui); - }); - }); - // Alternatively you could - // gui.begin_frame(); - // let ctx = gui.context(); - // demo_app.ui(&ctx); + egui::Window::new("Colors").vscroll(true).show(&ctx, |ui| { + egui_test.ui(ui); + }); + }); + // Alternatively you could + // gui.begin_frame(); + // let ctx = gui.context(); + // demo_app.ui(&ctx); - // Render UI - // Acquire swapchain future - match renderer.acquire() { - Ok(future) => { - let after_future = - gui.draw_on_image(future, renderer.swapchain_image_view()); - // Present swapchain - renderer.present(after_future, true); + // Render UI + // Acquire swapchain future + match renderer.acquire() { + Ok(future) => { + let after_future = gui + .draw_on_image(future, renderer.swapchain_image_view()); + // Present swapchain + renderer.present(after_future, true); + } + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); + } + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; + } + _ => (), } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - } - Event::MainEventsCleared => { - renderer.window().request_redraw(); + } + Event::AboutToWait => { + renderer.window().request_redraw(); + } + _ => (), } - _ => (), } - } - }); + }) + .unwrap(); } diff --git a/examples/minimal.rs b/examples/minimal.rs index 94ba0e2..80f1321 100644 --- a/examples/minimal.rs +++ b/examples/minimal.rs @@ -17,7 +17,7 @@ use vulkano_util::{ }; use winit::{ event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + event_loop::EventLoop, }; fn sized_text(ui: &mut egui::Ui, text: impl Into, size: f32) { @@ -26,7 +26,7 @@ fn sized_text(ui: &mut egui::Ui, text: impl Into, size: f32) { pub fn main() { // Winit event loop - let event_loop = EventLoop::new(); + let event_loop = EventLoop::new().unwrap(); // Vulkano context let context = VulkanoContext::new(VulkanoConfig::default()); // Vulkano windows (create one) @@ -48,75 +48,79 @@ pub fn main() { }; // Create gui state (pass anything your state requires) let mut code = CODE.to_owned(); - event_loop.run(move |event, _, control_flow| { - let renderer = windows.get_primary_renderer_mut().unwrap(); - match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; + event_loop + .run(move |event, window| { + let renderer = windows.get_primary_renderer_mut().unwrap(); + match event { + Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); + match event { + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + window.exit(); + } + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here + // Set immediate UI in redraw here + gui.immediate_ui(|gui| { + let ctx = gui.context(); + egui::CentralPanel::default().show(&ctx, |ui| { + ui.vertical_centered(|ui| { + ui.add(egui::widgets::Label::new("Hi there!")); + sized_text(ui, "Rich Text", 32.0); + }); + ui.separator(); + ui.columns(2, |columns| { + ScrollArea::vertical().id_source("source").show( + &mut columns[0], + |ui| { + ui.add( + TextEdit::multiline(&mut code) + .font(TextStyle::Monospace), + ); + }, + ); + ScrollArea::vertical().id_source("rendered").show( + &mut columns[1], + |ui| { + egui_demo_lib::easy_mark::easy_mark(ui, &code); + }, + ); + }); + }); + }); + // Render UI + // Acquire swapchain future + match renderer.acquire() { + Ok(future) => { + // Render gui + let after_future = + gui.draw_on_image(future, renderer.swapchain_image_view()); + // Present swapchain + renderer.present(after_future, true); + } + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); + } + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; + } + _ => (), } - _ => (), } + Event::AboutToWait => { + renderer.window().request_redraw(); + } + _ => (), } - Event::RedrawRequested(window_id) if window_id == window_id => { - // Set immediate UI in redraw here - gui.immediate_ui(|gui| { - let ctx = gui.context(); - egui::CentralPanel::default().show(&ctx, |ui| { - ui.vertical_centered(|ui| { - ui.add(egui::widgets::Label::new("Hi there!")); - sized_text(ui, "Rich Text", 32.0); - }); - ui.separator(); - ui.columns(2, |columns| { - ScrollArea::vertical().id_source("source").show( - &mut columns[0], - |ui| { - ui.add( - TextEdit::multiline(&mut code).font(TextStyle::Monospace), - ); - }, - ); - ScrollArea::vertical().id_source("rendered").show( - &mut columns[1], - |ui| { - egui_demo_lib::easy_mark::easy_mark(ui, &code); - }, - ); - }); - }); - }); - // Render UI - // Acquire swapchain future - match renderer.acquire() { - Ok(future) => { - // Render gui - let after_future = - gui.draw_on_image(future, renderer.swapchain_image_view()); - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - } - Event::MainEventsCleared => { - renderer.window().request_redraw(); - } - _ => (), - } - }); + }) + .unwrap(); } const CODE: &str = r" diff --git a/examples/multisample.rs b/examples/multisample.rs index 2eb798e..f17b475 100644 --- a/examples/multisample.rs +++ b/examples/multisample.rs @@ -20,8 +20,9 @@ use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, command_buffer::{ allocator::{StandardCommandBufferAllocator, StandardCommandBufferAllocatorCreateInfo}, - AutoCommandBufferBuilder, CommandBufferInheritanceInfo, CommandBufferUsage, - RenderPassBeginInfo, SubpassBeginInfo, SubpassContents, + CommandBufferBeginInfo, CommandBufferInheritanceInfo, CommandBufferLevel, + CommandBufferUsage, RecordingCommandBuffer, RenderPassBeginInfo, SubpassBeginInfo, + SubpassContents, }, device::{Device, Queue}, format::Format, @@ -49,12 +50,12 @@ use vulkano_util::{ }; use winit::{ event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + event_loop::EventLoop, }; pub fn main() { // Winit event loop - let event_loop = EventLoop::new(); + let event_loop = EventLoop::new().unwrap(); // Vulkano context let context = VulkanoContext::new(VulkanoConfig::default()); // Vulkano windows (create one) @@ -86,69 +87,72 @@ pub fn main() { ); // Create gui state (pass anything your state requires) - event_loop.run(move |event, _, control_flow| { - let renderer = windows.get_primary_renderer_mut().unwrap(); - match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); + event_loop + .run(move |event, window| { + let renderer = windows.get_primary_renderer_mut().unwrap(); + match event { + Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); + match event { + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => window.exit(), + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here + gui.immediate_ui(|gui| { + let ctx = gui.context(); + Window::new("Transparent Window") + .anchor(Align2([Align::RIGHT, Align::TOP]), vec2(-545.0, 500.0)) + .resizable(false) + .default_width(300.0) + .frame( + Frame::none() + .fill(Color32::from_white_alpha(125)) + .shadow(Shadow { + extrusion: 8.0, + color: Color32::from_black_alpha(125), + }) + .rounding(Rounding::same(5.0)) + .inner_margin(Margin::same(10.0)), + ) + .show(&ctx, |ui| { + ui.colored_label(Color32::BLACK, "Content :)"); + }); + }); + // Render + // Acquire swapchain future + match renderer.acquire() { + Ok(future) => { + // Render + let after_future = pipeline.render( + future, + renderer.swapchain_image_view(), + &mut gui, + ); + // Present swapchain + renderer.present(after_future, true); + } + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); + } + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; + } + _ => (), } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => (), } + Event::AboutToWait => { + renderer.window().request_redraw(); + } + _ => (), } - Event::RedrawRequested(window_id) if window_id == window_id => { - // Set immediate UI in redraw here - gui.immediate_ui(|gui| { - let ctx = gui.context(); - Window::new("Transparent Window") - .anchor(Align2([Align::RIGHT, Align::TOP]), vec2(-545.0, 500.0)) - .resizable(false) - .default_width(300.0) - .frame( - Frame::none() - .fill(Color32::from_white_alpha(125)) - .shadow(Shadow { - extrusion: 8.0, - color: Color32::from_black_alpha(125), - }) - .rounding(Rounding::same(5.0)) - .inner_margin(Margin::same(10.0)), - ) - .show(&ctx, |ui| { - ui.colored_label(Color32::BLACK, "Content :)"); - }); - }); - // Render - // Acquire swapchain future - match renderer.acquire() { - Ok(future) => { - // Render - let after_future = - pipeline.render(future, renderer.swapchain_image_view(), &mut gui); - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - } - Event::MainEventsCleared => { - renderer.window().request_redraw(); - } - _ => (), - } - }); + }) + .unwrap(); } struct MSAAPipeline { @@ -159,7 +163,7 @@ struct MSAAPipeline { subpass: Subpass, intermediary: Arc, vertex_buffer: Subbuffer<[MyVertex]>, - command_buffer_allocator: StandardCommandBufferAllocator, + command_buffer_allocator: Arc, } impl MSAAPipeline { @@ -197,7 +201,8 @@ impl MSAAPipeline { secondary_buffer_count: 32, ..Default::default() }, - ); + ) + .into(); let intermediary = ImageView::new_default( Image::new( @@ -293,24 +298,28 @@ impl MSAAPipeline { let subpass = Subpass::from(render_pass, 0).unwrap(); ( - GraphicsPipeline::new(device.clone(), None, GraphicsPipelineCreateInfo { - stages: stages.into_iter().collect(), - vertex_input_state: Some(vertex_input_state), - input_assembly_state: Some(InputAssemblyState::default()), - viewport_state: Some(ViewportState::default()), - rasterization_state: Some(RasterizationState::default()), - multisample_state: Some(MultisampleState { - rasterization_samples: subpass.num_samples().unwrap(), - ..MultisampleState::default() - }), - color_blend_state: Some(ColorBlendState::with_attachment_states( - subpass.num_color_attachments(), - ColorBlendAttachmentState::default(), - )), - dynamic_state: [DynamicState::Viewport].into_iter().collect(), - subpass: Some(subpass.clone().into()), - ..GraphicsPipelineCreateInfo::layout(layout) - }) + GraphicsPipeline::new( + device.clone(), + None, + GraphicsPipelineCreateInfo { + stages: stages.into_iter().collect(), + vertex_input_state: Some(vertex_input_state), + input_assembly_state: Some(InputAssemblyState::default()), + viewport_state: Some(ViewportState::default()), + rasterization_state: Some(RasterizationState::default()), + multisample_state: Some(MultisampleState { + rasterization_samples: subpass.num_samples().unwrap(), + ..MultisampleState::default() + }), + color_blend_state: Some(ColorBlendState::with_attachment_states( + subpass.num_color_attachments(), + ColorBlendAttachmentState::default(), + )), + dynamic_state: [DynamicState::Viewport].into_iter().collect(), + subpass: Some(subpass.clone().into()), + ..GraphicsPipelineCreateInfo::layout(layout) + }, + ) .unwrap(), subpass, ) @@ -322,10 +331,14 @@ impl MSAAPipeline { image: Arc, gui: &mut Gui, ) -> Box { - let mut builder = AutoCommandBufferBuilder::primary( - &self.command_buffer_allocator, + let mut builder = RecordingCommandBuffer::new( + self.command_buffer_allocator.clone(), self.queue.queue_family_index(), - CommandBufferUsage::OneTimeSubmit, + CommandBufferLevel::Primary, + CommandBufferBeginInfo { + usage: CommandBufferUsage::OneTimeSubmit, + ..Default::default() + }, ) .unwrap(); @@ -351,10 +364,13 @@ impl MSAAPipeline { .unwrap(); } - let framebuffer = Framebuffer::new(self.render_pass.clone(), FramebufferCreateInfo { - attachments: vec![self.intermediary.clone(), image], - ..Default::default() - }) + let framebuffer = Framebuffer::new( + self.render_pass.clone(), + FramebufferCreateInfo { + attachments: vec![self.intermediary.clone(), image], + ..Default::default() + }, + ) .unwrap(); // Begin render pipeline commands @@ -372,12 +388,15 @@ impl MSAAPipeline { .unwrap(); // Render first draw pass - let mut secondary_builder = AutoCommandBufferBuilder::secondary( - &self.command_buffer_allocator, + let mut secondary_builder = RecordingCommandBuffer::new( + self.command_buffer_allocator.clone(), self.queue.queue_family_index(), - CommandBufferUsage::MultipleSubmit, - CommandBufferInheritanceInfo { - render_pass: Some(self.subpass.clone().into()), + CommandBufferLevel::Secondary, + CommandBufferBeginInfo { + inheritance_info: Some(CommandBufferInheritanceInfo { + render_pass: Some(self.subpass.clone().into()), + ..Default::default() + }), ..Default::default() }, ) @@ -397,10 +416,11 @@ impl MSAAPipeline { ) .unwrap() .bind_vertex_buffers(0, self.vertex_buffer.clone()) - .unwrap() - .draw(self.vertex_buffer.len() as u32, 1, 0, 0) .unwrap(); - let cb = secondary_builder.build().unwrap(); + unsafe { + secondary_builder.draw(self.vertex_buffer.len() as u32, 1, 0, 0).unwrap(); + } + let cb = secondary_builder.end().unwrap(); builder.execute_commands(cb).unwrap(); // Draw gui on subpass @@ -409,7 +429,7 @@ impl MSAAPipeline { // Last end render pass builder.end_render_pass(Default::default()).unwrap(); - let command_buffer = builder.build().unwrap(); + let command_buffer = builder.end().unwrap(); let after_future = before_future.then_execute(self.queue.clone(), command_buffer).unwrap(); after_future.boxed() diff --git a/examples/paint_callback.rs b/examples/paint_callback.rs index 67fc097..01b9584 100644 --- a/examples/paint_callback.rs +++ b/examples/paint_callback.rs @@ -34,12 +34,12 @@ use vulkano_util::{ }; use winit::{ event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + event_loop::EventLoop, }; pub fn main() { // Winit event loop - let event_loop = EventLoop::new(); + let event_loop = EventLoop::new().unwrap(); // Vulkano context let context = VulkanoContext::new(VulkanoConfig::default()); // Vulkano windows (create one) @@ -71,74 +71,81 @@ pub fn main() { }; // Create gui state (pass anything your state requires) - event_loop.run(move |event, _, control_flow| { - let renderer = windows.get_primary_renderer_mut().unwrap(); - match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => (), - } - } - Event::RedrawRequested(window_id) if window_id == renderer.window().id() => { - let scene = scene.clone(); - // Set immediate UI in redraw here - gui.immediate_ui(|gui| { - let ctx = gui.context(); - egui::CentralPanel::default().show(&ctx, |ui| { - // Create a frame to render our triangle image in - egui::Frame::canvas(ui.style()).fill(Rgba::BLACK.into()).show(ui, |ui| { - // Allocate all the space in the frame for the image - let (rect, _) = ui.allocate_exact_size( - vec2(ui.available_width(), ui.available_height()), - Sense::click(), - ); + event_loop + .run(move |event, window| { + let renderer = windows.get_primary_renderer_mut().unwrap(); + match event { + Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); + match event { + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + window.exit(); + } + WindowEvent::RedrawRequested => { + let scene = scene.clone(); + // Set immediate UI in redraw here + gui.immediate_ui(|gui| { + let ctx = gui.context(); + egui::CentralPanel::default().show(&ctx, |ui| { + // Create a frame to render our triangle image in + egui::Frame::canvas(ui.style()).fill(Rgba::BLACK.into()).show( + ui, + |ui| { + // Allocate all the space in the frame for the image + let (rect, _) = ui.allocate_exact_size( + vec2(ui.available_width(), ui.available_height()), + Sense::click(), + ); - // Render the scene in the allocated space - let paint_callback = PaintCallback { - rect, - callback: Arc::new(CallbackFn::new(move |info, context| { - let mut scene = scene.lock(); - scene.render(info, context); - })), - }; + // Render the scene in the allocated space + let paint_callback = PaintCallback { + rect, + callback: Arc::new(CallbackFn::new( + move |info, context| { + let mut scene = scene.lock(); + scene.render(info, context); + }, + )), + }; - ui.painter().add(paint_callback); - }); - }); - }); - // Render UI - // Acquire swapchain future - match renderer.acquire() { - Ok(future) => { - // Render gui - let after_future = - gui.draw_on_image(future, renderer.swapchain_image_view()); - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); + ui.painter().add(paint_callback); + }, + ); + }); + }); + // Render UI + // Acquire swapchain future + match renderer.acquire() { + Ok(future) => { + // Render gui + let after_future = + gui.draw_on_image(future, renderer.swapchain_image_view()); + // Present swapchain + renderer.present(after_future, true); + } + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); + } + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; + } + _ => (), } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - } - Event::MainEventsCleared => { - renderer.window().request_redraw(); + } + Event::AboutToWait => { + renderer.window().request_redraw(); + } + _ => (), } - _ => (), - } - }); + }) + .unwrap(); } struct Scene { @@ -220,9 +227,10 @@ impl Scene { .bind_pipeline_graphics(self.pipeline.clone()) .unwrap() .bind_vertex_buffers(0, self.vertex_buffer.clone()) - .unwrap() - .draw(self.vertex_buffer.len() as u32, 1, 0, 0) .unwrap(); + unsafe { + context.builder.draw(self.vertex_buffer.len() as u32, 1, 0, 0).unwrap(); + } } } diff --git a/examples/subpass.rs b/examples/subpass.rs index 77d13c6..1255ddd 100644 --- a/examples/subpass.rs +++ b/examples/subpass.rs @@ -20,8 +20,9 @@ use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, command_buffer::{ allocator::{StandardCommandBufferAllocator, StandardCommandBufferAllocatorCreateInfo}, - AutoCommandBufferBuilder, CommandBufferInheritanceInfo, CommandBufferUsage, - RenderPassBeginInfo, SubpassBeginInfo, SubpassContents, + CommandBufferBeginInfo, CommandBufferInheritanceInfo, CommandBufferLevel, + CommandBufferUsage, RecordingCommandBuffer, RenderPassBeginInfo, SubpassBeginInfo, + SubpassContents, }, device::{Device, Queue}, format::Format, @@ -49,13 +50,13 @@ use vulkano_util::{ }; use winit::{ event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + event_loop::EventLoop, }; // Render a triangle (scene) and a gui from a subpass on top of it (with some transparent fill) pub fn main() { // Winit event loop - let event_loop = EventLoop::new(); + let event_loop = EventLoop::new().unwrap(); // Vulkano context let context = VulkanoContext::new(VulkanoConfig::default()); // Vulkano windows (create one) @@ -81,70 +82,75 @@ pub fn main() { ); // Create gui state (pass anything your state requires) - event_loop.run(move |event, _, control_flow| { - let renderer = windows.get_primary_renderer_mut().unwrap(); - match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); + event_loop + .run(move |event, window| { + let renderer = windows.get_primary_renderer_mut().unwrap(); + match event { + Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); + match event { + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + window.exit(); + } + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here + gui.immediate_ui(|gui| { + let ctx = gui.context(); + Window::new("Transparent Window") + .anchor(Align2([Align::RIGHT, Align::TOP]), vec2(-545.0, 500.0)) + .resizable(false) + .default_width(300.0) + .frame( + Frame::none() + .fill(Color32::from_white_alpha(125)) + .shadow(Shadow { + extrusion: 8.0, + color: Color32::from_black_alpha(125), + }) + .rounding(Rounding::same(5.0)) + .inner_margin(Margin::same(10.0)), + ) + .show(&ctx, |ui| { + ui.colored_label(Color32::BLACK, "Content :)"); + }); + }); + + // Acquire swapchain future + match renderer.acquire() { + Ok(future) => { + // Render gui + let after_future = gui_pipeline.render( + future, + renderer.swapchain_image_view(), + &mut gui, + ); + + // Present swapchain + renderer.present(after_future, true); + } + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); + } + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; + } + _ => (), } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => (), } + Event::AboutToWait => { + renderer.window().request_redraw(); + } + _ => (), } - Event::RedrawRequested(window_id) if window_id == window_id => { - // Set immediate UI in redraw here - gui.immediate_ui(|gui| { - let ctx = gui.context(); - Window::new("Transparent Window") - .anchor(Align2([Align::RIGHT, Align::TOP]), vec2(-545.0, 500.0)) - .resizable(false) - .default_width(300.0) - .frame( - Frame::none() - .fill(Color32::from_white_alpha(125)) - .shadow(Shadow { - extrusion: 8.0, - color: Color32::from_black_alpha(125), - }) - .rounding(Rounding::same(5.0)) - .inner_margin(Margin::same(10.0)), - ) - .show(&ctx, |ui| { - ui.colored_label(Color32::BLACK, "Content :)"); - }); - }); - - // Acquire swapchain future - match renderer.acquire() { - Ok(future) => { - // Render gui - let after_future = - gui_pipeline.render(future, renderer.swapchain_image_view(), &mut gui); - - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - } - Event::MainEventsCleared => { - renderer.window().request_redraw(); - } - _ => (), - } - }); + }) + .unwrap(); } struct SimpleGuiPipeline { @@ -153,7 +159,7 @@ struct SimpleGuiPipeline { pipeline: Arc, subpass: Subpass, vertex_buffer: Subbuffer<[MyVertex]>, - command_buffer_allocator: StandardCommandBufferAllocator, + command_buffer_allocator: Arc, } impl SimpleGuiPipeline { @@ -189,7 +195,8 @@ impl SimpleGuiPipeline { secondary_buffer_count: 32, ..Default::default() }, - ); + ) + .into(); Self { queue, render_pass, pipeline, subpass, vertex_buffer, command_buffer_allocator } } @@ -246,21 +253,25 @@ impl SimpleGuiPipeline { let subpass = Subpass::from(render_pass, 0).unwrap(); ( - GraphicsPipeline::new(device, None, GraphicsPipelineCreateInfo { - stages: stages.into_iter().collect(), - vertex_input_state: Some(vertex_input_state), - input_assembly_state: Some(InputAssemblyState::default()), - viewport_state: Some(ViewportState::default()), - rasterization_state: Some(RasterizationState::default()), - multisample_state: Some(MultisampleState::default()), - color_blend_state: Some(ColorBlendState::with_attachment_states( - subpass.num_color_attachments(), - ColorBlendAttachmentState::default(), - )), - dynamic_state: [DynamicState::Viewport].into_iter().collect(), - subpass: Some(subpass.clone().into()), - ..GraphicsPipelineCreateInfo::layout(layout) - }) + GraphicsPipeline::new( + device, + None, + GraphicsPipelineCreateInfo { + stages: stages.into_iter().collect(), + vertex_input_state: Some(vertex_input_state), + input_assembly_state: Some(InputAssemblyState::default()), + viewport_state: Some(ViewportState::default()), + rasterization_state: Some(RasterizationState::default()), + multisample_state: Some(MultisampleState::default()), + color_blend_state: Some(ColorBlendState::with_attachment_states( + subpass.num_color_attachments(), + ColorBlendAttachmentState::default(), + )), + dynamic_state: [DynamicState::Viewport].into_iter().collect(), + subpass: Some(subpass.clone().into()), + ..GraphicsPipelineCreateInfo::layout(layout) + }, + ) .unwrap(), subpass, ) @@ -272,18 +283,22 @@ impl SimpleGuiPipeline { image: Arc, gui: &mut Gui, ) -> Box { - let mut builder = AutoCommandBufferBuilder::primary( - &self.command_buffer_allocator, + let mut builder = RecordingCommandBuffer::new( + self.command_buffer_allocator.clone(), self.queue.queue_family_index(), - CommandBufferUsage::OneTimeSubmit, + CommandBufferLevel::Primary, + CommandBufferBeginInfo { + usage: CommandBufferUsage::OneTimeSubmit, + ..Default::default() + }, ) .unwrap(); let dimensions = image.image().extent(); - let framebuffer = Framebuffer::new(self.render_pass.clone(), FramebufferCreateInfo { - attachments: vec![image], - ..Default::default() - }) + let framebuffer = Framebuffer::new( + self.render_pass.clone(), + FramebufferCreateInfo { attachments: vec![image], ..Default::default() }, + ) .unwrap(); // Begin render pipeline commands @@ -301,12 +316,15 @@ impl SimpleGuiPipeline { .unwrap(); // Render first draw pass - let mut secondary_builder = AutoCommandBufferBuilder::secondary( - &self.command_buffer_allocator, + let mut secondary_builder = RecordingCommandBuffer::new( + self.command_buffer_allocator.clone(), self.queue.queue_family_index(), - CommandBufferUsage::MultipleSubmit, - CommandBufferInheritanceInfo { - render_pass: Some(self.subpass.clone().into()), + CommandBufferLevel::Secondary, + CommandBufferBeginInfo { + inheritance_info: Some(CommandBufferInheritanceInfo { + render_pass: Some(self.subpass.clone().into()), + ..Default::default() + }), ..Default::default() }, ) @@ -326,18 +344,22 @@ impl SimpleGuiPipeline { ) .unwrap() .bind_vertex_buffers(0, self.vertex_buffer.clone()) - .unwrap() - .draw(self.vertex_buffer.len() as u32, 1, 0, 0) .unwrap(); - let cb = secondary_builder.build().unwrap(); + unsafe { + secondary_builder.draw(self.vertex_buffer.len() as u32, 1, 0, 0).unwrap(); + } + let cb = secondary_builder.end().unwrap(); builder.execute_commands(cb).unwrap(); // Move on to next subpass for gui builder - .next_subpass(Default::default(), SubpassBeginInfo { - contents: SubpassContents::SecondaryCommandBuffers, - ..Default::default() - }) + .next_subpass( + Default::default(), + SubpassBeginInfo { + contents: SubpassContents::SecondaryCommandBuffers, + ..Default::default() + }, + ) .unwrap(); // Draw gui on subpass let cb = gui.draw_on_subpass_image([dimensions[0], dimensions[1]]); @@ -345,7 +367,7 @@ impl SimpleGuiPipeline { // Last end render pass builder.end_render_pass(Default::default()).unwrap(); - let command_buffer = builder.build().unwrap(); + let command_buffer = builder.end().unwrap(); let after_future = before_future.then_execute(self.queue.clone(), command_buffer).unwrap(); after_future.boxed() diff --git a/examples/wholesome/frame_system.rs b/examples/wholesome/frame_system.rs index c6e146b..39e922a 100644 --- a/examples/wholesome/frame_system.rs +++ b/examples/wholesome/frame_system.rs @@ -16,8 +16,8 @@ use std::{convert::TryFrom, sync::Arc}; use cgmath::Matrix4; use vulkano::{ command_buffer::{ - AutoCommandBufferBuilder, CommandBufferUsage, PrimaryAutoCommandBuffer, - RenderPassBeginInfo, SecondaryCommandBufferAbstract, SubpassBeginInfo, SubpassContents, + CommandBuffer, CommandBufferBeginInfo, CommandBufferLevel, CommandBufferUsage, + RecordingCommandBuffer, RenderPassBeginInfo, SubpassBeginInfo, SubpassContents, }, device::Queue, format::Format, @@ -124,10 +124,14 @@ impl FrameSystem { ..Default::default() }) .unwrap(); - let mut command_buffer_builder = AutoCommandBufferBuilder::primary( - self.allocators.command_buffers.as_ref(), + let mut command_buffer_builder = RecordingCommandBuffer::new( + self.allocators.command_buffers.clone(), self.gfx_queue.queue_family_index(), - CommandBufferUsage::OneTimeSubmit, + CommandBufferLevel::Primary, + CommandBufferBeginInfo { + usage: CommandBufferUsage::OneTimeSubmit, + ..Default::default() + }, ) .unwrap(); command_buffer_builder @@ -148,7 +152,7 @@ impl FrameSystem { before_main_cb_future: Some(Box::new(before_future)), framebuffer, num_pass: 0, - command_buffer_builder: Some(command_buffer_builder), + recording_command_buffer: Some(command_buffer_builder), world_to_framebuffer, } } @@ -159,7 +163,7 @@ pub struct Frame<'a> { num_pass: u8, before_main_cb_future: Option>, framebuffer: Arc, - command_buffer_builder: Option>, + recording_command_buffer: Option, #[allow(dead_code)] world_to_framebuffer: Matrix4, } @@ -174,12 +178,12 @@ impl<'a> Frame<'a> { match res { 0 => Some(Pass::Deferred(DrawPass { frame: self })), 1 => { - self.command_buffer_builder + self.recording_command_buffer .as_mut() .unwrap() .end_render_pass(Default::default()) .unwrap(); - let command_buffer = self.command_buffer_builder.take().unwrap().build().unwrap(); + let command_buffer = self.recording_command_buffer.take().unwrap().end().unwrap(); let after_main_cb = self .before_main_cb_future .take() @@ -204,12 +208,9 @@ pub struct DrawPass<'f, 's: 'f> { impl<'f, 's: 'f> DrawPass<'f, 's> { #[inline] - pub fn execute(&mut self, command_buffer: Arc) - where - C: SecondaryCommandBufferAbstract + Send + Sync + 'static, - { + pub fn execute(&mut self, command_buffer: Arc) { self.frame - .command_buffer_builder + .recording_command_buffer .as_mut() .unwrap() .execute_commands(command_buffer) diff --git a/examples/wholesome/main.rs b/examples/wholesome/main.rs index 91e11a0..e884e93 100644 --- a/examples/wholesome/main.rs +++ b/examples/wholesome/main.rs @@ -28,7 +28,7 @@ use vulkano_util::{ }; use winit::{ event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + event_loop::EventLoop, }; use crate::{renderer::RenderPipeline, time_info::TimeInfo}; @@ -100,26 +100,28 @@ impl GuiState { .vscroll(true) .open(show_texture_window1) .show(&egui_context, |ui| { - ui.image(ImageSource::Texture(SizedTexture::new(*image_texture_id1, [ - 256.0, 256.0, - ]))); + ui.image(ImageSource::Texture(SizedTexture::new( + *image_texture_id1, + [256.0, 256.0], + ))); }); egui::Window::new("Mah Doge") .resizable(true) .vscroll(true) .open(show_texture_window2) .show(&egui_context, |ui| { - ui.image(ImageSource::Texture(SizedTexture::new(*image_texture_id2, [ - 300.0, 200.0, - ]))); + ui.image(ImageSource::Texture(SizedTexture::new( + *image_texture_id2, + [300.0, 200.0], + ))); }); egui::Window::new("Scene").resizable(true).vscroll(true).open(show_scene_window).show( &egui_context, |ui| { - ui.image(ImageSource::Texture(SizedTexture::new(*scene_texture_id, [ - scene_view_size[0] as f32, - scene_view_size[1] as f32, - ]))); + ui.image(ImageSource::Texture(SizedTexture::new( + *scene_texture_id, + [scene_view_size[0] as f32, scene_view_size[1] as f32], + ))); }, ); egui::Area::new("fps") @@ -132,7 +134,7 @@ impl GuiState { pub fn main() { // Winit event loop & our time tracking initialization - let event_loop = EventLoop::new(); + let event_loop = EventLoop::new().unwrap(); let mut time = TimeInfo::new(); // Create renderer for our scene & ui let scene_view_size = [256, 256]; @@ -191,59 +193,63 @@ pub fn main() { // Create gui state (pass anything your state requires) let mut gui_state = GuiState::new(&mut gui, scene_image.clone(), scene_view_size); // Event loop run - event_loop.run(move |event, _, control_flow| { - let renderer = windows.get_primary_renderer_mut().unwrap(); - // Update Egui integration so the UI works! - match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; + event_loop + .run(move |event, window| { + let renderer = windows.get_primary_renderer_mut().unwrap(); + // Update Egui integration so the UI works! + match event { + Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { + let _pass_events_to_game = !gui.update(&event); + match event { + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + window.exit(); + } + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here + // It's a closure giving access to egui context inside which you can call anything. + // Here we're calling the layout of our `gui_state`. + gui.immediate_ui(|gui| { + let ctx = gui.context(); + gui_state.layout(ctx, renderer.window_size(), time.fps()) + }); + // Render UI + // Acquire swapchain future + match renderer.acquire() { + Ok(future) => { + // Draw scene + let after_scene_draw = + scene_render_pipeline.render(future, scene_image.clone()); + // Render gui + let after_future = gui.draw_on_image( + after_scene_draw, + renderer.swapchain_image_view(), + ); + // Present swapchain + renderer.present(after_future, true); + } + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); + } + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; + + // Update fps & dt + time.update(); + } + _ => (), } - _ => (), } + Event::AboutToWait => { + renderer.window().request_redraw(); + } + _ => (), } - Event::RedrawRequested(window_id) if window_id == window_id => { - // Set immediate UI in redraw here - // It's a closure giving access to egui context inside which you can call anything. - // Here we're calling the layout of our `gui_state`. - gui.immediate_ui(|gui| { - let ctx = gui.context(); - gui_state.layout(ctx, renderer.window_size(), time.fps()) - }); - // Render UI - // Acquire swapchain future - match renderer.acquire() { - Ok(future) => { - // Draw scene - let after_scene_draw = - scene_render_pipeline.render(future, scene_image.clone()); - // Render gui - let after_future = - gui.draw_on_image(after_scene_draw, renderer.swapchain_image_view()); - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - - // Update fps & dt - time.update(); - } - Event::MainEventsCleared => { - renderer.window().request_redraw(); - } - _ => (), - } - }); + }) + .unwrap(); } diff --git a/examples/wholesome/renderer.rs b/examples/wholesome/renderer.rs index 65e6d2e..886e6b3 100644 --- a/examples/wholesome/renderer.rs +++ b/examples/wholesome/renderer.rs @@ -58,7 +58,7 @@ impl RenderPipeline { while let Some(pass) = frame.next_pass() { match pass { Pass::Deferred(mut draw_pass) => { - let cb = Arc::new(self.draw_pipeline.draw([dims[0], dims[1]])); + let cb = self.draw_pipeline.draw([dims[0], dims[1]]); draw_pass.execute(cb); } Pass::Finished(af) => { diff --git a/examples/wholesome/triangle_draw_system.rs b/examples/wholesome/triangle_draw_system.rs index fdd327d..2ae046f 100644 --- a/examples/wholesome/triangle_draw_system.rs +++ b/examples/wholesome/triangle_draw_system.rs @@ -16,8 +16,8 @@ use std::{convert::TryInto, sync::Arc}; use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, command_buffer::{ - allocator::StandardCommandBufferAllocator, AutoCommandBufferBuilder, - CommandBufferInheritanceInfo, CommandBufferUsage, SecondaryAutoCommandBuffer, + allocator::StandardCommandBufferAllocator, CommandBuffer, CommandBufferBeginInfo, + CommandBufferInheritanceInfo, RecordingCommandBuffer, }, device::Queue, memory::allocator::{AllocationCreateInfo, MemoryTypeFilter}, @@ -122,16 +122,16 @@ impl TriangleDrawSystem { } } - pub fn draw( - &self, - viewport_dimensions: [u32; 2], - ) -> Arc>> { - let mut builder = AutoCommandBufferBuilder::secondary( - &self.command_buffer_allocator, + pub fn draw(&self, viewport_dimensions: [u32; 2]) -> Arc { + let mut builder = RecordingCommandBuffer::new( + self.command_buffer_allocator.clone(), self.gfx_queue.queue_family_index(), - CommandBufferUsage::MultipleSubmit, - CommandBufferInheritanceInfo { - render_pass: Some(self.subpass.clone().into()), + vulkano::command_buffer::CommandBufferLevel::Secondary, + CommandBufferBeginInfo { + inheritance_info: Some(CommandBufferInheritanceInfo { + render_pass: Some(self.subpass.clone().into()), + ..Default::default() + }), ..Default::default() }, ) @@ -151,10 +151,11 @@ impl TriangleDrawSystem { ) .unwrap() .bind_vertex_buffers(0, self.vertex_buffer.clone()) - .unwrap() - .draw(self.vertex_buffer.len() as u32, 1, 0, 0) .unwrap(); - builder.build().unwrap() + unsafe { + builder.draw(self.vertex_buffer.len() as u32, 1, 0, 0).unwrap(); + } + builder.end().unwrap() } } diff --git a/run_all_examples.ps1 b/run_all_examples.ps1 index 129e66f..f64d08d 100644 --- a/run_all_examples.ps1 +++ b/run_all_examples.ps1 @@ -1,3 +1,4 @@ +cargo build --examples --release cargo run --example wholesome --release cargo run --example minimal --release cargo run --example subpass --release diff --git a/run_all_examples.sh b/run_all_examples.sh index 129e66f..f64d08d 100755 --- a/run_all_examples.sh +++ b/run_all_examples.sh @@ -1,3 +1,4 @@ +cargo build --examples --release cargo run --example wholesome --release cargo run --example minimal --release cargo run --example subpass --release diff --git a/src/integration.rs b/src/integration.rs index e1ca10a..75b4816 100644 --- a/src/integration.rs +++ b/src/integration.rs @@ -11,7 +11,6 @@ use std::sync::Arc; use egui::{ClippedPrimitive, TexturesDelta}; use egui_winit::winit::event_loop::EventLoopWindowTarget; use vulkano::{ - command_buffer::SecondaryAutoCommandBuffer, device::Queue, format::{Format, NumericFormat}, image::{sampler::SamplerCreateInfo, view::ImageView, SampleCount}, @@ -212,7 +211,7 @@ impl Gui { pub fn draw_on_subpass_image( &mut self, image_dimensions: [u32; 2], - ) -> Arc { + ) -> Arc { if self.renderer.has_renderpass() { panic!( "Gui integration has been created with its own render pass, use `draw_on_image` \ diff --git a/src/renderer.rs b/src/renderer.rs index 2ccd94b..c2ea53e 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -20,14 +20,14 @@ use vulkano::{ Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer, }, command_buffer::{ - allocator::StandardCommandBufferAllocator, AutoCommandBufferBuilder, BufferImageCopy, - CommandBufferInheritanceInfo, CommandBufferUsage, CopyBufferToImageInfo, - PrimaryAutoCommandBuffer, PrimaryCommandBufferAbstract, RenderPassBeginInfo, - SecondaryAutoCommandBuffer, SubpassBeginInfo, SubpassContents, + allocator::StandardCommandBufferAllocator, BufferImageCopy, CommandBuffer, + CommandBufferBeginInfo, CommandBufferInheritanceInfo, CommandBufferLevel, + CommandBufferUsage, CopyBufferToImageInfo, RecordingCommandBuffer, RenderPassBeginInfo, + SubpassBeginInfo, SubpassContents, }, descriptor_set::{ - allocator::StandardDescriptorSetAllocator, layout::DescriptorSetLayout, - PersistentDescriptorSet, WriteDescriptorSet, + allocator::StandardDescriptorSetAllocator, layout::DescriptorSetLayout, DescriptorSet, + WriteDescriptorSet, }, device::Queue, format::{Format, NumericFormat}, @@ -105,7 +105,7 @@ pub struct Renderer { pipeline: Arc, subpass: Subpass, - texture_desc_sets: AHashMap>, + texture_desc_sets: AHashMap>, texture_images: AHashMap>, next_native_tex_id: u64, } @@ -276,9 +276,9 @@ impl Renderer { layout: &Arc, image: Arc, sampler: Arc, - ) -> Arc { - PersistentDescriptorSet::new( - &self.allocators.descriptor_set, + ) -> Arc { + DescriptorSet::new( + self.allocators.descriptor_set.clone(), layout.clone(), [WriteDescriptorSet::image_view_sampler(0, image, sampler)], [], @@ -385,7 +385,7 @@ impl Renderer { delta: &egui::epaint::ImageDelta, stage: Subbuffer<[u8]>, mapped_stage: &mut [u8], - cbb: &mut AutoCommandBufferBuilder, + cbb: &mut RecordingCommandBuffer, ) { // Extract pixel data from egui, writing into our region of the stage buffer. let format = match &delta.image { @@ -504,10 +504,14 @@ impl Renderer { let buffer = Subbuffer::new(buffer); // Shared command buffer for every upload in this batch. - let mut cbb = AutoCommandBufferBuilder::primary( - &self.allocators.command_buffer, + let mut cbb = RecordingCommandBuffer::new( + self.allocators.command_buffer.clone(), self.gfx_queue.queue_family_index(), - CommandBufferUsage::OneTimeSubmit, + CommandBufferLevel::Primary, + CommandBufferBeginInfo { + usage: CommandBufferUsage::OneTimeSubmit, + ..Default::default() + }, ) .unwrap(); @@ -535,7 +539,7 @@ impl Renderer { } // Execute every upload at once and await: - let command_buffer = cbb.build().unwrap(); + let command_buffer = cbb.end().unwrap(); // Executing on the graphics queue not only since it's what we have, but // we must guarantee a transfer granularity of [1,1,x] which graphics queue is required to have. command_buffer @@ -571,26 +575,24 @@ impl Renderer { } } - fn create_secondary_command_buffer_builder( - &self, - ) -> AutoCommandBufferBuilder { - AutoCommandBufferBuilder::secondary( - &self.allocators.command_buffer, + fn create_secondary_command_buffer_builder(&self) -> RecordingCommandBuffer { + RecordingCommandBuffer::new( + self.allocators.command_buffer.clone(), self.gfx_queue.queue_family_index(), - CommandBufferUsage::MultipleSubmit, - CommandBufferInheritanceInfo { - render_pass: Some(self.subpass.clone().into()), + CommandBufferLevel::Secondary, + CommandBufferBeginInfo { + inheritance_info: Some(CommandBufferInheritanceInfo { + render_pass: Some(self.subpass.clone().into()), + ..Default::default() + }), ..Default::default() }, ) .unwrap() } - // Starts the rendering pipeline and returns [`AutoCommandBufferBuilder`] for drawing - fn start( - &mut self, - final_image: Arc, - ) -> (AutoCommandBufferBuilder, [u32; 2]) { + // Starts the rendering pipeline and returns [`RecordingCommandBuffer`] for drawing + fn start(&mut self, final_image: Arc) -> (RecordingCommandBuffer, [u32; 2]) { // Get dimensions let img_dims = final_image.image().extent(); // Create framebuffer (must be in same order as render pass description in `new` @@ -605,10 +607,14 @@ impl Renderer { FramebufferCreateInfo { attachments: vec![final_image], ..Default::default() }, ) .unwrap(); - let mut command_buffer_builder = AutoCommandBufferBuilder::primary( - &self.allocators.command_buffer, + let mut command_buffer_builder = RecordingCommandBuffer::new( + self.allocators.command_buffer.clone(), self.gfx_queue.queue_family_index(), - CommandBufferUsage::OneTimeSubmit, + CommandBufferLevel::Primary, + CommandBufferBeginInfo { + usage: CommandBufferUsage::OneTimeSubmit, + ..Default::default() + }, ) .unwrap(); // Add clear values here for attachments and begin render pass @@ -645,7 +651,7 @@ impl Renderer { let mut builder = self.create_secondary_command_buffer_builder(); self.draw_egui(scale_factor, clipped_meshes, framebuffer_dimensions, &mut builder); // Execute draw commands - let command_buffer = builder.build().unwrap(); + let command_buffer = builder.end().unwrap(); command_buffer_builder.execute_commands(command_buffer).unwrap(); let done_future = self.finish(command_buffer_builder, Box::new(before_future)); @@ -659,13 +665,13 @@ impl Renderer { // Finishes the rendering pipeline fn finish( &self, - mut command_buffer_builder: AutoCommandBufferBuilder, + mut command_buffer_builder: RecordingCommandBuffer, before_main_cb_future: Box, ) -> Box { // We end render pass command_buffer_builder.end_render_pass(Default::default()).unwrap(); // Then execute our whole command buffer - let command_buffer = command_buffer_builder.build().unwrap(); + let command_buffer = command_buffer_builder.end().unwrap(); let after_main_cb = before_main_cb_future.then_execute(self.gfx_queue.clone(), command_buffer).unwrap(); // Return our future @@ -678,11 +684,11 @@ impl Renderer { textures_delta: &TexturesDelta, scale_factor: f32, framebuffer_dimensions: [u32; 2], - ) -> Arc { + ) -> Arc { self.update_textures(&textures_delta.set); let mut builder = self.create_secondary_command_buffer_builder(); self.draw_egui(scale_factor, clipped_meshes, framebuffer_dimensions, &mut builder); - let buffer = builder.build().unwrap(); + let buffer = builder.end().unwrap(); for &id in &textures_delta.free { self.unregister_image(id); } @@ -768,7 +774,7 @@ impl Renderer { scale_factor: f32, clipped_meshes: &[ClippedPrimitive], framebuffer_dimensions: [u32; 2], - builder: &mut AutoCommandBufferBuilder, + builder: &mut RecordingCommandBuffer, ) { let push_constants = vs::PushConstants { screen_size: [ @@ -867,15 +873,17 @@ impl Renderer { } // All set up to draw! - builder - .draw_indexed( - mesh.indices.len() as u32, - 1, - index_cursor, - vertex_cursor as i32, - 0, - ) - .unwrap(); + unsafe { + builder + .draw_indexed( + mesh.indices.len() as u32, + 1, + index_cursor, + vertex_cursor as i32, + 0, + ) + .unwrap(); + } // Consume this mesh for next iteration index_cursor += mesh.indices.len() as u32; @@ -975,7 +983,7 @@ impl Renderer { /// /// See the `triangle` demo source for a detailed usage example. pub struct CallbackContext<'a> { - pub builder: &'a mut AutoCommandBufferBuilder, + pub builder: &'a mut RecordingCommandBuffer, pub resources: RenderResources<'a>, } diff --git a/src/utils.rs b/src/utils.rs index e69b815..9eabd35 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -14,8 +14,8 @@ use vulkano::{ buffer::{AllocateBufferError, Buffer, BufferCreateInfo, BufferUsage}, command_buffer::{ allocator::{StandardCommandBufferAllocator, StandardCommandBufferAllocatorCreateInfo}, - AutoCommandBufferBuilder, CommandBufferUsage, CopyBufferToImageInfo, - PrimaryCommandBufferAbstract, + CommandBufferBeginInfo, CommandBufferLevel, CommandBufferUsage, CopyBufferToImageInfo, + RecordingCommandBuffer, }, descriptor_set::allocator::StandardDescriptorSetAllocator, device::{Device, Queue}, @@ -39,10 +39,11 @@ pub fn immutable_texture_from_bytes( dimensions: [u32; 2], format: vulkano::format::Format, ) -> Result, ImageCreationError> { - let mut cbb = AutoCommandBufferBuilder::primary( - &allocators.command_buffer, + let mut cbb = RecordingCommandBuffer::new( + allocators.command_buffer.clone(), queue.queue_family_index(), - CommandBufferUsage::OneTimeSubmit, + CommandBufferLevel::Primary, + CommandBufferBeginInfo { usage: CommandBufferUsage::OneTimeSubmit, ..Default::default() }, ) .map_err(ImageCreationError::Vulkan)?; @@ -77,7 +78,7 @@ pub fn immutable_texture_from_bytes( )) .map_err(ImageCreationError::Validation)?; - let _fut = cbb.build().unwrap().execute(queue).unwrap(); + let _fut = cbb.end().unwrap().execute(queue).unwrap(); Ok(ImageView::new_default(texture).unwrap()) } @@ -112,22 +113,24 @@ pub fn immutable_texture_from_file( pub struct Allocators { pub memory: Arc, - pub descriptor_set: StandardDescriptorSetAllocator, - pub command_buffer: StandardCommandBufferAllocator, + pub descriptor_set: Arc, + pub command_buffer: Arc, } impl Allocators { pub fn new_default(device: &Arc) -> Self { Self { memory: Arc::new(StandardMemoryAllocator::new_default(device.clone())), - descriptor_set: StandardDescriptorSetAllocator::new(device.clone(), Default::default()), + descriptor_set: StandardDescriptorSetAllocator::new(device.clone(), Default::default()) + .into(), command_buffer: StandardCommandBufferAllocator::new( device.clone(), StandardCommandBufferAllocatorCreateInfo { secondary_buffer_count: 32, ..Default::default() }, - ), + ) + .into(), } } } From 9102ce1722d69ad121fccde1cbd8690d6ee9dfd9 Mon Sep 17 00:00:00 2001 From: Okko Hakola Date: Tue, 16 Jan 2024 12:10:47 +0200 Subject: [PATCH 03/23] Fix clippy --- examples/wholesome/frame_system.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/wholesome/frame_system.rs b/examples/wholesome/frame_system.rs index 39e922a..aada2cf 100644 --- a/examples/wholesome/frame_system.rs +++ b/examples/wholesome/frame_system.rs @@ -119,10 +119,13 @@ impl FrameSystem { ) .unwrap(); } - let framebuffer = Framebuffer::new(self.render_pass.clone(), FramebufferCreateInfo { - attachments: vec![final_image, self.depth_buffer.clone()], - ..Default::default() - }) + let framebuffer = Framebuffer::new( + self.render_pass.clone(), + FramebufferCreateInfo { + attachments: vec![final_image, self.depth_buffer.clone()], + ..Default::default() + }, + ) .unwrap(); let mut command_buffer_builder = RecordingCommandBuffer::new( self.allocators.command_buffers.clone(), From 8a9f1c13d269598f7452115bca13098525c8b8e4 Mon Sep 17 00:00:00 2001 From: Aspen Date: Thu, 18 Jan 2024 14:29:41 -0800 Subject: [PATCH 04/23] Batched/Linear uploads (#56) * Batch upload images, skip 2 copies per image * Batch upload meshes, map only twice. * lints * Integrate packed fonts * Lints again, oops --- src/renderer.rs | 77 ++++++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/src/renderer.rs b/src/renderer.rs index c2ea53e..f9c46dc 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -176,22 +176,27 @@ impl Renderer { // final_output_format.type_color().unwrap() == NumericType::SRGB; final_output_format.numeric_format_color().unwrap() == NumericFormat::SRGB; let allocators = Allocators::new_default(gfx_queue.device()); - let vertex_index_buffer_pool = - SubbufferAllocator::new(allocators.memory.clone(), SubbufferAllocatorCreateInfo { + let vertex_index_buffer_pool = SubbufferAllocator::new( + allocators.memory.clone(), + SubbufferAllocatorCreateInfo { arena_size: INDEX_BUFFER_SIZE + VERTEX_BUFFER_SIZE, buffer_usage: BufferUsage::INDEX_BUFFER | BufferUsage::VERTEX_BUFFER, memory_type_filter: MemoryTypeFilter::PREFER_DEVICE | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, ..Default::default() - }); + }, + ); let pipeline = Self::create_pipeline(gfx_queue.clone(), subpass.clone()); - let font_sampler = Sampler::new(gfx_queue.device().clone(), SamplerCreateInfo { - mag_filter: Filter::Linear, - min_filter: Filter::Linear, - address_mode: [SamplerAddressMode::ClampToEdge; 3], - mipmap_mode: SamplerMipmapMode::Linear, - ..Default::default() - }) + let font_sampler = Sampler::new( + gfx_queue.device().clone(), + SamplerCreateInfo { + mag_filter: Filter::Linear, + min_filter: Filter::Linear, + address_mode: [SamplerAddressMode::ClampToEdge; 3], + mipmap_mode: SamplerMipmapMode::Linear, + ..Default::default() + }, + ) .unwrap(); let font_format = Self::choose_font_format(gfx_queue.device()); Renderer { @@ -252,21 +257,27 @@ impl Renderer { ) .unwrap(); - GraphicsPipeline::new(gfx_queue.device().clone(), None, GraphicsPipelineCreateInfo { - stages: stages.into_iter().collect(), - vertex_input_state, - input_assembly_state: Some(InputAssemblyState::default()), - viewport_state: Some(ViewportState::default()), - rasterization_state: Some(RasterizationState::default()), - multisample_state: Some(MultisampleState { - rasterization_samples: subpass.num_samples().unwrap_or(SampleCount::Sample1), - ..Default::default() - }), - color_blend_state: Some(blend_state), - dynamic_state: [DynamicState::Viewport, DynamicState::Scissor].into_iter().collect(), - subpass: Some(subpass.into()), - ..GraphicsPipelineCreateInfo::layout(layout) - }) + GraphicsPipeline::new( + gfx_queue.device().clone(), + None, + GraphicsPipelineCreateInfo { + stages: stages.into_iter().collect(), + vertex_input_state, + input_assembly_state: Some(InputAssemblyState::default()), + viewport_state: Some(ViewportState::default()), + rasterization_state: Some(RasterizationState::default()), + multisample_state: Some(MultisampleState { + rasterization_samples: subpass.num_samples().unwrap_or(SampleCount::Sample1), + ..Default::default() + }), + color_blend_state: Some(blend_state), + dynamic_state: [DynamicState::Viewport, DynamicState::Scissor] + .into_iter() + .collect(), + subpass: Some(subpass.into()), + ..GraphicsPipelineCreateInfo::layout(layout) + }, + ) .unwrap() } @@ -464,10 +475,10 @@ impl Renderer { }, _ => ComponentMapping::identity(), }; - let view = ImageView::new(img.clone(), ImageViewCreateInfo { - component_mapping, - ..ImageViewCreateInfo::from_image(&img) - }) + let view = ImageView::new( + img.clone(), + ImageViewCreateInfo { component_mapping, ..ImageViewCreateInfo::from_image(&img) }, + ) .unwrap(); // Create a descriptor for it let layout = self.pipeline.layout().set_layouts().first().unwrap(); @@ -940,10 +951,10 @@ impl Renderer { pixels_per_point: scale_factor, screen_size_px: framebuffer_dimensions, }; - (callback_fn.f)(info, &mut CallbackContext { - builder, - resources: self.render_resources(), - }); + (callback_fn.f)( + info, + &mut CallbackContext { builder, resources: self.render_resources() }, + ); // The user could have done much here - rebind pipes, set views, bind things, etc. // Mark all state as lost so that next mesh rebinds everything to a known state. From 80d58733212f12acf219d8132a39bab072fa6fa1 Mon Sep 17 00:00:00 2001 From: let Date: Tue, 16 Jan 2024 08:44:20 +0100 Subject: [PATCH 05/23] Updated the vulkano from the upstream version --- examples/wholesome/frame_system.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/wholesome/frame_system.rs b/examples/wholesome/frame_system.rs index aada2cf..5329224 100644 --- a/examples/wholesome/frame_system.rs +++ b/examples/wholesome/frame_system.rs @@ -173,12 +173,12 @@ pub struct Frame<'a> { impl<'a> Frame<'a> { pub fn next_pass<'f>(&'f mut self) -> Option> { - let res = { + let current_pass = { let current_pass = self.num_pass; self.num_pass += 1; current_pass }; - match res { + match current_pass { 0 => Some(Pass::Deferred(DrawPass { frame: self })), 1 => { self.recording_command_buffer From 1755d90cf0b6fbd44dfe9627721aa2983d993e93 Mon Sep 17 00:00:00 2001 From: let Date: Sat, 20 Jan 2024 09:16:17 +0100 Subject: [PATCH 06/23] clippy + add +nightly in run_checks.sh so that script works for everyone --- examples/wholesome/frame_system.rs | 11 ++--- run_checks.sh | 4 +- src/renderer.rs | 77 +++++++++++++----------------- 3 files changed, 39 insertions(+), 53 deletions(-) diff --git a/examples/wholesome/frame_system.rs b/examples/wholesome/frame_system.rs index 5329224..d04b754 100644 --- a/examples/wholesome/frame_system.rs +++ b/examples/wholesome/frame_system.rs @@ -119,13 +119,10 @@ impl FrameSystem { ) .unwrap(); } - let framebuffer = Framebuffer::new( - self.render_pass.clone(), - FramebufferCreateInfo { - attachments: vec![final_image, self.depth_buffer.clone()], - ..Default::default() - }, - ) + let framebuffer = Framebuffer::new(self.render_pass.clone(), FramebufferCreateInfo { + attachments: vec![final_image, self.depth_buffer.clone()], + ..Default::default() + }) .unwrap(); let mut command_buffer_builder = RecordingCommandBuffer::new( self.allocators.command_buffers.clone(), diff --git a/run_checks.sh b/run_checks.sh index e2d9b2a..603a7ad 100755 --- a/run_checks.sh +++ b/run_checks.sh @@ -1,2 +1,2 @@ -cargo fmt -- --check --color always -cargo clippy --all-targets -- -D warnings \ No newline at end of file +cargo +nightly fmt -- --check --color always +cargo +nightly clippy --all-targets -- -D warnings diff --git a/src/renderer.rs b/src/renderer.rs index f9c46dc..c2ea53e 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -176,27 +176,22 @@ impl Renderer { // final_output_format.type_color().unwrap() == NumericType::SRGB; final_output_format.numeric_format_color().unwrap() == NumericFormat::SRGB; let allocators = Allocators::new_default(gfx_queue.device()); - let vertex_index_buffer_pool = SubbufferAllocator::new( - allocators.memory.clone(), - SubbufferAllocatorCreateInfo { + let vertex_index_buffer_pool = + SubbufferAllocator::new(allocators.memory.clone(), SubbufferAllocatorCreateInfo { arena_size: INDEX_BUFFER_SIZE + VERTEX_BUFFER_SIZE, buffer_usage: BufferUsage::INDEX_BUFFER | BufferUsage::VERTEX_BUFFER, memory_type_filter: MemoryTypeFilter::PREFER_DEVICE | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, ..Default::default() - }, - ); + }); let pipeline = Self::create_pipeline(gfx_queue.clone(), subpass.clone()); - let font_sampler = Sampler::new( - gfx_queue.device().clone(), - SamplerCreateInfo { - mag_filter: Filter::Linear, - min_filter: Filter::Linear, - address_mode: [SamplerAddressMode::ClampToEdge; 3], - mipmap_mode: SamplerMipmapMode::Linear, - ..Default::default() - }, - ) + let font_sampler = Sampler::new(gfx_queue.device().clone(), SamplerCreateInfo { + mag_filter: Filter::Linear, + min_filter: Filter::Linear, + address_mode: [SamplerAddressMode::ClampToEdge; 3], + mipmap_mode: SamplerMipmapMode::Linear, + ..Default::default() + }) .unwrap(); let font_format = Self::choose_font_format(gfx_queue.device()); Renderer { @@ -257,27 +252,21 @@ impl Renderer { ) .unwrap(); - GraphicsPipeline::new( - gfx_queue.device().clone(), - None, - GraphicsPipelineCreateInfo { - stages: stages.into_iter().collect(), - vertex_input_state, - input_assembly_state: Some(InputAssemblyState::default()), - viewport_state: Some(ViewportState::default()), - rasterization_state: Some(RasterizationState::default()), - multisample_state: Some(MultisampleState { - rasterization_samples: subpass.num_samples().unwrap_or(SampleCount::Sample1), - ..Default::default() - }), - color_blend_state: Some(blend_state), - dynamic_state: [DynamicState::Viewport, DynamicState::Scissor] - .into_iter() - .collect(), - subpass: Some(subpass.into()), - ..GraphicsPipelineCreateInfo::layout(layout) - }, - ) + GraphicsPipeline::new(gfx_queue.device().clone(), None, GraphicsPipelineCreateInfo { + stages: stages.into_iter().collect(), + vertex_input_state, + input_assembly_state: Some(InputAssemblyState::default()), + viewport_state: Some(ViewportState::default()), + rasterization_state: Some(RasterizationState::default()), + multisample_state: Some(MultisampleState { + rasterization_samples: subpass.num_samples().unwrap_or(SampleCount::Sample1), + ..Default::default() + }), + color_blend_state: Some(blend_state), + dynamic_state: [DynamicState::Viewport, DynamicState::Scissor].into_iter().collect(), + subpass: Some(subpass.into()), + ..GraphicsPipelineCreateInfo::layout(layout) + }) .unwrap() } @@ -475,10 +464,10 @@ impl Renderer { }, _ => ComponentMapping::identity(), }; - let view = ImageView::new( - img.clone(), - ImageViewCreateInfo { component_mapping, ..ImageViewCreateInfo::from_image(&img) }, - ) + let view = ImageView::new(img.clone(), ImageViewCreateInfo { + component_mapping, + ..ImageViewCreateInfo::from_image(&img) + }) .unwrap(); // Create a descriptor for it let layout = self.pipeline.layout().set_layouts().first().unwrap(); @@ -951,10 +940,10 @@ impl Renderer { pixels_per_point: scale_factor, screen_size_px: framebuffer_dimensions, }; - (callback_fn.f)( - info, - &mut CallbackContext { builder, resources: self.render_resources() }, - ); + (callback_fn.f)(info, &mut CallbackContext { + builder, + resources: self.render_resources(), + }); // The user could have done much here - rebind pipes, set views, bind things, etc. // Mark all state as lost so that next mesh rebinds everything to a known state. From f8ef1f3f9e443dfdd2ef2d2b289002f043c85a3c Mon Sep 17 00:00:00 2001 From: let Date: Mon, 12 Feb 2024 16:37:57 +0100 Subject: [PATCH 07/23] update ahash and image --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f16431d..12ba334 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,10 +17,10 @@ links = ["egui-winit/links"] clipboard = ["egui-winit/clipboard"] [dependencies] -ahash = "0.8.3" +ahash = "0.8.7" egui-winit = "0.25" egui = "0.25" -image = "0.24.5" +image = "0.24.8" winit = { version = "0.29.10", features = [ "rwh_05" ] } vulkano = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} vulkano-shaders = "0.34" From 539e0d0c325cd6bd9f28dc61dbdb176e41d4be23 Mon Sep 17 00:00:00 2001 From: let Date: Mon, 12 Feb 2024 17:00:19 +0100 Subject: [PATCH 08/23] formatting --- examples/multisample.rs | 51 ++++++++++++++++-------------------- examples/subpass.rs | 53 +++++++++++++++++--------------------- examples/wholesome/main.rs | 22 +++++++--------- 3 files changed, 55 insertions(+), 71 deletions(-) diff --git a/examples/multisample.rs b/examples/multisample.rs index f17b475..91ea483 100644 --- a/examples/multisample.rs +++ b/examples/multisample.rs @@ -298,28 +298,24 @@ impl MSAAPipeline { let subpass = Subpass::from(render_pass, 0).unwrap(); ( - GraphicsPipeline::new( - device.clone(), - None, - GraphicsPipelineCreateInfo { - stages: stages.into_iter().collect(), - vertex_input_state: Some(vertex_input_state), - input_assembly_state: Some(InputAssemblyState::default()), - viewport_state: Some(ViewportState::default()), - rasterization_state: Some(RasterizationState::default()), - multisample_state: Some(MultisampleState { - rasterization_samples: subpass.num_samples().unwrap(), - ..MultisampleState::default() - }), - color_blend_state: Some(ColorBlendState::with_attachment_states( - subpass.num_color_attachments(), - ColorBlendAttachmentState::default(), - )), - dynamic_state: [DynamicState::Viewport].into_iter().collect(), - subpass: Some(subpass.clone().into()), - ..GraphicsPipelineCreateInfo::layout(layout) - }, - ) + GraphicsPipeline::new(device.clone(), None, GraphicsPipelineCreateInfo { + stages: stages.into_iter().collect(), + vertex_input_state: Some(vertex_input_state), + input_assembly_state: Some(InputAssemblyState::default()), + viewport_state: Some(ViewportState::default()), + rasterization_state: Some(RasterizationState::default()), + multisample_state: Some(MultisampleState { + rasterization_samples: subpass.num_samples().unwrap(), + ..MultisampleState::default() + }), + color_blend_state: Some(ColorBlendState::with_attachment_states( + subpass.num_color_attachments(), + ColorBlendAttachmentState::default(), + )), + dynamic_state: [DynamicState::Viewport].into_iter().collect(), + subpass: Some(subpass.clone().into()), + ..GraphicsPipelineCreateInfo::layout(layout) + }) .unwrap(), subpass, ) @@ -364,13 +360,10 @@ impl MSAAPipeline { .unwrap(); } - let framebuffer = Framebuffer::new( - self.render_pass.clone(), - FramebufferCreateInfo { - attachments: vec![self.intermediary.clone(), image], - ..Default::default() - }, - ) + let framebuffer = Framebuffer::new(self.render_pass.clone(), FramebufferCreateInfo { + attachments: vec![self.intermediary.clone(), image], + ..Default::default() + }) .unwrap(); // Begin render pipeline commands diff --git a/examples/subpass.rs b/examples/subpass.rs index 1255ddd..757b838 100644 --- a/examples/subpass.rs +++ b/examples/subpass.rs @@ -253,25 +253,21 @@ impl SimpleGuiPipeline { let subpass = Subpass::from(render_pass, 0).unwrap(); ( - GraphicsPipeline::new( - device, - None, - GraphicsPipelineCreateInfo { - stages: stages.into_iter().collect(), - vertex_input_state: Some(vertex_input_state), - input_assembly_state: Some(InputAssemblyState::default()), - viewport_state: Some(ViewportState::default()), - rasterization_state: Some(RasterizationState::default()), - multisample_state: Some(MultisampleState::default()), - color_blend_state: Some(ColorBlendState::with_attachment_states( - subpass.num_color_attachments(), - ColorBlendAttachmentState::default(), - )), - dynamic_state: [DynamicState::Viewport].into_iter().collect(), - subpass: Some(subpass.clone().into()), - ..GraphicsPipelineCreateInfo::layout(layout) - }, - ) + GraphicsPipeline::new(device, None, GraphicsPipelineCreateInfo { + stages: stages.into_iter().collect(), + vertex_input_state: Some(vertex_input_state), + input_assembly_state: Some(InputAssemblyState::default()), + viewport_state: Some(ViewportState::default()), + rasterization_state: Some(RasterizationState::default()), + multisample_state: Some(MultisampleState::default()), + color_blend_state: Some(ColorBlendState::with_attachment_states( + subpass.num_color_attachments(), + ColorBlendAttachmentState::default(), + )), + dynamic_state: [DynamicState::Viewport].into_iter().collect(), + subpass: Some(subpass.clone().into()), + ..GraphicsPipelineCreateInfo::layout(layout) + }) .unwrap(), subpass, ) @@ -295,10 +291,10 @@ impl SimpleGuiPipeline { .unwrap(); let dimensions = image.image().extent(); - let framebuffer = Framebuffer::new( - self.render_pass.clone(), - FramebufferCreateInfo { attachments: vec![image], ..Default::default() }, - ) + let framebuffer = Framebuffer::new(self.render_pass.clone(), FramebufferCreateInfo { + attachments: vec![image], + ..Default::default() + }) .unwrap(); // Begin render pipeline commands @@ -353,13 +349,10 @@ impl SimpleGuiPipeline { // Move on to next subpass for gui builder - .next_subpass( - Default::default(), - SubpassBeginInfo { - contents: SubpassContents::SecondaryCommandBuffers, - ..Default::default() - }, - ) + .next_subpass(Default::default(), SubpassBeginInfo { + contents: SubpassContents::SecondaryCommandBuffers, + ..Default::default() + }) .unwrap(); // Draw gui on subpass let cb = gui.draw_on_subpass_image([dimensions[0], dimensions[1]]); diff --git a/examples/wholesome/main.rs b/examples/wholesome/main.rs index e884e93..ac13438 100644 --- a/examples/wholesome/main.rs +++ b/examples/wholesome/main.rs @@ -100,28 +100,26 @@ impl GuiState { .vscroll(true) .open(show_texture_window1) .show(&egui_context, |ui| { - ui.image(ImageSource::Texture(SizedTexture::new( - *image_texture_id1, - [256.0, 256.0], - ))); + ui.image(ImageSource::Texture(SizedTexture::new(*image_texture_id1, [ + 256.0, 256.0, + ]))); }); egui::Window::new("Mah Doge") .resizable(true) .vscroll(true) .open(show_texture_window2) .show(&egui_context, |ui| { - ui.image(ImageSource::Texture(SizedTexture::new( - *image_texture_id2, - [300.0, 200.0], - ))); + ui.image(ImageSource::Texture(SizedTexture::new(*image_texture_id2, [ + 300.0, 200.0, + ]))); }); egui::Window::new("Scene").resizable(true).vscroll(true).open(show_scene_window).show( &egui_context, |ui| { - ui.image(ImageSource::Texture(SizedTexture::new( - *scene_texture_id, - [scene_view_size[0] as f32, scene_view_size[1] as f32], - ))); + ui.image(ImageSource::Texture(SizedTexture::new(*scene_texture_id, [ + scene_view_size[0] as f32, + scene_view_size[1] as f32, + ]))); }, ); egui::Area::new("fps") From c770eac6e24a3b62fb2e8b9d7b02c89b77f92259 Mon Sep 17 00:00:00 2001 From: let Date: Wed, 14 Feb 2024 15:37:40 +0100 Subject: [PATCH 09/23] updated egui to 0.26 --- Cargo.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 12ba334..3c0d12b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,15 +17,15 @@ links = ["egui-winit/links"] clipboard = ["egui-winit/clipboard"] [dependencies] -ahash = "0.8.7" -egui-winit = "0.25" -egui = "0.25" -image = "0.24.8" +ahash = "0.8" +egui-winit = "0.26" +egui = "0.26" +image = "0.24" winit = { version = "0.29.10", features = [ "rwh_05" ] } vulkano = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} vulkano-shaders = "0.34" [dev-dependencies] cgmath = "0.18.0" -egui_demo_lib = "0.25" +egui_demo_lib = "0.26" vulkano-util = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} From a84269d96e8f15e0464cc7bd2778e47acc955ec9 Mon Sep 17 00:00:00 2001 From: let Date: Wed, 28 Feb 2024 07:41:54 +0100 Subject: [PATCH 10/23] Make checks succeed --- examples/demo_app.rs | 2 +- examples/minimal.rs | 2 +- examples/multisample.rs | 2 +- examples/paint_callback.rs | 2 +- examples/subpass.rs | 2 +- examples/wholesome/main.rs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/demo_app.rs b/examples/demo_app.rs index 2315b5d..4e34999 100644 --- a/examples/demo_app.rs +++ b/examples/demo_app.rs @@ -116,7 +116,7 @@ pub fn main() { // Render UI // Acquire swapchain future - match renderer.acquire() { + match renderer.acquire(|_| {}) { Ok(future) => { let after_future = gui .draw_on_image(future, renderer.swapchain_image_view()); diff --git a/examples/minimal.rs b/examples/minimal.rs index 80f1321..d803ebe 100644 --- a/examples/minimal.rs +++ b/examples/minimal.rs @@ -97,7 +97,7 @@ pub fn main() { }); // Render UI // Acquire swapchain future - match renderer.acquire() { + match renderer.acquire(|_| {}) { Ok(future) => { // Render gui let after_future = diff --git a/examples/multisample.rs b/examples/multisample.rs index 91ea483..6e5e9ab 100644 --- a/examples/multisample.rs +++ b/examples/multisample.rs @@ -126,7 +126,7 @@ pub fn main() { }); // Render // Acquire swapchain future - match renderer.acquire() { + match renderer.acquire(|_| {}) { Ok(future) => { // Render let after_future = pipeline.render( diff --git a/examples/paint_callback.rs b/examples/paint_callback.rs index 01b9584..724d2a7 100644 --- a/examples/paint_callback.rs +++ b/examples/paint_callback.rs @@ -122,7 +122,7 @@ pub fn main() { }); // Render UI // Acquire swapchain future - match renderer.acquire() { + match renderer.acquire(|_| {}) { Ok(future) => { // Render gui let after_future = diff --git a/examples/subpass.rs b/examples/subpass.rs index 757b838..663ce8f 100644 --- a/examples/subpass.rs +++ b/examples/subpass.rs @@ -123,7 +123,7 @@ pub fn main() { }); // Acquire swapchain future - match renderer.acquire() { + match renderer.acquire(|_| {}) { Ok(future) => { // Render gui let after_future = gui_pipeline.render( diff --git a/examples/wholesome/main.rs b/examples/wholesome/main.rs index ac13438..3ee24d9 100644 --- a/examples/wholesome/main.rs +++ b/examples/wholesome/main.rs @@ -218,7 +218,7 @@ pub fn main() { }); // Render UI // Acquire swapchain future - match renderer.acquire() { + match renderer.acquire(|_| {}) { Ok(future) => { // Draw scene let after_scene_draw = From 033add604a7b3480a64a723338c6688bd46ed9c7 Mon Sep 17 00:00:00 2001 From: let Date: Wed, 28 Feb 2024 16:03:58 +0100 Subject: [PATCH 11/23] Made checks succeed --- src/renderer.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/renderer.rs b/src/renderer.rs index c2ea53e..58f2b1e 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -7,10 +7,7 @@ // notice may not be copied, modified, or distributed except // according to those terms. -use std::{ - convert::{TryFrom, TryInto}, - sync::Arc, -}; +use std::sync::Arc; use ahash::AHashMap; use egui::{epaint::Primitive, ClippedPrimitive, PaintCallbackInfo, Rect, TexturesDelta}; From 48ed67faa749841a1610fab794d4ef6705c9be95 Mon Sep 17 00:00:00 2001 From: let Date: Sat, 2 Mar 2024 21:48:43 +0100 Subject: [PATCH 12/23] fixed example lints --- examples/demo_app.rs | 2 +- examples/minimal.rs | 2 +- examples/multisample.rs | 7 ++----- examples/paint_callback.rs | 4 ++-- examples/subpass.rs | 7 ++----- examples/wholesome/frame_system.rs | 2 +- examples/wholesome/main.rs | 2 +- examples/wholesome/triangle_draw_system.rs | 2 +- 8 files changed, 11 insertions(+), 17 deletions(-) diff --git a/examples/demo_app.rs b/examples/demo_app.rs index 4e34999..a8955b0 100644 --- a/examples/demo_app.rs +++ b/examples/demo_app.rs @@ -7,7 +7,7 @@ // notice may not be copied, modified, or distributed except // according to those terms. -use egui_winit_vulkano::{egui, Gui, GuiConfig}; +use egui_winit_vulkano::{Gui, GuiConfig}; use vulkano_util::{ context::{VulkanoConfig, VulkanoContext}, window::{VulkanoWindows, WindowDescriptor}, diff --git a/examples/minimal.rs b/examples/minimal.rs index d803ebe..bc4ff44 100644 --- a/examples/minimal.rs +++ b/examples/minimal.rs @@ -10,7 +10,7 @@ #![allow(clippy::eq_op)] use egui::{ScrollArea, TextEdit, TextStyle}; -use egui_winit_vulkano::{egui, Gui, GuiConfig}; +use egui_winit_vulkano::{Gui, GuiConfig}; use vulkano_util::{ context::{VulkanoConfig, VulkanoContext}, window::{VulkanoWindows, WindowDescriptor}, diff --git a/examples/multisample.rs b/examples/multisample.rs index 6e5e9ab..2327c66 100644 --- a/examples/multisample.rs +++ b/examples/multisample.rs @@ -9,13 +9,10 @@ #![allow(clippy::eq_op)] -use std::{ - convert::{TryFrom, TryInto}, - sync::Arc, -}; +use std::sync::Arc; use egui::{epaint::Shadow, style::Margin, vec2, Align, Align2, Color32, Frame, Rounding, Window}; -use egui_winit_vulkano::{egui, Gui, GuiConfig}; +use egui_winit_vulkano::{Gui, GuiConfig}; use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, command_buffer::{ diff --git a/examples/paint_callback.rs b/examples/paint_callback.rs index 724d2a7..96a5af2 100644 --- a/examples/paint_callback.rs +++ b/examples/paint_callback.rs @@ -7,10 +7,10 @@ // notice may not be copied, modified, or distributed except // according to those terms. -use std::{convert::TryInto, sync::Arc}; +use std::sync::Arc; use egui::{mutex::Mutex, vec2, PaintCallback, PaintCallbackInfo, Rgba, Sense}; -use egui_winit_vulkano::{egui, CallbackContext, CallbackFn, Gui, GuiConfig, RenderResources}; +use egui_winit_vulkano::{CallbackContext, CallbackFn, Gui, GuiConfig, RenderResources}; use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, memory::allocator::{AllocationCreateInfo, MemoryTypeFilter}, diff --git a/examples/subpass.rs b/examples/subpass.rs index 663ce8f..c6b9cf9 100644 --- a/examples/subpass.rs +++ b/examples/subpass.rs @@ -9,13 +9,10 @@ #![allow(clippy::eq_op)] -use std::{ - convert::{TryFrom, TryInto}, - sync::Arc, -}; +use std::sync::Arc; use egui::{epaint::Shadow, style::Margin, vec2, Align, Align2, Color32, Frame, Rounding, Window}; -use egui_winit_vulkano::{egui, Gui, GuiConfig}; +use egui_winit_vulkano::{Gui, GuiConfig}; use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, command_buffer::{ diff --git a/examples/wholesome/frame_system.rs b/examples/wholesome/frame_system.rs index d04b754..8b23cf3 100644 --- a/examples/wholesome/frame_system.rs +++ b/examples/wholesome/frame_system.rs @@ -11,7 +11,7 @@ // https://github.com/vulkano-rs/vulkano-examples/blob/master/src/bin/deferred/frame/system.rs // Egui drawing could be its own pass or it could be a deferred subpass -use std::{convert::TryFrom, sync::Arc}; +use std::sync::Arc; use cgmath::Matrix4; use vulkano::{ diff --git a/examples/wholesome/main.rs b/examples/wholesome/main.rs index 3ee24d9..751e7d6 100644 --- a/examples/wholesome/main.rs +++ b/examples/wholesome/main.rs @@ -12,7 +12,7 @@ use std::sync::Arc; use egui::{load::SizedTexture, Context, ImageSource, Visuals}; -use egui_winit_vulkano::{egui, Gui, GuiConfig}; +use egui_winit_vulkano::{Gui, GuiConfig}; use vulkano::{ command_buffer::allocator::{ StandardCommandBufferAllocator, StandardCommandBufferAllocatorCreateInfo, diff --git a/examples/wholesome/triangle_draw_system.rs b/examples/wholesome/triangle_draw_system.rs index 2ae046f..f3059d7 100644 --- a/examples/wholesome/triangle_draw_system.rs +++ b/examples/wholesome/triangle_draw_system.rs @@ -11,7 +11,7 @@ // https://github.com/vulkano-rs/vulkano-examples/blob/master/src/bin/deferred/triangle_draw_system.rs // To simplify this wholesome example :) -use std::{convert::TryInto, sync::Arc}; +use std::sync::Arc; use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, From 484813b038ca63420a05fd25b4ce5dbb4590ea33 Mon Sep 17 00:00:00 2001 From: let Date: Sun, 17 Mar 2024 12:12:15 +0100 Subject: [PATCH 13/23] vulkano update --- src/renderer.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/renderer.rs b/src/renderer.rs index 58f2b1e..f31492e 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -235,8 +235,7 @@ impl Renderer { ..ColorBlendState::default() }; - let vertex_input_state = - Some(EguiVertex::per_vertex().definition(&vs.info().input_interface).unwrap()); + let vertex_input_state = Some(EguiVertex::per_vertex().definition(&vs).unwrap()); let stages = [PipelineShaderStageCreateInfo::new(vs), PipelineShaderStageCreateInfo::new(fs)]; From 422ba1532b7268b243146793cb88e64174a6884e Mon Sep 17 00:00:00 2001 From: let Date: Sun, 17 Mar 2024 12:19:25 +0100 Subject: [PATCH 14/23] fix vulkano in the examples --- examples/multisample.rs | 3 +-- examples/paint_callback.rs | 3 +-- examples/subpass.rs | 3 +-- examples/wholesome/triangle_draw_system.rs | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/examples/multisample.rs b/examples/multisample.rs index 2327c66..e120cc0 100644 --- a/examples/multisample.rs +++ b/examples/multisample.rs @@ -279,8 +279,7 @@ impl MSAAPipeline { .entry_point("main") .unwrap(); - let vertex_input_state = - MyVertex::per_vertex().definition(&vs.info().input_interface).unwrap(); + let vertex_input_state = MyVertex::per_vertex().definition(&vs).unwrap(); let stages = [PipelineShaderStageCreateInfo::new(vs), PipelineShaderStageCreateInfo::new(fs)]; diff --git a/examples/paint_callback.rs b/examples/paint_callback.rs index 96a5af2..87f8535 100644 --- a/examples/paint_callback.rs +++ b/examples/paint_callback.rs @@ -181,8 +181,7 @@ impl Scene { .entry_point("main") .unwrap(); - let vertex_input_state = - MyVertex::per_vertex().definition(&vs.info().input_interface).unwrap(); + let vertex_input_state = MyVertex::per_vertex().definition(&vs).unwrap(); let stages = [PipelineShaderStageCreateInfo::new(vs), PipelineShaderStageCreateInfo::new(fs)]; diff --git a/examples/subpass.rs b/examples/subpass.rs index c6b9cf9..047b028 100644 --- a/examples/subpass.rs +++ b/examples/subpass.rs @@ -234,8 +234,7 @@ impl SimpleGuiPipeline { .entry_point("main") .unwrap(); - let vertex_input_state = - MyVertex::per_vertex().definition(&vs.info().input_interface).unwrap(); + let vertex_input_state = MyVertex::per_vertex().definition(&vs).unwrap(); let stages = [PipelineShaderStageCreateInfo::new(vs), PipelineShaderStageCreateInfo::new(fs)]; diff --git a/examples/wholesome/triangle_draw_system.rs b/examples/wholesome/triangle_draw_system.rs index f3059d7..a6225fa 100644 --- a/examples/wholesome/triangle_draw_system.rs +++ b/examples/wholesome/triangle_draw_system.rs @@ -80,8 +80,7 @@ impl TriangleDrawSystem { .entry_point("main") .unwrap(); - let vertex_input_state = - MyVertex::per_vertex().definition(&vs.info().input_interface).unwrap(); + let vertex_input_state = MyVertex::per_vertex().definition(&vs).unwrap(); let stages = [PipelineShaderStageCreateInfo::new(vs), PipelineShaderStageCreateInfo::new(fs)]; From b5babeb41d648f2903ac2d9e7b972260fabf2900 Mon Sep 17 00:00:00 2001 From: let Date: Sun, 17 Mar 2024 12:37:09 +0100 Subject: [PATCH 15/23] Remove unnecessary feature of winit --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 3c0d12b..4b33843 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ ahash = "0.8" egui-winit = "0.26" egui = "0.26" image = "0.24" -winit = { version = "0.29.10", features = [ "rwh_05" ] } +winit = { version = "0.29" } vulkano = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} vulkano-shaders = "0.34" From 721c695be3884d04be4c6512a19526d44e86ea1e Mon Sep 17 00:00:00 2001 From: let Date: Sat, 23 Mar 2024 12:35:11 +0100 Subject: [PATCH 16/23] Update image to 0.25 to make deps.rs green again --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 4b33843..afdd02c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ clipboard = ["egui-winit/clipboard"] ahash = "0.8" egui-winit = "0.26" egui = "0.26" -image = "0.24" +image = "0.25" winit = { version = "0.29" } vulkano = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} vulkano-shaders = "0.34" From 8939678df9df23fb3dd7f30966ab0019e182c299 Mon Sep 17 00:00:00 2001 From: let Date: Wed, 3 Apr 2024 08:29:25 +0200 Subject: [PATCH 17/23] vulkano update + examples fix --- examples/demo_app.rs | 4 +++- examples/minimal.rs | 4 +++- examples/multisample.rs | 4 +++- examples/paint_callback.rs | 4 +++- examples/subpass.rs | 4 +++- examples/wholesome/main.rs | 4 +++- 6 files changed, 18 insertions(+), 6 deletions(-) diff --git a/examples/demo_app.rs b/examples/demo_app.rs index a8955b0..263cc5a 100644 --- a/examples/demo_app.rs +++ b/examples/demo_app.rs @@ -116,7 +116,9 @@ pub fn main() { // Render UI // Acquire swapchain future - match renderer.acquire(|_| {}) { + match renderer + .acquire(Some(std::time::Duration::from_millis(10)), |_| {}) + { Ok(future) => { let after_future = gui .draw_on_image(future, renderer.swapchain_image_view()); diff --git a/examples/minimal.rs b/examples/minimal.rs index bc4ff44..f885026 100644 --- a/examples/minimal.rs +++ b/examples/minimal.rs @@ -97,7 +97,9 @@ pub fn main() { }); // Render UI // Acquire swapchain future - match renderer.acquire(|_| {}) { + match renderer + .acquire(Some(std::time::Duration::from_millis(10)), |_| {}) + { Ok(future) => { // Render gui let after_future = diff --git a/examples/multisample.rs b/examples/multisample.rs index e120cc0..2cb9007 100644 --- a/examples/multisample.rs +++ b/examples/multisample.rs @@ -123,7 +123,9 @@ pub fn main() { }); // Render // Acquire swapchain future - match renderer.acquire(|_| {}) { + match renderer + .acquire(Some(std::time::Duration::from_millis(10)), |_| {}) + { Ok(future) => { // Render let after_future = pipeline.render( diff --git a/examples/paint_callback.rs b/examples/paint_callback.rs index 87f8535..1bd05d3 100644 --- a/examples/paint_callback.rs +++ b/examples/paint_callback.rs @@ -122,7 +122,9 @@ pub fn main() { }); // Render UI // Acquire swapchain future - match renderer.acquire(|_| {}) { + match renderer + .acquire(Some(std::time::Duration::from_millis(10)), |_| {}) + { Ok(future) => { // Render gui let after_future = diff --git a/examples/subpass.rs b/examples/subpass.rs index 047b028..139e6f0 100644 --- a/examples/subpass.rs +++ b/examples/subpass.rs @@ -120,7 +120,9 @@ pub fn main() { }); // Acquire swapchain future - match renderer.acquire(|_| {}) { + match renderer + .acquire(Some(std::time::Duration::from_millis(10)), |_| {}) + { Ok(future) => { // Render gui let after_future = gui_pipeline.render( diff --git a/examples/wholesome/main.rs b/examples/wholesome/main.rs index 751e7d6..e58be24 100644 --- a/examples/wholesome/main.rs +++ b/examples/wholesome/main.rs @@ -218,7 +218,9 @@ pub fn main() { }); // Render UI // Acquire swapchain future - match renderer.acquire(|_| {}) { + match renderer + .acquire(Some(std::time::Duration::from_millis(10)), |_| {}) + { Ok(future) => { // Draw scene let after_scene_draw = From a857b225c2b592c00ec86d79eec247e9e5872e0a Mon Sep 17 00:00:00 2001 From: let Date: Wed, 3 Apr 2024 08:40:30 +0200 Subject: [PATCH 18/23] update egui - 0.26 -> 0.27 --- Cargo.toml | 6 +++--- examples/multisample.rs | 6 ++++-- examples/subpass.rs | 6 ++++-- examples/wholesome/main.rs | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index afdd02c..57d6a0e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,8 +18,8 @@ clipboard = ["egui-winit/clipboard"] [dependencies] ahash = "0.8" -egui-winit = "0.26" -egui = "0.26" +egui-winit = "0.27" +egui = "0.27" image = "0.25" winit = { version = "0.29" } vulkano = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} @@ -27,5 +27,5 @@ vulkano-shaders = "0.34" [dev-dependencies] cgmath = "0.18.0" -egui_demo_lib = "0.26" +egui_demo_lib = "0.27" vulkano-util = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} diff --git a/examples/multisample.rs b/examples/multisample.rs index 2cb9007..9307ac1 100644 --- a/examples/multisample.rs +++ b/examples/multisample.rs @@ -11,7 +11,7 @@ use std::sync::Arc; -use egui::{epaint::Shadow, style::Margin, vec2, Align, Align2, Color32, Frame, Rounding, Window}; +use egui::{epaint::Shadow, vec2, Align, Align2, Color32, Frame, Margin, Rounding, Window}; use egui_winit_vulkano::{Gui, GuiConfig}; use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, @@ -111,8 +111,10 @@ pub fn main() { Frame::none() .fill(Color32::from_white_alpha(125)) .shadow(Shadow { - extrusion: 8.0, + spread: 8.0, + blur: 10.0, color: Color32::from_black_alpha(125), + ..Default::default() }) .rounding(Rounding::same(5.0)) .inner_margin(Margin::same(10.0)), diff --git a/examples/subpass.rs b/examples/subpass.rs index 139e6f0..de49d0f 100644 --- a/examples/subpass.rs +++ b/examples/subpass.rs @@ -11,7 +11,7 @@ use std::sync::Arc; -use egui::{epaint::Shadow, style::Margin, vec2, Align, Align2, Color32, Frame, Rounding, Window}; +use egui::{epaint::Shadow, vec2, Align, Align2, Color32, Frame, Margin, Rounding, Window}; use egui_winit_vulkano::{Gui, GuiConfig}; use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, @@ -108,8 +108,10 @@ pub fn main() { Frame::none() .fill(Color32::from_white_alpha(125)) .shadow(Shadow { - extrusion: 8.0, + spread: 8.0, + blur: 10.0, color: Color32::from_black_alpha(125), + ..Default::default() }) .rounding(Rounding::same(5.0)) .inner_margin(Margin::same(10.0)), diff --git a/examples/wholesome/main.rs b/examples/wholesome/main.rs index e58be24..7e11b2e 100644 --- a/examples/wholesome/main.rs +++ b/examples/wholesome/main.rs @@ -122,7 +122,7 @@ impl GuiState { ]))); }, ); - egui::Area::new("fps") + egui::Area::new("fps".into()) .fixed_pos(egui::pos2(window_size[0] - 0.05 * window_size[0], 10.0)) .show(&egui_context, |ui| { ui.label(format!("{fps:.2}")); From d8a6a6ce2e3a5565aedf6c3001a13a1f4c421729 Mon Sep 17 00:00:00 2001 From: let Date: Thu, 25 Jul 2024 15:09:06 +0200 Subject: [PATCH 19/23] update egui to 0.28.1 --- Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 57d6a0e..3d75e6d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,8 +18,8 @@ clipboard = ["egui-winit/clipboard"] [dependencies] ahash = "0.8" -egui-winit = "0.27" -egui = "0.27" +egui-winit = "0.28" +egui = "0.28" image = "0.25" winit = { version = "0.29" } vulkano = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} @@ -27,5 +27,5 @@ vulkano-shaders = "0.34" [dev-dependencies] cgmath = "0.18.0" -egui_demo_lib = "0.27" +egui_demo_lib = "0.28" vulkano-util = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} From 99e895364ec379d246559b6a5c0d4ce833ad2f56 Mon Sep 17 00:00:00 2001 From: let Date: Tue, 3 Sep 2024 17:31:14 +0200 Subject: [PATCH 20/23] make new nightly clippy compile --- src/renderer.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/renderer.rs b/src/renderer.rs index f31492e..8b35ec0 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -971,8 +971,9 @@ impl Renderer { } } -/// A set of objects used to perform custom rendering in a `PaintCallback`. It -/// includes [`RenderResources`] for constructing a subpass pipeline and a secondary +/// A set of objects used to perform custom rendering in a `PaintCallback`. +/// +/// It includes [`RenderResources`] for constructing a subpass pipeline and a secondary /// command buffer for pushing render commands onto it. /// /// # Example From bd84737de464ac2c4fb3a7b207ac9fcec00ba2cc Mon Sep 17 00:00:00 2001 From: let Date: Sat, 12 Oct 2024 21:24:13 +0200 Subject: [PATCH 21/23] Update dependencies vulkano -> upstream, winit -> 0.30, egui -> 0.29 --- Cargo.toml | 8 +- examples/demo_app.rs | 286 +++++++++++++++++++++---------------- examples/minimal.rs | 219 +++++++++++++++------------- examples/multisample.rs | 234 +++++++++++++++++------------- examples/paint_callback.rs | 221 +++++++++++++++------------- examples/subpass.rs | 232 +++++++++++++++++------------- examples/wholesome/main.rs | 279 +++++++++++++++++++++--------------- src/integration.rs | 25 ++-- 8 files changed, 850 insertions(+), 654 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c0473df..eceea11 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,14 +20,14 @@ x11 = ["winit/x11", "egui-winit/x11"] [dependencies] ahash = "0.8" -egui-winit = { version = "0.28", default-features = false } -egui = "0.28" +egui-winit = { version = "0.29", default-features = false } +egui = "0.29" image = { version = "0.25", optional = true } -winit = { version = "0.29", default-features = false } +winit = { version = "0.30", default-features = false, features = [ "rwh_06" ] } vulkano = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} vulkano-shaders = "0.34" [dev-dependencies] cgmath = "0.18.0" -egui_demo_lib = "0.28" +egui_demo_lib = "0.29.1" vulkano-util = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} diff --git a/examples/demo_app.rs b/examples/demo_app.rs index 263cc5a..d3d18e7 100644 --- a/examples/demo_app.rs +++ b/examples/demo_app.rs @@ -7,139 +7,183 @@ // notice may not be copied, modified, or distributed except // according to those terms. +use egui_demo_lib::{ColorTest, DemoWindows}; use egui_winit_vulkano::{Gui, GuiConfig}; use vulkano_util::{ context::{VulkanoConfig, VulkanoContext}, window::{VulkanoWindows, WindowDescriptor}, }; use winit::{ - event::{Event, WindowEvent}, - event_loop::EventLoop, + application::ApplicationHandler, error::EventLoopError, event::WindowEvent, + event_loop::EventLoop, window::WindowId, }; // Simply create egui demo apps to test everything works correctly. // Creates two windows with different color formats for their swapchain. -pub fn main() { - // Winit event loop - let event_loop = EventLoop::new().unwrap(); - // Vulkano context - let context = VulkanoContext::new(VulkanoConfig::default()); - // Vulkano windows (create one) - let mut windows = VulkanoWindows::default(); - let window1 = windows.create_window( - &event_loop, - &context, - &WindowDescriptor { - title: String::from("egui_winit_vulkano SRGB"), - ..WindowDescriptor::default() - }, - |ci| { - ci.image_format = vulkano::format::Format::B8G8R8A8_SRGB; - ci.min_image_count = ci.min_image_count.max(2); - }, - ); - let window2 = windows.create_window( - &event_loop, - &context, - &WindowDescriptor { - title: String::from("egui_winit_vulkano UNORM"), - ..WindowDescriptor::default() - }, - |ci| { - ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; - ci.min_image_count = ci.min_image_count.max(2); - }, - ); - // Create gui as main render pass (no overlay means it clears the image each frame) - let mut gui1 = { - let renderer = windows.get_renderer_mut(window1).unwrap(); - Gui::new( - &event_loop, - renderer.surface(), - renderer.graphics_queue(), - renderer.swapchain_format(), - GuiConfig { allow_srgb_render_target: true, ..GuiConfig::default() }, - ) - }; - let mut gui2 = { - let renderer = windows.get_renderer_mut(window2).unwrap(); - Gui::new( - &event_loop, - renderer.surface(), - renderer.graphics_queue(), - renderer.swapchain_format(), - GuiConfig::default(), - ) - }; - // Display the demo application that ships with egui. - let mut demo_app1 = egui_demo_lib::DemoWindows::default(); - let mut demo_app2 = egui_demo_lib::DemoWindows::default(); - let mut egui_test1 = egui_demo_lib::ColorTest::default(); - let mut egui_test2 = egui_demo_lib::ColorTest::default(); - - event_loop - .run(move |event, window| { - for (wi, renderer) in windows.iter_mut() { - // Quick and ugly... - let gui = if *wi == window1 { &mut gui1 } else { &mut gui2 }; - let demo_app = if *wi == window1 { &mut demo_app1 } else { &mut demo_app2 }; - let egui_test = if *wi == window1 { &mut egui_test1 } else { &mut egui_test2 }; - match &event { - Event::WindowEvent { event, window_id } if window_id == wi => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - window.exit(); - } - WindowEvent::RedrawRequested => { - // Set immediate UI in redraw here - gui.immediate_ui(|gui| { - let ctx = gui.context(); - demo_app.ui(&ctx); - - egui::Window::new("Colors").vscroll(true).show(&ctx, |ui| { - egui_test.ui(ui); - }); - }); - // Alternatively you could - // gui.begin_frame(); - // let ctx = gui.context(); - // demo_app.ui(&ctx); - - // Render UI - // Acquire swapchain future - match renderer - .acquire(Some(std::time::Duration::from_millis(10)), |_| {}) - { - Ok(future) => { - let after_future = gui - .draw_on_image(future, renderer.swapchain_image_view()); - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - } - _ => (), - } +pub struct App { + context: VulkanoContext, + windows: VulkanoWindows, + window1: Option, + window2: Option, +} + +pub struct Window { + id: WindowId, + gui: Gui, + demo_app: DemoWindows, + egui_test: ColorTest, +} + +impl Default for App { + fn default() -> Self { + // Vulkano context + let context = VulkanoContext::new(VulkanoConfig::default()); + // Vulkano windows (create one) + let windows = VulkanoWindows::default(); + + Self { context, windows, window1: None, window2: None } + } +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + // Display the demo application that ships with egui. + let demo_app1 = DemoWindows::default(); + let demo_app2 = DemoWindows::default(); + let egui_test1 = ColorTest::default(); + let egui_test2 = ColorTest::default(); + + let window1 = self.windows.create_window( + event_loop, + &self.context, + &WindowDescriptor { + title: String::from("egui_winit_vulkano SRGB"), + ..WindowDescriptor::default() + }, + |ci| { + ci.image_format = vulkano::format::Format::B8G8R8A8_SRGB; + ci.min_image_count = ci.min_image_count.max(2); + }, + ); + + let window2 = self.windows.create_window( + event_loop, + &self.context, + &WindowDescriptor { + title: String::from("egui_winit_vulkano UNORM"), + ..WindowDescriptor::default() + }, + |ci| { + ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; + ci.min_image_count = ci.min_image_count.max(2); + }, + ); + + // Create gui as main render pass (no overlay means it clears the image each frame) + let gui1 = { + let renderer = self.windows.get_renderer_mut(window1).unwrap(); + Gui::new( + event_loop, + renderer.surface(), + renderer.graphics_queue(), + renderer.swapchain_format(), + GuiConfig { allow_srgb_render_target: true, ..GuiConfig::default() }, + ) + }; + + let gui2 = { + let renderer = self.windows.get_renderer_mut(window2).unwrap(); + Gui::new( + event_loop, + renderer.surface(), + renderer.graphics_queue(), + renderer.swapchain_format(), + GuiConfig::default(), + ) + }; + + self.window1 = + Some(Window { id: window1, gui: gui1, demo_app: demo_app1, egui_test: egui_test1 }); + + self.window2 = + Some(Window { id: window2, gui: gui2, demo_app: demo_app2, egui_test: egui_test2 }); + } + + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.windows.get_renderer_mut(window_id).unwrap(); + + let w1 = self.window1.as_mut().unwrap(); + let w2 = self.window2.as_mut().unwrap(); + + // Quick and ugly... + let gui = if window_id == w1.id { &mut w1.gui } else { &mut w2.gui }; + let demo_app = if window_id == w1.id { &mut w1.demo_app } else { &mut w2.demo_app }; + let egui_test = if window_id == w1.id { &mut w1.egui_test } else { &mut w2.egui_test }; + + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); + match event { + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + event_loop.exit(); + } + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here + gui.immediate_ui(|gui| { + let ctx = gui.context(); + demo_app.ui(&ctx); + + egui::Window::new("Colors").vscroll(true).show(&ctx, |ui| { + egui_test.ui(ui); + }); + }); + // Alternatively you could + // gui.begin_frame(); + // let ctx = gui.context(); + // demo_app.ui(&ctx); + + // Render UI + // Acquire swapchain future + match renderer.acquire(Some(std::time::Duration::from_millis(10)), |_| {}) { + Ok(future) => { + let after_future = + gui.draw_on_image(future, renderer.swapchain_image_view()); + // Present swapchain + renderer.present(after_future, true); } - Event::AboutToWait => { - renderer.window().request_redraw(); + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); } - _ => (), - } + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; } - }) - .unwrap(); + _ => (), + } + } + + fn about_to_wait(&mut self, _event_loop: &winit::event_loop::ActiveEventLoop) { + for (_, renderer) in self.windows.iter_mut() { + renderer.window().request_redraw(); + } + } +} + +pub fn main() -> Result<(), EventLoopError> { + // Winit event loop + let event_loop = EventLoop::new().unwrap(); + + let mut app = App::default(); + + event_loop.run_app(&mut app) } diff --git a/examples/minimal.rs b/examples/minimal.rs index f885026..caad726 100644 --- a/examples/minimal.rs +++ b/examples/minimal.rs @@ -16,7 +16,7 @@ use vulkano_util::{ window::{VulkanoWindows, WindowDescriptor}, }; use winit::{ - event::{Event, WindowEvent}, + application::ApplicationHandler, error::EventLoopError, event::WindowEvent, event_loop::EventLoop, }; @@ -24,105 +24,130 @@ fn sized_text(ui: &mut egui::Ui, text: impl Into, size: f32) { ui.label(egui::RichText::new(text).size(size)); } -pub fn main() { - // Winit event loop - let event_loop = EventLoop::new().unwrap(); - // Vulkano context - let context = VulkanoContext::new(VulkanoConfig::default()); - // Vulkano windows (create one) - let mut windows = VulkanoWindows::default(); - windows.create_window(&event_loop, &context, &WindowDescriptor::default(), |ci| { - ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; - ci.min_image_count = ci.min_image_count.max(2); - }); - // Create gui as main render pass (no overlay means it clears the image each frame) - let mut gui = { - let renderer = windows.get_primary_renderer_mut().unwrap(); - Gui::new( - &event_loop, - renderer.surface(), - renderer.graphics_queue(), - renderer.swapchain_format(), - GuiConfig::default(), - ) - }; - // Create gui state (pass anything your state requires) - let mut code = CODE.to_owned(); - event_loop - .run(move |event, window| { - let renderer = windows.get_primary_renderer_mut().unwrap(); - match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - window.exit(); - } - WindowEvent::RedrawRequested => { - // Set immediate UI in redraw here - // Set immediate UI in redraw here - gui.immediate_ui(|gui| { - let ctx = gui.context(); - egui::CentralPanel::default().show(&ctx, |ui| { - ui.vertical_centered(|ui| { - ui.add(egui::widgets::Label::new("Hi there!")); - sized_text(ui, "Rich Text", 32.0); - }); - ui.separator(); - ui.columns(2, |columns| { - ScrollArea::vertical().id_source("source").show( - &mut columns[0], - |ui| { - ui.add( - TextEdit::multiline(&mut code) - .font(TextStyle::Monospace), - ); - }, - ); - ScrollArea::vertical().id_source("rendered").show( - &mut columns[1], - |ui| { - egui_demo_lib::easy_mark::easy_mark(ui, &code); - }, - ); - }); - }); +pub struct App { + context: VulkanoContext, + windows: VulkanoWindows, + code: String, + gui: Option, +} + +impl Default for App { + fn default() -> Self { + // Vulkano context + let context = VulkanoContext::new(VulkanoConfig::default()); + + // Vulkano windows + let windows = VulkanoWindows::default(); + + let code = CODE.to_owned(); + + Self { context, windows, code, gui: None } + } +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + self.windows.create_window(event_loop, &self.context, &WindowDescriptor::default(), |ci| { + ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; + ci.min_image_count = ci.min_image_count.max(2); + }); + + // Create gui as main render pass (no overlay means it clears the image each frame) + self.gui = Some({ + let renderer = self.windows.get_primary_renderer_mut().unwrap(); + Gui::new( + event_loop, + renderer.surface(), + renderer.graphics_queue(), + renderer.swapchain_format(), + GuiConfig::default(), + ) + }); + } + + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.windows.get_renderer_mut(window_id).unwrap(); + + let gui = self.gui.as_mut().unwrap(); + + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); + match event { + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + event_loop.exit(); + } + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here + // Set immediate UI in redraw here + gui.immediate_ui(|gui| { + let ctx = gui.context(); + egui::CentralPanel::default().show(&ctx, |ui| { + ui.vertical_centered(|ui| { + ui.add(egui::widgets::Label::new("Hi there!")); + sized_text(ui, "Rich Text", 32.0); + }); + ui.separator(); + ui.columns(2, |columns| { + ScrollArea::vertical().id_salt("source").show(&mut columns[0], |ui| { + ui.add( + TextEdit::multiline(&mut self.code).font(TextStyle::Monospace), + ); }); - // Render UI - // Acquire swapchain future - match renderer - .acquire(Some(std::time::Duration::from_millis(10)), |_| {}) - { - Ok(future) => { - // Render gui - let after_future = - gui.draw_on_image(future, renderer.swapchain_image_view()); - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - } - _ => (), + ScrollArea::vertical().id_salt("rendered").show( + &mut columns[1], + |ui| { + egui_demo_lib::easy_mark::easy_mark(ui, &self.code); + }, + ); + }); + }); + }); + // Render UI + // Acquire swapchain future + match renderer.acquire(Some(std::time::Duration::from_millis(10)), |_| {}) { + Ok(future) => { + // Render gui + let after_future = self + .gui + .as_mut() + .unwrap() + .draw_on_image(future, renderer.swapchain_image_view()); + // Present swapchain + renderer.present(after_future, true); + } + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); } - } - Event::AboutToWait => { - renderer.window().request_redraw(); - } - _ => (), + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; } - }) - .unwrap(); + _ => (), + } + } + fn about_to_wait(&mut self, _event_loop: &winit::event_loop::ActiveEventLoop) { + let renderer = self.windows.get_primary_renderer_mut().unwrap(); + renderer.window().request_redraw(); + } +} + +pub fn main() -> Result<(), EventLoopError> { + // Winit event loop + let event_loop = EventLoop::new().unwrap(); + + let mut app = App::default(); + + event_loop.run_app(&mut app) } const CODE: &str = r" diff --git a/examples/multisample.rs b/examples/multisample.rs index 9307ac1..e6ec54a 100644 --- a/examples/multisample.rs +++ b/examples/multisample.rs @@ -46,114 +46,142 @@ use vulkano_util::{ window::{VulkanoWindows, WindowDescriptor}, }; use winit::{ - event::{Event, WindowEvent}, + application::ApplicationHandler, error::EventLoopError, event::WindowEvent, event_loop::EventLoop, }; -pub fn main() { - // Winit event loop - let event_loop = EventLoop::new().unwrap(); - // Vulkano context - let context = VulkanoContext::new(VulkanoConfig::default()); - // Vulkano windows (create one) - let mut windows = VulkanoWindows::default(); - windows.create_window(&event_loop, &context, &WindowDescriptor::default(), |ci| { - ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; - ci.image_usage = ImageUsage::TRANSFER_DST | ci.image_usage; - ci.min_image_count = ci.min_image_count.max(2); - }); - // Create out gui pipeline - let mut pipeline = MSAAPipeline::new( - context.graphics_queue().clone(), - windows.get_primary_renderer_mut().unwrap().swapchain_format(), - context.memory_allocator(), - SampleCount::Sample4, - ); - // Create gui subpass - let mut gui = Gui::new_with_subpass( - &event_loop, - windows.get_primary_renderer_mut().unwrap().surface(), - windows.get_primary_renderer_mut().unwrap().graphics_queue(), - pipeline.gui_pass(), - windows.get_primary_renderer_mut().unwrap().swapchain_format(), - GuiConfig { - // Must match your pipeline's sample count - samples: SampleCount::Sample4, - ..Default::default() - }, - ); - - // Create gui state (pass anything your state requires) - event_loop - .run(move |event, window| { - let renderer = windows.get_primary_renderer_mut().unwrap(); - match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => window.exit(), - WindowEvent::RedrawRequested => { - // Set immediate UI in redraw here - gui.immediate_ui(|gui| { - let ctx = gui.context(); - Window::new("Transparent Window") - .anchor(Align2([Align::RIGHT, Align::TOP]), vec2(-545.0, 500.0)) - .resizable(false) - .default_width(300.0) - .frame( - Frame::none() - .fill(Color32::from_white_alpha(125)) - .shadow(Shadow { - spread: 8.0, - blur: 10.0, - color: Color32::from_black_alpha(125), - ..Default::default() - }) - .rounding(Rounding::same(5.0)) - .inner_margin(Margin::same(10.0)), - ) - .show(&ctx, |ui| { - ui.colored_label(Color32::BLACK, "Content :)"); - }); - }); - // Render - // Acquire swapchain future - match renderer - .acquire(Some(std::time::Duration::from_millis(10)), |_| {}) - { - Ok(future) => { - // Render - let after_future = pipeline.render( - future, - renderer.swapchain_image_view(), - &mut gui, - ); - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - } - _ => (), +pub struct App { + context: VulkanoContext, + windows: VulkanoWindows, + pipeline: Option, + gui: Option, +} + +impl Default for App { + fn default() -> Self { + // Vulkano context + let context = VulkanoContext::new(VulkanoConfig::default()); + + // Vulkano windows + let windows = VulkanoWindows::default(); + + Self { context, windows, pipeline: None, gui: None } + } +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + self.windows.create_window(event_loop, &self.context, &WindowDescriptor::default(), |ci| { + ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; + ci.image_usage = ImageUsage::TRANSFER_DST | ci.image_usage; + ci.min_image_count = ci.min_image_count.max(2); + }); + + // Create out gui pipeline + let pipeline = MSAAPipeline::new( + self.context.graphics_queue().clone(), + self.windows.get_primary_renderer_mut().unwrap().swapchain_format(), + self.context.memory_allocator(), + SampleCount::Sample4, + ); + + // Create gui subpass + self.gui = Some(Gui::new_with_subpass( + event_loop, + self.windows.get_primary_renderer_mut().unwrap().surface(), + self.windows.get_primary_renderer_mut().unwrap().graphics_queue(), + pipeline.gui_pass(), + self.windows.get_primary_renderer_mut().unwrap().swapchain_format(), + GuiConfig { + // Must match your pipeline's sample count + samples: SampleCount::Sample4, + ..Default::default() + }, + )); + + self.pipeline = Some(pipeline); + } + + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.windows.get_renderer_mut(window_id).unwrap(); + + let gui = self.gui.as_mut().unwrap(); + + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); + match event { + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => event_loop.exit(), + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here + gui.immediate_ui(|gui| { + let ctx = gui.context(); + Window::new("Transparent Window") + .anchor(Align2([Align::RIGHT, Align::TOP]), vec2(-545.0, 500.0)) + .resizable(false) + .default_width(300.0) + .frame( + Frame::none() + .fill(Color32::from_white_alpha(125)) + .shadow(Shadow { + spread: 8.0, + blur: 10.0, + color: Color32::from_black_alpha(125), + ..Default::default() + }) + .rounding(Rounding::same(5.0)) + .inner_margin(Margin::same(10.0)), + ) + .show(&ctx, |ui| { + ui.colored_label(Color32::BLACK, "Content :)"); + }); + }); + // Render + // Acquire swapchain future + match renderer.acquire(Some(std::time::Duration::from_millis(10)), |_| {}) { + Ok(future) => { + // Render + let after_future = self.pipeline.as_mut().unwrap().render( + future, + renderer.swapchain_image_view(), + gui, + ); + // Present swapchain + renderer.present(after_future, true); } - } - Event::AboutToWait => { - renderer.window().request_redraw(); - } - _ => (), + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); + } + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; } - }) - .unwrap(); + _ => (), + } + } + + fn about_to_wait(&mut self, _event_loop: &winit::event_loop::ActiveEventLoop) { + let renderer = self.windows.get_primary_renderer().unwrap(); + renderer.window().request_redraw(); + } +} + +pub fn main() -> Result<(), EventLoopError> { + // Winit event loop + let event_loop = EventLoop::new().unwrap(); + + let mut app = App::default(); + + event_loop.run_app(&mut app) } struct MSAAPipeline { diff --git a/examples/paint_callback.rs b/examples/paint_callback.rs index 1bd05d3..9b1a419 100644 --- a/examples/paint_callback.rs +++ b/examples/paint_callback.rs @@ -32,33 +32,44 @@ use vulkano_util::{ context::{VulkanoConfig, VulkanoContext}, window::{VulkanoWindows, WindowDescriptor}, }; -use winit::{ - event::{Event, WindowEvent}, - event_loop::EventLoop, -}; +use winit::{application::ApplicationHandler, event::WindowEvent, event_loop::EventLoop}; -pub fn main() { - // Winit event loop - let event_loop = EventLoop::new().unwrap(); - // Vulkano context - let context = VulkanoContext::new(VulkanoConfig::default()); - // Vulkano windows (create one) - let mut windows = VulkanoWindows::default(); - windows.create_window( - &event_loop, - &context, - &WindowDescriptor { width: 400.0, height: 400.0, ..Default::default() }, - |ci| { - ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; - ci.min_image_count = ci.min_image_count.max(2); - }, - ); - // Create gui as main render pass (no overlay means it clears the image each frame) - let (mut gui, scene) = { - let renderer = windows.get_primary_renderer_mut().unwrap(); +pub struct App { + context: VulkanoContext, + windows: VulkanoWindows, + gui: Option, + scene: Option>>, +} + +impl Default for App { + fn default() -> Self { + // Vulkano context + let context = VulkanoContext::new(VulkanoConfig::default()); + + // Vulkano windows + let windows = VulkanoWindows::default(); + + Self { context, windows, gui: None, scene: None } + } +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + self.windows.create_window( + event_loop, + &self.context, + &WindowDescriptor { width: 400.0, height: 400.0, ..Default::default() }, + |ci| { + ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; + ci.min_image_count = ci.min_image_count.max(2); + }, + ); + + // Create gui as main render pass (no overlay means it clears the image each frame) + let renderer = self.windows.get_primary_renderer_mut().unwrap(); let gui = Gui::new( - &event_loop, + event_loop, renderer.surface(), renderer.graphics_queue(), renderer.swapchain_format(), @@ -67,87 +78,93 @@ pub fn main() { let scene = Arc::new(Mutex::new(Scene::new(gui.render_resources()))); - (gui, scene) - }; - - // Create gui state (pass anything your state requires) - event_loop - .run(move |event, window| { - let renderer = windows.get_primary_renderer_mut().unwrap(); - match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - window.exit(); - } - WindowEvent::RedrawRequested => { - let scene = scene.clone(); - // Set immediate UI in redraw here - gui.immediate_ui(|gui| { - let ctx = gui.context(); - egui::CentralPanel::default().show(&ctx, |ui| { - // Create a frame to render our triangle image in - egui::Frame::canvas(ui.style()).fill(Rgba::BLACK.into()).show( - ui, - |ui| { - // Allocate all the space in the frame for the image - let (rect, _) = ui.allocate_exact_size( - vec2(ui.available_width(), ui.available_height()), - Sense::click(), - ); - - // Render the scene in the allocated space - let paint_callback = PaintCallback { - rect, - callback: Arc::new(CallbackFn::new( - move |info, context| { - let mut scene = scene.lock(); - scene.render(info, context); - }, - )), - }; - - ui.painter().add(paint_callback); - }, - ); - }); - }); - // Render UI - // Acquire swapchain future - match renderer - .acquire(Some(std::time::Duration::from_millis(10)), |_| {}) - { - Ok(future) => { - // Render gui - let after_future = - gui.draw_on_image(future, renderer.swapchain_image_view()); - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), + self.gui = Some(gui); + self.scene = Some(scene); + } + + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.windows.get_renderer_mut(window_id).unwrap(); + + let gui = self.gui.as_mut().unwrap(); + + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); + match event { + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + event_loop.exit(); + } + WindowEvent::RedrawRequested => { + let scene = self.scene.clone().unwrap(); + // Set immediate UI in redraw here + gui.immediate_ui(|gui| { + let ctx = gui.context(); + egui::CentralPanel::default().show(&ctx, |ui| { + // Create a frame to render our triangle image in + egui::Frame::canvas(ui.style()).fill(Rgba::BLACK.into()).show(ui, |ui| { + // Allocate all the space in the frame for the image + let (rect, _) = ui.allocate_exact_size( + vec2(ui.available_width(), ui.available_height()), + Sense::click(), + ); + + // Render the scene in the allocated space + let paint_callback = PaintCallback { + rect, + callback: Arc::new(CallbackFn::new(move |info, context| { + let mut scene = scene.lock(); + scene.render(info, context); + })), }; - } - _ => (), + + ui.painter().add(paint_callback); + }); + }); + }); + // Render UI + // Acquire swapchain future + match renderer.acquire(Some(std::time::Duration::from_millis(10)), |_| {}) { + Ok(future) => { + // Render gui + let after_future = + gui.draw_on_image(future, renderer.swapchain_image_view()); + // Present swapchain + renderer.present(after_future, true); } - } - Event::AboutToWait => { - renderer.window().request_redraw(); - } - _ => (), + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); + } + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; } - }) - .unwrap(); + _ => (), + } + } + + fn about_to_wait(&mut self, _event_loop: &winit::event_loop::ActiveEventLoop) { + let renderer = self.windows.get_primary_renderer().unwrap(); + + renderer.window().request_redraw(); + } +} + +pub fn main() -> Result<(), winit::error::EventLoopError> { + // Winit event loop + let event_loop = EventLoop::new().unwrap(); + + let mut app = App::default(); + + event_loop.run_app(&mut app) } struct Scene { diff --git a/examples/subpass.rs b/examples/subpass.rs index de49d0f..40c28d5 100644 --- a/examples/subpass.rs +++ b/examples/subpass.rs @@ -46,112 +46,144 @@ use vulkano_util::{ window::{VulkanoWindows, WindowDescriptor}, }; use winit::{ - event::{Event, WindowEvent}, + application::ApplicationHandler, error::EventLoopError, event::WindowEvent, event_loop::EventLoop, }; // Render a triangle (scene) and a gui from a subpass on top of it (with some transparent fill) -pub fn main() { - // Winit event loop - let event_loop = EventLoop::new().unwrap(); - // Vulkano context - let context = VulkanoContext::new(VulkanoConfig::default()); - // Vulkano windows (create one) - let mut windows = VulkanoWindows::default(); - windows.create_window(&event_loop, &context, &WindowDescriptor::default(), |ci| { - ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; - ci.min_image_count = ci.min_image_count.max(2); - }); - // Create out gui pipeline - let mut gui_pipeline = SimpleGuiPipeline::new( - context.graphics_queue().clone(), - windows.get_primary_renderer_mut().unwrap().swapchain_format(), - context.memory_allocator(), - ); - // Create gui subpass - let mut gui = Gui::new_with_subpass( - &event_loop, - windows.get_primary_renderer_mut().unwrap().surface(), - windows.get_primary_renderer_mut().unwrap().graphics_queue(), - gui_pipeline.gui_pass(), - windows.get_primary_renderer_mut().unwrap().swapchain_format(), - GuiConfig::default(), - ); - - // Create gui state (pass anything your state requires) - event_loop - .run(move |event, window| { - let renderer = windows.get_primary_renderer_mut().unwrap(); - match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - window.exit(); - } - WindowEvent::RedrawRequested => { - // Set immediate UI in redraw here - gui.immediate_ui(|gui| { - let ctx = gui.context(); - Window::new("Transparent Window") - .anchor(Align2([Align::RIGHT, Align::TOP]), vec2(-545.0, 500.0)) - .resizable(false) - .default_width(300.0) - .frame( - Frame::none() - .fill(Color32::from_white_alpha(125)) - .shadow(Shadow { - spread: 8.0, - blur: 10.0, - color: Color32::from_black_alpha(125), - ..Default::default() - }) - .rounding(Rounding::same(5.0)) - .inner_margin(Margin::same(10.0)), - ) - .show(&ctx, |ui| { - ui.colored_label(Color32::BLACK, "Content :)"); - }); - }); - - // Acquire swapchain future - match renderer - .acquire(Some(std::time::Duration::from_millis(10)), |_| {}) - { - Ok(future) => { - // Render gui - let after_future = gui_pipeline.render( - future, - renderer.swapchain_image_view(), - &mut gui, - ); - - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - } - _ => (), +pub struct App { + context: VulkanoContext, + windows: VulkanoWindows, + gui_pipeline: Option, + gui: Option, +} + +impl Default for App { + fn default() -> Self { + // Vulkano context + let context = VulkanoContext::new(VulkanoConfig::default()); + + // Vulkano windows + let windows = VulkanoWindows::default(); + + Self { context, windows, gui_pipeline: None, gui: None } + } +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + self.windows.create_window(event_loop, &self.context, &WindowDescriptor::default(), |ci| { + ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; + ci.min_image_count = ci.min_image_count.max(2); + }); + + // Create out gui pipeline + let gui_pipeline = SimpleGuiPipeline::new( + self.context.graphics_queue().clone(), + self.windows.get_primary_renderer_mut().unwrap().swapchain_format(), + self.context.memory_allocator(), + ); + + // Create gui subpass + self.gui = Some(Gui::new_with_subpass( + event_loop, + self.windows.get_primary_renderer_mut().unwrap().surface(), + self.windows.get_primary_renderer_mut().unwrap().graphics_queue(), + gui_pipeline.gui_pass(), + self.windows.get_primary_renderer_mut().unwrap().swapchain_format(), + GuiConfig::default(), + )); + + self.gui_pipeline = Some(gui_pipeline); + } + + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.windows.get_renderer_mut(window_id).unwrap(); + + let gui = self.gui.as_mut().unwrap(); + + match event { + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + event_loop.exit(); + } + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here + gui.immediate_ui(|gui| { + let ctx = gui.context(); + Window::new("Transparent Window") + .anchor(Align2([Align::RIGHT, Align::TOP]), vec2(-545.0, 500.0)) + .resizable(false) + .default_width(300.0) + .frame( + Frame::none() + .fill(Color32::from_white_alpha(125)) + .shadow(Shadow { + spread: 8.0, + blur: 10.0, + color: Color32::from_black_alpha(125), + ..Default::default() + }) + .rounding(Rounding::same(5.0)) + .inner_margin(Margin::same(10.0)), + ) + .show(&ctx, |ui| { + ui.colored_label(Color32::BLACK, "Content :)"); + }); + }); + + // Acquire swapchain future + match renderer.acquire(Some(std::time::Duration::from_millis(10)), |_| {}) { + Ok(future) => { + // Render gui + let after_future = self.gui_pipeline.as_mut().unwrap().render( + future, + renderer.swapchain_image_view(), + gui, + ); + + // Present swapchain + renderer.present(after_future, true); } - } - Event::AboutToWait => { - renderer.window().request_redraw(); - } - _ => (), + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); + } + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; } - }) - .unwrap(); + _ => (), + } + + if window_id == renderer.window().id() { + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); + } + } + + fn about_to_wait(&mut self, _event_loop: &winit::event_loop::ActiveEventLoop) { + let renderer = self.windows.get_primary_renderer().unwrap(); + + renderer.window().request_redraw(); + } +} + +pub fn main() -> Result<(), EventLoopError> { + // Winit event loop + let event_loop = EventLoop::new().unwrap(); + + let mut app = App::default(); + + event_loop.run_app(&mut app) } struct SimpleGuiPipeline { diff --git a/examples/wholesome/main.rs b/examples/wholesome/main.rs index 7e11b2e..15b545b 100644 --- a/examples/wholesome/main.rs +++ b/examples/wholesome/main.rs @@ -26,10 +26,7 @@ use vulkano_util::{ renderer::DEFAULT_IMAGE_FORMAT, window::{VulkanoWindows, WindowDescriptor}, }; -use winit::{ - event::{Event, WindowEvent}, - event_loop::EventLoop, -}; +use winit::{application::ApplicationHandler, event::WindowEvent, event_loop::EventLoop}; use crate::{renderer::RenderPipeline, time_info::TimeInfo}; @@ -130,126 +127,174 @@ impl GuiState { } } -pub fn main() { - // Winit event loop & our time tracking initialization - let event_loop = EventLoop::new().unwrap(); - let mut time = TimeInfo::new(); - // Create renderer for our scene & ui - let scene_view_size = [256, 256]; - // Vulkano context - let context = VulkanoContext::new(VulkanoConfig::default()); - // Vulkano windows (create one) - let mut windows = VulkanoWindows::default(); - windows.create_window(&event_loop, &context, &WindowDescriptor::default(), |ci| { - ci.image_format = Format::B8G8R8A8_UNORM; - ci.min_image_count = ci.min_image_count.max(2); - }); - // Create gui as main render pass (no overlay means it clears the image each frame) - let mut gui = { - let renderer = windows.get_primary_renderer_mut().unwrap(); - Gui::new( - &event_loop, - renderer.surface(), - renderer.graphics_queue(), - renderer.swapchain_format(), - GuiConfig::default(), - ) - }; - // Create a simple image to which we'll draw the triangle scene - let scene_image = ImageView::new_default( - Image::new( - context.memory_allocator().clone(), - ImageCreateInfo { - image_type: ImageType::Dim2d, - format: DEFAULT_IMAGE_FORMAT, - extent: [scene_view_size[0], scene_view_size[1], 1], - array_layers: 1, - usage: ImageUsage::SAMPLED | ImageUsage::COLOR_ATTACHMENT, - ..Default::default() - }, - AllocationCreateInfo::default(), - ) - .unwrap(), - ) - .unwrap(); - - // Create our render pipeline - let mut scene_render_pipeline = RenderPipeline::new( - context.graphics_queue().clone(), - DEFAULT_IMAGE_FORMAT, - &renderer::Allocators { - command_buffers: Arc::new(StandardCommandBufferAllocator::new( - context.device().clone(), - StandardCommandBufferAllocatorCreateInfo { - secondary_buffer_count: 32, +pub struct App { + context: VulkanoContext, + windows: VulkanoWindows, + scene_view_size: [u32; 2], + scene_image: Arc, + time: TimeInfo, + scene_render_pipeline: RenderPipeline, + gui: Option, + gui_state: Option, +} + +impl Default for App { + fn default() -> Self { + // Vulkano context + let context = VulkanoContext::new(VulkanoConfig::default()); + + // Vulkano windows + let windows = VulkanoWindows::default(); + + // Create renderer for our scene & ui + let scene_view_size = [256, 256]; + // Create a simple image to which we'll draw the triangle scene + let scene_image = ImageView::new_default( + Image::new( + context.memory_allocator().clone(), + ImageCreateInfo { + image_type: ImageType::Dim2d, + format: DEFAULT_IMAGE_FORMAT, + extent: [scene_view_size[0], scene_view_size[1], 1], + array_layers: 1, + usage: ImageUsage::SAMPLED | ImageUsage::COLOR_ATTACHMENT, ..Default::default() }, - )), - memory: context.memory_allocator().clone(), - }, - ); - // Create gui state (pass anything your state requires) - let mut gui_state = GuiState::new(&mut gui, scene_image.clone(), scene_view_size); - // Event loop run - event_loop - .run(move |event, window| { - let renderer = windows.get_primary_renderer_mut().unwrap(); - // Update Egui integration so the UI works! + AllocationCreateInfo::default(), + ) + .unwrap(), + ) + .unwrap(); + + let time = TimeInfo::new(); + + // Create our render pipeline + let scene_render_pipeline = RenderPipeline::new( + context.graphics_queue().clone(), + DEFAULT_IMAGE_FORMAT, + &renderer::Allocators { + command_buffers: Arc::new(StandardCommandBufferAllocator::new( + context.device().clone(), + StandardCommandBufferAllocatorCreateInfo { + secondary_buffer_count: 32, + ..Default::default() + }, + )), + memory: context.memory_allocator().clone(), + }, + ); + + Self { + context, + windows, + scene_view_size, + scene_image, + time, + scene_render_pipeline, + gui: None, + gui_state: None, + } + } +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + self.windows.create_window(event_loop, &self.context, &WindowDescriptor::default(), |ci| { + ci.image_format = Format::B8G8R8A8_UNORM; + ci.min_image_count = ci.min_image_count.max(2); + }); + // Create gui as main render pass (no overlay means it clears the image each frame) + let mut gui = { + let renderer = self.windows.get_primary_renderer_mut().unwrap(); + Gui::new( + event_loop, + renderer.surface(), + renderer.graphics_queue(), + renderer.swapchain_format(), + GuiConfig::default(), + ) + }; + + // Create gui state (pass anything your state requires) + self.gui_state = + Some(GuiState::new(&mut gui, self.scene_image.clone(), self.scene_view_size)); + + self.gui = Some(gui); + } + + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.windows.get_renderer_mut(window_id).unwrap(); + + let gui = self.gui.as_mut().unwrap(); + + if window_id == renderer.window().id() { + let _pass_events_to_game = !gui.update(&event); match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + event_loop.exit(); + } + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here + // It's a closure giving access to egui context inside which you can call anything. + // Here we're calling the layout of our `gui_state`. + gui.immediate_ui(|gui| { + let ctx = gui.context(); + self.gui_state.as_mut().unwrap().layout( + ctx, + renderer.window_size(), + self.time.fps(), + ) + }); + // Render UI + // Acquire swapchain future + match renderer.acquire(Some(std::time::Duration::from_millis(10)), |_| {}) { + Ok(future) => { + // Draw scene + let after_scene_draw = + self.scene_render_pipeline.render(future, self.scene_image.clone()); + // Render gui + let after_future = gui + .draw_on_image(after_scene_draw, renderer.swapchain_image_view()); + // Present swapchain + renderer.present(after_future, true); } - WindowEvent::ScaleFactorChanged { .. } => { + Err(vulkano::VulkanError::OutOfDate) => { renderer.resize(); } - WindowEvent::CloseRequested => { - window.exit(); - } - WindowEvent::RedrawRequested => { - // Set immediate UI in redraw here - // It's a closure giving access to egui context inside which you can call anything. - // Here we're calling the layout of our `gui_state`. - gui.immediate_ui(|gui| { - let ctx = gui.context(); - gui_state.layout(ctx, renderer.window_size(), time.fps()) - }); - // Render UI - // Acquire swapchain future - match renderer - .acquire(Some(std::time::Duration::from_millis(10)), |_| {}) - { - Ok(future) => { - // Draw scene - let after_scene_draw = - scene_render_pipeline.render(future, scene_image.clone()); - // Render gui - let after_future = gui.draw_on_image( - after_scene_draw, - renderer.swapchain_image_view(), - ); - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - - // Update fps & dt - time.update(); - } - _ => (), - } - } - Event::AboutToWait => { - renderer.window().request_redraw(); + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; + + // Update fps & dt + self.time.update(); } _ => (), } - }) - .unwrap(); + } + } + + fn about_to_wait(&mut self, _event_loop: &winit::event_loop::ActiveEventLoop) { + let renderer = self.windows.get_primary_renderer_mut().unwrap(); + renderer.window().request_redraw(); + } +} + +pub fn main() -> Result<(), winit::error::EventLoopError> { + // Winit event loop & our time tracking initialization + let event_loop = EventLoop::new().unwrap(); + + let mut app = App::default(); + + // Event loop run + event_loop.run_app(&mut app) } diff --git a/src/integration.rs b/src/integration.rs index 506c216..0d61e0f 100644 --- a/src/integration.rs +++ b/src/integration.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use egui::{ClippedPrimitive, TexturesDelta}; -use egui_winit::winit::event_loop::EventLoopWindowTarget; +use egui_winit::winit::event_loop::ActiveEventLoop; use vulkano::{ device::Queue, format::{Format, NumericFormat}, @@ -82,8 +82,8 @@ impl Gui { /// This is to be called once we have access to vulkano_win's winit window surface /// and gfx queue. Created with this, the renderer will own a render pass which is useful to e.g. place your render pass' images /// onto egui windows - pub fn new( - event_loop: &EventLoopWindowTarget, + pub fn new( + event_loop: &ActiveEventLoop, surface: Arc, gfx_queue: Arc, output_format: Format, @@ -100,8 +100,8 @@ impl Gui { } /// Same as `new` but instead of integration owning a render pass, egui renders on your subpass - pub fn new_with_subpass( - event_loop: &EventLoopWindowTarget, + pub fn new_with_subpass( + event_loop: &ActiveEventLoop, surface: Arc, gfx_queue: Arc, subpass: Subpass, @@ -114,8 +114,8 @@ impl Gui { } /// Same as `new` but instead of integration owning a render pass, egui renders on your subpass - fn new_internal( - event_loop: &EventLoopWindowTarget, + fn new_internal( + event_loop: &ActiveEventLoop, surface: Arc, renderer: Renderer, ) -> Gui { @@ -123,11 +123,16 @@ impl Gui { renderer.queue().device().physical_device().properties().max_image_dimension2_d as usize; let egui_ctx: egui::Context = Default::default(); + let theme = match egui_ctx.theme() { + egui::Theme::Dark => winit::window::Theme::Dark, + egui::Theme::Light => winit::window::Theme::Light, + }; let egui_winit = egui_winit::State::new( egui_ctx.clone(), egui_ctx.viewport_id(), event_loop, Some(surface_window(&surface).scale_factor() as f32), + Some(theme), Some(max_texture_side), ); Gui { @@ -165,7 +170,7 @@ impl Gui { /// Begins Egui frame & determines what will be drawn later. This must be called before draw, and after `update` (winit event). pub fn immediate_ui(&mut self, layout_function: impl FnOnce(&mut Self)) { let raw_input = self.egui_winit.take_egui_input(surface_window(&self.surface)); - self.egui_ctx.begin_frame(raw_input); + self.egui_ctx.begin_pass(raw_input); // Render Egui layout_function(self); } @@ -174,7 +179,7 @@ impl Gui { /// (Finish by drawing) pub fn begin_frame(&mut self) { let raw_input = self.egui_winit.take_egui_input(surface_window(&self.surface)); - self.egui_ctx.begin_frame(raw_input); + self.egui_ctx.begin_pass(raw_input); } /// Renders ui on `final_image` & Updates cursor icon @@ -246,7 +251,7 @@ impl Gui { shapes, pixels_per_point: _, viewport_output: _, - } = self.egui_ctx.end_frame(); + } = self.egui_ctx.end_pass(); self.egui_winit.handle_platform_output(surface_window(&self.surface), platform_output); self.shapes = shapes; From ddce81d33f0e58bb64c6264b16a1cd8ae8a4a13a Mon Sep 17 00:00:00 2001 From: let Date: Mon, 14 Oct 2024 08:34:58 +0200 Subject: [PATCH 22/23] add Cargo.lock This is in order to avoid random breakage when Vulkano gets an update. Gets removed as soon as Vulkano releases a new version. --- .gitignore | 2 +- Cargo.lock | 3046 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 3047 insertions(+), 1 deletion(-) create mode 100644 Cargo.lock diff --git a/.gitignore b/.gitignore index b471067..85c2d00 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ /target -Cargo.lock +# Cargo.lock .idea diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..f80519d --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3046 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ab_glyph" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.6.0", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "anyhow" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" + +[[package]] +name = "approx" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + +[[package]] +name = "arboard" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" +dependencies = [ + "clipboard-win", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "parking_lot", + "x11rb", +] + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ash" +version = "0.37.3+1.3.251" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +dependencies = [ + "libloading 0.7.4", +] + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading 0.8.5", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitstream-io" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b81e1519b0d82120d2fd469d5bfb2919a9361c48b02d82d04befc1cdd2002452" + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "built" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.6.0", + "log", + "polling", + "rustix", + "slab", + "thiserror", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cc" +version = "1.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cgmath" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317" +dependencies = [ + "approx", + "num-traits", +] + +[[package]] +name = "clipboard-win" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +dependencies = [ + "error-code", +] + +[[package]] +name = "cmake" +version = "0.1.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +dependencies = [ + "cc", +] + +[[package]] +name = "color-hex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecdffb913a326b6c642290a0d0ec8e8d6597291acdc07cc4c9cb4b3635d44cf9" + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.5", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" + +[[package]] +name = "ecolor" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775cfde491852059e386c4e1deb4aef381c617dc364184c6f6afee99b87c402b" +dependencies = [ + "bytemuck", + "color-hex", + "emath", +] + +[[package]] +name = "egui" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53eafabcce0cb2325a59a98736efe0bf060585b437763f8c476957fb274bb974" +dependencies = [ + "ahash", + "emath", + "epaint", + "log", + "nohash-hasher", +] + +[[package]] +name = "egui-winit" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a9c430f4f816340e8e8c1b20eec274186b1be6bc4c7dfc467ed50d57abc36c6" +dependencies = [ + "ahash", + "arboard", + "egui", + "log", + "raw-window-handle 0.6.2", + "smithay-clipboard", + "web-time", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_demo_lib" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc5e2dd86a62a644db35f89f712c87432ae58266f793d06683c827d67018aa1" +dependencies = [ + "egui", + "egui_extras", + "unicode_names2", +] + +[[package]] +name = "egui_extras" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3c1f5cd8dfe2ade470a218696c66cf556fcfd701e7830fa2e9f4428292a2a1" +dependencies = [ + "ahash", + "egui", + "enum-map", + "log", + "mime_guess2", +] + +[[package]] +name = "egui_winit_vulkano" +version = "0.27.0" +dependencies = [ + "ahash", + "cgmath", + "egui", + "egui-winit", + "egui_demo_lib", + "image", + "vulkano 0.34.0", + "vulkano-shaders", + "vulkano-util", + "winit", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "emath" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1fe0049ce51d0fb414d029e668dd72eb30bc2b739bf34296ed97bd33df544f3" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", + "serde", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "epaint" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a32af8da821bd4f43f2c137e295459ee2e1661d87ca8779dfa0eaf45d870e20f" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "log", + "nohash-hasher", + "parking_lot", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "483440db0b7993cf77a20314f08311dbe95675092405518c0677aa08c151a3ea" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "error-code" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" + +[[package]] +name = "exr" +version = "1.72.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +dependencies = [ + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide 0.7.4", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fdeflate" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +dependencies = [ + "crc32fast", + "miniz_oxide 0.8.0", +] + +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "spin", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "bytemuck", + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "image" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + +[[package]] +name = "libc" +version = "0.2.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess2" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a3333bb1609500601edc766a39b4c1772874a4ce26022f4d866854dc020c41" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.6.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle 0.6.2", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "dispatch", + "libc", + "objc2", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "orbclient" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +dependencies = [ + "libredox", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.7", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "png" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.0", +] + +[[package]] +name = "polling" +version = "3.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f0bfd976333248de2078d350bfdf182ff96e168a24d23d2436cef320dd4bdd" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rgb", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "raw-window-metal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2000e45d7daa9b6d946e88dfa1d7ae330424a81918a6545741821c989eb80a9" +dependencies = [ + "objc2", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "regex" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "roxmltree" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "rustix" +version = "0.38.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "shaderc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27e07913ada18607bb60d12431cbe3358d3bbebbe95948e1618851dc01e63b7b" +dependencies = [ + "libc", + "shaderc-sys", +] + +[[package]] +name = "shaderc-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73120d240fe22196300f39ca8547ca2d014960f27b19b47b21288b396272f7f7" +dependencies = [ + "cmake", + "libc", + "roxmltree", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slabbin" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8305086044614627ed85432d27b87cf9fc047204eaa036a11de6cf0120f273" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.6.0", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix", + "thiserror", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" +dependencies = [ + "libc", + "smithay-client-toolkit", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "syn" +version = "2.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "thiserror" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" + +[[package]] +name = "ttf-parser" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5902c5d130972a0000f60860bfbf46f7ca3db5391eddfedd1b8728bd9dc96c0e" + +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode_names2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446c96c6dd42604779487f0a981060717156648c1706aa1f464677f03c6cc059" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vk-parse" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81086c28be67a8759cd80cbb3c8f7b520e0874605fc5eb74d5a1c9c2d1878e79" +dependencies = [ + "xml-rs", +] + +[[package]] +name = "vk-parse" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3859da4d7b98bec73e68fb65815d47a263819c415c90eed42b80440a02cbce8c" +dependencies = [ + "xml-rs", +] + +[[package]] +name = "vulkano" +version = "0.34.0" +source = "git+https://github.com/vulkano-rs/vulkano.git#a2704689603bd614186edd17c73779fd1f401548" +dependencies = [ + "ahash", + "ash 0.38.0+1.3.281", + "bytemuck", + "crossbeam-queue", + "half", + "heck 0.4.1", + "indexmap", + "libloading 0.8.5", + "nom", + "once_cell", + "parking_lot", + "proc-macro2", + "quote", + "raw-window-handle 0.6.2", + "raw-window-metal", + "serde", + "serde_json", + "slabbin", + "smallvec", + "thread_local", + "vk-parse 0.15.0", + "vulkano-macros", + "x11-dl", + "x11rb", +] + +[[package]] +name = "vulkano" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f4278f76307b3c388679234b397b4f90de29cdba53873c26b624ed82653d75" +dependencies = [ + "ahash", + "ash 0.37.3+1.3.251", + "bytemuck", + "core-graphics-types", + "crossbeam-queue", + "half", + "heck 0.4.1", + "indexmap", + "libloading 0.8.5", + "objc", + "once_cell", + "parking_lot", + "proc-macro2", + "quote", + "raw-window-handle 0.5.2", + "regex", + "serde", + "serde_json", + "smallvec", + "thread_local", + "vk-parse 0.12.0", +] + +[[package]] +name = "vulkano-macros" +version = "0.34.0" +source = "git+https://github.com/vulkano-rs/vulkano.git#a2704689603bd614186edd17c73779fd1f401548" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "vulkano-shaders" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f63401297565d74afb96e9add12587d8e46235140cee325a8eb6ba4602f4ee" +dependencies = [ + "ahash", + "heck 0.4.1", + "proc-macro2", + "quote", + "shaderc", + "syn", + "vulkano 0.34.1", +] + +[[package]] +name = "vulkano-util" +version = "0.34.0" +source = "git+https://github.com/vulkano-rs/vulkano.git#a2704689603bd614186edd17c73779fd1f401548" +dependencies = [ + "ahash", + "vulkano 0.34.0", + "winit", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "wayland-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +dependencies = [ + "cc", + "downcast-rs", + "rustix", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" +dependencies = [ + "bitflags 2.6.0", + "rustix", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.6.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a94697e66e76c85923b0d28a0c251e8f0666f58fc47d316c0f4da6da75d37cb" +dependencies = [ + "rustix", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5755d77ae9040bb872a25026555ce4cb0ae75fd923e90d25fba07d81057de0" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0a41a6875e585172495f7a96dfa42ca7e0213868f4f15c313f7c33221a7eff" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad87b5fd1b1d3ca2f792df8f686a2a11e3fe1077b71096f7a175ab699f89109" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5f07fb9bc8de2ddfe6b24a71a75430673fd679e568c48b52716cef1cfae923" +dependencies = [ + "block2", + "core-foundation 0.10.0", + "home", + "jni", + "log", + "ndk-context", + "objc2", + "objc2-foundation", + "url", + "web-sys", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winit" +version = "0.30.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be9e76a1f1077e04a411f0b989cbd3c93339e1771cb41e71ac4aee95bfd2c67" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.6.0", + "block2", + "bytemuck", + "calloop", + "cfg_aliases", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle 0.6.2", + "redox_syscall 0.4.1", + "rustix", + "smithay-client-toolkit", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading 0.8.5", + "once_cell", + "rustix", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xcursor" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.6.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" + +[[package]] +name = "xmlparser" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" +dependencies = [ + "zune-core", +] From 00ebd45dc557288ff32a865aea9b672d1f7ab336 Mon Sep 17 00:00:00 2001 From: let Date: Sun, 20 Oct 2024 12:51:20 +0200 Subject: [PATCH 23/23] Update Vulkano rename RecordingCommandBuffers and CommandBuffers back to AutoCommandBufferBuilder and their previous names --- Cargo.lock | 78 ++++++++++------------ examples/multisample.rs | 28 +++----- examples/subpass.rs | 28 +++----- examples/wholesome/frame_system.rs | 18 ++--- examples/wholesome/triangle_draw_system.rs | 19 +++--- src/integration.rs | 3 +- src/renderer.rs | 60 ++++++++--------- src/utils.rs | 10 ++- 8 files changed, 104 insertions(+), 140 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f80519d..92db7a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -87,9 +87,9 @@ checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" [[package]] name = "approx" @@ -190,9 +190,9 @@ dependencies = [ [[package]] name = "avif-serialize" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" dependencies = [ "arrayvec", ] @@ -232,9 +232,9 @@ dependencies = [ [[package]] name = "built" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" [[package]] name = "bumpalo" @@ -308,9 +308,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.30" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "jobserver", "libc", @@ -735,9 +735,9 @@ dependencies = [ [[package]] name = "flume" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "spin", ] @@ -865,9 +865,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.2" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" +checksum = "bc144d44a31d753b02ce64093d532f55ff8dc4ebf2ffb8a63c0dda691385acae" dependencies = [ "bytemuck", "byteorder-lite", @@ -888,9 +888,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" +checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" dependencies = [ "byteorder-lite", "quick-error", @@ -898,9 +898,9 @@ dependencies = [ [[package]] name = "imgref" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" [[package]] name = "indexmap" @@ -992,9 +992,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libfuzzer-sys" @@ -1029,13 +1029,13 @@ dependencies = [ [[package]] name = "libredox" -version = "0.0.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.7", ] [[package]] @@ -1492,9 +1492,9 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "orbclient" -version = "0.3.47" +version = "0.3.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" dependencies = [ "libredox", ] @@ -1623,9 +1623,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.87" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" dependencies = [ "unicode-ident", ] @@ -1749,9 +1749,9 @@ dependencies = [ [[package]] name = "ravif" -version = "0.11.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f0bfd976333248de2078d350bfdf182ff96e168a24d23d2436cef320dd4bdd" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" dependencies = [ "avif-serialize", "imgref", @@ -1856,9 +1856,6 @@ name = "rgb" version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" -dependencies = [ - "bytemuck", -] [[package]] name = "roxmltree" @@ -1931,9 +1928,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -2069,9 +2066,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "198514704ca887dd5a1e408c6c6cdcba43672f9b4062e1b24aa34e74e6d7faae" dependencies = [ "proc-macro2", "quote", @@ -2211,12 +2208,9 @@ checksum = "5902c5d130972a0000f60860bfbf46f7ca3db5391eddfedd1b8728bd9dc96c0e" [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-bidi" @@ -2306,7 +2300,7 @@ dependencies = [ [[package]] name = "vulkano" version = "0.34.0" -source = "git+https://github.com/vulkano-rs/vulkano.git#a2704689603bd614186edd17c73779fd1f401548" +source = "git+https://github.com/vulkano-rs/vulkano.git#0815e76659ee0c9fdef39f5064ff70b45470eeca" dependencies = [ "ahash", "ash 0.38.0+1.3.281", @@ -2366,7 +2360,7 @@ dependencies = [ [[package]] name = "vulkano-macros" version = "0.34.0" -source = "git+https://github.com/vulkano-rs/vulkano.git#a2704689603bd614186edd17c73779fd1f401548" +source = "git+https://github.com/vulkano-rs/vulkano.git#0815e76659ee0c9fdef39f5064ff70b45470eeca" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2392,7 +2386,7 @@ dependencies = [ [[package]] name = "vulkano-util" version = "0.34.0" -source = "git+https://github.com/vulkano-rs/vulkano.git#a2704689603bd614186edd17c73779fd1f401548" +source = "git+https://github.com/vulkano-rs/vulkano.git#0815e76659ee0c9fdef39f5064ff70b45470eeca" dependencies = [ "ahash", "vulkano 0.34.0", diff --git a/examples/multisample.rs b/examples/multisample.rs index e6ec54a..0efb96e 100644 --- a/examples/multisample.rs +++ b/examples/multisample.rs @@ -17,9 +17,8 @@ use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, command_buffer::{ allocator::{StandardCommandBufferAllocator, StandardCommandBufferAllocatorCreateInfo}, - CommandBufferBeginInfo, CommandBufferInheritanceInfo, CommandBufferLevel, - CommandBufferUsage, RecordingCommandBuffer, RenderPassBeginInfo, SubpassBeginInfo, - SubpassContents, + AutoCommandBufferBuilder, CommandBufferInheritanceInfo, CommandBufferUsage, + RenderPassBeginInfo, SubpassBeginInfo, SubpassContents, }, device::{Device, Queue}, format::Format, @@ -355,14 +354,10 @@ impl MSAAPipeline { image: Arc, gui: &mut Gui, ) -> Box { - let mut builder = RecordingCommandBuffer::new( + let mut builder = AutoCommandBufferBuilder::primary( self.command_buffer_allocator.clone(), self.queue.queue_family_index(), - CommandBufferLevel::Primary, - CommandBufferBeginInfo { - usage: CommandBufferUsage::OneTimeSubmit, - ..Default::default() - }, + CommandBufferUsage::OneTimeSubmit, ) .unwrap(); @@ -409,15 +404,12 @@ impl MSAAPipeline { .unwrap(); // Render first draw pass - let mut secondary_builder = RecordingCommandBuffer::new( + let mut secondary_builder = AutoCommandBufferBuilder::secondary( self.command_buffer_allocator.clone(), self.queue.queue_family_index(), - CommandBufferLevel::Secondary, - CommandBufferBeginInfo { - inheritance_info: Some(CommandBufferInheritanceInfo { - render_pass: Some(self.subpass.clone().into()), - ..Default::default() - }), + CommandBufferUsage::MultipleSubmit, + CommandBufferInheritanceInfo { + render_pass: Some(self.subpass.clone().into()), ..Default::default() }, ) @@ -441,7 +433,7 @@ impl MSAAPipeline { unsafe { secondary_builder.draw(self.vertex_buffer.len() as u32, 1, 0, 0).unwrap(); } - let cb = secondary_builder.end().unwrap(); + let cb = secondary_builder.build().unwrap(); builder.execute_commands(cb).unwrap(); // Draw gui on subpass @@ -450,7 +442,7 @@ impl MSAAPipeline { // Last end render pass builder.end_render_pass(Default::default()).unwrap(); - let command_buffer = builder.end().unwrap(); + let command_buffer = builder.build().unwrap(); let after_future = before_future.then_execute(self.queue.clone(), command_buffer).unwrap(); after_future.boxed() diff --git a/examples/subpass.rs b/examples/subpass.rs index 40c28d5..5744faf 100644 --- a/examples/subpass.rs +++ b/examples/subpass.rs @@ -17,9 +17,8 @@ use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, command_buffer::{ allocator::{StandardCommandBufferAllocator, StandardCommandBufferAllocatorCreateInfo}, - CommandBufferBeginInfo, CommandBufferInheritanceInfo, CommandBufferLevel, - CommandBufferUsage, RecordingCommandBuffer, RenderPassBeginInfo, SubpassBeginInfo, - SubpassContents, + AutoCommandBufferBuilder, CommandBufferInheritanceInfo, CommandBufferUsage, + RenderPassBeginInfo, SubpassBeginInfo, SubpassContents, }, device::{Device, Queue}, format::Format, @@ -311,14 +310,10 @@ impl SimpleGuiPipeline { image: Arc, gui: &mut Gui, ) -> Box { - let mut builder = RecordingCommandBuffer::new( + let mut builder = AutoCommandBufferBuilder::primary( self.command_buffer_allocator.clone(), self.queue.queue_family_index(), - CommandBufferLevel::Primary, - CommandBufferBeginInfo { - usage: CommandBufferUsage::OneTimeSubmit, - ..Default::default() - }, + CommandBufferUsage::OneTimeSubmit, ) .unwrap(); @@ -344,15 +339,12 @@ impl SimpleGuiPipeline { .unwrap(); // Render first draw pass - let mut secondary_builder = RecordingCommandBuffer::new( + let mut secondary_builder = AutoCommandBufferBuilder::secondary( self.command_buffer_allocator.clone(), self.queue.queue_family_index(), - CommandBufferLevel::Secondary, - CommandBufferBeginInfo { - inheritance_info: Some(CommandBufferInheritanceInfo { - render_pass: Some(self.subpass.clone().into()), - ..Default::default() - }), + CommandBufferUsage::MultipleSubmit, + CommandBufferInheritanceInfo { + render_pass: Some(self.subpass.clone().into()), ..Default::default() }, ) @@ -376,7 +368,7 @@ impl SimpleGuiPipeline { unsafe { secondary_builder.draw(self.vertex_buffer.len() as u32, 1, 0, 0).unwrap(); } - let cb = secondary_builder.end().unwrap(); + let cb = secondary_builder.build().unwrap(); builder.execute_commands(cb).unwrap(); // Move on to next subpass for gui @@ -392,7 +384,7 @@ impl SimpleGuiPipeline { // Last end render pass builder.end_render_pass(Default::default()).unwrap(); - let command_buffer = builder.end().unwrap(); + let command_buffer = builder.build().unwrap(); let after_future = before_future.then_execute(self.queue.clone(), command_buffer).unwrap(); after_future.boxed() diff --git a/examples/wholesome/frame_system.rs b/examples/wholesome/frame_system.rs index 8b23cf3..f4cc5f9 100644 --- a/examples/wholesome/frame_system.rs +++ b/examples/wholesome/frame_system.rs @@ -16,8 +16,8 @@ use std::sync::Arc; use cgmath::Matrix4; use vulkano::{ command_buffer::{ - CommandBuffer, CommandBufferBeginInfo, CommandBufferLevel, CommandBufferUsage, - RecordingCommandBuffer, RenderPassBeginInfo, SubpassBeginInfo, SubpassContents, + AutoCommandBufferBuilder, CommandBufferUsage, PrimaryAutoCommandBuffer, + RenderPassBeginInfo, SecondaryAutoCommandBuffer, SubpassBeginInfo, SubpassContents, }, device::Queue, format::Format, @@ -124,14 +124,10 @@ impl FrameSystem { ..Default::default() }) .unwrap(); - let mut command_buffer_builder = RecordingCommandBuffer::new( + let mut command_buffer_builder = AutoCommandBufferBuilder::primary( self.allocators.command_buffers.clone(), self.gfx_queue.queue_family_index(), - CommandBufferLevel::Primary, - CommandBufferBeginInfo { - usage: CommandBufferUsage::OneTimeSubmit, - ..Default::default() - }, + CommandBufferUsage::OneTimeSubmit, ) .unwrap(); command_buffer_builder @@ -163,7 +159,7 @@ pub struct Frame<'a> { num_pass: u8, before_main_cb_future: Option>, framebuffer: Arc, - recording_command_buffer: Option, + recording_command_buffer: Option>, #[allow(dead_code)] world_to_framebuffer: Matrix4, } @@ -183,7 +179,7 @@ impl<'a> Frame<'a> { .unwrap() .end_render_pass(Default::default()) .unwrap(); - let command_buffer = self.recording_command_buffer.take().unwrap().end().unwrap(); + let command_buffer = self.recording_command_buffer.take().unwrap().build().unwrap(); let after_main_cb = self .before_main_cb_future .take() @@ -208,7 +204,7 @@ pub struct DrawPass<'f, 's: 'f> { impl<'f, 's: 'f> DrawPass<'f, 's> { #[inline] - pub fn execute(&mut self, command_buffer: Arc) { + pub fn execute(&mut self, command_buffer: Arc) { self.frame .recording_command_buffer .as_mut() diff --git a/examples/wholesome/triangle_draw_system.rs b/examples/wholesome/triangle_draw_system.rs index a6225fa..149cb47 100644 --- a/examples/wholesome/triangle_draw_system.rs +++ b/examples/wholesome/triangle_draw_system.rs @@ -16,8 +16,8 @@ use std::sync::Arc; use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, command_buffer::{ - allocator::StandardCommandBufferAllocator, CommandBuffer, CommandBufferBeginInfo, - CommandBufferInheritanceInfo, RecordingCommandBuffer, + allocator::StandardCommandBufferAllocator, AutoCommandBufferBuilder, + CommandBufferInheritanceInfo, CommandBufferUsage, SecondaryAutoCommandBuffer, }, device::Queue, memory::allocator::{AllocationCreateInfo, MemoryTypeFilter}, @@ -121,16 +121,13 @@ impl TriangleDrawSystem { } } - pub fn draw(&self, viewport_dimensions: [u32; 2]) -> Arc { - let mut builder = RecordingCommandBuffer::new( + pub fn draw(&self, viewport_dimensions: [u32; 2]) -> Arc { + let mut builder = AutoCommandBufferBuilder::secondary( self.command_buffer_allocator.clone(), self.gfx_queue.queue_family_index(), - vulkano::command_buffer::CommandBufferLevel::Secondary, - CommandBufferBeginInfo { - inheritance_info: Some(CommandBufferInheritanceInfo { - render_pass: Some(self.subpass.clone().into()), - ..Default::default() - }), + CommandBufferUsage::MultipleSubmit, + CommandBufferInheritanceInfo { + render_pass: Some(self.subpass.clone().into()), ..Default::default() }, ) @@ -154,7 +151,7 @@ impl TriangleDrawSystem { unsafe { builder.draw(self.vertex_buffer.len() as u32, 1, 0, 0).unwrap(); } - builder.end().unwrap() + builder.build().unwrap() } } diff --git a/src/integration.rs b/src/integration.rs index 0d61e0f..e407e3f 100644 --- a/src/integration.rs +++ b/src/integration.rs @@ -11,6 +11,7 @@ use std::sync::Arc; use egui::{ClippedPrimitive, TexturesDelta}; use egui_winit::winit::event_loop::ActiveEventLoop; use vulkano::{ + command_buffer::SecondaryAutoCommandBuffer, device::Queue, format::{Format, NumericFormat}, image::{sampler::SamplerCreateInfo, view::ImageView, SampleCount}, @@ -218,7 +219,7 @@ impl Gui { pub fn draw_on_subpass_image( &mut self, image_dimensions: [u32; 2], - ) -> Arc { + ) -> Arc { if self.renderer.has_renderpass() { panic!( "Gui integration has been created with its own render pass, use `draw_on_image` \ diff --git a/src/renderer.rs b/src/renderer.rs index 8b35ec0..72da71b 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -17,9 +17,9 @@ use vulkano::{ Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer, }, command_buffer::{ - allocator::StandardCommandBufferAllocator, BufferImageCopy, CommandBuffer, - CommandBufferBeginInfo, CommandBufferInheritanceInfo, CommandBufferLevel, - CommandBufferUsage, CopyBufferToImageInfo, RecordingCommandBuffer, RenderPassBeginInfo, + allocator::StandardCommandBufferAllocator, AutoCommandBufferBuilder, BufferImageCopy, + CommandBufferInheritanceInfo, CommandBufferUsage, CopyBufferToImageInfo, + PrimaryAutoCommandBuffer, RenderPassBeginInfo, SecondaryAutoCommandBuffer, SubpassBeginInfo, SubpassContents, }, descriptor_set::{ @@ -381,7 +381,7 @@ impl Renderer { delta: &egui::epaint::ImageDelta, stage: Subbuffer<[u8]>, mapped_stage: &mut [u8], - cbb: &mut RecordingCommandBuffer, + cbb: &mut AutoCommandBufferBuilder, ) { // Extract pixel data from egui, writing into our region of the stage buffer. let format = match &delta.image { @@ -500,14 +500,10 @@ impl Renderer { let buffer = Subbuffer::new(buffer); // Shared command buffer for every upload in this batch. - let mut cbb = RecordingCommandBuffer::new( + let mut cbb = AutoCommandBufferBuilder::primary( self.allocators.command_buffer.clone(), self.gfx_queue.queue_family_index(), - CommandBufferLevel::Primary, - CommandBufferBeginInfo { - usage: CommandBufferUsage::OneTimeSubmit, - ..Default::default() - }, + CommandBufferUsage::OneTimeSubmit, ) .unwrap(); @@ -535,7 +531,7 @@ impl Renderer { } // Execute every upload at once and await: - let command_buffer = cbb.end().unwrap(); + let command_buffer = cbb.build().unwrap(); // Executing on the graphics queue not only since it's what we have, but // we must guarantee a transfer granularity of [1,1,x] which graphics queue is required to have. command_buffer @@ -571,16 +567,15 @@ impl Renderer { } } - fn create_secondary_command_buffer_builder(&self) -> RecordingCommandBuffer { - RecordingCommandBuffer::new( + fn create_secondary_command_buffer_builder( + &self, + ) -> AutoCommandBufferBuilder { + AutoCommandBufferBuilder::secondary( self.allocators.command_buffer.clone(), self.gfx_queue.queue_family_index(), - CommandBufferLevel::Secondary, - CommandBufferBeginInfo { - inheritance_info: Some(CommandBufferInheritanceInfo { - render_pass: Some(self.subpass.clone().into()), - ..Default::default() - }), + CommandBufferUsage::MultipleSubmit, + CommandBufferInheritanceInfo { + render_pass: Some(self.subpass.clone().into()), ..Default::default() }, ) @@ -588,7 +583,10 @@ impl Renderer { } // Starts the rendering pipeline and returns [`RecordingCommandBuffer`] for drawing - fn start(&mut self, final_image: Arc) -> (RecordingCommandBuffer, [u32; 2]) { + fn start( + &mut self, + final_image: Arc, + ) -> (AutoCommandBufferBuilder, [u32; 2]) { // Get dimensions let img_dims = final_image.image().extent(); // Create framebuffer (must be in same order as render pass description in `new` @@ -603,14 +601,10 @@ impl Renderer { FramebufferCreateInfo { attachments: vec![final_image], ..Default::default() }, ) .unwrap(); - let mut command_buffer_builder = RecordingCommandBuffer::new( + let mut command_buffer_builder = AutoCommandBufferBuilder::primary( self.allocators.command_buffer.clone(), self.gfx_queue.queue_family_index(), - CommandBufferLevel::Primary, - CommandBufferBeginInfo { - usage: CommandBufferUsage::OneTimeSubmit, - ..Default::default() - }, + CommandBufferUsage::OneTimeSubmit, ) .unwrap(); // Add clear values here for attachments and begin render pass @@ -647,7 +641,7 @@ impl Renderer { let mut builder = self.create_secondary_command_buffer_builder(); self.draw_egui(scale_factor, clipped_meshes, framebuffer_dimensions, &mut builder); // Execute draw commands - let command_buffer = builder.end().unwrap(); + let command_buffer = builder.build().unwrap(); command_buffer_builder.execute_commands(command_buffer).unwrap(); let done_future = self.finish(command_buffer_builder, Box::new(before_future)); @@ -661,13 +655,13 @@ impl Renderer { // Finishes the rendering pipeline fn finish( &self, - mut command_buffer_builder: RecordingCommandBuffer, + mut command_buffer_builder: AutoCommandBufferBuilder, before_main_cb_future: Box, ) -> Box { // We end render pass command_buffer_builder.end_render_pass(Default::default()).unwrap(); // Then execute our whole command buffer - let command_buffer = command_buffer_builder.end().unwrap(); + let command_buffer = command_buffer_builder.build().unwrap(); let after_main_cb = before_main_cb_future.then_execute(self.gfx_queue.clone(), command_buffer).unwrap(); // Return our future @@ -680,11 +674,11 @@ impl Renderer { textures_delta: &TexturesDelta, scale_factor: f32, framebuffer_dimensions: [u32; 2], - ) -> Arc { + ) -> Arc { self.update_textures(&textures_delta.set); let mut builder = self.create_secondary_command_buffer_builder(); self.draw_egui(scale_factor, clipped_meshes, framebuffer_dimensions, &mut builder); - let buffer = builder.end().unwrap(); + let buffer = builder.build().unwrap(); for &id in &textures_delta.free { self.unregister_image(id); } @@ -770,7 +764,7 @@ impl Renderer { scale_factor: f32, clipped_meshes: &[ClippedPrimitive], framebuffer_dimensions: [u32; 2], - builder: &mut RecordingCommandBuffer, + builder: &mut AutoCommandBufferBuilder, ) { let push_constants = vs::PushConstants { screen_size: [ @@ -980,7 +974,7 @@ impl Renderer { /// /// See the `triangle` demo source for a detailed usage example. pub struct CallbackContext<'a> { - pub builder: &'a mut RecordingCommandBuffer, + pub builder: &'a mut AutoCommandBufferBuilder, pub resources: RenderResources<'a>, } diff --git a/src/utils.rs b/src/utils.rs index af55ad3..b501d28 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -15,8 +15,7 @@ use vulkano::{ buffer::{AllocateBufferError, Buffer, BufferCreateInfo, BufferUsage}, command_buffer::{ allocator::{StandardCommandBufferAllocator, StandardCommandBufferAllocatorCreateInfo}, - CommandBufferBeginInfo, CommandBufferLevel, CommandBufferUsage, CopyBufferToImageInfo, - RecordingCommandBuffer, + AutoCommandBufferBuilder, CommandBufferUsage, CopyBufferToImageInfo, }, descriptor_set::allocator::StandardDescriptorSetAllocator, device::{Device, Queue}, @@ -40,11 +39,10 @@ pub fn immutable_texture_from_bytes( dimensions: [u32; 2], format: vulkano::format::Format, ) -> Result, ImageCreationError> { - let mut cbb = RecordingCommandBuffer::new( + let mut cbb = AutoCommandBufferBuilder::primary( allocators.command_buffer.clone(), queue.queue_family_index(), - CommandBufferLevel::Primary, - CommandBufferBeginInfo { usage: CommandBufferUsage::OneTimeSubmit, ..Default::default() }, + CommandBufferUsage::OneTimeSubmit, ) .map_err(ImageCreationError::Vulkan)?; @@ -79,7 +77,7 @@ pub fn immutable_texture_from_bytes( )) .map_err(ImageCreationError::Validation)?; - let _fut = cbb.end().unwrap().execute(queue).unwrap(); + let _fut = cbb.build().unwrap().execute(queue).unwrap(); Ok(ImageView::new_default(texture).unwrap()) }