[pkg-fso-commits] [SCM] xf86-video-glamo, SMedia Glamo video driver for X.Org branch, master, updated. upstream/0.0.0+20091108.git9918e082-8-g16af3c0

Thomas White taw at bitwiz.org.uk
Sun Mar 6 09:14:10 UTC 2011


The following commit has been merged in the master branch:
commit cd91a3c251dfd0b9d4e1230b6f9dd498e46e8fb6
Author: Thomas White <taw at bitwiz.org.uk>
Date:   Sun Apr 25 23:19:16 2010 +0200

    Support newer modesetting callbacks to allow rotation

diff --git a/src/glamo-kms-crtc.c b/src/glamo-kms-crtc.c
index e00c41e..4df6b87 100644
--- a/src/glamo-kms-crtc.c
+++ b/src/glamo-kms-crtc.c
@@ -80,6 +80,118 @@ static void crtc_dpms(xf86CrtcPtr crtc, int mode)
 }
 
 
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,5,0,0,0)
+
+
+static Bool crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
+                                Rotation rot, int x, int y)
+{
+	ScrnInfoPtr scrn = crtc->scrn;
+	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+	DisplayModeRec saved_mode;
+	int saved_x, saved_y;
+	Rotation saved_rotation;
+	GlamoPtr pGlamo = GlamoPTR(crtc->scrn);
+	Bool ret = FALSE;
+	int i;
+	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
+	xf86OutputPtr output = config->output[config->compat_output];
+	drmModeConnectorPtr drm_connector = output->driver_private;
+	struct crtc_private *crtcp = crtc->driver_private;
+	drmModeCrtcPtr drm_crtc = crtcp->drm_crtc;
+	drmModeModeInfo drm_mode;
+
+	crtc->enabled = xf86CrtcInUse (crtc);
+
+	if ( !crtc->enabled ) return TRUE;
+
+	saved_mode = crtc->mode;
+	saved_x = crtc->x;
+	saved_y = crtc->y;
+	saved_rotation = crtc->rotation;
+
+	crtc->mode = *mode;
+	crtc->x = x;
+	crtc->y = y;
+	crtc->rotation = rot;
+
+	crtc->funcs->dpms(crtc, DPMSModeOff);
+	for ( i=0; i<xf86_config->num_output; i++ ) {
+		xf86OutputPtr output = xf86_config->output[i];
+		if (output->crtc != crtc)continue;
+		output->funcs->prepare(output);
+	}
+
+	/* Set the mode... */
+	drm_mode.clock = mode->Clock * 1000.0;
+	if ( (rot == RR_Rotate_0) || (rot == RR_Rotate_180) ) {
+		drm_mode.hdisplay = mode->HDisplay;
+		drm_mode.hsync_start = mode->HSyncStart;
+		drm_mode.hsync_end = mode->HSyncEnd;
+		drm_mode.htotal = mode->HTotal;
+		drm_mode.vdisplay = mode->VDisplay;
+		drm_mode.vsync_start = mode->VSyncStart;
+		drm_mode.vsync_end = mode->VSyncEnd;
+		drm_mode.vtotal = mode->VTotal;
+	} else if ( (rot == RR_Rotate_90) || (rot == RR_Rotate_270) ) {
+		drm_mode.hdisplay = mode->VDisplay;
+		drm_mode.hsync_start = mode->VSyncStart;
+		drm_mode.hsync_end = mode->VSyncEnd;
+		drm_mode.htotal = mode->VTotal;
+		drm_mode.vdisplay = mode->HDisplay;
+		drm_mode.vsync_start = mode->HSyncStart;
+		drm_mode.vsync_end = mode->HSyncEnd;
+		drm_mode.vtotal = mode->HTotal;
+	} else {
+		drm_mode.hdisplay = mode->HDisplay;
+		drm_mode.hsync_start = mode->HSyncStart;
+		drm_mode.hsync_end = mode->HSyncEnd;
+		drm_mode.htotal = mode->HTotal;
+		drm_mode.vdisplay = mode->VDisplay;
+		drm_mode.vsync_start = mode->VSyncStart;
+		drm_mode.vsync_end = mode->VSyncEnd;
+		drm_mode.vtotal = mode->VTotal;
+		ErrorF("Couldn't determine rotation\n");
+	}
+	drm_mode.flags = mode->Flags;
+	drm_mode.hskew = mode->HSkew;
+	drm_mode.vscan = mode->VScan;
+	drm_mode.vrefresh = mode->VRefresh;
+	if ( !mode->name ) xf86SetModeDefaultName(mode);
+	strncpy(drm_mode.name, mode->name, DRM_DISPLAY_MODE_LEN);
+	drmModeSetCrtc(pGlamo->drm_fd, drm_crtc->crtc_id, pGlamo->fb_id,
+	                x, y, &drm_connector->connector_id, 1, &drm_mode);
+
+	crtc->funcs->dpms (crtc, DPMSModeOn);
+	for (i = 0; i < xf86_config->num_output; i++){
+		xf86OutputPtr output = xf86_config->output[i];
+		if (output->crtc == crtc) {
+			output->funcs->commit(output);
+#ifdef RANDR_12_INTERFACE
+			if (output->randr_output) {
+				RRPostPendingProperties (output->randr_output);
+			}
+#endif
+		}
+	}
+
+	ret = TRUE;
+	if ( scrn->pScreen ) xf86CrtcSetScreenSubpixelOrder(scrn->pScreen);
+
+	if ( !ret ) {
+		crtc->x = saved_x;
+		crtc->y = saved_y;
+		crtc->rotation = saved_rotation;
+		crtc->mode = saved_mode;
+	}
+
+	return ret;
+}
+
+
+#else /* XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,5,0,0,0) */
+
+
 static Bool crtc_lock(xf86CrtcPtr crtc)
 {
 	return FALSE;
@@ -140,6 +252,8 @@ static void crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode,
 	               &drm_connector->connector_id, 1, &drm_mode);
 }
 
+#endif /* XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,5,0,0,0) */
+
 
 void crtc_load_lut(xf86CrtcPtr crtc)
 {
@@ -185,12 +299,22 @@ static const xf86CrtcFuncsRec crtc_funcs = {
 	.dpms = crtc_dpms,
 	.save = NULL,
 	.restore = NULL,
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,5,0,0,0)
+	.lock = NULL,
+	.unlock = NULL,
+	.mode_fixup = NULL,
+	.prepare = NULL,
+	.mode_set = NULL,
+	.commit = NULL,
+	.set_mode_major = crtc_set_mode_major,
+#else
 	.lock = crtc_lock,
 	.unlock = crtc_unlock,
 	.mode_fixup = crtc_mode_fixup,
 	.prepare = crtc_prepare,
 	.mode_set = crtc_mode_set,
 	.commit = crtc_commit,
+#endif
 	.gamma_set = crtc_gamma_set,
 	.shadow_create = crtc_shadow_create,
 	.shadow_allocate = crtc_shadow_allocate,
diff --git a/src/glamo-kms-driver.c b/src/glamo-kms-driver.c
index 1dce5d8..ce87caa 100644
--- a/src/glamo-kms-driver.c
+++ b/src/glamo-kms-driver.c
@@ -133,10 +133,16 @@ void GlamoKMSAdjustFrame(int scrnIndex, int x, int y, int flags)
 	xf86CrtcPtr crtc = output->crtc;
 
 	if (crtc && crtc->enabled) {
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,5,0,0,0)
+		crtc->funcs->set_mode_major(crtc, pScrn->currentMode,
+		                            crtc->rotation, x, y);
+#else
 		crtc->funcs->mode_set(crtc,
 		                      pScrn->currentMode,
 		                      pScrn->currentMode,
 		                      x, y);
+
+#endif
 		crtc->x = output->initial_x + x;
 		crtc->y = output->initial_y + y;
 	}

-- 
xf86-video-glamo, SMedia Glamo video driver for X.Org



More information about the pkg-fso-commits mailing list