diff options
author | Keith Packard <keithp@guitar.keithp.com> | 2007-03-15 00:00:51 -0700 |
---|---|---|
committer | Keith Packard <keithp@guitar.keithp.com> | 2007-03-15 00:01:39 -0700 |
commit | 8ae6ad93329e2842c6f2d5b20ffeb0c14d10c0de (patch) | |
tree | d5a43dc2ba4aa704e306dc1649f610f7b43d0df2 /src/i830_cursor.c | |
parent | 9fbef2de9edbbed9c2f6a80c4074b9b245547c45 (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.c | 633 |
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); } |