xf86-video-intel: src/sna/sna_display.c

Chris Wilson ickle at kemper.freedesktop.org
Mon Sep 23 11:40:01 PDT 2013


 src/sna/sna_display.c |   34 ++++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 14 deletions(-)

New commits:
commit 8f54e9d3c43c04be0d405a94ae5a9d8fe8f8d75b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Sep 23 19:34:25 2013 +0100

    sna: Check OPTION_PREFERRED_MODE rather than M_T_USERPREF
    
    During the intial KMS probe, we do not yet have the list of output
    modes, and in particular do not have the list of user preferred modes.
    So, in order to honour the user preferrence, we need to query for any
    preferred mode on the output from the option list.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    Bugzilla: https://bugzilla.novell.com/show_bug.cgi?id=841696

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 0f84402..f54f4de 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3083,6 +3083,20 @@ static void output_set_gamma(xf86OutputPtr output, xf86CrtcPtr crtc) { }
 static void crtc_init_gamma(xf86CrtcPtr crtc) { }
 #endif
 
+static const char *preferred_mode(xf86OutputPtr output)
+{
+	char *mode;
+
+	mode = xf86GetOptValString(output->options, OPTION_PREFERRED_MODE);
+	if (mode)
+		return mode;
+
+	if (output->scrn->display->modes && *output->scrn->display->modes)
+		return *output->scrn->display->modes;
+
+	return NULL;
+}
+
 static bool sna_probe_initial_configuration(struct sna *sna)
 {
 	ScrnInfoPtr scrn = sna->scrn;
@@ -3107,7 +3121,6 @@ static bool sna_probe_initial_configuration(struct sna *sna)
 	/* First scan through all outputs and look for user overrides */
 	for (i = 0; i < config->num_output; i++) {
 		xf86OutputPtr output = config->output[i];
-		DisplayModePtr mode;
 
 		for (j = 0; j < ARRAY_SIZE(user_overrides); j++) {
 			if (xf86GetOptValString(output->options, user_overrides[j])) {
@@ -3118,17 +3131,6 @@ static bool sna_probe_initial_configuration(struct sna *sna)
 				return false;
 			}
 		}
-
-		for (mode = output->probed_modes;
-		     mode && mode->next != output->probed_modes;
-		     mode = mode->next) {
-			if (mode->type & M_T_USERPREF) {
-				DBG(("%s: user mode for %s\n",
-				     __FUNCTION__,
-				     output->name));
-				return false;
-			}
-		}
 	}
 
 	/* Copy the existing modes on each CRTCs */
@@ -3189,6 +3191,11 @@ static bool sna_probe_initial_configuration(struct sna *sna)
 
 			if (crtc->desiredMode.status == MODE_OK) {
 				DisplayModePtr M;
+				const char *pref;
+
+				pref = preferred_mode(output);
+				if (pref && strcmp(pref, crtc->desiredMode.name))
+					return false;
 
 				xf86DrvMsg(scrn->scrnIndex, X_PROBED,
 						"Output %s using initial mode %s on pipe %d\n",
@@ -3199,8 +3206,7 @@ static bool sna_probe_initial_configuration(struct sna *sna)
 				output->crtc = crtc;
 				crtc->enabled = TRUE;
 
-				if (output->mm_width == 0 ||
-						output->mm_height == 0) {
+				if (output->mm_width == 0 || output->mm_height == 0) {
 					output->mm_height = (crtc->desiredMode.VDisplay * 254) / (10*DEFAULT_DPI);
 					output->mm_width = (crtc->desiredMode.HDisplay * 254) / (10*DEFAULT_DPI);
 				}


More information about the xorg-commit mailing list