pkgsrc-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[pkgsrc/trunk]: pkgsrc/x11/xf86-video-radeonhd Accumulated cursor fixes from ...



details:   https://anonhg.NetBSD.org/pkgsrc/rev/27a4fddd6c5d
branches:  trunk
changeset: 560353:27a4fddd6c5d
user:      hasso <hasso%pkgsrc.org@localhost>
date:      Thu Jun 11 07:00:31 2009 +0000

description:
Accumulated cursor fixes from upstream repository. Should fix a cursor
corruption issues. Bump PKGREVISION.

diffstat:

 x11/xf86-video-radeonhd/Makefile         |    4 +-
 x11/xf86-video-radeonhd/distinfo         |    3 +-
 x11/xf86-video-radeonhd/patches/patch-aa |  360 +++++++++++++++++++++++++++++++
 3 files changed, 364 insertions(+), 3 deletions(-)

diffs (truncated from 389 to 300 lines):

diff -r 6dea891ec981 -r 27a4fddd6c5d x11/xf86-video-radeonhd/Makefile
--- a/x11/xf86-video-radeonhd/Makefile  Thu Jun 11 06:55:28 2009 +0000
+++ b/x11/xf86-video-radeonhd/Makefile  Thu Jun 11 07:00:31 2009 +0000
@@ -1,8 +1,8 @@
-# $NetBSD: Makefile,v 1.13 2009/06/07 11:24:37 wiz Exp $
+# $NetBSD: Makefile,v 1.14 2009/06/11 07:00:31 hasso Exp $
 #
 
 DISTNAME=      xf86-video-radeonhd-1.2.5
-PKGREVISION=   1
+PKGREVISION=   2
 CATEGORIES=    x11
 MASTER_SITES=  ${MASTER_SITE_XORG:=driver/}
 EXTRACT_SUFX=  .tar.bz2
diff -r 6dea891ec981 -r 27a4fddd6c5d x11/xf86-video-radeonhd/distinfo
--- a/x11/xf86-video-radeonhd/distinfo  Thu Jun 11 06:55:28 2009 +0000
+++ b/x11/xf86-video-radeonhd/distinfo  Thu Jun 11 07:00:31 2009 +0000
@@ -1,5 +1,6 @@
-$NetBSD: distinfo,v 1.9 2009/05/07 13:32:08 tnn Exp $
+$NetBSD: distinfo,v 1.10 2009/06/11 07:00:31 hasso Exp $
 
 SHA1 (xf86-video-radeonhd-1.2.5.tar.bz2) = 64fc0eb5209adba5479396bafe53b50ded6c0940
 RMD160 (xf86-video-radeonhd-1.2.5.tar.bz2) = e30a896cd08e82b8a1bbc73e6f0ab862fe564a8a
 Size (xf86-video-radeonhd-1.2.5.tar.bz2) = 751941 bytes
+SHA1 (patch-aa) = de3176186b4780be2ae68b3eeb070f3262f0afcf
diff -r 6dea891ec981 -r 27a4fddd6c5d x11/xf86-video-radeonhd/patches/patch-aa
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/x11/xf86-video-radeonhd/patches/patch-aa  Thu Jun 11 07:00:31 2009 +0000
@@ -0,0 +1,360 @@
+$NetBSD: patch-aa,v 1.7 2009/06/11 07:00:31 hasso Exp $
+
+Accumulated cursor fixes from upstream repository. Should fix cursor
+corruption issues:
+
+http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/commit/?id=f668cc06
+http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/commit/?id=6f378a0d
+http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/commit/?id=669e0bef
+http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/commit/?id=4be5f715
+http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/commit/?id=dd287015
+http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/commit/?id=08461642
+http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/commit/?id=23d25fe7
+
+--- src/rhd_cursor.c.oorig     2009-06-10 22:02:08 +0300
++++ src/rhd_cursor.c   2009-06-10 22:02:47 +0300
+@@ -62,13 +62,16 @@
+ static void
+ lockCursor(struct rhdCursor *Cursor, Bool Lock)
+ {
+-    /* Double Buffering: Set _UPDATE_LOCK bit */
++    /* Locking disables double buffering of HW cursor registers.
++     * Set D*CURSOR_UPDATE_LOCK bit to 1 to lock.
++     * We want *_DISABLE_MULTIPLE_UPDATE to always be 0, and since all other
++     * meaningful bits are read-only for D*CUR_UPDATE registers, it is safe
++     * to use RHDRegWrite() instead of RHDRegMask(); the latter is slower.
++     */
+     if (Lock)
+-      RHDRegMask(Cursor, Cursor->RegOffset + D1CUR_UPDATE,
+-                 0x00010000, 0x00010000);
++      RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_UPDATE, 0x00010000);
+     else
+-      RHDRegMask(Cursor, Cursor->RegOffset + D1CUR_UPDATE,
+-                 0x00000000, 0x00010000);
++      RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_UPDATE, 0x00000000);
+ }
+ 
+ /* RadeonHD has hardware support for hotspots, but doesn't allow negative
+@@ -89,13 +92,23 @@ setCursorPos(struct rhdCursor *Cursor, C
+ }
+ 
+ static void
++setCursorSize(struct rhdCursor *Cursor, CARD32 width, CARD32 height)
++{
++    ASSERT ((width  > 0) && (width  <= MAX_CURSOR_WIDTH));
++    ASSERT ((height > 0) && (height <= MAX_CURSOR_HEIGHT));
++    RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_SIZE,
++              (width - 1) << 16 | (height - 1));
++}
++
++static void
+ enableCursor(struct rhdCursor *Cursor, Bool Enable)
+ {
++    /* Make sure mode stays the same even when disabled; bug #13405 */
+     if (Enable)
+       /* pre-multiplied ARGB, Enable */
+       RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_CONTROL, 0x00000201);
+     else
+-      RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_CONTROL, 0);
++      RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_CONTROL, 0x00000200);
+ }
+ 
+ /* Activate already uploaded cursor image. */
+@@ -106,10 +119,6 @@ setCursorImage(struct rhdCursor *Cursor)
+ 
+     RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_SURFACE_ADDRESS,
+               rhdPtr->FbIntAddress + Cursor->Base);
+-    ASSERT ((Cursor->Width > 0) && (Cursor->Width  <= MAX_CURSOR_WIDTH));
+-    ASSERT ((Cursor->Height > 0) && (Cursor->Height <= MAX_CURSOR_HEIGHT));
+-    RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_SIZE,
+-              (Cursor->Width - 1) << 16 | (Cursor->Height - 1));
+ }
+ 
+ /* Upload image.
+@@ -121,7 +130,7 @@ uploadCursorImage(struct rhdCursor *Curs
+     RHDPtr rhdPtr = RHDPTRI(Cursor);
+ 
+     memcpy(((CARD8 *) rhdPtr->FbBase + Cursor->Base), img,
+-         MAX_CURSOR_WIDTH * Cursor->Height * 4);
++         MAX_CURSOR_WIDTH * MAX_CURSOR_HEIGHT * 4);
+ }
+ 
+ static void
+@@ -192,6 +201,8 @@ convertBitsToARGB(struct rhd_Cursor_Bits
+     CARD8 *mask     = src + srcPitch * bits->height;
+     int x, y;
+ 
++    memset(dest, 0, MAX_CURSOR_WIDTH * MAX_CURSOR_HEIGHT * 4);
++
+     for (y = 0; y < bits->height; y++) {
+       CARD8  *s = src, *m = mask;
+       CARD32 *d = dest;
+@@ -210,41 +221,24 @@ convertBitsToARGB(struct rhd_Cursor_Bits
+     }
+ }
+ 
+-/* Enable/disable cursor according to visibility, and set cursor pos */
+-static void
+-displayCursor(struct rhdCrtc *Crtc)
++/*
++ * Returns if CRTC has a visible cursor
++ */
++static Bool
++hasVisibleCursor(struct rhdCrtc *Crtc)
+ {
+     struct rhdCursor *Cursor = Crtc->Cursor;
++    if (Cursor->X >= Crtc->X - MAX_CURSOR_WIDTH  &&
++        Cursor->X <  Crtc->X + Crtc->Width       &&
++        Cursor->Y >= Crtc->Y - MAX_CURSOR_HEIGHT &&
++        Cursor->Y <  Crtc->Y + Crtc->Height) {
+ 
+-    /* Hardware doesn't allow negative cursor pos. Use hardware
+-     * hotspot support for that. Cannot exceed width, but cursor is
+-     * not visible in this case. */
+-
+-    /* xorg bug#13405: Cursor corruptions
+-     * With both CRTC enabled but HW cursor active only on one, the reported
+-     * corruption is seen. If HW cursor for both CRTC is forced to stay on, then no
+-     * corruption occurs. */
+-#if 0
+-    if (Cursor->X >= Crtc->X - Cursor->Width  &&
+-      Cursor->X <  Crtc->X + Crtc->Width    &&
+-      Cursor->Y >= Crtc->Y - Cursor->Height &&
+-      Cursor->Y <  Crtc->Y + Crtc->Height) {
+-#endif
+-      int X, Y, HotX, HotY;
+-
+-      X = Cursor->X >= 0 ? Cursor->X : 0;
+-      Y = Cursor->Y >= 0 ? Cursor->Y : 0;
+-      HotX = Cursor->X >= 0 ? 0 : -Cursor->X;
+-      HotY = Cursor->Y >= 0 ? 0 : -Cursor->Y;
+-
+-      enableCursor(Cursor, TRUE);
+-      setCursorPos(Cursor, X, Y, HotX, HotY);
+-#if 0
++        return TRUE;
+     } else
+-      enableCursor(Cursor, FALSE);
+-#endif
++        return FALSE;
+ }
+ 
++
+ /*
+  * Internal Driver + Xorg Interface
+  */
+@@ -258,12 +252,10 @@ rhdShowCursor(ScrnInfoPtr pScrn)
+     for (i = 0; i < 2; i++) {
+       struct rhdCrtc *Crtc = rhdPtr->Crtc[i];
+ 
+-      if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) {
+-          struct rhdCursor *Cursor = Crtc->Cursor;
++      if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex
++            && hasVisibleCursor(Crtc)) {
+ 
+-          lockCursor   (Cursor, TRUE);
+-          displayCursor(Crtc);
+-          lockCursor   (Cursor, FALSE);
++            rhdCrtcShowCursor(Crtc);
+       }
+     }
+ }
+@@ -278,11 +270,7 @@ rhdHideCursor(ScrnInfoPtr pScrn)
+       struct rhdCrtc *Crtc = rhdPtr->Crtc[i];
+ 
+       if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) {
+-          struct rhdCursor *Cursor = Crtc->Cursor;
+-
+-          lockCursor  (Cursor, TRUE);
+-          enableCursor(Cursor, FALSE);
+-          lockCursor  (Cursor, FALSE);
++            rhdCrtcHideCursor(Crtc);
+       }
+     }
+ }
+@@ -339,14 +327,7 @@ rhdReloadCursor(ScrnInfoPtr pScrn)
+       struct rhdCrtc *Crtc = rhdPtr->Crtc[i];
+ 
+       if (Crtc->scrnIndex == pScrn->scrnIndex) {
+-          struct rhdCursor *Cursor = Crtc->Cursor;
+-
+-          lockCursor       (Cursor, TRUE);
+-          uploadCursorImage(Cursor, rhdPtr->CursorImage);
+-          setCursorImage   (Cursor);
+-          if (Crtc->Active)
+-              displayCursor(Crtc);
+-          lockCursor       (Cursor, FALSE);
++            rhdCrtcLoadCursorARGB(Crtc, rhdPtr->CursorImage);
+       }
+     }
+ }
+@@ -363,16 +344,11 @@ rhdSetCursorPosition(ScrnInfoPtr pScrn, 
+     for (i = 0; i < 2; i++) {
+       struct rhdCrtc *Crtc = rhdPtr->Crtc[i];
+ 
+-      if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) {
+-          struct rhdCursor *Cursor = Crtc->Cursor;
++      if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex
++            && hasVisibleCursor(Crtc)) {
+ 
+           /* Given cursor pos is always relative to frame - make absolute */
+-          Cursor->X = x + pScrn->frameX0;
+-          Cursor->Y = y + pScrn->frameY0;
+-
+-          lockCursor   (Cursor, TRUE);
+-          displayCursor(Crtc);
+-          lockCursor   (Cursor, FALSE);
++            rhdCrtcSetCursorPosition(Crtc, x+pScrn->frameX0, y+pScrn->frameY0);
+       }
+     }
+ }
+@@ -397,12 +373,7 @@ rhdSetCursorColors(ScrnInfoPtr pScrn, in
+       struct rhdCrtc *Crtc = rhdPtr->Crtc[i];
+ 
+       if (Crtc->scrnIndex == pScrn->scrnIndex) {
+-          struct rhdCursor *Cursor = Crtc->Cursor;
+-
+-          lockCursor       (Cursor, TRUE);
+-          uploadCursorImage(Cursor, rhdPtr->CursorImage);
+-          setCursorImage   (Cursor);
+-          lockCursor       (Cursor, FALSE);
++            rhdCrtcLoadCursorARGB(Crtc, rhdPtr->CursorImage);
+       }
+     }
+ }
+@@ -422,15 +393,7 @@ rhdLoadCursorImage(ScrnInfoPtr pScrn, un
+       struct rhdCrtc *Crtc = rhdPtr->Crtc[i];
+ 
+       if (Crtc->scrnIndex == pScrn->scrnIndex) {
+-          struct rhdCursor *Cursor = Crtc->Cursor;
+-
+-          Cursor->Width  = bits->width;
+-          Cursor->Height = bits->height;
+-
+-          lockCursor       (Cursor, TRUE);
+-          uploadCursorImage(Cursor, rhdPtr->CursorImage);
+-          setCursorImage   (Cursor);
+-          lockCursor       (Cursor, FALSE);
++            rhdCrtcLoadCursorARGB(Crtc, rhdPtr->CursorImage);
+       }
+     }
+ }
+@@ -455,24 +418,19 @@ rhdLoadCursorARGB(ScrnInfoPtr pScrn, Cur
+     rhdPtr->CursorBits   = NULL;
+ 
+     /* Hardware only supports 64-wide cursor images. */
+-    for (i = 0; i < cur->bits->height; i++)
+-      memcpy(rhdPtr->CursorImage + MAX_CURSOR_WIDTH*i,
++    memset(rhdPtr->CursorImage, 0, MAX_CURSOR_WIDTH * MAX_CURSOR_HEIGHT * 4);
++    for (i = 0; i < cur->bits->height; i++) {
++      CARD32 *img = rhdPtr->CursorImage + MAX_CURSOR_WIDTH*i;
++      memcpy(img,
+              cur->bits->argb + cur->bits->width*i,
+              cur->bits->width*4);
++    }
+ 
+     for (i = 0; i < 2; i++) {
+       struct rhdCrtc *Crtc = rhdPtr->Crtc[i];
+ 
+       if (Crtc->scrnIndex == pScrn->scrnIndex) {
+-          struct rhdCursor *Cursor = Crtc->Cursor;
+-
+-          Cursor->Width = cur->bits->width;
+-          Cursor->Height = cur->bits->height;
+-
+-          lockCursor       (Cursor, TRUE);
+-          uploadCursorImage(Cursor, rhdPtr->CursorImage);
+-          setCursorImage   (Cursor);
+-          lockCursor       (Cursor, FALSE);
++            rhdCrtcLoadCursorARGB(Crtc, rhdPtr->CursorImage);
+       }
+     }



Home | Main Index | Thread Index | Old Index