summaryrefslogtreecommitdiff
path: root/src/i830_cursor.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@guitar.keithp.com>2007-03-15 00:00:51 -0700
committerKeith Packard <keithp@guitar.keithp.com>2007-03-15 00:01:39 -0700
commit8ae6ad93329e2842c6f2d5b20ffeb0c14d10c0de (patch)
treed5a43dc2ba4aa704e306dc1649f610f7b43d0df2 /src/i830_cursor.c
parent9fbef2de9edbbed9c2f6a80c4074b9b245547c45 (diff)
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.
Diffstat (limited to 'src/i830_cursor.c')
-rw-r--r--src/i830_cursor.c633
1 files changed, 148 insertions, 485 deletions
diff --git a/src/i830_cursor.c b/src/i830_cursor.c
index 85785112..9cc92dc9 100644
--- a/src/i830_cursor.c
+++ b/src/i830_cursor.c
@@ -68,17 +68,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#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);
-}
-
-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++;
- }
- }
+ 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 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)
-{
- 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);
-}
-
-static void
-I830HideCursor(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, "I830HideCursor\n");
+ 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);
- 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
+ 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;
- DPRINTF(PFX, "I830SetCursorColors\n");
-
- 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);
}