[PATCHv2] modesetting: Add common widescreen resolutions

Alex Deucher alexdeucher at gmail.com
Mon Feb 22 16:41:06 UTC 2016


On Sun, Feb 21, 2016 at 6:12 AM, Adel Gadllah <adel.gadllah at gmail.com> wrote:
> Stolen from the intel ddx driver, see:
> https://cgit.freedesktop.org/xorg/driver/xf86-video-intel/commit/?id=26fd6bec
> https://bugs.freedesktop.org/show_bug.cgi?id=37858
>
> it makes those common modes selectable when using the modesetting driver.
>
> Signed-off-by: Adel Gadllah <adel.gadllah at gmail.com>

NACK.  There's no reason to add this to the modesetting ddx.  Just fix
it in the xserver.  E.g., they should be added to
hw/xfree86/etc/extramodes.c as per
https://bugs.freedesktop.org/show_bug.cgi?id=37858#c4

Alex

> ---
>  hw/xfree86/drivers/modesetting/drmmode_display.c | 107 ++++++++++++++++++++++-
>  1 file changed, 106 insertions(+), 1 deletion(-)
>
> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
> index 0d34ca1..4faabcd 100644
> --- a/hw/xfree86/drivers/modesetting/drmmode_display.c
> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
> @@ -953,6 +953,111 @@ has_panel_fitter(xf86OutputPtr output)
>      return FALSE;
>  }
>
> +static struct pixel_count {
> +       int16_t width, height;
> +} common_16_9[] = {
> +       { 640, 360 },
> +       { 720, 405 },
> +       { 864, 486 },
> +       { 960, 540 },
> +       { 1024, 576 },
> +       { 1280, 720 },
> +       { 1366, 768 },
> +       { 1600, 900 },
> +       { 1920, 1080 },
> +       { 2048, 1152 },
> +       { 2560, 1440 },
> +       { 2880, 1620 },
> +       { 3200, 1800 },
> +       { 3840, 2160 },
> +       { 4096, 2304 },
> +       { 5120, 2880 },
> +       { 7680, 4320 },
> +       { 15360, 8640 },
> +}, common_16_10[] = {
> +       { 1280, 800 },
> +       { 1400, 900 },
> +       { 1680, 1050 },
> +       { 1920, 1200 },
> +       { 2560, 1600 },
> +};
> +
> +static bool
> +drmmode_output_is_duplicate_mode(DisplayModePtr modes, DisplayModePtr m)
> +{
> +       if (m == NULL)
> +               return false;
> +
> +       while (modes) {
> +               if (xf86ModesEqual(modes, m))
> +                       return true;
> +
> +               modes = modes->next;
> +       }
> +
> +       return false;
> +}
> +
> +static DisplayModePtr
> +drmmode_output_get_default_modes(DisplayModePtr preferred)
> +{
> +    DisplayModePtr modes;
> +    int n;
> +
> +    modes = xf86GetDefaultModes();
> +    if (preferred) {
> +               DisplayModePtr m;
> +
> +               /* Add a half-resolution mode useful for large panels */
> +               m = xf86GTFMode(preferred->HDisplay / 2,
> +                               preferred->VDisplay / 2,
> +                               xf86ModeVRefresh(preferred),
> +                               FALSE, FALSE);
> +               if (!drmmode_output_is_duplicate_mode(modes, m))
> +                       modes = xf86ModesAdd(modes, m);
> +               else
> +                       free(m);
> +
> +               if (preferred->VDisplay * 16 > preferred->HDisplay * 9 - preferred->HDisplay / 32 &&
> +                   preferred->VDisplay * 16 < preferred->HDisplay * 9 + preferred->HDisplay / 32) {
> +                       for (n = 0; n < ARRAY_SIZE(common_16_9); n++) {
> +                               if (preferred->HDisplay <= common_16_9[n].width ||
> +                                   preferred->VDisplay <= common_16_9[n].height)
> +                                       break;
> +
> +                               m = xf86GTFMode(common_16_9[n].width,
> +                                               common_16_9[n].height,
> +                                               xf86ModeVRefresh(preferred),
> +                                               FALSE, FALSE);
> +                               if (!drmmode_output_is_duplicate_mode(modes, m))
> +                                       modes = xf86ModesAdd(modes, m);
> +                               else
> +                                       free(m);
> +                       }
> +               }
> +
> +               if (preferred->VDisplay * 16 > preferred->HDisplay * 10 - preferred->HDisplay / 32 &&
> +                   preferred->VDisplay * 16 < preferred->HDisplay * 10 + preferred->HDisplay / 32) {
> +                       for (n = 0; n < ARRAY_SIZE(common_16_10); n++) {
> +                               if (preferred->HDisplay <= common_16_10[n].width ||
> +                                   preferred->VDisplay <= common_16_10[n].height)
> +                                       break;
> +
> +                               m = xf86GTFMode(common_16_10[n].width,
> +                                               common_16_10[n].height,
> +                                               xf86ModeVRefresh(preferred),
> +                                               FALSE, FALSE);
> +                               if (!drmmode_output_is_duplicate_mode(modes, m))
> +                                       modes = xf86ModesAdd(modes, m);
> +                               else
> +                                       free(m);
> +                       }
> +               }
> +       }
> +
> +       return modes;
> +}
> +
>  static DisplayModePtr
>  drmmode_output_add_gtf_modes(xf86OutputPtr output, DisplayModePtr Modes)
>  {
> @@ -978,7 +1083,7 @@ drmmode_output_add_gtf_modes(xf86OutputPtr output, DisplayModePtr Modes)
>      max_vrefresh = max(max_vrefresh, 60.0);
>      max_vrefresh *= (1 + SYNC_TOLERANCE);
>
> -    m = xf86GetDefaultModes();
> +    m = drmmode_output_get_default_modes(preferred);
>      xf86ValidateModesSize(output->scrn, m, max_x, max_y, 0);
>
>      for (i = m; i; i = i->next) {
> --
> 2.5.0
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list