diff --git a/Cargo.lock b/Cargo.lock index 6d31d07..ee0d624 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -190,6 +190,9 @@ name = "anyhow" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +dependencies = [ + "backtrace", +] [[package]] name = "anymap" @@ -778,6 +781,7 @@ checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" name = "cli" version = "0.1.0" dependencies = [ + "anyhow", "clap", "ctrlc", "env_logger", @@ -1583,6 +1587,7 @@ dependencies = [ name = "frontend-common" version = "0.5.1" dependencies = [ + "anyhow", "bytemuck", "chrono", "cpal", @@ -2208,6 +2213,7 @@ dependencies = [ name = "gui" version = "0.1.0" dependencies = [ + "anyhow", "cacao", "cpal", "env_logger", @@ -2638,7 +2644,6 @@ dependencies = [ [[package]] name = "librashader" version = "0.2.7" -source = "git+https://git.alexjanka.com/alex/librashader#30bb747e94e7ab11ea5aecf388f4b693ac836434" dependencies = [ "ash 0.37.3+1.3.251", "halfbrown", @@ -2657,7 +2662,6 @@ dependencies = [ [[package]] name = "librashader-cache" version = "0.2.7" -source = "git+https://git.alexjanka.com/alex/librashader#30bb747e94e7ab11ea5aecf388f4b693ac836434" dependencies = [ "bincode", "blake3", @@ -2673,7 +2677,6 @@ dependencies = [ [[package]] name = "librashader-common" version = "0.2.7" -source = "git+https://git.alexjanka.com/alex/librashader#30bb747e94e7ab11ea5aecf388f4b693ac836434" dependencies = [ "ash 0.37.3+1.3.251", "halfbrown", @@ -2685,7 +2688,6 @@ dependencies = [ [[package]] name = "librashader-preprocess" version = "0.2.7" -source = "git+https://git.alexjanka.com/alex/librashader#30bb747e94e7ab11ea5aecf388f4b693ac836434" dependencies = [ "encoding_rs", "librashader-common", @@ -2696,7 +2698,6 @@ dependencies = [ [[package]] name = "librashader-presets" version = "0.2.7" -source = "git+https://git.alexjanka.com/alex/librashader#30bb747e94e7ab11ea5aecf388f4b693ac836434" dependencies = [ "librashader-common", "nom", @@ -2712,7 +2713,6 @@ dependencies = [ [[package]] name = "librashader-reflect" version = "0.2.7" -source = "git+https://git.alexjanka.com/alex/librashader#30bb747e94e7ab11ea5aecf388f4b693ac836434" dependencies = [ "bitflags 2.5.0", "bytemuck", @@ -2734,7 +2734,6 @@ dependencies = [ [[package]] name = "librashader-runtime" version = "0.2.7" -source = "git+https://git.alexjanka.com/alex/librashader#30bb747e94e7ab11ea5aecf388f4b693ac836434" dependencies = [ "array-concat", "bytemuck", @@ -2750,7 +2749,6 @@ dependencies = [ [[package]] name = "librashader-runtime-vk" version = "0.2.7" -source = "git+https://git.alexjanka.com/alex/librashader#30bb747e94e7ab11ea5aecf388f4b693ac836434" dependencies = [ "array-concat", "ash 0.37.3+1.3.251", @@ -2770,7 +2768,6 @@ dependencies = [ [[package]] name = "librashader-runtime-wgpu" version = "0.2.7" -source = "git+https://git.alexjanka.com/alex/librashader#30bb747e94e7ab11ea5aecf388f4b693ac836434" dependencies = [ "array-concat", "bytemuck", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index cff7be6..14b8554 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -14,3 +14,4 @@ clap = { version = "4.4", features = ["derive"] } ctrlc = "3.4" log = { workspace = true } env_logger = { workspace = true } +anyhow = { version = "1.0.86", features = ["backtrace"] } diff --git a/cli/src/main.rs b/cli/src/main.rs index b3e7fea..4bcaec2 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -121,7 +121,7 @@ impl From for frontend_common::RunOptions { } } -fn main() { +fn main() -> anyhow::Result<()> { env_logger::init(); let args = Args::parse(); @@ -170,7 +170,7 @@ fn main() { let prepared = frontend_common::prepare(args.into(), receiver); let (output, stream) = audio::create_output(mute); let mut window_manager = ActiveWindowManager::new(sender, stream, record); - let mut core = frontend_common::run(prepared, &mut window_manager, output); + let mut core = frontend_common::run(prepared, &mut window_manager, output)?; if debug { let mut debugger = Debugger::new(Box::new(core)); let mut since = Instant::now(); @@ -190,6 +190,7 @@ fn main() { window_manager.run_events_blocking().unwrap(); } } + Ok(()) } const UPDATE_INTERVAL: Duration = Duration::from_millis(1); diff --git a/frontend-common/Cargo.toml b/frontend-common/Cargo.toml index 6f68c45..4b19080 100644 --- a/frontend-common/Cargo.toml +++ b/frontend-common/Cargo.toml @@ -29,3 +29,4 @@ image = { version = "0.24", default-features = false, features = ["png"] } bytemuck = "1.14" chrono = "0.4" log = { workspace = true } +anyhow = "1.0.86" diff --git a/frontend-common/src/lib.rs b/frontend-common/src/lib.rs index d967077..e31f595 100644 --- a/frontend-common/src/lib.rs +++ b/frontend-common/src/lib.rs @@ -167,7 +167,7 @@ pub fn run( prepared: PreparedEmulator, window_manager: &mut W, output: AudioOutput, -) -> EmulatorCore<[u8; 4]> +) -> anyhow::Result> where W: WindowManager, { @@ -178,16 +178,16 @@ where prepared.scale_override, prepared.shader_path, prepared.resizable, - ); + )?; let tile_window = if prepared.tile_window { - Some(new_tile_window(window_manager)) + Some(new_tile_window(window_manager)?) } else { None }; let layer_window = if prepared.layer_window { - Some(new_layer_window(window_manager)) + Some(new_layer_window(window_manager)?) } else { None }; @@ -224,7 +224,7 @@ where EmulatorCore::init(true, prepared.receiver, emulator_options) } -pub fn new_tile_window(window_manager: &mut W) -> RendererChannel +pub fn new_tile_window(window_manager: &mut W) -> anyhow::Result where W: WindowManager, { @@ -236,7 +236,7 @@ where ) } -pub fn new_layer_window(window_manager: &mut W) -> RendererChannel +pub fn new_layer_window(window_manager: &mut W) -> anyhow::Result where W: WindowManager, { diff --git a/frontend-common/src/window.rs b/frontend-common/src/window.rs index 8e4d1c0..b79ec61 100644 --- a/frontend-common/src/window.rs +++ b/frontend-common/src/window.rs @@ -21,5 +21,5 @@ pub trait WindowManager { factor: usize, shader_path: Option, resizable: bool, - ) -> RendererChannel; + ) -> anyhow::Result; } diff --git a/frontend-common/src/window/winit_manager.rs b/frontend-common/src/window/winit_manager.rs index afd722e..5743400 100644 --- a/frontend-common/src/window/winit_manager.rs +++ b/frontend-common/src/window/winit_manager.rs @@ -56,6 +56,7 @@ where impl WinitWindowManager where Backend: RendererBackend, + ::RendererError: Sync + Send + 'static, { pub fn new( sender: Sender>, @@ -97,6 +98,7 @@ where impl WindowManager for WinitWindowManager where Backend: RendererBackend, + ::RendererError: Sync + Send + 'static, { fn add( &mut self, @@ -104,7 +106,7 @@ where factor: usize, shader_path: Option, resizable: bool, - ) -> RendererChannel { + ) -> anyhow::Result { let is_main = window_type == WindowType::Main; self.data.add( @@ -121,6 +123,7 @@ where impl WinitWindowManagerData where Backend: RendererBackend, + ::RendererError: Sync + Send + 'static, { fn add( &mut self, @@ -130,7 +133,7 @@ where event_loop: &EventLoop<()>, is_main: bool, record: bool, - ) -> RendererChannel { + ) -> anyhow::Result { let (r, sender) = WindowRenderer::new( factor, event_loop, @@ -138,13 +141,13 @@ where shader_path, resizable, record, - ); + )?; let id = r.window.id(); self.windows.insert(id, r); if is_main { self.main_window = Some(id); } - sender + Ok(sender) } fn handler(&mut self, run_return: bool, event: Event<()>, target: &EventLoopWindowTarget<()>) { @@ -320,6 +323,7 @@ impl QueuedBuf { impl WindowRenderer where Backend: RendererBackend, + ::RendererError: Sync + Send + 'static, { #[allow(unused_variables)] fn new( @@ -329,12 +333,11 @@ where shader_path: Option, resizable: bool, record: bool, - ) -> (Self, RendererChannel) { + ) -> anyhow::Result<(Self, RendererChannel)> { let window = WindowBuilder::new() .with_title("Gameboy") .with_resizable(resizable) - .build(event_loop) - .unwrap(); + .build(event_loop)?; let real_factor = (window.scale_factor() * factor as f64) as u32; let inner_size = window.inner_size(); @@ -344,8 +347,9 @@ where scaled_width: inner_size.width / real_factor, scaled_height: inner_size.height / real_factor, }; + let renderer = RendererBackend::new(resolutions, &window, shader_path, manager); - let renderer = RendererBackend::new(resolutions, &window, shader_path, manager).unwrap(); + let renderer = renderer?; let recording = if record { let configs = access_config(); @@ -365,7 +369,7 @@ where let (sender, receiver) = mpsc::channel(); - ( + Ok(( Self { receiver, renderer, @@ -377,7 +381,7 @@ where recording, }, sender, - ) + )) } fn render(&mut self, manager: &Backend::RendererBackendManager) { diff --git a/gui/Cargo.toml b/gui/Cargo.toml index 7dd075a..e81b65c 100644 --- a/gui/Cargo.toml +++ b/gui/Cargo.toml @@ -31,6 +31,7 @@ log = { workspace = true } env_logger = { workspace = true } thiserror = { workspace = true } serde = { version = "1.0", features = ["derive"] } +anyhow = "1.0.86" [target.'cfg(any(target_os = "macos"))'.dependencies] cacao = { git = "https://git.alexjanka.com/alex/cacao", optional = true }