diff options
-rw-r--r-- | src/i830.h | 28 | ||||
-rw-r--r-- | src/i830_cursor.c | 633 | ||||
-rw-r--r-- | src/i830_display.c | 7 | ||||
-rw-r--r-- | src/i830_driver.c | 19 |
4 files changed, 185 insertions, 502 deletions
@@ -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(ScrnInfoPtr pScrn); 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 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); } diff --git a/src/i830_display.c b/src/i830_display.c index 6e64961b..2fc81b98 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_funcs = { .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 1be9fddf..497a4ab9 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 pScreen, int argc, char **argv) } } - if (!I830EnterVT(scrnIndex, 0)) - return FALSE; - miInitializeBackingStore(pScreen); xf86SetBackingStore(pScreen); xf86SetSilkenMouse(pScreen); @@ -2601,6 +2597,9 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) } 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 pScreen) pI830->EXADriverPtr = NULL; } #endif - if (pI830->CursorInfoRec) { - xf86DestroyCursorInfoRec(pI830->CursorInfoRec); - pI830->CursorInfoRec = 0; - } + xf86_cursors_fini (pScreen); i830_reset_allocations(pScrn); |