xref: /aosp_15_r20/external/crosvm/gpu_display/src/vulkan/sys.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2023 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker cfg_if::cfg_if! {
6*bb4ee6a4SAndroid Build Coastguard Worker     if #[cfg(unix)] {
7*bb4ee6a4SAndroid Build Coastguard Worker         pub mod unix;
8*bb4ee6a4SAndroid Build Coastguard Worker         pub use unix as platform;
9*bb4ee6a4SAndroid Build Coastguard Worker         pub(crate) use self::unix::StubWindowEventLoop as PlatformWindowEventLoop;
10*bb4ee6a4SAndroid Build Coastguard Worker     } else if #[cfg(windows)] {
11*bb4ee6a4SAndroid Build Coastguard Worker         pub mod windows;
12*bb4ee6a4SAndroid Build Coastguard Worker         pub use windows as platform;
13*bb4ee6a4SAndroid Build Coastguard Worker         pub(crate) use self::windows::WindowsWindowEventLoop as PlatformWindowEventLoop;
14*bb4ee6a4SAndroid Build Coastguard Worker     }
15*bb4ee6a4SAndroid Build Coastguard Worker }
16*bb4ee6a4SAndroid Build Coastguard Worker 
17*bb4ee6a4SAndroid Build Coastguard Worker use std::any::Any;
18*bb4ee6a4SAndroid Build Coastguard Worker use std::sync::Arc;
19*bb4ee6a4SAndroid Build Coastguard Worker 
20*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::Result;
21*bb4ee6a4SAndroid Build Coastguard Worker use euclid::Box2D;
22*bb4ee6a4SAndroid Build Coastguard Worker use euclid::Size2D;
23*bb4ee6a4SAndroid Build Coastguard Worker use euclid::UnknownUnit;
24*bb4ee6a4SAndroid Build Coastguard Worker use vulkano::instance::Instance;
25*bb4ee6a4SAndroid Build Coastguard Worker use vulkano::swapchain;
26*bb4ee6a4SAndroid Build Coastguard Worker 
27*bb4ee6a4SAndroid Build Coastguard Worker type Surface = swapchain::Surface<Arc<dyn Any + Send + Sync>>;
28*bb4ee6a4SAndroid Build Coastguard Worker 
29*bb4ee6a4SAndroid Build Coastguard Worker pub trait Window: Any + Send + Sync {
get_inner_size(&self) -> Result<Size2D<u32, UnknownUnit>>30*bb4ee6a4SAndroid Build Coastguard Worker     fn get_inner_size(&self) -> Result<Size2D<u32, UnknownUnit>>;
create_vulkan_surface(self: Arc<Self>, instance: Arc<Instance>) -> Result<Arc<Surface>>31*bb4ee6a4SAndroid Build Coastguard Worker     fn create_vulkan_surface(self: Arc<Self>, instance: Arc<Instance>) -> Result<Arc<Surface>>;
32*bb4ee6a4SAndroid Build Coastguard Worker }
33*bb4ee6a4SAndroid Build Coastguard Worker 
34*bb4ee6a4SAndroid Build Coastguard Worker pub trait ApplicationState {
35*bb4ee6a4SAndroid Build Coastguard Worker     type UserEvent: Send + 'static;
36*bb4ee6a4SAndroid Build Coastguard Worker 
process_event(&self, event: WindowEvent<Self::UserEvent>)37*bb4ee6a4SAndroid Build Coastguard Worker     fn process_event(&self, event: WindowEvent<Self::UserEvent>);
38*bb4ee6a4SAndroid Build Coastguard Worker }
39*bb4ee6a4SAndroid Build Coastguard Worker 
40*bb4ee6a4SAndroid Build Coastguard Worker pub trait ApplicationStateBuilder: Send + 'static {
41*bb4ee6a4SAndroid Build Coastguard Worker     type Target: ApplicationState;
42*bb4ee6a4SAndroid Build Coastguard Worker 
build<T: Window>(self, window: Arc<T>) -> Result<Self::Target>43*bb4ee6a4SAndroid Build Coastguard Worker     fn build<T: Window>(self, window: Arc<T>) -> Result<Self::Target>;
44*bb4ee6a4SAndroid Build Coastguard Worker }
45*bb4ee6a4SAndroid Build Coastguard Worker 
46*bb4ee6a4SAndroid Build Coastguard Worker // Some platform may not support all the events.
47*bb4ee6a4SAndroid Build Coastguard Worker #[allow(dead_code)]
48*bb4ee6a4SAndroid Build Coastguard Worker pub enum WindowEvent<T: Send> {
49*bb4ee6a4SAndroid Build Coastguard Worker     Resized,
50*bb4ee6a4SAndroid Build Coastguard Worker     User(T),
51*bb4ee6a4SAndroid Build Coastguard Worker }
52*bb4ee6a4SAndroid Build Coastguard Worker 
53*bb4ee6a4SAndroid Build Coastguard Worker pub trait WindowEventLoop<State: ApplicationState>: Sized + Send {
54*bb4ee6a4SAndroid Build Coastguard Worker     type WindowType: Window;
55*bb4ee6a4SAndroid Build Coastguard Worker 
56*bb4ee6a4SAndroid Build Coastguard Worker     /// # Safety
57*bb4ee6a4SAndroid Build Coastguard Worker     /// The parent window must outlive the lifetime of this object.
create<Builder>( parent: platform::NativeWindowType, initial_window_size: &Size2D<i32, UnknownUnit>, application_state_builder: Builder, ) -> Result<Self> where Builder: ApplicationStateBuilder<Target = State>58*bb4ee6a4SAndroid Build Coastguard Worker     unsafe fn create<Builder>(
59*bb4ee6a4SAndroid Build Coastguard Worker         parent: platform::NativeWindowType,
60*bb4ee6a4SAndroid Build Coastguard Worker         initial_window_size: &Size2D<i32, UnknownUnit>,
61*bb4ee6a4SAndroid Build Coastguard Worker         application_state_builder: Builder,
62*bb4ee6a4SAndroid Build Coastguard Worker     ) -> Result<Self>
63*bb4ee6a4SAndroid Build Coastguard Worker     where
64*bb4ee6a4SAndroid Build Coastguard Worker         Builder: ApplicationStateBuilder<Target = State>;
65*bb4ee6a4SAndroid Build Coastguard Worker 
send_event(&self, event: State::UserEvent) -> Result<()>66*bb4ee6a4SAndroid Build Coastguard Worker     fn send_event(&self, event: State::UserEvent) -> Result<()>;
67*bb4ee6a4SAndroid Build Coastguard Worker 
move_window(&self, pos: &Box2D<i32, UnknownUnit>) -> Result<()>68*bb4ee6a4SAndroid Build Coastguard Worker     fn move_window(&self, pos: &Box2D<i32, UnknownUnit>) -> Result<()>;
69*bb4ee6a4SAndroid Build Coastguard Worker }
70