xref: /aosp_15_r20/external/crosvm/gpu_display/src/sys/linux.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2022 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 use std::path::Path;
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use base::AsRawDescriptor;
8*bb4ee6a4SAndroid Build Coastguard Worker use base::RawDescriptor;
9*bb4ee6a4SAndroid Build Coastguard Worker use base::WaitContext;
10*bb4ee6a4SAndroid Build Coastguard Worker 
11*bb4ee6a4SAndroid Build Coastguard Worker use crate::gpu_display_wl::DisplayWl;
12*bb4ee6a4SAndroid Build Coastguard Worker use crate::DisplayEventToken;
13*bb4ee6a4SAndroid Build Coastguard Worker use crate::DisplayT;
14*bb4ee6a4SAndroid Build Coastguard Worker use crate::EventDevice;
15*bb4ee6a4SAndroid Build Coastguard Worker use crate::GpuDisplay;
16*bb4ee6a4SAndroid Build Coastguard Worker use crate::GpuDisplayExt;
17*bb4ee6a4SAndroid Build Coastguard Worker use crate::GpuDisplayResult;
18*bb4ee6a4SAndroid Build Coastguard Worker 
19*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) trait UnixDisplayT: DisplayT {}
20*bb4ee6a4SAndroid Build Coastguard Worker 
21*bb4ee6a4SAndroid Build Coastguard Worker impl GpuDisplayExt for GpuDisplay {
import_event_device(&mut self, event_device: EventDevice) -> GpuDisplayResult<u32>22*bb4ee6a4SAndroid Build Coastguard Worker     fn import_event_device(&mut self, event_device: EventDevice) -> GpuDisplayResult<u32> {
23*bb4ee6a4SAndroid Build Coastguard Worker         let new_event_device_id = self.next_id;
24*bb4ee6a4SAndroid Build Coastguard Worker 
25*bb4ee6a4SAndroid Build Coastguard Worker         self.wait_ctx.add(
26*bb4ee6a4SAndroid Build Coastguard Worker             &event_device,
27*bb4ee6a4SAndroid Build Coastguard Worker             DisplayEventToken::EventDevice {
28*bb4ee6a4SAndroid Build Coastguard Worker                 event_device_id: new_event_device_id,
29*bb4ee6a4SAndroid Build Coastguard Worker             },
30*bb4ee6a4SAndroid Build Coastguard Worker         )?;
31*bb4ee6a4SAndroid Build Coastguard Worker         self.event_devices.insert(new_event_device_id, event_device);
32*bb4ee6a4SAndroid Build Coastguard Worker 
33*bb4ee6a4SAndroid Build Coastguard Worker         self.next_id += 1;
34*bb4ee6a4SAndroid Build Coastguard Worker         Ok(new_event_device_id)
35*bb4ee6a4SAndroid Build Coastguard Worker     }
36*bb4ee6a4SAndroid Build Coastguard Worker 
handle_event_device(&mut self, event_device_id: u32)37*bb4ee6a4SAndroid Build Coastguard Worker     fn handle_event_device(&mut self, event_device_id: u32) {
38*bb4ee6a4SAndroid Build Coastguard Worker         if let Some(event_device) = self.event_devices.get(&event_device_id) {
39*bb4ee6a4SAndroid Build Coastguard Worker             // TODO(zachr): decode the event and forward to the device.
40*bb4ee6a4SAndroid Build Coastguard Worker             let _ = event_device.recv_event_encoded();
41*bb4ee6a4SAndroid Build Coastguard Worker         }
42*bb4ee6a4SAndroid Build Coastguard Worker     }
43*bb4ee6a4SAndroid Build Coastguard Worker }
44*bb4ee6a4SAndroid Build Coastguard Worker 
45*bb4ee6a4SAndroid Build Coastguard Worker pub trait UnixGpuDisplayExt {
46*bb4ee6a4SAndroid Build Coastguard Worker     /// Opens a fresh connection to the compositor.
open_wayland<P: AsRef<Path>>(wayland_path: Option<P>) -> GpuDisplayResult<GpuDisplay>47*bb4ee6a4SAndroid Build Coastguard Worker     fn open_wayland<P: AsRef<Path>>(wayland_path: Option<P>) -> GpuDisplayResult<GpuDisplay>;
48*bb4ee6a4SAndroid Build Coastguard Worker }
49*bb4ee6a4SAndroid Build Coastguard Worker 
50*bb4ee6a4SAndroid Build Coastguard Worker impl UnixGpuDisplayExt for GpuDisplay {
open_wayland<P: AsRef<Path>>(wayland_path: Option<P>) -> GpuDisplayResult<GpuDisplay>51*bb4ee6a4SAndroid Build Coastguard Worker     fn open_wayland<P: AsRef<Path>>(wayland_path: Option<P>) -> GpuDisplayResult<GpuDisplay> {
52*bb4ee6a4SAndroid Build Coastguard Worker         let display = match wayland_path {
53*bb4ee6a4SAndroid Build Coastguard Worker             Some(s) => DisplayWl::new(Some(s.as_ref()))?,
54*bb4ee6a4SAndroid Build Coastguard Worker             None => DisplayWl::new(None)?,
55*bb4ee6a4SAndroid Build Coastguard Worker         };
56*bb4ee6a4SAndroid Build Coastguard Worker 
57*bb4ee6a4SAndroid Build Coastguard Worker         let wait_ctx = WaitContext::new()?;
58*bb4ee6a4SAndroid Build Coastguard Worker         wait_ctx.add(&display, DisplayEventToken::Display)?;
59*bb4ee6a4SAndroid Build Coastguard Worker 
60*bb4ee6a4SAndroid Build Coastguard Worker         Ok(GpuDisplay {
61*bb4ee6a4SAndroid Build Coastguard Worker             inner: Box::new(display),
62*bb4ee6a4SAndroid Build Coastguard Worker             next_id: 1,
63*bb4ee6a4SAndroid Build Coastguard Worker             event_devices: Default::default(),
64*bb4ee6a4SAndroid Build Coastguard Worker             surfaces: Default::default(),
65*bb4ee6a4SAndroid Build Coastguard Worker             wait_ctx,
66*bb4ee6a4SAndroid Build Coastguard Worker         })
67*bb4ee6a4SAndroid Build Coastguard Worker     }
68*bb4ee6a4SAndroid Build Coastguard Worker }
69*bb4ee6a4SAndroid Build Coastguard Worker 
70*bb4ee6a4SAndroid Build Coastguard Worker impl AsRawDescriptor for GpuDisplay {
as_raw_descriptor(&self) -> RawDescriptor71*bb4ee6a4SAndroid Build Coastguard Worker     fn as_raw_descriptor(&self) -> RawDescriptor {
72*bb4ee6a4SAndroid Build Coastguard Worker         self.wait_ctx.as_raw_descriptor()
73*bb4ee6a4SAndroid Build Coastguard Worker     }
74*bb4ee6a4SAndroid Build Coastguard Worker }
75