diff --git a/drivers/graphics/driver-graphics/src/kms/objects.rs b/drivers/graphics/driver-graphics/src/kms/objects.rs index 5dd4b4ca79..5958257c64 100644 --- a/drivers/graphics/driver-graphics/src/kms/objects.rs +++ b/drivers/graphics/driver-graphics/src/kms/objects.rs @@ -77,7 +77,7 @@ impl KmsObjects { gamma_size: 0, properties: KmsCrtc::base_properties(), state: KmsCrtcState { - fb_id: KmsObjectId::INVALID, + fb_id: None, mode: None, driver_data: driver_data_state, }, @@ -208,7 +208,7 @@ pub struct KmsCrtc { #[derive(Debug, Clone)] pub struct KmsCrtcState { - pub fb_id: KmsObjectId, + pub fb_id: Option, pub mode: Option, pub driver_data: ::State, } diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index bdefaba6f2..4949c5fae1 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -241,7 +241,7 @@ impl GraphicsScheme { let crtc = self.inner.objects.get_crtc(crtc_id).unwrap(); let connector_id = self.inner.objects.connector_ids()[display_id]; - crtc.lock().unwrap().state.fb_id = fb.unwrap_or(KmsObjectId::INVALID); + crtc.lock().unwrap().state.fb_id = *fb; let fb = fb.map(|fb| { self.inner @@ -538,7 +538,7 @@ impl SchemeSync for GraphicsSchemeInner { .lock() .unwrap(); // Don't touch set_connectors, that is only used by MODE_SET_CRTC - data.set_fb_id(crtc.state.fb_id.0); + data.set_fb_id(crtc.state.fb_id.unwrap_or(KmsObjectId::INVALID).0); // FIXME fill x and y with the data from the primary plane data.set_x(0); data.set_y(0); @@ -561,11 +561,14 @@ impl SchemeSync for GraphicsSchemeInner { .take(data.count_connectors() as usize) .map(|&id| KmsObjectId(id)) .collect(); - let fb = if data.fb_id() != 0 { - Some(self.objects.get_framebuffer(KmsObjectId(data.fb_id()))?) + let fb_id = if data.fb_id() != 0 { + Some(KmsObjectId(data.fb_id())) } else { None }; + let fb = fb_id + .map(|fb_id| self.objects.get_framebuffer(fb_id)) + .transpose()?; let mode = if data.mode_valid() != 0 { Some(data.mode()) } else { @@ -584,7 +587,7 @@ impl SchemeSync for GraphicsSchemeInner { height: mode.map_or(0, |m| m.vdisplay as u32), }, ); - crtc.lock().unwrap().state.fb_id = KmsObjectId(data.fb_id()); + crtc.lock().unwrap().state.fb_id = fb_id; for connector in connector_ids { self.objects @@ -781,7 +784,7 @@ impl SchemeSync for GraphicsSchemeInner { continue; } let crtc = self.objects.crtcs().nth(display_id).unwrap(); - crtc.lock().unwrap().state.fb_id = KmsObjectId::INVALID; + crtc.lock().unwrap().state.fb_id = None; self.adapter.set_crtc( &self.objects, crtc, @@ -821,7 +824,7 @@ impl SchemeSync for GraphicsSchemeInner { if *vt == self.active_vt { for crtc in self.objects.crtcs() { - if crtc.lock().unwrap().state.fb_id == KmsObjectId(data.fb_id()) { + if crtc.lock().unwrap().state.fb_id == Some(KmsObjectId(data.fb_id())) { let mode = crtc.lock().unwrap().state.mode; self.adapter .set_crtc(&self.objects, crtc, mode, Some(fb), damage); @@ -886,7 +889,14 @@ impl SchemeSync for GraphicsSchemeInner { let crtc_id = self.objects.crtc_ids()[i as usize]; let crtc = self.objects.get_crtc(crtc_id).unwrap(); data.set_crtc_id(crtc_id.0); - data.set_fb_id(crtc.lock().unwrap().state.fb_id.0); + data.set_fb_id( + crtc.lock() + .unwrap() + .state + .fb_id + .unwrap_or(KmsObjectId::INVALID) + .0, + ); data.set_possible_crtcs(1 << i); data.set_format_type_ptr(&[DrmFourcc::Argb8888 as u32]); Ok(0)