1
0
Fork 0
forked from wry/wry

config: add DrmDevice::make_render_device

This commit is contained in:
Julian Orth 2022-11-13 13:41:13 +01:00
parent c6c87bdaa1
commit 049b86f4e2
9 changed files with 91 additions and 32 deletions

View file

@ -476,6 +476,10 @@ impl Client {
pci_id pci_id
} }
pub fn make_render_device(&self, device: DrmDevice) {
self.send(&ClientMessage::MakeRenderDevice { device });
}
pub fn connector_connected(&self, connector: Connector) -> bool { pub fn connector_connected(&self, connector: Connector) -> bool {
let res = self.send_with_response(&ClientMessage::ConnectorConnected { connector }); let res = self.send_with_response(&ClientMessage::ConnectorConnected { connector });
get_response!(res, false, ConnectorConnected { connected }); get_response!(res, false, ConnectorConnected { connected });

View file

@ -313,6 +313,9 @@ pub enum ClientMessage<'a> {
connector: Connector, connector: Connector,
enabled: bool, enabled: bool,
}, },
MakeRenderDevice {
device: DrmDevice,
},
} }
#[derive(Encode, Decode, Debug)] #[derive(Encode, Decode, Debug)]

View file

@ -357,4 +357,9 @@ impl DrmDevice {
pub fn pci_id(self) -> PciId { pub fn pci_id(self) -> PciId {
get!().drm_device_pci_id(self) get!().drm_device_pci_id(self)
} }
/// Makes this device the render device.
pub fn make_render_device(self) {
get!().make_render_device(self);
}
} }

View file

@ -221,4 +221,5 @@ pub trait BackendDrmDevice {
fn event(&self) -> Option<DrmEvent>; fn event(&self) -> Option<DrmEvent>;
fn on_change(&self, cb: Rc<dyn Fn()>); fn on_change(&self, cb: Rc<dyn Fn()>);
fn dev_t(&self) -> c::dev_t; fn dev_t(&self) -> c::dev_t;
fn make_render_device(self: Rc<Self>);
} }

View file

@ -55,6 +55,7 @@ pub struct MetalRenderContext {
#[derive(Debug)] #[derive(Debug)]
pub struct MetalDrmDevice { pub struct MetalDrmDevice {
pub backend: Rc<MetalBackend>,
pub id: DrmDeviceId, pub id: DrmDeviceId,
pub devnum: c::dev_t, pub devnum: c::dev_t,
pub devnode: CString, pub devnode: CString,
@ -88,6 +89,10 @@ impl BackendDrmDevice for MetalDrmDevice {
fn dev_t(&self) -> dev_t { fn dev_t(&self) -> dev_t {
self.devnum self.devnum
} }
fn make_render_device(self: Rc<Self>) {
self.backend.make_render_device(&self, true);
}
} }
pub struct HandleEvents { pub struct HandleEvents {
@ -869,6 +874,7 @@ impl MetalBackend {
fatal!("We are not innocent. Terminating."); fatal!("We are not innocent. Terminating.");
} }
log::info!("Trying to create a new context"); log::info!("Trying to create a new context");
self.ctx.set(None);
self.state.set_render_ctx(None); self.state.set_render_ctx(None);
let mut old_buffers = vec![]; let mut old_buffers = vec![];
for dev in self.device_holder.drm_devices.lock().values() { for dev in self.device_holder.drm_devices.lock().values() {
@ -876,16 +882,7 @@ impl MetalBackend {
old_buffers.push(connector.buffers.take()); old_buffers.push(connector.buffers.take());
} }
} }
if !self.install_render_context(&ctx.dev) { self.make_render_device(&ctx.dev, true)
return false;
}
let mut preserve = Preserve::default();
for dev in self.device_holder.drm_devices.lock().values() {
if let Err(e) = self.init_drm_device(dev, &mut preserve) {
log::error!("Could not re-initialize device: {}", ErrorFmt(e));
}
}
true
} }
fn install_render_context(&self, dev: &Rc<MetalDrmDevice>) -> bool { fn install_render_context(&self, dev: &Rc<MetalDrmDevice>) -> bool {
@ -1006,11 +1003,7 @@ impl MetalBackend {
if !preserve.connectors.contains(&connector.id) { if !preserve.connectors.contains(&connector.id) {
connector.can_present.set(true); connector.can_present.set(true);
} }
let dd = connector.display.borrow_mut(); self.start_connector(connector, true);
if !connector.connect_sent.get() {
self.send_connected(connector, &dd);
}
self.start_connector(connector, &dd);
} }
} }
dev.unprocessed_change.set(false); dev.unprocessed_change.set(false);
@ -1092,6 +1085,7 @@ impl MetalBackend {
}; };
let dev = Rc::new(MetalDrmDevice { let dev = Rc::new(MetalDrmDevice {
backend: self.clone(),
id: pending.id, id: pending.id,
devnum: pending.devnum, devnum: pending.devnum,
devnode: pending.devnode, devnode: pending.devnode,
@ -1111,13 +1105,8 @@ impl MetalBackend {
}, },
}); });
let mut preserve = Preserve::default();
if self.ctx.get().is_none() { if self.ctx.get().is_none() {
self.install_render_context(&dev); self.make_render_device(&dev, false);
for dev in self.device_holder.drm_devices.lock().values() {
let _ = self.init_drm_device(dev, &mut preserve);
}
} }
let (connectors, futures) = get_connectors(self, &dev, &resources.connectors)?; let (connectors, futures) = get_connectors(self, &dev, &resources.connectors)?;
@ -1129,7 +1118,7 @@ impl MetalBackend {
unprocessed_change: Cell::new(false), unprocessed_change: Cell::new(false),
}); });
self.init_drm_device(&slf, &mut preserve)?; self.init_drm_device(&slf, &mut Preserve::default())?;
self.state self.state
.backend_events .backend_events
@ -1140,9 +1129,7 @@ impl MetalBackend {
.backend_events .backend_events
.push(BackendEvent::NewConnector(connector.clone())); .push(BackendEvent::NewConnector(connector.clone()));
if connector.connected() { if connector.connected() {
let dd = connector.display.borrow_mut(); self.start_connector(connector, true);
self.send_connected(connector, &dd);
self.start_connector(connector, &dd);
} }
} }
@ -1417,6 +1404,31 @@ impl MetalBackend {
} }
} }
fn make_render_device(&self, dev: &Rc<MetalDrmDevice>, log: bool) -> bool {
if let Some(ctx) = self.ctx.get() {
if ctx.dev.id == dev.id {
return true;
}
}
if !self.install_render_context(dev) {
return false;
}
let mut preserve = Preserve::default();
for dev in self.device_holder.drm_devices.lock().values() {
if let Err(e) = self.init_drm_device(dev, &mut preserve) {
if log {
log::error!("Could not initialize device: {}", ErrorFmt(e));
}
}
for connector in dev.connectors.lock().values() {
if connector.connected() {
self.start_connector(connector, false);
}
}
}
true
}
fn init_drm_device( fn init_drm_device(
&self, &self,
dev: &Rc<MetalDrmDeviceData>, dev: &Rc<MetalDrmDeviceData>,
@ -1749,13 +1761,19 @@ impl MetalBackend {
Ok(()) Ok(())
} }
fn start_connector(&self, connector: &Rc<MetalConnector>, dd: &ConnectorDisplayData) { fn start_connector(&self, connector: &Rc<MetalConnector>, log_mode: bool) {
log::info!( let dd = connector.display.borrow_mut();
"Initialized connector {}-{} with mode {:?}", if !connector.connect_sent.get() {
dd.connector_type, self.send_connected(connector, &dd);
dd.connector_type_id, }
dd.mode.as_ref().unwrap(), if log_mode {
); log::info!(
"Initialized connector {}-{} with mode {:?}",
dd.connector_type,
dd.connector_type_id,
dd.mode.as_ref().unwrap(),
);
}
connector.has_damage.set(true); connector.has_damage.set(true);
connector.cursor_changed.set(true); connector.cursor_changed.set(true);
connector.schedule_present(); connector.schedule_present();

View file

@ -960,6 +960,11 @@ impl BackendDrmDevice for XDrmDevice {
fn dev_t(&self) -> dev_t { fn dev_t(&self) -> dev_t {
self.dev self.dev
} }
fn make_render_device(self: Rc<Self>) {
log::warn!("make_render_device is not supported by the X backend");
// nothing
}
} }
struct XOutput { struct XOutput {

View file

@ -195,6 +195,12 @@ impl ConfigProxyHandler {
self.respond(Response::GetDrmDevices { devices: res }); self.respond(Response::GetDrmDevices { devices: res });
} }
fn handle_make_render_device(&self, dev: DrmDevice) -> Result<(), CphError> {
let dev = self.get_drm_device(dev)?;
dev.make_render_device();
Ok(())
}
fn handle_get_drm_device_model(&self, dev: DrmDevice) -> Result<(), CphError> { fn handle_get_drm_device_model(&self, dev: DrmDevice) -> Result<(), CphError> {
let dev = self.get_drm_device(dev)?; let dev = self.get_drm_device(dev)?;
let model = dev.model.clone().unwrap_or_default(); let model = dev.model.clone().unwrap_or_default();
@ -1217,6 +1223,9 @@ impl ConfigProxyHandler {
ClientMessage::DisablePointerConstraint { seat } => self ClientMessage::DisablePointerConstraint { seat } => self
.handle_disable_pointer_constraint(seat) .handle_disable_pointer_constraint(seat)
.wrn("disable_pointer_constraint")?, .wrn("disable_pointer_constraint")?,
ClientMessage::MakeRenderDevice { device } => self
.handle_make_render_device(device)
.wrn("make_render_device")?,
} }
Ok(()) Ok(())
} }

View file

@ -209,11 +209,22 @@ pub struct DrmDevData {
pub handler: Cell<Option<SpawnedFuture<()>>>, pub handler: Cell<Option<SpawnedFuture<()>>>,
pub connectors: CopyHashMap<ConnectorId, Rc<ConnectorData>>, pub connectors: CopyHashMap<ConnectorId, Rc<ConnectorData>>,
pub syspath: Option<String>, pub syspath: Option<String>,
pub devnode: Option<String>,
pub vendor: Option<String>, pub vendor: Option<String>,
pub model: Option<String>, pub model: Option<String>,
pub pci_id: Option<PciId>, pub pci_id: Option<PciId>,
} }
impl DrmDevData {
pub fn make_render_device(&self) {
log::info!(
"Making {} the render device",
self.devnode.as_deref().unwrap_or("unknown"),
);
self.dev.clone().make_render_device();
}
}
struct UpdateTextTexturesVisitor; struct UpdateTextTexturesVisitor;
impl NodeVisitorBase for UpdateTextTexturesVisitor { impl NodeVisitorBase for UpdateTextTexturesVisitor {
fn visit_container(&mut self, node: &Rc<ContainerNode>) { fn visit_container(&mut self, node: &Rc<ContainerNode>) {

View file

@ -12,6 +12,7 @@ use {
pub fn handle(state: &Rc<State>, dev: Rc<dyn BackendDrmDevice>) { pub fn handle(state: &Rc<State>, dev: Rc<dyn BackendDrmDevice>) {
let id = dev.id(); let id = dev.id();
let mut syspath = None; let mut syspath = None;
let mut devnode = None;
let mut vendor = None; let mut vendor = None;
let mut model = None; let mut model = None;
let mut pci_id = None; let mut pci_id = None;
@ -40,6 +41,7 @@ pub fn handle(state: &Rc<State>, dev: Rc<dyn BackendDrmDevice>) {
syspath = dev.syspath().map(|s| s.to_string_lossy().into_owned()); syspath = dev.syspath().map(|s| s.to_string_lossy().into_owned());
vendor = dev.vendor().map(|s| s.to_string_lossy().into_owned()); vendor = dev.vendor().map(|s| s.to_string_lossy().into_owned());
model = dev.model().map(|s| s.to_string_lossy().into_owned()); model = dev.model().map(|s| s.to_string_lossy().into_owned());
devnode = odev.devnode().map(|s| s.to_string_lossy().into_owned());
'get_pci_id: { 'get_pci_id: {
let id = match dev.pci_id() { let id = match dev.pci_id() {
Some(id) => id, Some(id) => id,
@ -68,6 +70,7 @@ pub fn handle(state: &Rc<State>, dev: Rc<dyn BackendDrmDevice>) {
handler: Cell::new(None), handler: Cell::new(None),
connectors: Default::default(), connectors: Default::default(),
syspath, syspath,
devnode,
vendor, vendor,
model, model,
pci_id, pci_id,