feat(client): initialize renderer and extract vulkan extensions

Added ash-window dependency to bridge winit and Vulkan. Extracted raw display handle in the event loop and queried required Vulkan extensions to pass down to the renderer initialization.
This commit is contained in:
Serkyo 2026-04-30 01:38:24 +02:00
parent d60ccd7918
commit 9ceefc6654
3 changed files with 93 additions and 0 deletions

78
Cargo.lock generated
View file

@ -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"

View file

@ -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"

View file

@ -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<Window>,
renderer: Option<renderer::Renderer>,
}
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) {