xserver/hw/kdrive/ati ati.c, 1.13, 1.14 ati_cursor.c, 1.1, 1.2 ati_draw.c, 1.16, 1.17 ati_reg.h, 1.5, 1.6
Keith Packard <xserver-commit-u7BhqnqprCWvj1b/[email protected]>
| Newsgroups | gmane.comp.freedesktop.xserver.cvs |
|---|---|
| Message-ID | <[email protected]> |
Committed by: keithp Update of /cvs/xserver/xserver/hw/kdrive/ati In directory pdx:/tmp/cvs-serv16982/hw/kdrive/ati Modified Files: ati.c ati_cursor.c ati_draw.c ati_reg.h Log Message: 2004-06-25 Keith Packard <[email protected]> * hw/kdrive/ati/ati.c: (ATIScreenInit): * hw/kdrive/ati/ati_cursor.c: (ATIMoveCursor), (ClassicAllocCursorColors), (ClassicSetCursorColors), (ClassicRecolorCursor), (ClassicLoadCursor), (RadeonLoadCursor), (ATIRealizeCursor), (ATISetCursor), (ATICursorEnable), (ATIRecolorCursor): * hw/kdrive/ati/ati_draw.c: (ATIDrawFini): * hw/kdrive/ati/ati_reg.h: Add ARGB cursor support for Radeon cards. Index: ati.c =================================================================== RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- ati.c 17 May 2004 20:18:02 -0000 1.13 +++ ati.c 26 Jun 2004 04:13:02 -0000 1.14 @@ -284,6 +284,7 @@ ATICardInfo(screen); Bool success = FALSE; int screen_size = 0; + int cursor_size; #if defined(USE_DRI) && defined(GLXEXT) int l; #endif @@ -323,11 +324,14 @@ screen->off_screen_base = screen_size; - /* Reserve the area for the monochrome cursor. */ - if (screen->off_screen_base + - ATI_CURSOR_HEIGHT * ATI_CURSOR_PITCH * 3 <= screen->memory_size) { + if (atic->is_radeon) + cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_WIDTH * 4; + else + cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_PITCH * 2; + /* Reserve the area for the cursor. */ + if (screen->off_screen_base + cursor_size <= screen->memory_size) { atis->cursor.offset = screen->off_screen_base; - screen->off_screen_base += ATI_CURSOR_HEIGHT * ATI_CURSOR_PITCH * 2; + screen->off_screen_base += cursor_size; } #if defined(USE_DRI) && defined(GLXEXT) Index: ati_cursor.c =================================================================== RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati_cursor.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- ati_cursor.c 17 May 2004 20:18:02 -0000 1.1 +++ ati_cursor.c 26 Jun 2004 04:13:03 -0000 1.2 @@ -38,6 +38,7 @@ ATICursor *pCurPriv = &atis->cursor; CARD16 xoff, yoff; CARD8 *mmio = atic->reg_base; + int stride = atic->is_radeon ? 256 : 16; if (!pCurPriv->has_cursor) return; @@ -62,11 +63,11 @@ (xoff << 16) | yoff); MMIO_OUT32(mmio, ATI_REG_CUR_HORZ_VERT_POSN, ATI_CUR_LOCK | (x << 16) | y); - MMIO_OUT32(mmio, ATI_REG_CUR_OFFSET, (pCurPriv->offset + yoff * 16)); + MMIO_OUT32(mmio, ATI_REG_CUR_OFFSET, (pCurPriv->offset + yoff * stride)); } static void -ATIAllocCursorColors(ScreenPtr pScreen) +ClassicAllocCursorColors(ScreenPtr pScreen) { KdScreenPriv(pScreen); ATIScreenInfo(pScreenPriv); @@ -91,7 +92,7 @@ } static void -ATISetCursorColors(ScreenPtr pScreen) +ClassicSetCursorColors(ScreenPtr pScreen) { KdScreenPriv(pScreen); ATICardInfo(pScreenPriv); @@ -103,8 +104,8 @@ MMIO_OUT32(mmio, ATI_REG_CUR_CLR1, pCurPriv->source); } -void -ATIRecolorCursor(ScreenPtr pScreen, int ndef, xColorItem *pdef) +static void +ClassicRecolorCursor(ScreenPtr pScreen, int ndef, xColorItem *pdef) { KdScreenPriv(pScreen); ATIScreenInfo(pScreenPriv); @@ -128,8 +129,8 @@ if (ndef == 0) return; } - ATIAllocCursorColors(pScreen); - ATISetCursorColors(pScreen); + ClassicAllocCursorColors(pScreen); + ClassicSetCursorColors(pScreen); } #define InvertBits32(v) do { \ @@ -139,7 +140,7 @@ } while (0) static void -ATILoadCursor(ScreenPtr pScreen, int x, int y) +ClassicLoadCursor(ScreenPtr pScreen) { KdScreenPriv(pScreen); ATICardInfo(pScreenPriv); @@ -154,7 +155,7 @@ CARD32 tmp; CARD8 *mmio = atic->reg_base; - ATIAllocCursorColors(pScreen); + ClassicAllocCursorColors(pScreen); pCurPriv->pCursor = pCursor; pCurPriv->xhot = pCursor->bits->xhot; @@ -223,10 +224,120 @@ MMIO_OUT32(mmio, ATI_REG_GEN_CNTL, tmp | ATI_CRTC_CUR_EN); /* Set new color */ - ATISetCursorColors(pScreen); + ClassicSetCursorColors(pScreen); - /* Move to new position */ - ATIMoveCursor(pScreen, x, y); +} + +static void +RadeonLoadCursor(ScreenPtr pScreen) +{ + KdScreenPriv(pScreen); + ATICardInfo(pScreenPriv); + ATIScreenInfo(pScreenPriv); + ATICursor *pCurPriv = &atis->cursor; + CursorPtr pCursor = pCurPriv->pCursor; + CursorBitsPtr bits = pCursor->bits; + int h, w; + int x, y; + CARD32 *ram, *msk, *mskLine, *src, *srcLine; + int lwsrc; + CARD32 tmp; + CARD8 *mmio = atic->reg_base; + + pCurPriv->pCursor = pCursor; + pCurPriv->xhot = pCursor->bits->xhot; + pCurPriv->yhot = pCursor->bits->yhot; + + w = bits->width; + if (w > ATI_CURSOR_WIDTH) + w = ATI_CURSOR_WIDTH; + + h = bits->height; + if (h > ATI_CURSOR_HEIGHT) + h = ATI_CURSOR_HEIGHT; + + tmp = MMIO_IN32(mmio, ATI_REG_GEN_CNTL); + MMIO_OUT32(mmio, ATI_REG_GEN_CNTL, tmp & ~ATI_CRTC_CUR_EN); + + /* Stick new image into cursor memory */ + ram = (CARD32 *)(pScreenPriv->screen->memory_base + + pCurPriv->offset); + if (pCursor->bits->argb) + { + srcLine = pCursor->bits->argb; + for (y = 0; y < h; y++) + { + src = srcLine; + srcLine += pCursor->bits->width; + for (x = 0; x < w; x++) + *ram++ = *src++; + for (; x < ATI_CURSOR_WIDTH; x++) + *ram++ = 0; + } + for (; y < ATI_CURSOR_HEIGHT; y++) + for (x = 0; x < ATI_CURSOR_WIDTH; x++) + *ram++ = 0; + } + else + { + CARD32 colors[4]; + + colors[0] = 0; + colors[1] = 0; + colors[2] = (((pCursor->backRed >> 8) << 16) | + ((pCursor->backGreen >> 8) << 8) | + ((pCursor->backBlue >> 8) << 0) | + 0xff000000); + colors[3] = (((pCursor->foreRed >> 8) << 16) | + ((pCursor->foreGreen >> 8) << 8) | + ((pCursor->foreBlue >> 8) << 0) | + 0xff000000); + + mskLine = (CARD32 *)bits->mask; + srcLine = (CARD32 *)bits->source; + + /* words per line */ + lwsrc = BitmapBytePad(bits->width) / 4; + + for (y = 0; y < ATI_CURSOR_HEIGHT; y++) + { + CARD32 m, s; + + msk = mskLine; + src = srcLine; + mskLine += lwsrc; + srcLine += lwsrc; + + for (x = 0; x < ATI_CURSOR_WIDTH / 32; x++) + { + int k; + if (y < h && x < lwsrc) + { + m = *msk++; + s = *src++; + } + else + { + m = 0x0; + s = 0x0; + } + + for (k = 0; k < 32; k++) + { + CARD32 bits = (s & 1) | ((m & 1) << 1); + *ram++ = colors[bits]; + s >>= 1; + m >>= 1; + } + } + } + } + + /* Enable the cursor */ + tmp &= ~(ATI_CRTC_ICON_EN); + tmp |= (ATI_CRTC_ARGB_EN); + tmp |= ATI_CRTC_CUR_EN; + MMIO_OUT32(mmio, ATI_REG_GEN_CNTL, tmp); } static void @@ -245,6 +356,7 @@ ATIRealizeCursor(ScreenPtr pScreen, CursorPtr pCursor) { KdScreenPriv(pScreen); + ATICardInfo(pScreenPriv); ATIScreenInfo(pScreenPriv); ATICursor *pCurPriv = &atis->cursor; @@ -257,7 +369,12 @@ int x, y; miPointerPosition(&x, &y); - ATILoadCursor(pScreen, x, y); + if (atic->is_radeon) + RadeonLoadCursor (pScreen); + else + ClassicLoadCursor(pScreen); + /* Move to new position */ + ATIMoveCursor(pScreen, x, y); } return TRUE; @@ -273,6 +390,7 @@ ATISetCursor(ScreenPtr pScreen, CursorPtr pCursor, int x, int y) { KdScreenPriv(pScreen); + ATICardInfo(pScreenPriv); ATIScreenInfo(pScreenPriv); ATICursor *pCurPriv = &atis->cursor; @@ -282,7 +400,14 @@ return; if (pCursor) - ATILoadCursor(pScreen, x, y); + { + if (atic->is_radeon) + RadeonLoadCursor (pScreen); + else + ClassicLoadCursor(pScreen); + /* Move to new position */ + ATIMoveCursor(pScreen, x, y); + } else ATIUnloadCursor(pScreen); } @@ -324,6 +449,7 @@ ATICursorEnable(ScreenPtr pScreen) { KdScreenPriv(pScreen); + ATICardInfo(pScreenPriv); ATIScreenInfo(pScreenPriv); ATICursor *pCurPriv = &atis->cursor; @@ -334,7 +460,12 @@ int x, y; miPointerPosition(&x, &y); - ATILoadCursor(pScreen, x, y); + if (atic->is_radeon) + RadeonLoadCursor(pScreen); + else + ClassicLoadCursor(pScreen); + /* Move to new position */ + ATIMoveCursor(pScreen, x, y); } else ATIUnloadCursor(pScreen); @@ -380,6 +511,16 @@ return TRUE; } +void +ATIRecolorCursor (ScreenPtr pScreen, int ndef, xColorItem *pdef) +{ + KdScreenPriv(pScreen); + ATICardInfo(pScreenPriv); + + if (!atic->is_radeon) + ClassicRecolorCursor (pScreen, ndef, pdef); +} + void ATICursorFini(ScreenPtr pScreen) { Index: ati_draw.c =================================================================== RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati_draw.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- ati_draw.c 10 Jun 2004 19:22:56 -0000 1.16 +++ ati_draw.c 26 Jun 2004 04:13:03 -0000 1.17 @@ -795,9 +795,8 @@ ATIDrawFini(ScreenPtr pScreen) { KdScreenPriv(pScreen); - ATIScreenInfo(pScreenPriv); - #ifdef USE_DRI + ATIScreenInfo(pScreenPriv); if (atis->using_dri) { ATIDRICloseScreen(pScreen); atis->using_dri = FALSE; Index: ati_reg.h =================================================================== RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati_reg.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- ati_reg.h 17 May 2004 20:18:02 -0000 1.5 +++ ati_reg.h 26 Jun 2004 04:13:03 -0000 1.6 @@ -49,6 +49,7 @@ # define ATI_CRTC_CUR_EN (1 << 16) # define ATI_CRTC_CUR_MODE_MASK (7 << 17) # define ATI_CRTC_ICON_EN (1 << 20) +# define ATI_CRTC_ARGB_EN (2 << 20) # define ATI_CRTC_EXT_DISP_EN (1 << 24) # define ATI_CRTC_EN (1 << 25) # define ATI_CRTC_DISP_REQ_EN_B (1 << 26)