chore: Update smithay

This commit is contained in:
Victoria Brekenfeld 2023-02-27 23:53:27 +01:00
parent c787cbdbbd
commit d16b752030
4 changed files with 48 additions and 48 deletions

2
Cargo.lock generated
View file

@ -3145,7 +3145,7 @@ checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
[[package]] [[package]]
name = "smithay" name = "smithay"
version = "0.3.0" version = "0.3.0"
source = "git+https://github.com/pop-os/smithay?rev=6276454e856#6276454e8565f386722da0a516c7a6e9e60ba3d7" source = "git+https://github.com/pop-os/smithay?rev=19f7c9aad6#19f7c9aad6e164ad78e0913e4371585441a14702"
dependencies = [ dependencies = [
"appendlist", "appendlist",
"ash", "ash",

View file

@ -42,7 +42,7 @@ tracing = "0.1.37"
[dependencies.smithay] [dependencies.smithay]
version = "0.3" version = "0.3"
git = "https://github.com/smithay/smithay.git" git = "https://github.com/smithay/smithay.git"
branch = "30dc3abb57" rev = "30dc3abb57"
default-features = false default-features = false
features = ["backend_drm", "backend_gbm", "backend_egl", "backend_libinput", "backend_session_libseat", "backend_udev", "backend_winit", "backend_vulkan", "backend_x11", "desktop", "use_system_lib", "renderer_glow", "renderer_multi", "wayland_frontend", "xwayland"] features = ["backend_drm", "backend_gbm", "backend_egl", "backend_libinput", "backend_session_libseat", "backend_udev", "backend_winit", "backend_vulkan", "backend_x11", "desktop", "use_system_lib", "renderer_glow", "renderer_multi", "wayland_frontend", "xwayland"]
@ -68,4 +68,4 @@ debug = true
lto = "fat" lto = "fat"
[patch."https://github.com/Smithay/smithay.git"] [patch."https://github.com/Smithay/smithay.git"]
smithay = { git = "https://github.com/pop-os/smithay", rev = "6276454e856" } smithay = { git = "https://github.com/pop-os/smithay", rev = "19f7c9aad6" }

View file

@ -87,7 +87,7 @@ pub struct KmsState {
pub struct Device { pub struct Device {
render_node: DrmNode, render_node: DrmNode,
surfaces: HashMap<crtc::Handle, Surface>, surfaces: HashMap<crtc::Handle, Surface>,
drm: Dispatcher<'static, DrmDevice, Data>, drm: DrmDevice,
gbm: GbmDevice<DrmDeviceFd>, gbm: GbmDevice<DrmDeviceFd>,
allocator: Box<dyn Allocator<Buffer = Dmabuf, Error = AnyError>>, allocator: Box<dyn Allocator<Buffer = Dmabuf, Error = AnyError>>,
formats: HashSet<Format>, formats: HashSet<Format>,
@ -223,7 +223,7 @@ pub fn init_backend(
error!(?err, "Failed to resume libinput context."); error!(?err, "Failed to resume libinput context.");
} }
for device in data.state.backend.kms().devices.values() { for device in data.state.backend.kms().devices.values() {
device.drm.as_source_ref().activate(); device.drm.activate();
} }
let dispatcher = dispatcher.clone(); let dispatcher = dispatcher.clone();
handle.insert_idle(move |data| { handle.insert_idle(move |data| {
@ -294,7 +294,7 @@ pub fn init_backend(
SessionEvent::PauseSession => { SessionEvent::PauseSession => {
libinput_context.suspend(); libinput_context.suspend();
for device in data.state.backend.kms().devices.values() { for device in data.state.backend.kms().devices.values() {
device.drm.as_source_ref().pause(); device.drm.pause();
} }
} }
}) })
@ -369,7 +369,7 @@ impl State {
})?, })?,
) )
}); });
let drm = DrmDevice::new(fd.clone(), false) let (drm, notifier) = DrmDevice::new(fd.clone(), false)
.with_context(|| format!("Failed to initialize drm device for: {}", path.display()))?; .with_context(|| format!("Failed to initialize drm device for: {}", path.display()))?;
let drm_node = DrmNode::from_dev_id(dev)?; let drm_node = DrmNode::from_dev_id(dev)?;
let supports_atomic = drm.is_atomic(); let supports_atomic = drm.is_atomic();
@ -401,11 +401,16 @@ impl State {
// otherwise the EGLDisplay created below might share the same GBM context // otherwise the EGLDisplay created below might share the same GBM context
}; };
let dispatcher = let token = self
Dispatcher::new(drm, move |event, metadata, data: &mut Data| match event { .common
DrmEvent::VBlank(crtc) => { .event_loop_handle
let rescheduled = .insert_source(
if let Some(device) = data.state.backend.kms().devices.get_mut(&drm_node) { notifier,
move |event, metadata, data: &mut Data| match event {
DrmEvent::VBlank(crtc) => {
let rescheduled = if let Some(device) =
data.state.backend.kms().devices.get_mut(&drm_node)
{
if let Some(surface) = device.surfaces.get_mut(&crtc) { if let Some(surface) = device.surfaces.get_mut(&crtc) {
#[cfg(feature = "debug")] #[cfg(feature = "debug")]
surface.fps.displayed(); surface.fps.displayed();
@ -467,35 +472,32 @@ impl State {
None None
}; };
if let Some((output, avg_rendertime)) = rescheduled { if let Some((output, avg_rendertime)) = rescheduled {
let mut scheduled_sessions = let mut scheduled_sessions =
data.state.workspace_session_for_output(&output); data.state.workspace_session_for_output(&output);
let mut output_sessions = output.pending_buffers().peekable(); let mut output_sessions = output.pending_buffers().peekable();
if output_sessions.peek().is_some() { if output_sessions.peek().is_some() {
scheduled_sessions scheduled_sessions
.get_or_insert_with(Vec::new) .get_or_insert_with(Vec::new)
.extend(output_sessions); .extend(output_sessions);
} }
let repaint_delay = std::cmp::max(avg_rendertime, MIN_RENDER_TIME); let repaint_delay = std::cmp::max(avg_rendertime, MIN_RENDER_TIME);
if let Err(err) = data.state.backend.kms().schedule_render( if let Err(err) = data.state.backend.kms().schedule_render(
&data.state.common.event_loop_handle, &data.state.common.event_loop_handle,
&output, &output,
Some(repaint_delay), Some(repaint_delay),
scheduled_sessions, scheduled_sessions,
) { ) {
warn!(?err, "Failed to schedule render."); warn!(?err, "Failed to schedule render.");
}
} }
} }
} DrmEvent::Error(err) => {
DrmEvent::Error(err) => { warn!(?err, "Failed to read events of device {:?}.", dev);
warn!(?err, "Failed to read events of device {:?}.", dev); }
} },
}); )
let token = self
.common
.event_loop_handle
.register_dispatcher(dispatcher.clone())
.with_context(|| format!("Failed to add drm device to event loop: {}", dev))?; .with_context(|| format!("Failed to add drm device to event loop: {}", dev))?;
let socket = match self.create_socket(dh, render_node, formats.clone().into_iter()) { let socket = match self.create_socket(dh, render_node, formats.clone().into_iter()) {
@ -518,7 +520,7 @@ impl State {
surfaces: HashMap::new(), surfaces: HashMap::new(),
gbm: gbm.clone(), gbm: gbm.clone(),
allocator, allocator,
drm: dispatcher, drm,
formats, formats,
supports_atomic, supports_atomic,
event_token: Some(token), event_token: Some(token),
@ -754,10 +756,8 @@ pub struct OutputChanges {
impl Device { impl Device {
pub fn enumerate_surfaces(&mut self) -> Result<OutputChanges> { pub fn enumerate_surfaces(&mut self) -> Result<OutputChanges> {
let drm = &mut *self.drm.as_source_mut();
// enumerate our outputs // enumerate our outputs
let config = drm_helpers::display_configuration(drm, self.supports_atomic)?; let config = drm_helpers::display_configuration(&mut self.drm, self.supports_atomic)?;
let surfaces = self let surfaces = self
.surfaces .surfaces
@ -787,7 +787,7 @@ impl Device {
position: (i32, i32), position: (i32, i32),
renderer: &mut GlMultiRenderer<'_, '_>, renderer: &mut GlMultiRenderer<'_, '_>,
) -> Result<Output> { ) -> Result<Output> {
let drm = &mut *self.drm.as_source_mut(); let drm = &mut self.drm;
let crtc_info = drm.get_crtc(crtc)?; let crtc_info = drm.get_crtc(crtc)?;
let conn_info = drm.get_connector(conn, false)?; let conn_info = drm.get_connector(conn, false)?;
let vrr = drm_helpers::set_vrr(drm, crtc, conn, true).unwrap_or(false); let vrr = drm_helpers::set_vrr(drm, crtc, conn, true).unwrap_or(false);
@ -1011,7 +1011,7 @@ impl KmsState {
} }
false false
} else { } else {
let drm = &mut *device.drm.as_source_mut(); let drm = &mut device.drm;
let conn = surface.connector; let conn = surface.connector;
let conn_info = drm.get_connector(conn, false)?; let conn_info = drm.get_connector(conn, false)?;
let mode = conn_info let mode = conn_info

View file

@ -295,7 +295,7 @@ impl ScreencopyHandler for State {
} }
if let Some(BufferType::Shm) = buffer_type(&params.buffer) { if let Some(BufferType::Shm) = buffer_type(&params.buffer) {
if with_buffer_contents(&params.buffer, |_, info| { if with_buffer_contents(&params.buffer, |_, _, info| {
info.format != ShmFormat::Abgr8888 && info.format != ShmFormat::Xbgr8888 info.format != ShmFormat::Abgr8888 && info.format != ShmFormat::Xbgr8888
}) })
.unwrap() .unwrap()
@ -502,7 +502,7 @@ where
{ {
if matches!(buffer_type(buffer), Some(BufferType::Shm)) { if matches!(buffer_type(buffer), Some(BufferType::Shm)) {
let buffer_size = buffer_dimensions(buffer).unwrap(); let buffer_size = buffer_dimensions(buffer).unwrap();
with_buffer_contents_mut(buffer, |slice, data| { with_buffer_contents_mut(buffer, |ptr, len, data| {
let offset = data.offset as i32; let offset = data.offset as i32;
let width = data.width as i32; let width = data.width as i32;
let height = data.height as i32; let height = data.height as i32;
@ -513,7 +513,7 @@ where
let pixelsize = 4i32; let pixelsize = 4i32;
// ensure consistency, the SHM handler of smithay should ensure this // ensure consistency, the SHM handler of smithay should ensure this
assert!((offset + (height - 1) * stride + width * pixelsize) as usize <= slice.len()); assert!((offset + (height - 1) * stride + width * pixelsize) as usize <= len);
let mapping = let mapping =
renderer.copy_framebuffer(Rectangle::from_loc_and_size((0, 0), buffer_size))?; renderer.copy_framebuffer(Rectangle::from_loc_and_size((0, 0), buffer_size))?;
@ -524,7 +524,7 @@ where
unsafe { unsafe {
std::ptr::copy_nonoverlapping::<u8>( std::ptr::copy_nonoverlapping::<u8>(
gl_data.as_ptr().offset((width * pixelsize * i) as isize), gl_data.as_ptr().offset((width * pixelsize * i) as isize),
slice.as_mut_ptr().offset((offset + stride * i) as isize), ptr.offset((offset + stride * i) as isize),
(width * pixelsize) as usize, (width * pixelsize) as usize,
); );
} }