From d60ccd79187f20326bfc49ae1d47295d6ae1d3f0 Mon Sep 17 00:00:00 2001 From: Serkyo Date: Thu, 30 Apr 2026 01:29:04 +0200 Subject: [PATCH] feat(renderer): implement base Vulkan instance initialization Added ash and thiserror dependencies to the renderer crate. Defined RendererError for typed Vulkan failure handling. Implemented the Renderer struct with basic Vulkan Entry and Instance creation. --- Cargo.lock | 15 ++++++++++++++ crates/client/Cargo.toml | 2 ++ crates/renderer/Cargo.toml | 2 ++ crates/renderer/src/error.rs | 9 +++++++++ crates/renderer/src/lib.rs | 39 +++++++++++++++++++++++++++--------- 5 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 crates/renderer/src/error.rs 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