diff --git a/Cargo.lock b/Cargo.lock index 8539f35..7cd4bf9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -89,6 +89,17 @@ dependencies = [ "libloading", ] +[[package]] +name = "ash-window" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52bca67b61cb81e5553babde81b8211f713cb6db79766f80168f3e5f40ea6c82" +dependencies = [ + "ash", + "raw-window-handle", + "raw-window-metal", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -107,6 +118,12 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block2" version = "0.5.1" @@ -189,6 +206,7 @@ name = "client" version = "0.1.0" dependencies = [ "anyhow", + "ash-window", "raw-window-handle", "renderer", "tracing", @@ -196,6 +214,36 @@ dependencies = [ "winit", ] +[[package]] +name = "cocoa" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + [[package]] name = "combine" version = "4.6.7" @@ -543,6 +591,15 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + [[package]] name = "memchr" version = "2.8.0" @@ -619,6 +676,15 @@ dependencies = [ "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" @@ -953,6 +1019,18 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" +[[package]] +name = "raw-window-metal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e8caa82e31bb98fee12fa8f051c94a6aa36b07cddb03f0d4fc558988360ff1" +dependencies = [ + "cocoa", + "core-graphics", + "objc", + "raw-window-handle", +] + [[package]] name = "redox_syscall" version = "0.4.1" diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 3545640..2c1d315 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -10,3 +10,4 @@ tracing-subscriber = "0.3.23" winit = "0.30.13" renderer = { path = "../renderer" } raw-window-handle = "0.6.2" +ash-window = "0.13.0" diff --git a/crates/client/src/main.rs b/crates/client/src/main.rs index 0b2ec56..54e11fd 100644 --- a/crates/client/src/main.rs +++ b/crates/client/src/main.rs @@ -1,4 +1,5 @@ use anyhow::{Context, Result}; +use raw_window_handle::HasDisplayHandle; use tracing::info; use winit::application::ApplicationHandler; use winit::event::WindowEvent; @@ -8,6 +9,7 @@ use winit::window::{Window, WindowId}; #[derive(Default)] struct App { window: Option, + renderer: Option, } impl ApplicationHandler for App { @@ -16,6 +18,18 @@ impl ApplicationHandler for App { .with_title("Project Catalyst"); self.window = Some(event_loop.create_window(attributes).unwrap()); + + let display_handle = event_loop.display_handle() + .expect("Failed to get display handle") + .as_raw(); + + let required_extensions = ash_window::enumerate_required_extensions(display_handle) + .expect("Failed to enumerate required extensions"); + + let renderer = renderer::Renderer::new(required_extensions) + .expect("Failed to initialize Vulkan renderer"); + + self.renderer = Some(renderer); } fn window_event(&mut self, event_loop: &ActiveEventLoop, _id: WindowId, event: WindowEvent) {