From f62ac3ec39c6593df476985c630e499864c19c72 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 28 Nov 2006 10:31:40 -0800 Subject: [PATCH] Separate DDC mode list creation from MonPtr creation. This will be used by the intel driver, and likely other RandR 1.2 drivers. --- hw/xfree86/ddc/edid_modes.c | 88 +++++++++++++++++++++++-------------- hw/xfree86/ddc/xf86DDC.h | 2 + 2 files changed, 56 insertions(+), 34 deletions(-) diff --git a/hw/xfree86/ddc/edid_modes.c b/hw/xfree86/ddc/edid_modes.c index 25f95ca24..cfc8ddc13 100644 --- a/hw/xfree86/ddc/edid_modes.c +++ b/hw/xfree86/ddc/edid_modes.c @@ -204,32 +204,14 @@ DDCGuessRangesFromModes(int scrnIndex, MonPtr Monitor, DisplayModePtr Modes) } } -/* - * Fill out MonPtr with xf86MonPtr information. - */ -void -xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC) +DisplayModePtr +xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC) { + int preferred, i; DisplayModePtr Modes = NULL, Mode; - int i, clock; - Bool have_hsync = FALSE, have_vrefresh = FALSE; - int preferred; - - if (!Monitor || !DDC) - return; - - Monitor->DDC = DDC; preferred = PREFERRED_TIMING_MODE(DDC->features.msc); - Monitor->widthmm = 10 * DDC->features.hsize; - Monitor->heightmm = 10 * DDC->features.vsize; - - /* If this is a digital display, then we can use reduced blanking */ - if (DDC->features.input_type) - Monitor->reducedblanking = TRUE; - /* Allow the user to also enable this through config */ - /* Add established timings */ Mode = DDCModesFromEstablished(scrnIndex, &DDC->timings1); Modes = xf86ModesAdd(Modes, Mode); @@ -238,12 +220,61 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC) Mode = DDCModesFromStandardTiming(scrnIndex, DDC->timings2); Modes = xf86ModesAdd(Modes, Mode); + for (i = 0; i < DET_TIMINGS; i++) { + struct detailed_monitor_section *det_mon = &DDC->det_mon[i]; + + switch (det_mon->type) { + case DT: + Mode = DDCModeFromDetailedTiming(scrnIndex, + &det_mon->section.d_timings, + preferred); + preferred = 0; + Modes = xf86ModesAdd(Modes, Mode); + break; + case DS_STD_TIMINGS: + Mode = DDCModesFromStandardTiming(scrnIndex, + det_mon->section.std_t); + Modes = xf86ModesAdd(Modes, Mode); + break; + default: + break; + } + } + + return Modes; +} + +/* + * Fill out MonPtr with xf86MonPtr information. + */ +void +xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC) +{ + DisplayModePtr Modes = NULL, Mode; + int i, clock; + Bool have_hsync = FALSE, have_vrefresh = FALSE; + + if (!Monitor || !DDC) + return; + + Monitor->DDC = DDC; + + Monitor->widthmm = 10 * DDC->features.hsize; + Monitor->heightmm = 10 * DDC->features.vsize; + + /* If this is a digital display, then we can use reduced blanking */ + if (DDC->features.input_type) + Monitor->reducedblanking = TRUE; + /* Allow the user to also enable this through config */ + + Modes = xf86DDCGetModes(scrnIndex, DDC); + /* Skip EDID ranges if they were specified in the config file */ have_hsync = (Monitor->nHsync != 0); have_vrefresh = (Monitor->nVrefresh != 0); /* Go through the detailed monitor sections */ - for (i = 0; i < DET_TIMINGS; i++) + for (i = 0; i < DET_TIMINGS; i++) { switch (DDC->det_mon[i].type) { case DS_RANGES: if (!have_hsync) { @@ -278,22 +309,11 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC) if (clock > Monitor->maxPixClock) Monitor->maxPixClock = clock; - break; - case DT: - Mode = DDCModeFromDetailedTiming(scrnIndex, - &DDC->det_mon[i].section.d_timings, - preferred); - preferred = 0; - Modes = xf86ModesAdd(Modes, Mode); - break; - case DS_STD_TIMINGS: - Mode = DDCModesFromStandardTiming(scrnIndex, - DDC->det_mon[i].section.std_t); - Modes = xf86ModesAdd(Modes, Mode); break; default: break; } + } if (Modes) { /* Print Modes */ diff --git a/hw/xfree86/ddc/xf86DDC.h b/hw/xfree86/ddc/xf86DDC.h index 5def97a81..77994715e 100644 --- a/hw/xfree86/ddc/xf86DDC.h +++ b/hw/xfree86/ddc/xf86DDC.h @@ -59,6 +59,8 @@ extern void xf86print_vdif( xf86vdifPtr v ); +DisplayModePtr xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC); + #endif