open-src/xserver/xorg/6535006.patch
author Alan Coopersmith <Alan.Coopersmith@Sun.COM>
Thu, 15 Jan 2009 12:55:00 -0800
changeset 606 068c11b419c9
parent 154 ae2bd8710ae2
child 705 24ca414edbff
permissions -rw-r--r--
6582489 X11R7.4: Xorg server 1.5.3, Mesa 7.2, and associated driver updates Includes changes contributed by Liang, Kan <[email protected]>: - G41 support patches - DRM_CAS in libdrm type error can cause deadlock and hang the glxgears. Includes changes contributed by Martin Bochnig <[email protected]>: - Make SUNWxorg-mesa package platform-clean

diff -urp -x '*~' -x '*.orig' hw/xfree86/common/xf86Mode.c hw/xfree86/common/xf86Mode.c
--- hw/xfree86/common/xf86Mode.c	2008-09-24 20:23:48.393454000 -0700
+++ hw/xfree86/common/xf86Mode.c	2008-09-24 20:24:02.313999000 -0700
@@ -1415,7 +1415,45 @@ xf86ValidateModes(ScrnInfoPtr scrp, Disp
 	virtX = virtualX;
 	virtY = virtualY;
 	scrp->virtualFrom = X_CONFIG;
-    } else if (!modeNames || !*modeNames) {
+    } 
+
+    if  ((modeNames == NULL) || (*modeNames == NULL)) {
+	if (UseDefaultRate) {
+	    modeNames = xnfcalloc(2, sizeof(char *));
+	    modeNames[0] = strdup("1024x768");
+	    modeNames[1] = NULL;
+	} else {
+	    char *mode_pref = NULL;
+	    const int types[] = {
+            	M_T_BUILTIN | M_T_PREFERRED,
+            	M_T_USERDEF | M_T_PREFERRED,
+            	M_T_DRIVER | M_T_PREFERRED
+		};
+	    const int ntypes = sizeof(types) / sizeof(int);
+	    int n, type;
+	    DisplayModePtr modes = scrp->modePool ? scrp->modePool : availModes;
+
+	    for (n = 0; n < ntypes; n++) {
+	        type = types[n];
+		
+	    	for (p = modes;  p != NULL;  p = p->next) {
+	    	    if ((p->type & type) == type) {
+		    	mode_pref = strdup(p->name);
+		    	break;
+	    	    }
+	    	}
+	    	if (mode_pref)
+		    break;
+	    }
+	    if (mode_pref) {
+	    	modeNames = xnfcalloc(2, sizeof(char *));
+	    	modeNames[0] = strdup(mode_pref);
+	    	modeNames[1] = NULL;
+	    }
+	}
+    }
+
+    if ((virtualY <= 0) && (!modeNames || !*modeNames)) {
 	/* No virtual size given in the config, try to infer */
 	/* XXX this doesn't take m{in,ax}Pitch into account; oh well */
 	inferred_virtual = inferVirtualSize(scrp, availModes, &virtX, &virtY);
@@ -1500,12 +1538,7 @@ xf86ValidateModes(ScrnInfoPtr scrp, Disp
 	xf86DeleteMode(&scrp->modes, scrp->modes);
     endp = &scrp->modes;
     last = NULL;
-    if (UseDefaultRate && ((modeNames == NULL) || (*modeNames == NULL))) {
-	modeNames = xnfcalloc(2, sizeof(char *));
-	modeNames[0] = strdup("1024x768");
-	modeNames[1] = NULL;
-    }
-    if (modeNames != NULL) {
+    if ((modeNames != NULL) && (*modeNames != NULL)) {
 	for (i = 0; modeNames[i] != NULL; i++) {
 	    userModes = TRUE;
 	    new = xnfcalloc(1, sizeof(DisplayModeRec));