1
0
Fork 0
forked from wry/wry

metal: disable implicit sync in KMS

This commit is contained in:
Julian Orth 2024-09-10 14:29:44 +02:00
parent 0dc5d9adb8
commit a1985b2870
5 changed files with 42 additions and 8 deletions

View file

@ -16,7 +16,7 @@ use {
},
dbus::{DbusError, SignalHandler},
drm_feedback::DrmFeedback,
gfx_api::GfxError,
gfx_api::{GfxError, SyncFile},
ifs::{
wl_output::OutputId,
wl_seat::tablet::{
@ -150,6 +150,7 @@ pub struct MetalBackend {
pause_handler: Cell<Option<SignalHandler>>,
resume_handler: Cell<Option<SignalHandler>>,
ctx: CloneCell<Option<Rc<MetalRenderContext>>>,
signaled_sync_file: CloneCell<Option<SyncFile>>,
default_feedback: CloneCell<Option<Rc<DrmFeedback>>>,
persistent_display_data: CopyHashMap<Rc<OutputId>, Rc<PersistentDisplayData>>,
}
@ -324,6 +325,7 @@ pub async fn create(state: &Rc<State>) -> Result<Rc<MetalBackend>, MetalError> {
pause_handler: Default::default(),
resume_handler: Default::default(),
ctx: Default::default(),
signaled_sync_file: Default::default(),
default_feedback: Default::default(),
persistent_display_data: Default::default(),
});

View file

@ -292,7 +292,9 @@ impl MetalConnector {
change!(c, plane.crtc_w, crtc_w);
change!(c, plane.crtc_h, crtc_h);
if !try_async_flip && !self.dev.is_nvidia {
c.change(plane.in_fence_fd, -1i32 as u64);
if let Some(sf) = self.backend.signaled_sync_file.get() {
c.change(plane.in_fence_fd, sf.0.raw() as u64);
}
}
});
} else {
@ -329,7 +331,9 @@ impl MetalConnector {
c.change(plane.src_w.id, (*width as u64) << 16);
c.change(plane.src_h.id, (*height as u64) << 16);
if !self.dev.is_nvidia {
c.change(plane.in_fence_fd, -1i32 as u64);
if let Some(sf) = self.backend.signaled_sync_file.get() {
c.change(plane.in_fence_fd, sf.0.raw() as u64);
}
}
});
}
@ -512,8 +516,8 @@ impl MetalConnector {
}
ct
};
if let AcquireSync::None = ct.acquire_sync {
// Cannot perform scanout without sync.
if let AcquireSync::None | AcquireSync::Implicit = ct.acquire_sync {
// Cannot perform scanout without explicit sync.
return None;
}
if ct.source.buffer_transform != ct.target.output_transform {

View file

@ -2029,6 +2029,18 @@ impl MetalBackend {
}
}
let ctx = dev.ctx.get();
if self.signaled_sync_file.is_none() {
if let Some(sync) = ctx.gfx.sync_obj_ctx() {
match sync.create_signaled_sync_file() {
Ok(sf) => {
self.signaled_sync_file.set(Some(sf));
}
Err(e) => {
log::warn!("Could not create signaled sync file: {}", ErrorFmt(e));
}
}
}
}
self.state.set_render_ctx(Some(ctx.gfx.clone()));
let fb = match DrmFeedback::new(&self.state.drm_feedback_ids, &*ctx.gfx) {
Ok(fb) => Some(Rc::new(fb)),