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;
|
||||
}
|
||||
|
||||
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. */
|
||||
|
||||
if (timing->interlaced)
|
||||
Mode->Flags |= V_INTERLACE;
|
||||
DDCModeDoInterlaceQuirks(Mode);
|
||||
|
||||
if (quirks & DDC_QUIRK_DETAILED_SYNC_PP)
|
||||
Mode->Flags |= V_PVSYNC | V_PHSYNC;
|
||||
|
|
Loading…
Reference in New Issue