drivers/graphics/driver-graphics: Add primary plane for every CRTC
This commit is contained in:
@@ -82,12 +82,22 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
|
||||
&mut self,
|
||||
driver_data: T::Crtc,
|
||||
driver_data_state: <T::Crtc as KmsCrtcDriver>::State,
|
||||
plane_data: T::Plane,
|
||||
plane_data_state: <T::Plane as KmsPlaneDriver>::State,
|
||||
) -> KmsObjectId {
|
||||
let primary_plane = self.add_plane(
|
||||
&[],
|
||||
KmsPlaneType::Primary,
|
||||
plane_data,
|
||||
plane_data_state,
|
||||
);
|
||||
|
||||
let crtc_index = self.crtcs.len() as u32;
|
||||
let id = self.add(Mutex::new(KmsCrtc {
|
||||
crtc_index,
|
||||
gamma_size: 0,
|
||||
properties: KmsCrtc::base_properties(),
|
||||
primary_plane,
|
||||
state: KmsCrtcState {
|
||||
fb_id: None,
|
||||
mode: None,
|
||||
@@ -97,6 +107,8 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
|
||||
}));
|
||||
self.crtcs.push(id);
|
||||
|
||||
self.get_plane(primary_plane).unwrap().lock().unwrap().possible_crtcs = 1 << crtc_index;
|
||||
|
||||
id
|
||||
}
|
||||
|
||||
@@ -254,6 +266,7 @@ pub struct KmsCrtc<T: GraphicsAdapter> {
|
||||
pub crtc_index: u32,
|
||||
pub gamma_size: u32,
|
||||
pub properties: Vec<KmsPropertyData<Self>>,
|
||||
pub primary_plane: KmsObjectId,
|
||||
pub state: KmsCrtcState<T>,
|
||||
pub driver_data: T::Crtc,
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ use syscall::{Error, MapFlags, Result, EACCES, EAGAIN, EINVAL, ENOENT, ENXIO, EO
|
||||
use crate::kms::connector::{KmsConnectorDriver, KmsConnectorState};
|
||||
use crate::kms::objects::{
|
||||
self, KmsCrtc, KmsCrtcDriver, KmsCrtcState, KmsObjectId, KmsObjects, KmsPlane, KmsPlaneDriver,
|
||||
KmsPlaneState, KmsPlaneType, KmsRect,
|
||||
KmsPlaneState, KmsRect,
|
||||
};
|
||||
use crate::kms::properties::KmsPropertyKind;
|
||||
|
||||
@@ -623,20 +623,7 @@ impl<T: GraphicsAdapter> SchemeSync for GraphicsSchemeInner<T> {
|
||||
None
|
||||
};
|
||||
|
||||
let primary_plane_id = self
|
||||
.objects
|
||||
.plane_ids()
|
||||
.iter()
|
||||
.copied()
|
||||
.find(|&pid| {
|
||||
let plane = self.objects.get_plane(pid).unwrap().lock().unwrap();
|
||||
plane.plane_type == KmsPlaneType::Primary
|
||||
&& (plane.state.crtc_id == Some(crtc_id)
|
||||
|| plane.possible_crtcs
|
||||
& (1 << crtc.lock().unwrap().crtc_index)
|
||||
!= 0)
|
||||
})
|
||||
.ok_or(Error::new(EINVAL))?;
|
||||
let primary_plane_id = crtc.lock().unwrap().primary_plane;
|
||||
let plane = self.objects.get_plane(primary_plane_id)?;
|
||||
let mut new_crtc_state = crtc.lock().unwrap().state.clone();
|
||||
new_crtc_state.mode = mode;
|
||||
|
||||
@@ -449,7 +449,7 @@ impl Device {
|
||||
}
|
||||
|
||||
fn add_kms_pipe(objects: &mut KmsObjects<Self>, pipe_idx: usize, fb: KmsFramebuffer<Self>) {
|
||||
let crtc_id = objects.add_crtc(Crtc { pipe_idx }, ());
|
||||
let crtc_id = objects.add_crtc(Crtc { pipe_idx }, (), (), ());
|
||||
|
||||
let (width, height) = (fb.width, fb.height);
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ impl GraphicsAdapter for FbAdapter {
|
||||
|
||||
fn init(&mut self, objects: &mut KmsObjects<Self>) {
|
||||
for (framebuffer_id, framebuffer) in self.framebuffers.iter().enumerate() {
|
||||
let crtc = objects.add_crtc((), ());
|
||||
let crtc = objects.add_crtc((), (), (), ());
|
||||
|
||||
objects.add_connector(
|
||||
Connector {
|
||||
|
||||
@@ -363,7 +363,7 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> {
|
||||
});
|
||||
|
||||
for display_id in 0..self.config.num_scanouts.get() {
|
||||
let crtc = objects.add_crtc((), ());
|
||||
let crtc = objects.add_crtc((), (), (), ());
|
||||
|
||||
objects.add_connector(VirtGpuConnector { display_id }, (), &[crtc]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user