1mod context;
2mod handler;
3mod plugin;
4mod traits;
5
6pub mod window_config;
7
8pub use context::EngineContext;
9pub use plugin::Plugin;
10pub use traits::App;
11
12use crate::EngineFlags;
13use handler::EngineHandler;
14use winit::event_loop::{ControlFlow, EventLoop};
15
16pub struct Engine;
17
18impl Engine {
19 pub fn run<A: App + 'static>(app: A) -> anyhow::Result<()> {
20 env_logger::builder()
21 .filter_level(log::LevelFilter::Info)
22 .filter_module("cosmic_text::font::fallback", log::LevelFilter::Off)
23 .format(|buf, record| {
24 use std::io::Write;
25
26 let parts: Vec<&str> = record.target().split("::").collect();
27 let start = parts.len().saturating_sub(2);
28 let short_target = parts[start..].join("::");
29
30 let ts = buf.timestamp().to_string();
31 let ts = ts.split('T').nth(1).unwrap_or(&ts).trim_end_matches('Z');
32
33 writeln!(buf, "[{} {:<5} {}] {}", ts, record.level(), short_target, record.args())
34 })
35 .parse_default_env()
36 .init();
37
38 let flags = EngineFlags::from_args();
39
40 let _puffin_server = if flags.profile {
41 let server_addr = format!("127.0.0.1:{}", puffin_http::DEFAULT_PORT);
42 let server = puffin_http::Server::new(&server_addr)?;
43 log::info!("Run this to view profiling data: puffin_viewer --url {server_addr}");
44 puffin::set_scopes_on(true);
45 Some(server)
46 } else {
47 puffin::set_scopes_on(false);
48 None
49 };
50
51 let window_config = A::window_config();
52 let initial_pipeline = A::initial_pipeline();
53
54 let event_loop = EventLoop::new()?;
55 event_loop.set_control_flow(ControlFlow::Poll);
56
57 let mut handler = EngineHandler::new(Box::new(app), initial_pipeline, flags, window_config);
58 event_loop.run_app(&mut handler)?;
59 Ok(())
60 }
61}
62
63pub fn create_temp_pool(vk: &crate::VulkanContext) -> anyhow::Result<ash::vk::CommandPool> {
64 use ash::vk;
65 let pool = unsafe {
66 vk.device.handle.create_command_pool(
67 &vk::CommandPoolCreateInfo::default()
68 .queue_family_index(vk.device.graphics_family)
69 .flags(vk::CommandPoolCreateFlags::TRANSIENT),
70 None,
71 )?
72 };
73 Ok(pool)
74}