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" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" 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]] [[package]]
name = "atomic-waker" name = "atomic-waker"
version = "1.1.2" version = "1.1.2"
@ -180,6 +189,8 @@ name = "client"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"raw-window-handle",
"renderer",
"tracing", "tracing",
"tracing-subscriber", "tracing-subscriber",
"winit", "winit",
@ -963,6 +974,10 @@ dependencies = [
[[package]] [[package]]
name = "renderer" name = "renderer"
version = "0.1.0" version = "0.1.0"
dependencies = [
"ash",
"thiserror 2.0.18",
]
[[package]] [[package]]
name = "rustc_version" name = "rustc_version"

View file

@ -8,3 +8,5 @@ anyhow = "1.0.102"
tracing = "0.1.44" tracing = "0.1.44"
tracing-subscriber = "0.3.23" tracing-subscriber = "0.3.23"
winit = "0.30.13" 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" edition = "2024"
[dependencies] [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 { pub mod error;
left + right
use std::ffi::c_char;
use ash::{Entry, Instance, vk};
pub use error::RendererError;
pub struct Renderer {
_entry: Entry,
instance: Instance,
} }
#[cfg(test)] impl Renderer {
mod tests { /// Initializes the Vulkan renderer.
use super::*; /// `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] let app_info = vk::ApplicationInfo::default()
fn it_works() { .api_version(vk::API_VERSION_1_3);
let result = add(2, 2);
assert_eq!(result, 4); 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,
})
} }
} }