Hello community, here is the log from the commit of package xorg-x11-driver-video checked in at Sun Aug 6 22:08:07 CEST 2006. -------- --- xorg-x11-driver-video/xorg-x11-driver-video.changes 2006-08-01 12:04:49.000000000 +0200 +++ xorg-x11-driver-video/xorg-x11-driver-video.changes 2006-08-06 16:12:59.000000000 +0200 @@ -1,0 +2,6 @@ +Sun Aug 6 16:12:10 CEST 2006 - sndirsch@suse.de + +- p_i810-refresh.diff: + * refresh rates fixes (Bug #102345) + +------------------------------------------------------------------- New: ---- p_i810-refresh.diff ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xorg-x11-driver-video.spec ++++++ --- /var/tmp/diff_new_pack.tNnw1U/_old 2006-08-06 22:07:49.000000000 +0200 +++ /var/tmp/diff_new_pack.tNnw1U/_new 2006-08-06 22:07:49.000000000 +0200 @@ -15,14 +15,14 @@ BuildRequires: Mesa-devel libdrm-devel pkgconfig xorg-x11-proto-devel xorg-x11-server-sdk URL: http://xorg.freedesktop.org/ Version: 7.1 -Release: 7 +Release: 8 License: X11/MIT BuildRoot: %{_tmppath}/%{name}-%{version}-build Group: System/X11/Servers/XF86_4 Provides: xorg-x11-driver-video-nvidia Obsoletes: xorg-x11-driver-video-nvidia Requires: xorg-x11-server -Summary: Various X.Org video drivers +Summary: X.Org video drivers Source0: xf86-video-apm-X11R7.1-1.1.1.tar.bz2 Source1: xf86-video-ark-X11R7.1-0.6.0.tar.bz2 Source2: xf86-video-ast-X11R7.1-0.81.0.tar.bz2 @@ -85,22 +85,11 @@ Patch14: xf86-video-rendition.diff Patch15: xf86-video-via.diff Patch16: xf86-video-nsc.diff +Patch17: p_i810-refresh.diff %description -This package includes the following X.Org video drivers: - -- ATI (ati, r128, radeon) - -- Intel (i810) - -- Matrox (mga) - -- NVIDIA (nv) - -- SIS (sis) - -- VIA (via) +This package contains X.Org video drivers. @@ -201,12 +190,17 @@ pushd xf86-video-nsc-* %patch16 popd +pushd xf86-video-i810-* +%patch17 +popd %build for dir in xf86-video-nv-* \ + xf86-video-i810-* \ xf86-video-mga-* \ xf86-video-ati-* \ $(ls | grep -v -e xf86-video-impact \ + -e xf86-video-i810 \ -e xf86-video-nv \ -e xf86-video-mga \ -e xf86-video-ati); do @@ -250,6 +244,9 @@ %{_mandir}/man4x/* %changelog -n xorg-x11-driver-video +* Sun Aug 06 2006 - sndirsch@suse.de +- p_i810-refresh.diff: + * refresh rates fixes (Bug #102345) * Tue Aug 01 2006 - sndirsch@suse.de - fixed build of nsc driver by adding -DXFree86Server to CFLAGS * Sat Jul 29 2006 - sndirsch@suse.de ++++++ p_i810-refresh.diff ++++++ diff -u -r src.orig/i830_driver.c src/i830_driver.c --- src.orig/i830_driver.c 2006-08-06 15:41:20.000000000 +0200 +++ src/i830_driver.c 2006-08-06 15:41:33.000000000 +0200 @@ -2002,6 +2002,10 @@ pScrn->monitor->hsync[i].lo = mon_range->min_h; pScrn->monitor->hsync[i].hi = mon_range->max_h; } + } else { + pScrn->monitor->hsync[0].lo = mon_range->min_h; + pScrn->monitor->hsync[0].hi = mon_range->max_h; + pScrn->monitor->nHsync = 1; } if (pScrn->monitor->nVrefresh > 0) { @@ -2019,6 +2023,10 @@ pScrn->monitor->vrefresh[i].lo = mon_range->min_v; pScrn->monitor->vrefresh[i].hi = mon_range->max_v; } + } else { + pScrn->monitor->vrefresh[0].lo = mon_range->min_v; + pScrn->monitor->vrefresh[0].hi = mon_range->max_v; + pScrn->monitor->nVrefresh = 1; } return mon_range->max_clock; @@ -2093,7 +2101,7 @@ int i, n; int DDCclock = 0; char *s; - DisplayModePtr p, pMon; + DisplayModePtr p; pointer pDDCModule = NULL, pVBEModule = NULL; Bool enable; const char *chipname; @@ -2119,7 +2127,7 @@ I830BIOSProbeDDC(pScrn, pEnt->index); return TRUE; } - + /* The vgahw module should be loaded here when needed */ if (!xf86LoadSubModule(pScrn, "vgahw")) return FALSE; @@ -3267,11 +3275,14 @@ return FALSE; } + if (pScrn->modes == NULL) + return FALSE; + +#if 1 /* Only use this if we've got DDC available */ if (DDCclock > 0) { + DisplayModePtr p, pMon; p = pScrn->modes; - if (p == NULL) - return FALSE; do { int Clock = 100000000; /* incredible value */ @@ -3297,6 +3308,7 @@ p = p->next; } while (p != NULL && p != pScrn->modes); } +#endif xf86PruneDriverModes(pScrn); @@ -5383,9 +5395,9 @@ { I830Ptr pI830 = I830PTR(pScrn); pointer pDDCModule = NULL; - DisplayModePtr p, pMon; int memsize; int DDCclock = 0; + DisplayModePtr p; int displayWidth = pScrn->displayWidth; int curHDisplay = pScrn->currentMode->HDisplay; int curVDisplay = pScrn->currentMode->VDisplay; @@ -5434,20 +5446,23 @@ else memsize = pScrn->videoRam; - VBEValidateModes(pScrn, pScrn->monitor->Modes, pScrn->display->modes, NULL, + VBEValidateModes(pScrn, NULL, pScrn->display->modes, NULL, NULL, 0, MAX_DISPLAY_PITCH, 1, 0, MAX_DISPLAY_HEIGHT, pScrn->display->virtualX, pScrn->display->virtualY, memsize, LOOKUP_BEST_REFRESH); + if (pScrn->modes == NULL) + return FALSE; + if (DDCclock > 0) { p = pScrn->modes; - if (p == NULL) - return FALSE; do { int Clock = 100000000; /* incredible value */ + DisplayModePtr pMon; + if (p->status == MODE_OK) { for (pMon = pScrn->monitor->Modes; pMon != NULL; pMon = pMon->next) { if ((pMon->HDisplay != p->HDisplay) || @@ -5483,10 +5498,9 @@ * This allows VT switching to continue happily when not disconnecting * and reconnecting monitors */ - pScrn->currentMode = pScrn->modes; - p = pScrn->modes; - if (p == NULL) + if (pScrn->modes == NULL) return FALSE; + pScrn->currentMode = p = pScrn->modes; do { if ((p->HDisplay == curHDisplay) && (p->VDisplay == curVDisplay) && diff -u -r src.orig/i830_modes.c src/i830_modes.c --- src.orig/i830_modes.c 2006-08-06 15:41:21.000000000 +0200 +++ src/i830_modes.c 2006-08-06 15:54:17.000000000 +0200 @@ -1,4 +1,6 @@ +/* #define DEBUG 1 */ #define DEBUG_VERB 2 +#define DEBUG_VERB_HI 5 /* * Copyright © 2002 David Dawes * @@ -69,8 +71,8 @@ extern const int i830refreshes[]; static DisplayModePtr -I830GetGTF (int h_pixels, int v_lines, float freq, - int interlaced, int margins) +I830GetGTFVrefresh (int h_pixels, int v_lines, float freq, + int interlaced, int margins, DisplayModePtr m) { float h_pixels_rnd; float v_lines_rnd; @@ -99,9 +101,11 @@ float h_front_porch; float v_odd_front_porch_lines; char modename[20]; - DisplayModePtr m; - m = xnfcalloc(sizeof(DisplayModeRec), 1); + if (m == NULL) + m = xnfcalloc(sizeof(DisplayModeRec), 1); + else if (m->name) + xfree(m->name); /* 1. In order to give correct results, the number of horizontal @@ -357,6 +361,150 @@ } static DisplayModePtr +I830GetGTFClock (int h_pixels, int v_lines, float Clock, + int interlaced, int margins, + DisplayModePtr m) +{ + float h_pixels_rnd; + float v_lines_rnd; + float top_margin; + float bottom_margin; + float interlace; + float vsync_plus_bp; + float v_back_porch; + float total_v_lines; + float h_period; + float v_field_rate; + float v_frame_rate; + float left_margin; + float right_margin; + float total_active_pixels; + float ideal_h_period; + float ideal_duty_cycle; + float h_blank; + float total_pixels; + float pixel_freq; + float h_freq; + + float h_sync; + float h_front_porch; + float v_odd_front_porch_lines; + char modename[20]; + + if (m == NULL) + m = xnfcalloc(sizeof(DisplayModeRec), 1); + else if (m->name) + xfree(m->name); + + /* 1. */ + h_pixels_rnd = rint((float) h_pixels / CELL_GRAN) * CELL_GRAN; + + /* 2. */ + v_lines_rnd = interlaced ? + rint((float) v_lines) / 2.0 : + rint((float) v_lines); + + /* 3. */ + pixel_freq = 1/Clock; + + /* 4. */ + left_margin = margins + ? ( rint(MARGIN_PERCENT / 100.0 * h_pixels_rnd / CELL_GRAN) + * CELL_GRAN) + : 0; + + /* 5. */ + right_margin = margins + ? ( rint(MARGIN_PERCENT / 100.0 * h_pixels_rnd / CELL_GRAN) + * CELL_GRAN) + : 0; + + /* 6. */ + total_active_pixels = h_pixels_rnd + right_margin + left_margin; + + /* 7. */ + ideal_h_period = ((C_PRIME - 100.0) + + (sqrt((pow(100.0 - C_PRIME, 2.0)) + + (0.4 * M_PRIME * (total_active_pixels + + left_margin + right_margin) + / pixel_freq))))/2.0/M_PRIME*1000.0; + + /* 8. */ + ideal_duty_cycle = C_PRIME - (M_PRIME * ideal_h_period / 1000.0); + + /* 9. */ + h_blank = rint(total_active_pixels * ideal_duty_cycle / + (100 - ideal_duty_cycle)/(2 * CELL_GRAN)) + * (2 * CELL_GRAN); + + /* 10. */ + total_pixels = total_active_pixels + h_blank; + + /* 11. */ + h_freq = pixel_freq / total_pixels * 1000.0; + + /* 12. */ + h_period = 1000.0 / h_freq; + + /* 13. */ + top_margin = margins ? rint(MARGIN_PERCENT/100.0*v_lines_rnd) : 0.0; + + /* 14. */ + bottom_margin = margins ? rint(MARGIN_PERCENT/100.0*v_lines_rnd) : 0.0; + + /* 15. */ + interlace = interlaced ? 0.5 : 0.0; + + /* 16. */ + vsync_plus_bp = rint(MIN_VSYNC_PLUS_BP * h_freq / 1000.0); + + /* 17. */ + v_back_porch = vsync_plus_bp - V_SYNC_RQD; + + /* 18. */ + total_v_lines = v_lines_rnd + top_margin + bottom_margin + vsync_plus_bp + + interlace + MIN_PORCH; + + /* 19. */ + v_field_rate = h_freq / total_v_lines * 1000.0; + + /* 20. */ + v_frame_rate = interlaced ? v_field_rate / 2.0 : v_field_rate; + + /* Stage 2 */ + + /* 17. */ + h_sync = rint(H_SYNC_PERCENT/100.0 * total_pixels / CELL_GRAN) * CELL_GRAN; + + /* 18. */ + h_front_porch = (h_blank / 2.0) - h_sync; + + /* 36. */ + v_odd_front_porch_lines = MIN_PORCH + interlace; + + m->HDisplay = (int) (h_pixels_rnd); + m->HSyncStart = (int) (h_pixels_rnd + h_front_porch); + m->HSyncEnd = (int) (h_pixels_rnd + h_front_porch + h_sync); + m->HTotal = (int) (total_pixels); + + m->VDisplay = (int) (v_lines_rnd); + m->VSyncStart = (int) (v_lines_rnd + v_odd_front_porch_lines); + m->VSyncEnd = (int) (int) (v_lines_rnd + v_odd_front_porch_lines + V_SYNC_RQD); + m->VTotal = (int) (total_v_lines); + + m->Clock = (int)(pixel_freq * 1000); + m->SynthClock = m->Clock; + m->HSync = h_freq; + m->VRefresh = v_frame_rate; + + sprintf(modename, "%dx%d", m->HDisplay,m->VDisplay); + m->name = xnfstrdup(modename); + + return (m); +} + + +static DisplayModePtr CheckMode(ScrnInfoPtr pScrn, vbeInfoPtr pVbe, VbeInfoBlock *vbe, int id, int flags) { @@ -461,22 +609,63 @@ for (vrefresh = pScrn->monitor->vrefresh[i].hi; vrefresh >= pScrn->monitor->vrefresh[i].lo; vrefresh -= 1.0f) { - if (vrefresh != (float)0.0f) { float best_vrefresh; int int_vrefresh; - + int clock; + /* Find the best refresh for the Intel chipsets */ int_vrefresh = I830GetBestRefresh(pScrn, (int)vrefresh); best_vrefresh = (float)i830refreshes[int_vrefresh]; + if (best_vrefresh > pScrn->monitor->vrefresh[i].hi + || best_vrefresh < pScrn->monitor->vrefresh[i].lo) + continue; + /* Now, grab the best mode from the available refresh */ - pMode = I830GetGTF(mode->XResolution, mode->YResolution, - best_vrefresh, 0, 0); - + pMode = I830GetGTFVrefresh(mode->XResolution, + mode->YResolution, + best_vrefresh, 0, 0, NULL); + /* XXX May not have this. */ + clock = VBEGetPixelClock(pVbe, id, + pMode->Clock * 1000); + if (clock) { + int tolerance; + + pMode = I830GetGTFClock(mode->XResolution, + mode->YResolution, + clock, 0, 0, pMode); + /* allow 5 percent deviation */ +#define TOLERANCE 5 + tolerance = pMode->Clock * TOLERANCE / 100; + if (best_vrefresh + tolerance > pMode->VRefresh + || best_vrefresh - tolerance < pMode->Clock) + continue; +#ifdef DEBUG + ErrorF("Setting clock %.2fMHz, closest is %.2fMHz\n", + (double)pMode->Clock / 1000.0, + (double)clock / 1000000.0); +#endif + } pMode->type = M_T_BUILTIN; status = xf86CheckModeForMonitor(pMode, pScrn->monitor); +#ifdef DEBUG + ErrorF("Name: %s %i %i %i %i - " + " %i %i %i %i %.2f MHz " + "Sync: %.2f kHz Refresh: %.2f Hz " + "--- attempted vrefresh: %f best: %f Status: %i\n", + pMode->name, pMode->HDisplay, pMode->HSyncStart, + pMode->HSyncEnd, pMode->HTotal, pMode->VDisplay, + pMode->VSyncStart,pMode->VSyncEnd,pMode->VTotal, + (double)pMode->Clock/1000.0, + (double)(pMode->Clock/pMode->HTotal), + (double)(pMode->Clock*1000.0 + /pMode->HTotal/pMode->VTotal), + vrefresh, + best_vrefresh, + status); +#endif if (status == MODE_OK) { if (major >= 3) { if (pMode->Clock * 1000 <= mode->MaxPixelClock) @@ -497,66 +686,79 @@ } } - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, "Mode: %x (%dx%d)\n", id, mode->XResolution, mode->YResolution); - xf86ErrorFVerb(DEBUG_VERB, + if (modeOK) + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO,DEBUG_VERB, + "GTF Video Modeline: Name: %s %i %i %i %i - " + " %i %i %i %i %.2f MHz " + "Sync: %.2f kHz Refresh: %.2f Hz\n", + pMode->name, pMode->HDisplay, pMode->HSyncStart, + pMode->HSyncEnd, pMode->HTotal, pMode->VDisplay, + pMode->VSyncStart,pMode->VSyncEnd,pMode->VTotal, + (double)pMode->Clock/1000.0, + (double)(pMode->Clock/pMode->HTotal), + (double)(pMode->Clock*1000.0 + /pMode->HTotal/pMode->VTotal)); + + xf86ErrorFVerb(DEBUG_VERB_HI, " ModeAttributes: 0x%x\n", mode->ModeAttributes); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " WinAAttributes: 0x%x\n", mode->WinAAttributes); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " WinBAttributes: 0x%x\n", mode->WinBAttributes); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " WinGranularity: %d\n", mode->WinGranularity); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " WinSize: %d\n", mode->WinSize); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " WinASegment: 0x%x\n", mode->WinASegment); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " WinBSegment: 0x%x\n", mode->WinBSegment); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " WinFuncPtr: 0x%lx\n", (unsigned long)mode->WinFuncPtr); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " BytesPerScanline: %d\n", mode->BytesPerScanline); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " XResolution: %d\n", mode->XResolution); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " YResolution: %d\n", mode->YResolution); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " XCharSize: %d\n", mode->XCharSize); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " YCharSize: %d\n", mode->YCharSize); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " NumberOfPlanes: %d\n", mode->NumberOfPlanes); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " BitsPerPixel: %d\n", mode->BitsPerPixel); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " NumberOfBanks: %d\n", mode->NumberOfBanks); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " MemoryModel: %d\n", mode->MemoryModel); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " BankSize: %d\n", mode->BankSize); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " NumberOfImages: %d\n", mode->NumberOfImages); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " RedMaskSize: %d\n", mode->RedMaskSize); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " RedFieldPosition: %d\n", mode->RedFieldPosition); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " GreenMaskSize: %d\n", mode->GreenMaskSize); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " GreenFieldPosition: %d\n", mode->GreenFieldPosition); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " BlueMaskSize: %d\n", mode->BlueMaskSize); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " BlueFieldPosition: %d\n", mode->BlueFieldPosition); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " RsvdMaskSize: %d\n", mode->RsvdMaskSize); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " RsvdFieldPosition: %d\n", mode->RsvdFieldPosition); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " DirectColorModeInfo: %d\n", mode->DirectColorModeInfo); if (major >= 2) { - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " PhysBasePtr: 0x%lx\n", (unsigned long)mode->PhysBasePtr); if (major >= 3) { @@ -566,21 +768,21 @@ " BnkNumberOfImagePages: %d\n", mode->BnkNumberOfImagePages); xf86ErrorFVerb(DEBUG_VERB, " LinNumberOfImagePages: %d\n", mode->LinNumberOfImagePages); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " LinRedMaskSize: %d\n", mode->LinRedMaskSize); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " LinRedFieldPosition: %d\n", mode->LinRedFieldPosition); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " LinGreenMaskSize: %d\n", mode->LinGreenMaskSize); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " LinGreenFieldPosition: %d\n", mode->LinGreenFieldPosition); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " LinBlueMaskSize: %d\n", mode->LinBlueMaskSize); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " LinBlueFieldPosition: %d\n", mode->LinBlueFieldPosition); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " LinRsvdMaskSize: %d\n", mode->LinRsvdMaskSize); - xf86ErrorFVerb(DEBUG_VERB, + xf86ErrorFVerb(DEBUG_VERB_HI, " LinRsvdFieldPosition: %d\n", mode->LinRsvdFieldPosition); xf86ErrorFVerb(DEBUG_VERB, " MaxPixelClock: %ld\n", (unsigned long) @@ -668,8 +870,6 @@ pMode = pScrn->modes; do { - int clock; - data = (VbeModeInfoData*)pMode->Private; data->block = xcalloc(sizeof(VbeCRTCInfoBlock), 1); data->block->HorizontalTotal = pMode->HTotal; @@ -681,15 +881,7 @@ data->block->Flags = ((pMode->Flags & V_NHSYNC) ? CRTC_NHSYNC : 0) | ((pMode->Flags & V_NVSYNC) ? CRTC_NVSYNC : 0); data->block->PixelClock = pMode->Clock * 1000; - /* XXX May not have this. */ - clock = VBEGetPixelClock(pVbe, data->mode, data->block->PixelClock); - if (clock) - data->block->PixelClock = clock; -#ifdef DEBUG - ErrorF("Setting clock %.2fMHz, closest is %.2fMHz\n", - (double)data->block->PixelClock / 1000000.0, - (double)clock / 1000000.0); -#endif + data->mode |= (1 << 11); if (pMode->VRefresh != 0) { data->block->RefreshRate = pMode->VRefresh * 100; @@ -701,13 +893,14 @@ "Attempting to use %2.2fHz refresh for mode \"%s\" (%x)\n", (float)(((double)(data->block->PixelClock) / (double)(pMode->HTotal * pMode->VTotal))), pMode->name, data->mode); #ifdef DEBUG - ErrorF("Video Modeline: ID: 0x%x Name: %s %i %i %i %i - " - " %i %i %i %i %.2f MHz Refresh: %.2f Hz\n", - data->mode, pMode->name, pMode->HDisplay, pMode->HSyncStart, - pMode->HSyncEnd, pMode->HTotal, pMode->VDisplay, - pMode->VSyncStart,pMode->VSyncEnd,pMode->VTotal, - (double)data->block->PixelClock/1000000.0, - (double)data->block->RefreshRate/100); + ErrorF("Video Modeline: ID: 0x%x Name: %s %i %i %i %i - " + " %i %i %i %i %.2f MHz Sync: %.2f kHz Refresh: %.2f Hz\n", + data->mode, pMode->name, pMode->HDisplay, pMode->HSyncStart, + pMode->HSyncEnd, pMode->HTotal, pMode->VDisplay, + pMode->VSyncStart,pMode->VSyncEnd,pMode->VTotal, + (double)data->block->PixelClock/1000000.0, + (double)(data->block->PixelClock/pMode->HTotal)/1000.0, + (double)data->block->RefreshRate/100); #endif pMode = pMode->next; } while (pMode != pScrn->modes); ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun...