[PATCH 2/2] Be forgiving of character-cell size mismatches in mode sizes

Matt Turner mattst88 at gmail.com
Mon Feb 14 10:12:23 PST 2011


On Mon, Feb 14, 2011 at 5:45 PM, Adam Jackson <ajax at redhat.com> wrote:
> Signed-off-by: Adam Jackson <ajax at redhat.com>
> ---
>  src/vesa.c |   28 +++++++++++++++++++++++++---
>  1 files changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/src/vesa.c b/src/vesa.c
> index ef01881..61d3550 100644
> --- a/src/vesa.c
> +++ b/src/vesa.c
> @@ -317,6 +317,30 @@ VESASetModeParameters(vbeInfoPtr pVbe, DisplayModePtr vbemode,
>                                (double)(ddcmode->HTotal * ddcmode->VTotal));
>  }
>
> +/*
> + * Despite that VBE gives you pixel granularity for mode sizes, some BIOSes
> + * think they can only give sizes in multiples of character cells; and
> + * indeed, the reference CVT and GTF formulae only give results where
> + * (h % 8) == 0.  Whatever, let's just try to cope.  What we're looking for
> + * here is cases where the display says 1366x768 and the BIOS says 1360x768.
> + */
> +static Bool
> +vesaModesCloseEnough(DisplayModePtr edid, DisplayModePtr vbe)
> +{
> +    if (!(edid->type & M_T_DRIVER))
> +       return FALSE;
> +
> +    /* never seen a height granularity... */
> +    if (edid->VDisplay != vbe->VDisplay)
> +       return FALSE;
> +
> +    if (edid->HDisplay >= vbe->HDisplay &&
> +       (edid->HDisplay & ~7) == (vbe->HDisplay & ~7))
> +       return TRUE;
> +
> +    return FALSE;
> +}
> +
>  static ModeStatus
>  VESAValidMode(int scrn, DisplayModePtr p, Bool flag, int pass)
>  {
> @@ -358,9 +382,7 @@ VESAValidMode(int scrn, DisplayModePtr p, Bool flag, int pass)
>         */
>        if (pScrn->monitor->DDC) {
>            for (mode = pScrn->monitor->Modes; mode; mode = mode->next) {
> -               if (mode->type & M_T_DRIVER &&
> -                       mode->HDisplay == p->HDisplay &&
> -                       mode->VDisplay == p->VDisplay) {
> +               if (vesaModesCloseEnough(mode, p)) {
>                    if (xf86CheckModeForMonitor(mode, mon) == MODE_OK) {
>                        found = 1;
>                        break;
> --
> 1.7.3.5

This looks like a good idea.

For both patches:
Reviewed-by: Matt Turner <mattst88 at gmail.com>


More information about the xorg-devel mailing list