Skip to content

Instantly share code, notes, and snippets.

@tronical
Created September 28, 2023 07:53
Show Gist options
  • Save tronical/66a0baa7818e48c082788b32c01099cc to your computer and use it in GitHub Desktop.
Save tronical/66a0baa7818e48c082788b32c01099cc to your computer and use it in GitHub Desktop.
diff --git a/internal/backends/linuxkms/display/egldisplay.rs b/internal/backends/linuxkms/display/egldisplay.rs
index 2dd96746f..0f66aa499 100644
--- a/internal/backends/linuxkms/display/egldisplay.rs
+++ b/internal/backends/linuxkms/display/egldisplay.rs
@@ -204,19 +204,32 @@ pub fn try_create_egl_display(
})
.ok_or_else(|| format!("No preferred or non-zero size display mode found"))?;
- let encoder = connector
- .encoders()
- .iter()
- .find_map(|handle| {
- if connector.current_encoder() == Some(*handle) {
- drm_device.get_encoder(*handle).ok()
- } else {
- None
- }
- })
- .ok_or_else(|| format!("Not encoder found for connector"))?;
+ let encoder = connector.encoders().iter().find_map(|handle| {
+ if connector.current_encoder() == Some(*handle) {
+ drm_device.get_encoder(*handle).ok()
+ } else {
+ None
+ }
+ });
- let crtc = encoder.crtc().ok_or_else(|| format!("no crtc for encoder"))?;
+ let crtc = if let Some(encoder) = encoder {
+ encoder.crtc().ok_or_else(|| format!("no crtc for encoder"))?
+ } else {
+ // No crtc found for current encoder? Pick the first possible ctrc.
+ connector
+ .encoders()
+ .iter()
+ .filter_map(|handle| drm_device.get_encoder(*handle).ok())
+ .flat_map(|encoder| resources.filter_crtcs(encoder.possible_crtcs()))
+ .find(|crtc_handle| drm_device.get_crtc(*crtc_handle).is_ok())
+ .ok_or_else(|| {
+ format!(
+ "Could not find any crtc for any encoder connected to output {}-{}",
+ connector.interface().as_str(),
+ connector.interface_id()
+ )
+ })?
+ };
let (width, height) = mode.size();
let width = std::num::NonZeroU32::new(width as _)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment