From: "Erich E. Hoover" Subject: winex11.drv: Update the check for broken nVidia RandR to test for the number of resolutions instead of the number of modes (try 2). Message-Id: Date: Tue, 13 Jan 2015 16:51:47 -0700 This version has been updated with suggestions from Henri Verbeet to simplify the test for the number of resolutions (since we only care about the case where there's only one). Best, Erich From 590ab2d6042e4af966bae9dc9f8ada3d68d9825d Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Sat, 9 Aug 2014 13:15:09 -0600 Subject: winex11.drv: Update the check for broken nVidia RandR to test for the number of resolutions instead of the number of modes. --- dlls/winex11.drv/xrandr.c | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index fc09020..e9670c3 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -386,6 +386,7 @@ static XRRCrtcInfo *xrandr12_get_primary_crtc_info( XRRScreenResources *resource static int xrandr12_init_modes(void) { + unsigned int only_one_resolution = 1, mode_count; XRRScreenResources *resources; XRROutputInfo *output_info; XRRCrtcInfo *crtc_info; @@ -434,21 +435,6 @@ static int xrandr12_init_modes(void) goto done; } - /* Recent (304.64, possibly earlier) versions of the nvidia driver only - * report a DFP's native mode through RandR 1.2 / 1.3. Standard DMT modes - * are only listed through RandR 1.0 / 1.1. This is completely useless, - * but NVIDIA considers this a feature, so it's unlikely to change. The - * best we can do is to fall back to RandR 1.0 and encourage users to - * consider more cooperative driver vendors when we detect such a - * configuration. */ - if (output_info->nmode == 1 && XQueryExtension( gdi_display, "NV-CONTROL", &i, &j, &ret )) - { - ERR_(winediag)("Broken NVIDIA RandR detected, falling back to RandR 1.0. " - "Please consider using the Nouveau driver instead.\n"); - ret = -1; - goto done; - } - if (!(xrandr12_modes = HeapAlloc( GetProcessHeap(), 0, sizeof(*xrandr12_modes) * output_info->nmode ))) { ERR("Failed to allocate xrandr mode info array.\n"); @@ -480,6 +466,32 @@ static int xrandr12_init_modes(void) } } + mode_count = X11DRV_Settings_GetModeCount(); + for (i = 1; i < mode_count; ++i) + { + if (dd_modes[i].width != dd_modes[0].width || dd_modes[i].height != dd_modes[0].height) + { + only_one_resolution = 0; + break; + } + } + + /* Recent (304.64, possibly earlier) versions of the nvidia driver only + * report a DFP's native mode through RandR 1.2 / 1.3. Standard DMT modes + * are only listed through RandR 1.0 / 1.1. This is completely useless, + * but NVIDIA considers this a feature, so it's unlikely to change. The + * best we can do is to fall back to RandR 1.0 and encourage users to + * consider more cooperative driver vendors when we detect such a + * configuration. */ + if (only_one_resolution && XQueryExtension( gdi_display, "NV-CONTROL", &i, &j, &ret )) + { + ERR_(winediag)("Broken NVIDIA RandR detected, falling back to RandR 1.0. " + "Please consider using the Nouveau driver instead.\n"); + ret = -1; + HeapFree( GetProcessHeap(), 0, xrandr12_modes ); + goto done; + } + X11DRV_Settings_AddDepthModes(); ret = 0; -- 1.9.1