1
0
Fork 0
forked from wry/wry

autocommit 2022-03-12 22:58:30 CET

This commit is contained in:
Julian Orth 2022-03-12 22:58:30 +01:00
parent 21527b3e38
commit 133035e0a6
8 changed files with 41 additions and 74 deletions

View file

@ -204,7 +204,6 @@ impl MetalBackend {
return;
}
};
slf.init_drm_device(&dev);
slf.device_holder
.drm_devices
.set(dev.dev.devnum, dev.clone());

View file

@ -1,11 +1,6 @@
use crate::async_engine::{AsyncFd, SpawnedFuture};
use crate::backend::{BackendEvent, Output, OutputId};
use crate::drm::drm::{
ConnectorStatus, ConnectorType, DrmBlob, DrmConnector, DrmCrtc, DrmEncoder, DrmError, DrmEvent,
DrmFb, DrmFramebuffer, DrmMaster, DrmModeInfo, DrmObject, DrmPlane, DrmProperty,
DrmPropertyDefinition, DrmPropertyType, PropBlob, DRM_CLIENT_CAP_ATOMIC,
DRM_MODE_ATOMIC_ALLOW_MODESET, DRM_MODE_ATOMIC_NONBLOCK, DRM_MODE_PAGE_FLIP_EVENT,
};
use crate::drm::drm::{ConnectorStatus, ConnectorType, DrmBlob, DrmConnector, DrmCrtc, DrmEncoder, DrmError, DrmEvent, DrmFb, DrmFramebuffer, DrmMaster, DrmModeInfo, DrmObject, DrmPlane, DrmProperty, DrmPropertyDefinition, DrmPropertyType, PropBlob, DRM_CLIENT_CAP_ATOMIC, DRM_MODE_ATOMIC_ALLOW_MODESET, DRM_MODE_ATOMIC_NONBLOCK, DRM_MODE_PAGE_FLIP_EVENT, Change};
use crate::drm::gbm::{GbmDevice, GBM_BO_USE_RENDERING, GBM_BO_USE_SCANOUT};
use crate::drm::{ModifiedFormat, INVALID_MODIFIER};
use crate::format::{Format, XRGB8888};
@ -469,7 +464,20 @@ impl MetalBackend {
let slf = Rc::new(MetalDrmDevice { dev, connectors });
self.reset_drm_device(&slf)?;
let mut changes = master.change(DRM_MODE_ATOMIC_ALLOW_MODESET);
self.reset_drm_device(&slf, &mut changes);
self.init_drm_device(&slf, &mut changes);
if let Err(e) = changes.commit(0) {
return Err(MetalError::Configure(e));
}
for connector in slf.connectors.values() {
if connector.primary_plane.get().is_some() {
self.start_connector(connector);
}
}
let handler = self
.state
@ -477,7 +485,7 @@ impl MetalBackend {
.spawn(self.clone().handle_drm_events(slf.clone()));
slf.dev.handle_events.handle_events.set(Some(handler));
self.state.render_ctx.set(Some(egl));
self.state.set_render_ctx(&egl);
Ok(slf)
}
@ -531,8 +539,7 @@ impl MetalBackend {
self.present(&connector);
}
fn reset_drm_device(&self, dev: &MetalDrmDevice) -> Result<(), DrmError> {
let mut changes = dev.dev.master.change(DRM_MODE_ATOMIC_ALLOW_MODESET);
fn reset_drm_device(&self, dev: &MetalDrmDevice, changes: &mut Change) {
for connector in dev.connectors.values() {
if connector.crtc_id.value.take().is_some() {
changes.change_object(connector.id, |c| {
@ -560,15 +567,11 @@ impl MetalBackend {
}
})
}
if let Err(e) = changes.commit(0) {
return Err(DrmError::ResetFailed(Box::new(e)));
}
Ok(())
}
pub fn init_drm_device(&self, dev: &Rc<MetalDrmDevice>) {
pub fn init_drm_device(&self, dev: &Rc<MetalDrmDevice>, changes: &mut Change) {
for connector in dev.connectors.values() {
if let Err(e) = self.init_drm_connector(dev, connector) {
if let Err(e) = self.init_drm_connector(dev, connector, changes) {
log::error!("Could not initialize drm connector: {}", ErrorFmt(e));
}
}
@ -604,11 +607,11 @@ impl MetalBackend {
Ok(b) => b,
Err(e) => return Err(MetalError::ScanoutBuffer(e)),
};
let drm_fb = match connector.master.add_fb(&bo) {
let drm_fb = match connector.master.add_fb(bo.dma()) {
Ok(fb) => Rc::new(fb),
Err(e) => return Err(MetalError::Framebuffer(e)),
};
let egl_fb = match dev.dev.egl.dmabuf_fb(&bo.dma()) {
let egl_fb = match dev.dev.egl.dmabuf_fb(bo.dma()) {
Ok(fb) => fb,
Err(e) => return Err(MetalError::ImportFb(e)),
};
@ -622,6 +625,7 @@ impl MetalBackend {
&self,
dev: &Rc<MetalDrmDevice>,
connector: &Rc<MetalConnector>,
changes: &mut Change,
) -> Result<(), MetalError> {
if connector.connection != ConnectorStatus::Connected {
return Ok(());
@ -661,7 +665,6 @@ impl MetalBackend {
mode.hdisplay as _,
mode.vdisplay as _,
)?;
let mut changes = connector.master.change(DRM_MODE_ATOMIC_ALLOW_MODESET);
changes.change_object(connector.id, |c| {
c.change(connector.crtc_id.id, crtc.id.0 as _);
});
@ -681,9 +684,6 @@ impl MetalBackend {
c.change(primary_plane.src_w.id, (mode.hdisplay as u64) << 16);
c.change(primary_plane.src_h.id, (mode.vdisplay as u64) << 16);
});
if let Err(e) = changes.commit(0) {
return Err(MetalError::Configure(e));
}
primary_plane.fb_id.value.set(buffers[0].drm.id());
primary_plane.crtc_id.value.set(crtc.id);
primary_plane.crtc_x.value.set(0);
@ -702,6 +702,11 @@ impl MetalBackend {
crtc.active.value.set(true);
crtc.mode_id.value.set(mode_blob.id());
crtc.mode_blob.set(Some(Rc::new(mode_blob)));
Ok(())
}
fn start_connector(&self, connector: &Rc<MetalConnector>) {
let mode = connector.mode.get().unwrap();
self.state
.backend_events
.push(BackendEvent::NewOutput(connector.clone()));
@ -712,7 +717,6 @@ impl MetalBackend {
mode
);
self.present(connector);
Ok(())
}
fn present(&self, connector: &Rc<MetalConnector>) {

View file

@ -234,7 +234,7 @@ fn get_drm(con: &XcbCon) -> Result<Drm, XorgBackendError> {
assert!(res.nfd == 1);
let fd = *con.dri.xcb_dri3_open_reply_fds(con.c, &mut *res);
let fd = OwnedFd::new(fd);
Ok(Drm::reopen(fd.raw(), true)?)
Ok(Drm::reopen(fd.raw(), false)?)
}
}