intel: fix vblank crtc selection with DRI1 when only one pipe is enabled.
authorOwain Ainsworth <zerooa@googlemail.com>
Wed, 21 Jan 2009 21:57:24 +0000 (21:57 +0000)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Fri, 23 Jan 2009 20:58:49 +0000 (12:58 -0800)
On Mobile chipsets, we often enable PipeB instead of PipeA, but the test
in here was insufficient, falling back to pipe A if the area
intersection returned zero. Therefore, in the case where a window went
off to the top of the left of the screen, it would freeze, waiting on
the wrong vblank.

Fix this mess by checking the sarea for a crtc being zero sized, and in
that case always default to the other one.

src/mesa/drivers/dri/intel/intel_buffers.c

index 08e10c9e0ef588d68275e863677324c040dc3a46..81e718bb3d689b70e142adec10dc383fdabff59a 100644 (file)
@@ -195,6 +195,14 @@ intelWindowMoved(struct intel_context *intel)
        intel->intelScreen->driScrnPriv->ddx_version.minor >= 7) {
       GLuint flags = intelFixupVblank(intel, dPriv);
 
+      /* Do the stupid test: Is one of them actually disabled?
+       */
+      if (sarea->planeA_w == 0 || sarea->planeA_h == 0) {
+        flags = dPriv->vblFlags | VBLANK_FLAG_SECONDARY;
+      } else if (sarea->planeB_w == 0 || sarea->planeB_h == 0) {
+        flags = dPriv->vblFlags & ~VBLANK_FLAG_SECONDARY;
+      }
+
       /* Check to see if we changed pipes */
       if (flags != dPriv->vblFlags && dPriv->vblFlags &&
          !(dPriv->vblFlags & VBLANK_FLAG_NO_IRQ)) {