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.
This commit is contained in:
Serkyo 2026-04-30 01:29:04 +02:00
parent 1979308cbb
commit d60ccd7918
5 changed files with 57 additions and 10 deletions

15
Cargo.lock generated
View file

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

View file

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

View file

@ -4,3 +4,5 @@ version = "0.1.0"
edition = "2024"
[dependencies]
ash = "0.38.0"
thiserror = "2.0.18"

View file

@ -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)
}

View file

@ -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<Self, RendererError> {
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,
})
}
}
}