summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/i830.h28
-rw-r--r--src/i830_cursor.c633
-rw-r--r--src/i830_display.c7
-rw-r--r--src/i830_driver.c19
4 files changed, 185 insertions, 502 deletions
diff --git a/src/i830.h b/src/i830.h
index d4be4034..661d27e5 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(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);