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