[PATCH] crtc: match full preferred modes if possible when choosing an initial config

Alex Deucher alexdeucher at gmail.com
Thu Oct 13 12:50:55 PDT 2011


On Thu, Oct 13, 2011 at 3:01 PM, Jesse Barnes <jbarnes at virtuousgeek.org> wrote:
> It's fairly common to have multiple, identical monitors plugged in.  In
> that case, it's preferable to run the monitor's preferred mode on each
> output, rather than just matching the width & height and end up with
> different timings or refresh rates.
>
> Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>

Makes sense to me.

Reviewed-by: Alex Deucher <alexdeucher at gmail.com>

> ---
>  hw/xfree86/modes/xf86Crtc.c |   25 ++++++++++++++++++++-----
>  1 files changed, 20 insertions(+), 5 deletions(-)
>
> diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
> index 3fae039..d75cd77 100644
> --- a/hw/xfree86/modes/xf86Crtc.c
> +++ b/hw/xfree86/modes/xf86Crtc.c
> @@ -2060,13 +2060,28 @@ xf86TargetPreferred(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
>                if (o == p)
>                    continue;
>
> -               for (mode = output->probed_modes; mode; mode = mode->next) {
> -                   Rotation r = output->initial_rotation;
> -                   if (xf86ModeWidth(mode, r) == pref_width &&
> -                           xf86ModeHeight(mode, r) == pref_height) {
> +               /*
> +                * First see if the preferred mode matches on the next
> +                * output as well.  This catches the common case of identical
> +                * monitors and makes sure they all have the same timings
> +                * and refresh.  If that fails, we fall back to trying to
> +                * match just width & height.
> +                */
> +               mode = xf86OutputHasPreferredMode(output, pref_width,
> +                                                 pref_height);
> +               if (mode && xf86ModesEqual(mode, preferred[p])) {
>                        preferred[o] = mode;
>                        match = TRUE;
> -                   }
> +               } else {
> +                       for (mode = output->probed_modes; mode;
> +                            mode = mode->next) {
> +                               Rotation r = output->initial_rotation;
> +                               if (xf86ModeWidth(mode, r) == pref_width &&
> +                                   xf86ModeHeight(mode, r) == pref_height) {
> +                                       preferred[o] = mode;
> +                                       match = TRUE;
> +                               }
> +                       }
>                }
>
>                all_match &= match;
> --
> 1.7.4.1
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>


More information about the xorg-devel mailing list