diff --git a/drivers/graphics/console-draw/src/lib.rs b/drivers/graphics/console-draw/src/lib.rs index 1180c8a02c..c066a622c9 100644 --- a/drivers/graphics/console-draw/src/lib.rs +++ b/drivers/graphics/console-draw/src/lib.rs @@ -6,7 +6,7 @@ use std::{cmp, io, mem, ptr}; use drm::buffer::{Buffer, DrmFourcc}; use drm::control::dumbbuffer::{DumbBuffer, DumbMapping}; -use drm::control::{framebuffer, Device}; +use drm::control::{framebuffer, ClipRect, Device}; use graphics_ipc::v2::{Damage, V2GraphicsHandle}; use orbclient::FONT; @@ -25,6 +25,14 @@ impl V2DisplayMap { let mode = connector_info.modes()[0]; let (width, height) = mode.size(); + // FIXME do something smarter that avoids conflicts + let crtc = display_handle.resource_handles().unwrap().filter_crtcs( + display_handle + .get_encoder(connector_info.encoders()[0]) + .unwrap() + .possible_crtcs(), + )[0]; + let mut buffer = display_handle.create_dumb_buffer( (width.into(), height.into()), DrmFourcc::Argb8888, @@ -32,6 +40,8 @@ impl V2DisplayMap { )?; let fb = display_handle.add_framebuffer(&buffer, 32, 32)?; + display_handle.set_crtc(crtc, Some(fb), (0, 0), &[connector], Some(mode))?; + let map = display_handle.map_dumb_buffer(&mut buffer)?; let map = unsafe { mem::transmute::, DumbMapping<'static>>(map) }; @@ -55,8 +65,15 @@ impl V2DisplayMap { } pub fn dirty_fb(&self, damage: Damage) -> io::Result<()> { - self.display_handle - .update_plane(0, u32::from(self.fb), damage) + self.display_handle.dirty_framebuffer( + self.fb, + &[ClipRect::new( + damage.x as u16, + damage.y as u16, + (damage.x + damage.width) as u16, + (damage.y + damage.height) as u16, + )], + ) } }