diff options
| author | Valentin Popov <valentin@popov.link> | 2026-06-23 21:50:32 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-06-23 21:50:32 +0300 |
| commit | a0a4089e4b75296e43a89f9a9ca2592f7fc2f68f (patch) | |
| tree | 0ccc308da703508e274379385e54ad11d33609bf | |
| parent | dc7e72961a67ba8f0eab623dd0172df3ced7f74d (diff) | |
| download | fparkan-a0a4089e4b75296e43a89f9a9ca2592f7fc2f68f.tar.xz fparkan-a0a4089e4b75296e43a89f9a9ca2592f7fc2f68f.zip | |
feat: expose native window handles
| -rw-r--r-- | Cargo.lock | 4 | ||||
| -rw-r--r-- | adapters/fparkan-platform-winit/Cargo.toml | 1 | ||||
| -rw-r--r-- | adapters/fparkan-platform-winit/src/lib.rs | 19 | ||||
| -rw-r--r-- | crates/fparkan-platform/Cargo.toml | 1 | ||||
| -rw-r--r-- | crates/fparkan-platform/src/lib.rs | 15 | ||||
| -rw-r--r-- | fixtures/acceptance/coverage.tsv | 2 | ||||
| -rw-r--r-- | fixtures/acceptance/stage_0_2_roadmap.md | 2 |
7 files changed, 42 insertions, 2 deletions
@@ -642,12 +642,16 @@ version = "0.1.0" [[package]] name = "fparkan-platform" version = "0.1.0" +dependencies = [ + "raw-window-handle", +] [[package]] name = "fparkan-platform-winit" version = "0.1.0" dependencies = [ "fparkan-platform", + "raw-window-handle", "winit", ] diff --git a/adapters/fparkan-platform-winit/Cargo.toml b/adapters/fparkan-platform-winit/Cargo.toml index e0ec438..d8bbc58 100644 --- a/adapters/fparkan-platform-winit/Cargo.toml +++ b/adapters/fparkan-platform-winit/Cargo.toml @@ -7,6 +7,7 @@ repository.workspace = true [dependencies] fparkan-platform = { path = "../../crates/fparkan-platform" } +raw-window-handle = "0.6" winit = "0.30" [lints] diff --git a/adapters/fparkan-platform-winit/src/lib.rs b/adapters/fparkan-platform-winit/src/lib.rs index 496d955..9a9941c 100644 --- a/adapters/fparkan-platform-winit/src/lib.rs +++ b/adapters/fparkan-platform-winit/src/lib.rs @@ -21,9 +21,10 @@ //! Minimal `winit`-backed platform adapter shim. use fparkan_platform::{ - EventSource, MonotonicClock, MonotonicInstant, PhysicalSize, PlatformError, PlatformEvent, - RenderRequest, WindowHandle, WindowPort, + EventSource, MonotonicClock, MonotonicInstant, NativeWindowHandles, PhysicalSize, + PlatformError, PlatformEvent, RenderRequest, WindowHandle, WindowPort, }; +use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use std::collections::VecDeque; use std::sync::atomic::{AtomicU64, Ordering}; use std::time::{SystemTime, UNIX_EPOCH}; @@ -153,6 +154,7 @@ pub struct WinitWindow { focused: bool, minimized: bool, occluded: bool, + native_handles: Option<NativeWindowHandles>, } impl WinitWindow { @@ -171,6 +173,7 @@ impl WinitWindow { focused: true, minimized: false, occluded: false, + native_handles: native_handles(window), } } @@ -187,6 +190,7 @@ impl WinitWindow { focused: true, minimized: false, occluded: false, + native_handles: None, } } @@ -224,6 +228,16 @@ impl WindowPort for WinitWindow { fn handle(&self) -> WindowHandle { self.handle } + + fn native_handles(&self) -> Option<NativeWindowHandles> { + self.native_handles + } +} + +fn native_handles(window: &Window) -> Option<NativeWindowHandles> { + let display = window.display_handle().ok()?.as_raw(); + let window = window.window_handle().ok()?.as_raw(); + Some(NativeWindowHandles { display, window }) } #[cfg(test)] @@ -259,6 +273,7 @@ mod tests { height: 360 } ); + assert!(window.native_handles().is_none()); } #[test] diff --git a/crates/fparkan-platform/Cargo.toml b/crates/fparkan-platform/Cargo.toml index dc103f2..3f9d593 100644 --- a/crates/fparkan-platform/Cargo.toml +++ b/crates/fparkan-platform/Cargo.toml @@ -6,6 +6,7 @@ license.workspace = true repository.workspace = true [dependencies] +raw-window-handle = "0.6" [lints] workspace = true diff --git a/crates/fparkan-platform/src/lib.rs b/crates/fparkan-platform/src/lib.rs index fec188e..c2a3a0f 100644 --- a/crates/fparkan-platform/src/lib.rs +++ b/crates/fparkan-platform/src/lib.rs @@ -20,6 +20,8 @@ )] //! Platform ports for clocks, event sources and window descriptors. +use raw_window_handle::{RawDisplayHandle, RawWindowHandle}; + /// Monotonic instant measured in milliseconds since process start. #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] pub struct MonotonicInstant(pub u64); @@ -143,6 +145,15 @@ pub struct WindowHandle { pub id: u64, } +/// Native raw window/display handles for render surface creation. +#[derive(Clone, Copy, Debug)] +pub struct NativeWindowHandles { + /// Raw display handle. + pub display: RawDisplayHandle, + /// Raw window handle. + pub window: RawWindowHandle, +} + /// Window presentation and lifecycle port. /// /// Presentation is not owned by the window abstraction. Render adapters @@ -160,6 +171,10 @@ pub trait WindowPort { fn is_occluded(&self) -> bool; /// Opaque window identity. fn handle(&self) -> WindowHandle; + /// Raw native handles for render surface creation, when backed by a native window. + fn native_handles(&self) -> Option<NativeWindowHandles> { + None + } } /// Render backend request contract. diff --git a/fixtures/acceptance/coverage.tsv b/fixtures/acceptance/coverage.tsv index 41af770..048a654 100644 --- a/fixtures/acceptance/coverage.tsv +++ b/fixtures/acceptance/coverage.tsv @@ -21,6 +21,8 @@ S0-CORPUS-005 covered cargo test -p fparkan-corpus --offline fingerprint_changes S0-CORPUS-006 covered cargo test -p fparkan-corpus --offline atomic_report_write S0-CLI-001 covered cargo test -p fparkan-cli --offline stable_exit_codes_are_mapped S0-CLI-002 covered cargo test -p fparkan-cli --offline accepts_json_format_option archive_json_has_schema_version +S0-PLAT-001 covered cargo test -p fparkan-platform-winit --offline window_port_reports_default_request_profile +S0-PLAT-002 covered cargo clippy -p fparkan-platform -p fparkan-platform-winit --all-targets --all-features --locked -- -D warnings S0-VK-001 covered cargo test -p fparkan-render-vulkan --offline backend_tracks_render_request_and_presents S0-VK-002 covered cargo test -p fparkan-render-vulkan --offline device_scoring_is_deterministic_and_prefers_discrete_unified_queue S0-VK-003 covered cargo test -p fparkan-render-vulkan --offline portability_subset_is_reported_and_enabled_when_exposed diff --git a/fixtures/acceptance/stage_0_2_roadmap.md b/fixtures/acceptance/stage_0_2_roadmap.md index 1df5041..66d8cdd 100644 --- a/fixtures/acceptance/stage_0_2_roadmap.md +++ b/fixtures/acceptance/stage_0_2_roadmap.md @@ -21,6 +21,8 @@ `S0-CORPUS-006` `S0-CLI-001` `S0-CLI-002` +`S0-PLAT-001` +`S0-PLAT-002` `S0-VK-001` `S0-VK-002` `S0-VK-003` |
