xf86-video-intel: src/i830_cursor.c src/i830_display.c src/i830_driver.c src/i830.h

Keith Packard keithp at kemper.freedesktop.org
Thu Mar 15 09:01:27 EET 2007


 src/i830.h         |   28 +-
 src/i830_cursor.c  |  633 ++++++++++++-----------------------------------------
 src/i830_display.c |    7 
 src/i830_driver.c  |   19 -
 4 files changed, 185 insertions(+), 502 deletions(-)

New commits:
diff-tree 8ae6ad93329e2842c6f2d5b20ffeb0c14d10c0de (from 9fbef2de9edbbed9c2f6a80c4074b9b245547c45)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Thu Mar 15 00:00:51 2007 -0700

    Use new driver-independent CRTC-based cursor layer.
    
    This eliminates all of the cursor rotation code and other cursor management
    infrastructure, leaving a fairly simple hardware layer in its place.

diff --git a/src/i830.h b/src/i830.h
index d4be403..661d27e 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -229,6 +229,7 @@ typedef struct _I830CrtcPrivateRec {
 
     i830_memory *cursor_mem;
     i830_memory *cursor_mem_argb;
+    Bool	cursor_is_argb;
 } I830CrtcPrivateRec, *I830CrtcPrivatePtr;
 
 #define I830CrtcPrivate(c) ((I830CrtcPrivatePtr) (c)->driver_private)
@@ -328,9 +329,7 @@ typedef struct _I830Rec {
    int backPitch;
 
    Bool CursorNeedsPhysical;
-   Bool CursorIsARGB;
-   CursorPtr pCurs;
-
+ 
    DGAModePtr DGAModes;
    int numDGAModes;
    Bool DGAactive;
@@ -366,7 +365,6 @@ typedef struct _I830Rec {
    Bool useEXA;
    Bool noAccel;
    Bool SWCursor;
-   Bool cursorOn;
 #ifdef I830_USE_XAA
    XAAInfoRecPtr AccelInfoRec;
 
@@ -382,7 +380,6 @@ typedef struct _I830Rec {
 			 int w, int h);
    void (*xaa_done_composite)(PixmapPtr pDst);
 #endif
-   xf86CursorInfoPtr CursorInfoRec;
    CloseScreenProcPtr CloseScreen;
 
 #ifdef I830_USE_EXA
@@ -542,6 +539,27 @@ extern void I830EmitInvarientState(ScrnI
 extern void I915EmitInvarientState(ScrnInfoPtr pScrn);
 extern void I830SelectBuffer(ScrnInfoPtr pScrn, int buffer);
 
+/* CRTC-based cursor functions */
+void
+i830_crtc_load_cursor_image (xf86CrtcPtr crtc, unsigned char *src);
+
+#ifdef ARGB_CURSOR
+void
+i830_crtc_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image);
+#endif
+
+void
+i830_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y);
+
+void
+i830_crtc_show_cursor (xf86CrtcPtr crtc);
+
+void
+i830_crtc_hide_cursor (xf86CrtcPtr crtc);
+
+void
+i830_crtc_set_cursor_colors (xf86CrtcPtr crtc, int bg, int fg);
+
 extern void I830RefreshRing(ScrnInfoPtr pScrn);
 extern void I830EmitFlush(ScrnInfoPtr pScrn);
 
diff --git a/src/i830_cursor.c b/src/i830_cursor.c
index 8578511..9cc92dc 100644
--- a/src/i830_cursor.c
+++ b/src/i830_cursor.c
@@ -68,17 +68,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
 
 #include "i830.h"
 
-static void I830LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src);
-static void I830ShowCursor(ScrnInfoPtr pScrn);
-static void I830HideCursor(ScrnInfoPtr pScrn);
-static void I830SetCursorColors(ScrnInfoPtr pScrn, int bg, int fb);
-static void I830SetCursorPosition(ScrnInfoPtr pScrn, int x, int y);
-static Bool I830UseHWCursor(ScreenPtr pScrn, CursorPtr pCurs);
-#ifdef ARGB_CURSOR
-static void I830LoadCursorARGB(ScrnInfoPtr pScrn, CursorPtr pCurs);
-static Bool I830UseHWCursorARGB(ScreenPtr pScrn, CursorPtr pCurs);
-#endif
-
 static void
 I830SetPipeCursorBase (xf86CrtcPtr crtc)
 {
@@ -86,533 +75,207 @@ I830SetPipeCursorBase (xf86CrtcPtr crtc)
     I830CrtcPrivatePtr	intel_crtc = crtc->driver_private;
     int			pipe = intel_crtc->pipe;
     I830Ptr		pI830 = I830PTR(pScrn);
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
     int			cursor_base = (pipe == 0 ? CURSOR_A_BASE : CURSOR_B_BASE);
     i830_memory		*cursor_mem;
+    CARD32		value;
 
-    if (pipe >= xf86_config->num_crtc)
-	FatalError("Bad pipe number for cursor base setting\n");
-
-    if (pI830->CursorIsARGB)
+    if (intel_crtc->cursor_is_argb)
 	cursor_mem = intel_crtc->cursor_mem_argb;
     else
 	cursor_mem = intel_crtc->cursor_mem;
 
-    if (pI830->CursorNeedsPhysical) {
-	OUTREG(cursor_base, cursor_mem->bus_addr);
-    } else {
-	OUTREG(cursor_base, cursor_mem->offset);
-    }
+    if (pI830->CursorNeedsPhysical)
+	value = cursor_mem->bus_addr;
+    else
+	value = cursor_mem->offset;
+    
+    OUTREG(cursor_base, value);
 }
 
 void
-I830SetPipeCursor (xf86CrtcPtr crtc, Bool force)
+I830InitHWCursor(ScrnInfoPtr pScrn)
 {
-    ScrnInfoPtr		pScrn = crtc->scrn;
-    I830CrtcPrivatePtr	intel_crtc = crtc->driver_private;
-    int			pipe = intel_crtc->pipe;
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
     I830Ptr		pI830 = I830PTR(pScrn);
     CARD32		temp;
-    Bool		show;
-    
-    if (!crtc->enabled)
-	return;
+    int			i;
 
-    show = pI830->cursorOn && crtc->cursorInRange;
-    if (show && (force || !crtc->cursorShown))
-    {
-	if (IS_MOBILE(pI830) || IS_I9XX(pI830)) {
-	    int	cursor_control;
-	    if (pipe == 0)
-		cursor_control = CURSOR_A_CONTROL;
-	    else
-		cursor_control = CURSOR_B_CONTROL;
-	    temp = INREG(cursor_control);
-	    temp &= ~(CURSOR_MODE | MCURSOR_PIPE_SELECT);
-	    if (pI830->CursorIsARGB) {
-		temp |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE;
-	    } else
-		temp |= CURSOR_MODE_64_4C_AX;
-	    
-	    temp |= (pipe << 28); /* Connect to correct pipe */
-	    /* Need to set mode, then address. */
-	    OUTREG(cursor_control, temp);
-	} else {
-	    temp = INREG(CURSOR_CONTROL);
-	    temp &= ~(CURSOR_FORMAT_MASK);
-	    temp |= CURSOR_ENABLE;
-	    if (pI830->CursorIsARGB) {
-		temp |= CURSOR_FORMAT_ARGB | CURSOR_GAMMA_ENABLE;
-	    } else
-		temp |= CURSOR_FORMAT_3C;
-	    OUTREG(CURSOR_CONTROL, temp);
-	}
-	crtc->cursorShown = TRUE;
-    }
-    else if (!show && (force || crtc->cursorShown))
+    DPRINTF(PFX, "I830InitHWCursor\n");
+
+    /* Initialise the HW cursor registers, leaving the cursor hidden. */
+    for (i = 0; i < xf86_config->num_crtc; i++)
     {
+	int   cursor_control = i == 0 ? CURSOR_A_CONTROL : CURSOR_B_CONTROL;
+	
+	temp = INREG(cursor_control);
 	if (IS_MOBILE(pI830) || IS_I9XX(pI830)) 
 	{
-	    int	cursor_control;
-	    if (pipe == 0)
-		cursor_control = CURSOR_A_CONTROL;
-	    else
-		cursor_control = CURSOR_B_CONTROL;
-	    temp = INREG(cursor_control);
-	    temp &= ~(CURSOR_MODE|MCURSOR_GAMMA_ENABLE);
+	    temp &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE |
+		      MCURSOR_MEM_TYPE_LOCAL |
+		      MCURSOR_PIPE_SELECT);
+	    temp |= (i << 28);
 	    temp |= CURSOR_MODE_DISABLE;
-	    OUTREG(cursor_control, temp);
-	} else {
-	    temp = INREG(CURSOR_CONTROL);
+	}
+	else
+	{
 	    temp &= ~(CURSOR_ENABLE|CURSOR_GAMMA_ENABLE);
-	    OUTREG(CURSOR_CONTROL, temp);
 	}
-	crtc->cursorShown = FALSE;
+	
+	/* Need to set control, then address. */
+	OUTREG(cursor_control, temp);
+	I830SetPipeCursorBase(xf86_config->crtc[i]);
     }
-
-    /* Flush cursor changes. */
-    I830SetPipeCursorBase(crtc);
-}
-
-void
-I830InitHWCursor(ScrnInfoPtr pScrn)
-{
-   xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-   I830Ptr pI830 = I830PTR(pScrn);
-   CARD32 temp;
-   int i;
-
-   DPRINTF(PFX, "I830InitHWCursor\n");
-   for (i = 0; i < xf86_config->num_crtc; i++) 
-      xf86_config->crtc[i]->cursorShown = FALSE;
-
-   /* Initialise the HW cursor registers, leaving the cursor hidden. */
-   if (IS_MOBILE(pI830) || IS_I9XX(pI830)) {
-      for (i = 0; i < xf86_config->num_crtc; i++)
-      {
-	 int   cursor_control = i == 0 ? CURSOR_A_CONTROL : CURSOR_B_CONTROL;
-	 temp = INREG(cursor_control);
-	 temp &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE |
-		   MCURSOR_MEM_TYPE_LOCAL |
-		   MCURSOR_PIPE_SELECT);
-	 temp |= (i << 28);
-	 if (pI830->CursorIsARGB)
-	    temp |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE;
-	 else
-	    temp |= CURSOR_MODE_64_4C_AX;
-	 /* Need to set control, then address. */
-	 OUTREG(cursor_control, temp);
-	 I830SetPipeCursorBase(xf86_config->crtc[i]);
-      }
-   } else {
-      temp = INREG(CURSOR_CONTROL);
-      temp &= ~(CURSOR_FORMAT_MASK | CURSOR_GAMMA_ENABLE |
-		CURSOR_ENABLE  | CURSOR_STRIDE_MASK);
-      if (pI830->CursorIsARGB)
-         temp |= CURSOR_FORMAT_ARGB | CURSOR_GAMMA_ENABLE;
-      else 
-         temp |= CURSOR_FORMAT_3C;
-      /* This initialises the format and leave the cursor disabled. */
-      OUTREG(CURSOR_CONTROL, temp);
-      /* Need to set address and size after disabling. */
-      I830SetPipeCursorBase(xf86_config->crtc[0]);
-      temp = ((I810_CURSOR_X & CURSOR_SIZE_MASK) << CURSOR_SIZE_HSHIFT) |
-	     ((I810_CURSOR_Y & CURSOR_SIZE_MASK) << CURSOR_SIZE_VSHIFT);
-      OUTREG(CURSOR_SIZE, temp);
-   }
 }
 
 Bool
 I830CursorInit(ScreenPtr pScreen)
 {
-   ScrnInfoPtr pScrn;
-   I830Ptr pI830;
-   xf86CursorInfoPtr infoPtr;
-
-   DPRINTF(PFX, "I830CursorInit\n");
-   pScrn = xf86Screens[pScreen->myNum];
-   pI830 = I830PTR(pScrn);
-   pI830->CursorInfoRec = infoPtr = xf86CreateCursorInfoRec();
-   if (!infoPtr)
-      return FALSE;
-
-   infoPtr->MaxWidth = I810_CURSOR_X;
-   infoPtr->MaxHeight = I810_CURSOR_Y;
-   infoPtr->Flags = (HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
-		     HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
-		     HARDWARE_CURSOR_INVERT_MASK |
-		     HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK |
-		     HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
-		     HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 | 0);
-
-   infoPtr->SetCursorColors = I830SetCursorColors;
-   infoPtr->SetCursorPosition = I830SetCursorPosition;
-   infoPtr->LoadCursorImage = I830LoadCursorImage;
-   infoPtr->HideCursor = I830HideCursor;
-   infoPtr->ShowCursor = I830ShowCursor;
-   infoPtr->UseHWCursor = I830UseHWCursor;
-#ifdef ARGB_CURSOR
-   infoPtr->UseHWCursorARGB = I830UseHWCursorARGB;
-   infoPtr->LoadCursorARGB = I830LoadCursorARGB;
-#endif
-
-   pI830->pCurs = NULL;
-
-
-   I830HideCursor(pScrn);
-
-   return xf86InitCursor(pScreen, infoPtr);
+    return xf86_cursors_init (pScreen, I810_CURSOR_X, I810_CURSOR_Y,
+			      (HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
+			       HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
+			       HARDWARE_CURSOR_INVERT_MASK |
+			       HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK |
+			       HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
+			       HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
+			       HARDWARE_CURSOR_ARGB));
 }
 
-static Bool
-I830UseHWCursor(ScreenPtr pScreen, CursorPtr pCurs)
-{
-   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
-   I830Ptr pI830 = I830PTR(pScrn);
-
-   pI830->pCurs = pCurs;
-
-   return TRUE;
-}
-
-static void
-I830CRTCLoadCursorImage(xf86CrtcPtr crtc, unsigned char *src)
-{
-   ScrnInfoPtr pScrn = crtc->scrn;
-   I830Ptr pI830 = I830PTR(pScrn);
-   I830CrtcPrivatePtr intel_crtc = crtc->driver_private;
-   CARD8 *pcurs = (CARD8 *) (pI830->FbBase + intel_crtc->cursor_mem->offset);
-   int x, y;
-
-   DPRINTF(PFX, "I830LoadCursorImage\n");
-
-#ifdef ARGB_CURSOR
-   pI830->CursorIsARGB = FALSE;
-#endif
- 
-   memset(pcurs, 0, 64 * 64 / 4);
-
-#define GetBit(image, x, y)\
-    ((int)((*(image + ((x) / 8) + ((y) * (128/8))) &\
-	    (1 << ( 7 -((x) % 8) ))) ? 1 : 0))
-
-#define SetBit(image, x, y)\
-    (*(image + (x) / 8 + (y) * (128/8)) |=\
-     (int) (1 <<  (7-((x) % 8))))
-
-   switch (crtc->rotation) {
-      case RR_Rotate_90:
-         for (y = 0; y < 64; y++) {
-            for (x = 0; x < 64; x++) {
-               if (GetBit(src, 64 - y - 1, x))
-                  SetBit(pcurs, x, y);
-               if (GetBit(src, 128 - y - 1, x))
-                  SetBit(pcurs, x + 64, y);
-            }
-         }
-
-         return;
-      case RR_Rotate_180:
-         for (y = 0; y < 64; y++) {
-            for (x = 0; x < 64; x++) {
-               if (GetBit(src, 64 - x - 1, 64 - y - 1))
-                  SetBit(pcurs, x, y);
-               if (GetBit(src, 128 - x - 1, 64 - y - 1))
-                  SetBit(pcurs, x + 64, y);
-            }
-         }
-
-         return;
-      case RR_Rotate_270:
-         for (y = 0; y < 64; y++) {
-            for (x = 0; x < 64; x++) {
-               if (GetBit(src, y, 64 - x - 1))
-                  SetBit(pcurs, x, y);
-               if (GetBit(src, y + 64, 64 - x - 1))
-                  SetBit(pcurs, x + 64, y);
-            }
-         }
-
-         return;
-   }
-
-   for (y = 0; y < 64; y++) {
-      for (x = 0; x < 64 / 4; x++) {
-	 *pcurs++ = *src++;
-      }
-   }
-}
-
-static void
-I830LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src)
+void
+i830_crtc_load_cursor_image (xf86CrtcPtr crtc, unsigned char *src)
 {
-    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-    int pipe;
+    ScrnInfoPtr		scrn = crtc->scrn;
+    I830Ptr		pI830 = I830PTR(scrn);
+    I830CrtcPrivatePtr	intel_crtc = crtc->driver_private;
+    CARD8		*pcurs = (CARD8 *) (pI830->FbBase +
+					    intel_crtc->cursor_mem->offset);
 
-    for (pipe = 0; pipe < xf86_config->num_crtc; pipe++) {
-       I830CRTCLoadCursorImage(xf86_config->crtc[pipe], src);
-    }
+    intel_crtc->cursor_is_argb = FALSE;
+    memcpy (pcurs, src, I810_CURSOR_X * I810_CURSOR_Y / 4);
 }
 
 #ifdef ARGB_CURSOR
-#include "cursorstr.h"
-
-static Bool I830UseHWCursorARGB (ScreenPtr pScreen, CursorPtr pCurs)
+void
+i830_crtc_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image)
 {
-   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
-   I830Ptr pI830 = I830PTR(pScrn);
-   xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-   int i;
-
-   DPRINTF(PFX, "I830UseHWCursorARGB\n");
-
-   pI830->pCurs = pCurs;
-
-   /* Check that our ARGB allocations succeeded */
-   for (i = 0; i < xf86_config->num_crtc; i++) {
-      I830CrtcPrivatePtr intel_crtc = xf86_config->crtc[i]->driver_private;
-
-      if (intel_crtc->cursor_mem_argb == NULL)
-	 return FALSE;
-   }
-
-   if (pScrn->bitsPerPixel == 8)
-      return FALSE;
-
-   if (pCurs->bits->height <= 64 && pCurs->bits->width <= 64) 
-	return TRUE;
+    ScrnInfoPtr		scrn = crtc->scrn;
+    I830Ptr		pI830 = I830PTR(scrn);
+    I830CrtcPrivatePtr	intel_crtc = crtc->driver_private;
+    CARD32		*pcurs = (CARD32 *) (pI830->FbBase +
+					     intel_crtc->cursor_mem_argb->offset);
 
-   return FALSE;
+    intel_crtc->cursor_is_argb = TRUE;
+    memcpy (pcurs, image, I810_CURSOR_Y * I810_CURSOR_X * 4);
 }
+#endif
 
-static void I830CRTCLoadCursorARGB (xf86CrtcPtr crtc, CursorPtr pCurs)
+void
+i830_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
 {
-   I830Ptr pI830 = I830PTR(crtc->scrn);
-   I830CrtcPrivatePtr intel_crtc = crtc->driver_private;
-   CARD32 *dst = (CARD32 *) (pI830->FbBase +
-			     intel_crtc->cursor_mem_argb->offset);
-   CARD32 *image = (CARD32 *)pCurs->bits->argb;
-   int x, y, w, h;
-
-   DPRINTF(PFX, "I830LoadCursorARGB\n");
+    ScrnInfoPtr		scrn = crtc->scrn;
+    I830Ptr		pI830 = I830PTR(scrn);
+    I830CrtcPrivatePtr	intel_crtc = I830CrtcPrivate(crtc);
+    CARD32		temp;
 
-   if (!image)
-	return;	/* XXX can't happen */
+    temp = 0;
+    if (x < 0) {
+	temp |= (CURSOR_POS_SIGN << CURSOR_X_SHIFT);
+	x = -x;
+    }
+    if (y < 0) {
+	temp |= (CURSOR_POS_SIGN << CURSOR_Y_SHIFT);
+	y = -y;
+    }
+    temp |= ((x & CURSOR_POS_MASK) << CURSOR_X_SHIFT);
+    temp |= ((y & CURSOR_POS_MASK) << CURSOR_Y_SHIFT);
+
+    switch (intel_crtc->pipe) {
+    case 0:
+	OUTREG(CURSOR_A_POSITION, temp);
+	break;
+    case 1:
+	OUTREG(CURSOR_B_POSITION, temp);
+	break;
+    }
     
-   pI830->CursorIsARGB = TRUE;
-
-   w = pCurs->bits->width;
-   h = pCurs->bits->height;
-
-   switch (crtc->rotation) {
-      case RR_Rotate_90:
-         for (y = 0; y < h; y++) {
-            for (x = 0; x < w; x++)
-               dst[(y) + ((64 - x - 1) * 64)] = *image++;
-            for(; x < 64; x++)
-               dst[(y) + ((64 - x - 1) * 64)] = 0;
-         }
-         for(; y < 64; y++) {
-   	    for(x = 0; x < 64; x++)
-               dst[(y) + ((64 - x - 1) * 64)] = 0;
-         }
-         return;
-
-      case RR_Rotate_180:
-         for (y = 0; y < h; y++) {
-            for (x = 0; x < w; x++)
-               dst[(64 - x - 1) + ((64 - y - 1) * 64)] = *image++;
-            for(; x < 64; x++)
-               dst[(64 - x - 1) + ((64 - y - 1) * 64)] = 0;
-         }
-         for(; y < 64; y++) {
-            for(x = 0; x < 64; x++)
-               dst[(64 - x - 1) + ((64 - y - 1) * 64)] = 0;
-         }
-         return;
-
-      case RR_Rotate_270:
-         for (y = 0; y < h; y++) {
-            for (x = 0; x < w; x++)
-               dst[(64 - y - 1) + (x * 64)] = *image++;
-            for(; x < 64; x++)
-               dst[(64 - y - 1) + (x * 64)] = 0;
-         }
-         for(; y < 64; y++) {
-            for(x = 0; x < 64; x++)
-               dst[(64 - y - 1) + (x * 64)] = 0;
-         }
-         return;
-   }
-
-   for(y = 0; y < h; y++) {
-      for(x = 0; x < w; x++)
-          *dst++ = *image++;
-      for(; x < 64; x++)
-          *dst++ = 0;
-   }
-
-   for(; y < 64; y++) {
-      for(x = 0; x < 64; x++)
-          *dst++ = 0;
-   }
+    if (crtc->cursor_shown)
+	I830SetPipeCursorBase (crtc);
 }
 
-static void
-I830LoadCursorARGB(ScrnInfoPtr pScrn, CursorPtr pCurs)
+void
+i830_crtc_show_cursor (xf86CrtcPtr crtc)
 {
-    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-    int pipe;
+    ScrnInfoPtr		scrn = crtc->scrn;
+    I830Ptr		pI830 = I830PTR(scrn);
+    I830CrtcPrivatePtr	intel_crtc = I830CrtcPrivate(crtc);
+    int			pipe = intel_crtc->pipe;
+    CARD32		temp;
+    int			cursor_control = (pipe == 0 ? CURSOR_A_CONTROL :
+					  CURSOR_B_CONTROL);
+    
+    temp = INREG(cursor_control);
+    
+    if (IS_MOBILE(pI830) || IS_I9XX(pI830)) 
+    {
+	temp &= ~(CURSOR_MODE | MCURSOR_PIPE_SELECT);
+	if (intel_crtc->cursor_is_argb)
+	    temp |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE;
+	else
+	    temp |= CURSOR_MODE_64_4C_AX;
 
-    for (pipe = 0; pipe < xf86_config->num_crtc; pipe++) {
-       I830CRTCLoadCursorARGB(xf86_config->crtc[pipe], pCurs);
+	temp |= (pipe << 28); /* Connect to correct pipe */
     }
-}
-#endif
-
-static void
-I830SetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
-{
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-    I830Ptr pI830 = I830PTR(pScrn);
-    CARD32 temp;
-    Bool inrange;
-    int root_x = x, root_y = y;
-    int pipe;
-
-    root_x = x + pScrn->frameX0; /* undo what xf86HWCurs did */
-    root_y = y + pScrn->frameY0;
-
-    for (pipe = 0; pipe < xf86_config->num_crtc; pipe++)
+    else 
     {
-	xf86CrtcPtr	    crtc = xf86_config->crtc[pipe];
-	DisplayModePtr	    mode = &crtc->mode;
-	int		    thisx = 0;
-	int		    thisy = 0;
-	int hotspotx = 0, hotspoty = 0;
-
-	if (!crtc->enabled)
-	    continue;
-
-	switch (crtc->rotation) {
-	case RR_Rotate_0:
-	    thisx = (root_x - crtc->x);
-	    thisy = (root_y - crtc->y);
-	    break;
-	case RR_Rotate_90:
-	    thisx = (root_y - crtc->y);
-	    thisy = mode->VDisplay - (root_x - crtc->x);
-	    hotspoty = I810_CURSOR_X;
-	    break;
-	case RR_Rotate_180:
-	    thisx = mode->HDisplay - (root_x - crtc->x);
-	    thisy = mode->VDisplay - (root_y - crtc->y);
-	    hotspotx = I810_CURSOR_X;
-	    hotspoty = I810_CURSOR_Y;
-	    break;
-	case RR_Rotate_270:
-	    thisx = mode->HDisplay - (root_y - crtc->y);
-	    thisy = (root_x - crtc->x);
-	    hotspotx = I810_CURSOR_Y;
-	    break;
-	}
-
-	thisx -= hotspotx;
-	thisy -= hotspoty;
-
-	/*
-	 * There is a screen display problem when the cursor position is set
-	 * wholely outside of the viewport.  We trap that here, turning the
-	 * cursor off when that happens, and back on when it comes back into
-	 * the viewport.
-	 */
-	inrange = TRUE;
-	if (thisx >= mode->HDisplay ||
-	    thisy >= mode->VDisplay ||
-	    thisx <= -I810_CURSOR_X || thisy <= -I810_CURSOR_Y) 
-	{
-	    inrange = FALSE;
-	    thisx = 0;
-	    thisy = 0;
-	}
-
-	temp = 0;
-	if (thisx < 0) {
-	    temp |= (CURSOR_POS_SIGN << CURSOR_X_SHIFT);
-	    thisx = -thisx;
-	}
-	if (thisy < 0) {
-	    temp |= (CURSOR_POS_SIGN << CURSOR_Y_SHIFT);
-	    thisy = -thisy;
-	}
-	temp |= ((thisx & CURSOR_POS_MASK) << CURSOR_X_SHIFT);
-	temp |= ((thisy & CURSOR_POS_MASK) << CURSOR_Y_SHIFT);
-
-	if (pipe == 0)
-	    OUTREG(CURSOR_A_POSITION, temp);
-	if (pipe == 1)
-	    OUTREG(CURSOR_B_POSITION, temp);
-
-	crtc->cursorInRange = inrange;
-	
-        I830SetPipeCursor (crtc, FALSE);
+	temp &= ~(CURSOR_FORMAT_MASK);
+	temp |= CURSOR_ENABLE;
+	if (intel_crtc->cursor_is_argb)
+	    temp |= CURSOR_FORMAT_ARGB | CURSOR_GAMMA_ENABLE;
+	else
+	    temp |= CURSOR_FORMAT_3C;
     }
+    
+    /* Need to set mode, then address. */
+    OUTREG(cursor_control, temp);
+    I830SetPipeCursorBase (crtc);
 }
 
-static void
-I830ShowCursor(ScrnInfoPtr pScrn)
+void
+i830_crtc_hide_cursor (xf86CrtcPtr crtc)
 {
-    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-    I830Ptr pI830 = I830PTR(pScrn);
-    int pipe;
-
-    DPRINTF(PFX, "I830ShowCursor\n");
-
-    pI830->cursorOn = TRUE;
-    for (pipe = 0; pipe < xf86_config->num_crtc; pipe++)
-	I830SetPipeCursor (xf86_config->crtc[pipe], TRUE);
-}
+    ScrnInfoPtr		scrn = crtc->scrn;
+    I830Ptr		pI830 = I830PTR(scrn);
+    I830CrtcPrivatePtr	intel_crtc = I830CrtcPrivate(crtc);
+    int			pipe = intel_crtc->pipe;
+    CARD32		temp;
+    int			cursor_control = (pipe == 0 ? CURSOR_A_CONTROL :
+					  CURSOR_B_CONTROL);
+    
+    temp = INREG(cursor_control);
+    
+    if (IS_MOBILE(pI830) || IS_I9XX(pI830)) 
+    {
+	temp &= ~(CURSOR_MODE|MCURSOR_GAMMA_ENABLE);
+	temp |= CURSOR_MODE_DISABLE;
+    }
+    else
+	temp &= ~(CURSOR_ENABLE|CURSOR_GAMMA_ENABLE);
 
-static void
-I830HideCursor(ScrnInfoPtr pScrn)
-{
-   xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-   I830Ptr pI830 = I830PTR(pScrn);
-    int pipe;
-
-   DPRINTF(PFX, "I830HideCursor\n");
-
-   pI830->cursorOn = FALSE;
-    for (pipe = 0; pipe < xf86_config->num_crtc; pipe++)
-	I830SetPipeCursor (xf86_config->crtc[pipe], TRUE);
+    /* Need to set mode, then address. */
+    OUTREG(cursor_control, temp);
+    I830SetPipeCursorBase (crtc);
 }
 
-static void
-I830SetCursorColors(ScrnInfoPtr pScrn, int bg, int fg)
+void
+i830_crtc_set_cursor_colors (xf86CrtcPtr crtc, int bg, int fg)
 {
-   xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-   I830Ptr pI830 = I830PTR(pScrn);
-   int pipe; 
-
-#ifdef ARGB_CURSOR
-    /* Don't recolour cursors set with SetCursorARGB. */
-    if (pI830->CursorIsARGB)
-       return;
-#endif
-
-   DPRINTF(PFX, "I830SetCursorColors\n");
+    ScrnInfoPtr		scrn = crtc->scrn;
+    I830Ptr		pI830 = I830PTR(scrn);
+    I830CrtcPrivatePtr	intel_crtc = I830CrtcPrivate(crtc);
+    int			pipe = intel_crtc->pipe;
+    int			pal0 = pipe == 0 ? CURSOR_A_PALETTE0 : CURSOR_B_PALETTE0;
 
-   for (pipe = 0; pipe < xf86_config->num_crtc; pipe++)
-   {
-      xf86CrtcPtr	crtc = xf86_config->crtc[pipe];
-      int		pal0 = pipe == 0 ? CURSOR_A_PALETTE0 : CURSOR_B_PALETTE0;
-
-      if (crtc->enabled)
-      {
-	 OUTREG(pal0 +  0, bg & 0x00ffffff);
-	 OUTREG(pal0 +  4, fg & 0x00ffffff);
-	 OUTREG(pal0 +  8, fg & 0x00ffffff);
-	 OUTREG(pal0 + 12, bg & 0x00ffffff);
-      }
-   }
+    OUTREG(pal0 +  0, bg & 0x00ffffff);
+    OUTREG(pal0 +  4, fg & 0x00ffffff);
+    OUTREG(pal0 +  8, fg & 0x00ffffff);
+    OUTREG(pal0 + 12, bg & 0x00ffffff);
 }
diff --git a/src/i830_display.c b/src/i830_display.c
index 6e64961..2fc81b9 100644
--- a/src/i830_display.c
+++ b/src/i830_display.c
@@ -578,6 +578,7 @@ static void
 i830_crtc_commit (xf86CrtcPtr crtc)
 {
     crtc->funcs->dpms (crtc, DPMSModeOn);
+    xf86_reload_cursors (crtc->scrn->pScreen);
 }
 
 void
@@ -1334,6 +1335,12 @@ static const xf86CrtcFuncsRec i830_crtc_
     .shadow_create = i830_crtc_shadow_create,
     .shadow_allocate = i830_crtc_shadow_allocate,
     .shadow_destroy = i830_crtc_shadow_destroy,
+    .set_cursor_colors = i830_crtc_set_cursor_colors,
+    .set_cursor_position = i830_crtc_set_cursor_position,
+    .show_cursor = i830_crtc_show_cursor,
+    .hide_cursor = i830_crtc_hide_cursor,
+/*    .load_cursor_image = i830_crtc_load_cursor_image, */
+    .load_cursor_argb = i830_crtc_load_cursor_argb,
     .destroy = NULL, /* XXX */
 };
 
diff --git a/src/i830_driver.c b/src/i830_driver.c
index 1be9fdd..497a4ab 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -1563,9 +1563,8 @@ ResetState(ScrnInfoPtr pScrn, Bool flush
    OUTREG(LP_RING + RING_HEAD, 0);
    OUTREG(LP_RING + RING_TAIL, 0);
    OUTREG(LP_RING + RING_START, 0);
-  
-   if (pI830->CursorInfoRec && pI830->CursorInfoRec->HideCursor)
-      pI830->CursorInfoRec->HideCursor(pScrn);
+
+   xf86_hide_cursors (pScrn);
 }
 
 static void
@@ -2585,9 +2584,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr 
       }
    }
 
-   if (!I830EnterVT(scrnIndex, 0))
-      return FALSE;
-
    miInitializeBackingStore(pScreen);
    xf86SetBackingStore(pScreen);
    xf86SetSilkenMouse(pScreen);
@@ -2601,6 +2597,9 @@ I830ScreenInit(int scrnIndex, ScreenPtr 
    } else
       xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Initializing SW Cursor!\n");
 
+   if (!I830EnterVT(scrnIndex, 0))
+      return FALSE;
+
    DPRINTF(PFX, "assert( if(!miCreateDefColormap(pScreen)) )\n");
    if (!miCreateDefColormap(pScreen))
       return FALSE;
@@ -2785,8 +2784,7 @@ I830LeaveVT(int scrnIndex, int flags)
    }
 #endif
 
-   if (pI830->CursorInfoRec && pI830->CursorInfoRec->HideCursor)
-      pI830->CursorInfoRec->HideCursor(pScrn);
+   xf86_hide_cursors (pScrn);
 
    ResetState(pScrn, TRUE);
 
@@ -2981,10 +2979,7 @@ I830CloseScreen(int scrnIndex, ScreenPtr
        pI830->EXADriverPtr = NULL;
    }
 #endif
-   if (pI830->CursorInfoRec) {
-      xf86DestroyCursorInfoRec(pI830->CursorInfoRec);
-      pI830->CursorInfoRec = 0;
-   }
+   xf86_cursors_fini (pScreen);
 
    i830_reset_allocations(pScrn);
 



More information about the xorg-commit mailing list