diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c index 2062a20cf..709590ed4 100644 --- a/src/backends/native/meta-output-kms.c +++ b/src/backends/native/meta-output-kms.c @@ -316,6 +316,45 @@ compare_modes (const void *one, meta_crtc_mode_get_name (crtc_mode_two)); } +static gboolean +are_all_modes_equally_sized (MetaOutputInfo *output_info) +{ + const MetaCrtcModeInfo *base = + meta_crtc_mode_get_info (output_info->modes[0]); + int i; + + for (i = 1; i < output_info->n_modes; i++) + { + const MetaCrtcModeInfo *mode_info = + meta_crtc_mode_get_info (output_info->modes[i]); + + if (base->width != mode_info->width || + base->height != mode_info->height) + return FALSE; + } + + return TRUE; +} + +static void +maybe_add_fallback_modes (const MetaKmsConnectorState *connector_state, + MetaOutputInfo *output_info, + MetaGpuKms *gpu_kms, + MetaKmsConnector *kms_connector) +{ + if (!connector_state->has_scaling) + return; + + if (output_info->connector_type == DRM_MODE_CONNECTOR_eDP && + !are_all_modes_equally_sized (output_info)) + return; + + meta_topic (META_DEBUG_KMS, "Adding common modes to connector %u on %s", + meta_kms_connector_get_id (kms_connector), + meta_gpu_kms_get_file_path (gpu_kms)); + add_common_modes (output_info, gpu_kms); +} + static gboolean init_output_modes (MetaOutputInfo *output_info, MetaGpuKms *gpu_kms, @@ -344,14 +383,7 @@ init_output_modes (MetaOutputInfo *output_info, output_info->preferred_mode = output_info->modes[i]; } - if (connector_state->has_scaling) - { - meta_topic (META_DEBUG_KMS, "Adding common modes to connector %u on %s", - meta_kms_connector_get_id (kms_connector), - meta_gpu_kms_get_file_path (gpu_kms)); - add_common_modes (output_info, gpu_kms); - } - + maybe_add_fallback_modes (connector_state, output_info, gpu_kms, kms_connector); if (!output_info->modes) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, @@ -415,6 +447,10 @@ meta_output_kms_new (MetaGpuKms *gpu_kms, output_info->height_mm = connector_state->height_mm; } + drm_connector_type = meta_kms_connector_get_connector_type (kms_connector); + output_info->connector_type = + meta_kms_connector_type_from_drm (drm_connector_type); + if (!init_output_modes (output_info, gpu_kms, kms_connector, error)) return NULL; @@ -449,10 +485,6 @@ meta_output_kms_new (MetaGpuKms *gpu_kms, meta_output_info_parse_edid (output_info, connector_state->edid_data); - drm_connector_type = meta_kms_connector_get_connector_type (kms_connector); - output_info->connector_type = - meta_kms_connector_type_from_drm (drm_connector_type); - output_info->tile_info = connector_state->tile_info; output = g_object_new (META_TYPE_OUTPUT_KMS,