EDID: Fix interlaced detailed timings to be frame size, not field size
Signed-off-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
parent
fb86433d89
commit
25236d19e6
|
@ -502,6 +502,45 @@ DDCModesFromStandardTiming(struct std_timings *timing, ddc_quirk_t quirks,
|
||||||
return Modes;
|
return Modes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
DDCModeDoInterlaceQuirks(DisplayModePtr mode)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* EDID is delightfully ambiguous about how interlaced modes are to be
|
||||||
|
* encoded. X's internal representation is of frame height, but some
|
||||||
|
* HDTV detailed timings are encoded as field height.
|
||||||
|
*
|
||||||
|
* The format list here is from CEA, in frame size. Technically we
|
||||||
|
* should be checking refresh rate too. Whatever.
|
||||||
|
*/
|
||||||
|
static const struct {
|
||||||
|
int w, h;
|
||||||
|
} cea_interlaced[] = {
|
||||||
|
{ 1920, 1080 },
|
||||||
|
{ 720, 480 },
|
||||||
|
{ 1440, 480 },
|
||||||
|
{ 2880, 480 },
|
||||||
|
{ 720, 576 },
|
||||||
|
{ 1440, 576 },
|
||||||
|
{ 2880, 576 },
|
||||||
|
};
|
||||||
|
static const int n_modes = sizeof(cea_interlaced)/sizeof(cea_interlaced[0]);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < n_modes; i++) {
|
||||||
|
if ((mode->HDisplay == cea_interlaced[i].w) &&
|
||||||
|
(mode->VDisplay == cea_interlaced[i].h / 2)) {
|
||||||
|
mode->VDisplay *= 2;
|
||||||
|
mode->VSyncStart *= 2;
|
||||||
|
mode->VSyncEnd *= 2;
|
||||||
|
mode->VTotal *= 2;
|
||||||
|
mode->VTotal |= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mode->Flags |= V_INTERLACE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -569,7 +608,7 @@ DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing,
|
||||||
/* We ignore h/v_size and h/v_border for now. */
|
/* We ignore h/v_size and h/v_border for now. */
|
||||||
|
|
||||||
if (timing->interlaced)
|
if (timing->interlaced)
|
||||||
Mode->Flags |= V_INTERLACE;
|
DDCModeDoInterlaceQuirks(Mode);
|
||||||
|
|
||||||
if (quirks & DDC_QUIRK_DETAILED_SYNC_PP)
|
if (quirks & DDC_QUIRK_DETAILED_SYNC_PP)
|
||||||
Mode->Flags |= V_PVSYNC | V_PHSYNC;
|
Mode->Flags |= V_PVSYNC | V_PHSYNC;
|
||||||
|
|
Loading…
Reference in New Issue