From 347f868af119262d2eea132f233c176af2d03510 Mon Sep 17 00:00:00 2001 From: Serkyo Date: Thu, 30 Apr 2026 14:46:54 +0200 Subject: [PATCH] feat(renderer): update new() to accept window handles Updated the Renderer constructor to accept RawDisplayHandle and RawWindowHandle, and updated the client to pass these handles during resumption. This is a prerequisite for surface creation. --- Cargo.lock | 1 + crates/client/src/main.rs | 9 +++++++-- crates/renderer/Cargo.toml | 1 + crates/renderer/src/lib.rs | 8 +++++++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 62f9a0b..7593380 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1054,6 +1054,7 @@ name = "renderer" version = "0.1.0" dependencies = [ "ash", + "raw-window-handle", "thiserror 2.0.18", "tracing", ] diff --git a/crates/client/src/main.rs b/crates/client/src/main.rs index 54e11fd..5fd098b 100644 --- a/crates/client/src/main.rs +++ b/crates/client/src/main.rs @@ -1,5 +1,5 @@ use anyhow::{Context, Result}; -use raw_window_handle::HasDisplayHandle; +use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use tracing::info; use winit::application::ApplicationHandler; use winit::event::WindowEvent; @@ -23,10 +23,15 @@ impl ApplicationHandler for App { .expect("Failed to get display handle") .as_raw(); + // Get the window handle for surface creation + let window_handle = self.window.as_ref().unwrap().window_handle() + .expect("Failed to get window 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) + let renderer = renderer::Renderer::new(display_handle, window_handle, required_extensions) .expect("Failed to initialize Vulkan renderer"); self.renderer = Some(renderer); diff --git a/crates/renderer/Cargo.toml b/crates/renderer/Cargo.toml index dcf69a5..bd3e81d 100644 --- a/crates/renderer/Cargo.toml +++ b/crates/renderer/Cargo.toml @@ -5,5 +5,6 @@ edition = "2024" [dependencies] ash = "0.38.0" +raw-window-handle = "0.6.2" thiserror = "2.0.18" tracing = "0.1.44" diff --git a/crates/renderer/src/lib.rs b/crates/renderer/src/lib.rs index 8785a83..b28b21a 100644 --- a/crates/renderer/src/lib.rs +++ b/crates/renderer/src/lib.rs @@ -2,6 +2,7 @@ pub mod error; use std::ffi::{CStr, c_char}; use ash::{Entry, Instance, ext, vk, Device}; +use raw_window_handle::{RawDisplayHandle, RawWindowHandle}; use tracing::{debug, error, info, warn}; pub use error::RendererError; @@ -32,8 +33,13 @@ impl Renderer { /// This function loads the Vulkan library, creates an instance, selects a GPU, /// and initializes a logical device with a graphics queue. /// + /// `display_handle` and `window_handle` are used to create the OS-specific surface. /// `required_extensions` are raw C-strings (pointers) provided by the windowing system. - pub fn new(required_extensions: &[*const c_char]) -> Result { + pub fn new( + display_handle: RawDisplayHandle, + window_handle: RawWindowHandle, + required_extensions: &[*const c_char], + ) -> Result { let entry = unsafe { Entry::load() }?; // Prepare extensions and layers