xf86-video-glamo: add patch for modesetting
authorMartin Jansa <Martin.Jansa@gmail.com>
Mon, 26 Apr 2010 07:43:40 +0000 (09:43 +0200)
committerMartin Jansa <Martin.Jansa@gmail.com>
Mon, 26 Apr 2010 10:43:43 +0000 (12:43 +0200)
Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
recipes/xorg-driver/xf86-video-glamo/modesetting.patch [new file with mode: 0644]
recipes/xorg-driver/xf86-video-glamo_git.bb

diff --git a/recipes/xorg-driver/xf86-video-glamo/modesetting.patch b/recipes/xorg-driver/xf86-video-glamo/modesetting.patch
new file mode 100644 (file)
index 0000000..99e11df
--- /dev/null
@@ -0,0 +1,184 @@
+From: Thomas White <taw@bitwiz.org.uk>
+Date: Sun, 25 Apr 2010 21:19:16 +0000 (+0200)
+Subject: Support newer modesetting callbacks to allow rotation
+X-Git-Url: http://git.bitwiz.org.uk/?p=xf86-video-glamo.git;a=commitdiff_plain;h=cd91a3c251dfd0b9d4e1230b6f9dd498e46e8fb6;hp=77b6d1b7363d3ff28f063ed92c9ed47194f70b20
+
+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;
+       }
index c889485..6d95e8c 100644 (file)
@@ -1,12 +1,13 @@
 require xorg-driver-video.inc
-SRC_URI = "git://git.openmoko.org/git/xf86-video-glamo.git;protocol=git;branch=master"
+SRC_URI = "git://git.openmoko.org/git/xf86-video-glamo.git;protocol=git;branch=master \
+           file://modesetting.patch;patch=1"
 
 S = "${WORKDIR}/git"
 
 SRCREV = "77b6d1b7363d3ff28f063ed92c9ed47194f70b20"
 PV = "1.0.0+gitr${SRCPV}"
 PE = "2"
-PR = "r4"
+PR = "r5"
 
 do_configure_prepend() {
   # pedantic emits warning about GCC extension used in xserver header file edid.h (from version 1.8) and because of -Werror it fill fail