drivers/graphics: Use set_crtc+dirtyfb in V2DisplayMap
This commit is contained in:
@@ -6,7 +6,7 @@ use std::{cmp, io, mem, ptr};
|
|||||||
|
|
||||||
use drm::buffer::{Buffer, DrmFourcc};
|
use drm::buffer::{Buffer, DrmFourcc};
|
||||||
use drm::control::dumbbuffer::{DumbBuffer, DumbMapping};
|
use drm::control::dumbbuffer::{DumbBuffer, DumbMapping};
|
||||||
use drm::control::{framebuffer, Device};
|
use drm::control::{framebuffer, ClipRect, Device};
|
||||||
use graphics_ipc::v2::{Damage, V2GraphicsHandle};
|
use graphics_ipc::v2::{Damage, V2GraphicsHandle};
|
||||||
use orbclient::FONT;
|
use orbclient::FONT;
|
||||||
|
|
||||||
@@ -25,6 +25,14 @@ impl V2DisplayMap {
|
|||||||
let mode = connector_info.modes()[0];
|
let mode = connector_info.modes()[0];
|
||||||
let (width, height) = mode.size();
|
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(
|
let mut buffer = display_handle.create_dumb_buffer(
|
||||||
(width.into(), height.into()),
|
(width.into(), height.into()),
|
||||||
DrmFourcc::Argb8888,
|
DrmFourcc::Argb8888,
|
||||||
@@ -32,6 +40,8 @@ impl V2DisplayMap {
|
|||||||
)?;
|
)?;
|
||||||
let fb = display_handle.add_framebuffer(&buffer, 32, 32)?;
|
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 = display_handle.map_dumb_buffer(&mut buffer)?;
|
||||||
let map = unsafe { mem::transmute::<DumbMapping<'_>, DumbMapping<'static>>(map) };
|
let map = unsafe { mem::transmute::<DumbMapping<'_>, DumbMapping<'static>>(map) };
|
||||||
|
|
||||||
@@ -55,8 +65,15 @@ impl V2DisplayMap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn dirty_fb(&self, damage: Damage) -> io::Result<()> {
|
pub fn dirty_fb(&self, damage: Damage) -> io::Result<()> {
|
||||||
self.display_handle
|
self.display_handle.dirty_framebuffer(
|
||||||
.update_plane(0, u32::from(self.fb), damage)
|
self.fb,
|
||||||
|
&[ClipRect::new(
|
||||||
|
damage.x as u16,
|
||||||
|
damage.y as u16,
|
||||||
|
(damage.x + damage.width) as u16,
|
||||||
|
(damage.y + damage.height) as u16,
|
||||||
|
)],
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user