diff --git a/Cargo.lock b/Cargo.lock index be1169a..8539f35 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,6 +80,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -180,6 +189,8 @@ name = "client" version = "0.1.0" dependencies = [ "anyhow", + "raw-window-handle", + "renderer", "tracing", "tracing-subscriber", "winit", @@ -963,6 +974,10 @@ dependencies = [ [[package]] name = "renderer" version = "0.1.0" +dependencies = [ + "ash", + "thiserror 2.0.18", +] [[package]] name = "rustc_version" diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 68a84b7..3545640 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -8,3 +8,5 @@ anyhow = "1.0.102" tracing = "0.1.44" tracing-subscriber = "0.3.23" winit = "0.30.13" +renderer = { path = "../renderer" } +raw-window-handle = "0.6.2" diff --git a/crates/renderer/Cargo.toml b/crates/renderer/Cargo.toml index c29f61c..5c0e449 100644 --- a/crates/renderer/Cargo.toml +++ b/crates/renderer/Cargo.toml @@ -4,3 +4,5 @@ version = "0.1.0" edition = "2024" [dependencies] +ash = "0.38.0" +thiserror = "2.0.18" diff --git a/crates/renderer/src/error.rs b/crates/renderer/src/error.rs new file mode 100644 index 0000000..923b351 --- /dev/null +++ b/crates/renderer/src/error.rs @@ -0,0 +1,9 @@ +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum RendererError { + #[error("Failed to load Vulkan library")] + LoadFailed(#[from] ash::LoadingError), + #[error("Failed to create Vulkan instance")] + InstanceCreateFailed(#[from] ash::vk::Result) +} \ No newline at end of file diff --git a/crates/renderer/src/lib.rs b/crates/renderer/src/lib.rs index b93cf3f..8a062c1 100644 --- a/crates/renderer/src/lib.rs +++ b/crates/renderer/src/lib.rs @@ -1,14 +1,33 @@ -pub fn add(left: u64, right: u64) -> u64 { - left + right +pub mod error; + +use std::ffi::c_char; +use ash::{Entry, Instance, vk}; + +pub use error::RendererError; + +pub struct Renderer { + _entry: Entry, + instance: Instance, } -#[cfg(test)] -mod tests { - use super::*; +impl Renderer { + /// Initializes the Vulkan renderer. + /// `required_extensions` are raw C-strings (pointers) provided by the windowing system. + pub fn new(required_extensions: &[*const c_char]) -> Result { + let entry = unsafe { Entry::load() }?; - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); + let app_info = vk::ApplicationInfo::default() + .api_version(vk::API_VERSION_1_3); + + let create_info = vk::InstanceCreateInfo::default() + .application_info(&app_info) + .enabled_extension_names(required_extensions); + + let instance = unsafe { entry.create_instance(&create_info, None)? }; + + Ok(Self { + _entry: entry, + instance, + }) } -} +} \ No newline at end of file