drivers/graphics: Use set_crtc+dirtyfb in V2DisplayMap

This commit is contained in:
bjorn3
2026-03-16 20:44:53 +01:00
parent f150813cfa
commit a40be7b446
+20 -3
View File
@@ -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<'_>, 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,
)],
)
}
}