summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Deucher <agd5f@yahoo.com>2005-08-04 02:42:10 +0000
committerAlex Deucher <agd5f@yahoo.com>2005-08-04 02:42:10 +0000
commit6da51e9c6f589ffa78ed6a5da0548eb56ab90b7c (patch)
tree5dea3b3a7fa8a68f1a7eee47349685de42d2c780
parent16d2e7832a8b138e78947896c69537a59124dfec (diff)
- fix accel problems on crtc2. It seems the GBD doesn't always update
correctly resulting in incorrect stride and/or offset. Switch the accel code to use the PBD instead and send the new offset with each command. Because the offset is always up to date, we no longer need SavageRestoreAccelState().
-rw-r--r--src/savage_accel.c147
-rw-r--r--src/savage_image.c14
2 files changed, 69 insertions, 92 deletions
diff --git a/src/savage_accel.c b/src/savage_accel.c
index a231bba..3155e9d 100644
--- a/src/savage_accel.c
+++ b/src/savage_accel.c
@@ -981,7 +981,8 @@ void SavageSetGBD_M7(ScrnInfoPtr pScrn)
OUTREG32(0x8128, 0xFFFFFFFFL);
OUTREG32(0x812C, 0xFFFFFFFFL);
- OUTREG32(S3_BCI_GLB_BD_HIGH, bci_enable | S3_LITTLE_ENDIAN | S3_BD64);
+ if (!psav->IsSecondary)
+ OUTREG32(S3_BCI_GLB_BD_HIGH, bci_enable | S3_LITTLE_ENDIAN | S3_BD64);
/* CR50, bit 7,6,0 = 111, Use GBD.*/
OUTREG8(CRT_ADDRESS_REG,0x50);
@@ -1070,15 +1071,17 @@ void SavageSetGBD_M7(ScrnInfoPtr pScrn)
byte = (INREG8(CRT_DATA_REG) | 0x04) & 0xFE;
OUTREG8(CRT_DATA_REG,byte);
- /* program the GBD and SBD's */
- OUTREG32(S3_GLB_BD_LOW,psav->GlobalBD.bd2.LoPart );
- /* 8: bci enable */
- OUTREG32(S3_GLB_BD_HIGH,(psav->GlobalBD.bd2.HiPart
+ if (!psav->IsSecondary) {
+ /* program the GBD and SBD's */
+ OUTREG32(S3_GLB_BD_LOW,psav->GlobalBD.bd2.LoPart );
+ /* 8: bci enable */
+ OUTREG32(S3_GLB_BD_HIGH,(psav->GlobalBD.bd2.HiPart
| bci_enable | S3_LITTLE_ENDIAN | S3_BD64));
- OUTREG32(S3_PRI_BD_LOW,psav->GlobalBD.bd2.LoPart);
- OUTREG32(S3_PRI_BD_HIGH,psav->GlobalBD.bd2.HiPart);
- OUTREG32(S3_SEC_BD_LOW,psav->GlobalBD.bd2.LoPart);
- OUTREG32(S3_SEC_BD_HIGH,psav->GlobalBD.bd2.HiPart);
+ OUTREG32(S3_PRI_BD_LOW,psav->GlobalBD.bd2.LoPart);
+ OUTREG32(S3_PRI_BD_HIGH,psav->GlobalBD.bd2.HiPart);
+ OUTREG32(S3_SEC_BD_LOW,psav->GlobalBD.bd2.LoPart);
+ OUTREG32(S3_SEC_BD_HIGH,psav->GlobalBD.bd2.HiPart);
+ }
/* turn on screen */
OUTREG8(SEQ_ADDRESS_REG,0x01);
@@ -1230,8 +1233,9 @@ void SavageSetGBD_PM(ScrnInfoPtr pScrn)
OUTREG32(0x8128, 0xFFFFFFFFL);
OUTREG32(0x812C, 0xFFFFFFFFL);
- /* bit 28:block write disable */
- OUTREG32(S3_GLB_BD_HIGH, bci_enable | S3_BD64 | 0x10000000);
+ if (!psav->IsSecondary)
+ /* bit 28:block write disable */
+ OUTREG32(S3_GLB_BD_HIGH, bci_enable | S3_BD64 | 0x10000000);
/* CR50, bit 7,6,0 = 111, Use GBD.*/
OUTREG8(CRT_ADDRESS_REG,0x50);
@@ -1281,14 +1285,16 @@ void SavageSetGBD_PM(ScrnInfoPtr pScrn)
byte = INREG8(CRT_DATA_REG) & (~(ENABLE_CPUA_BASE_A0000));
OUTREG8(CRT_DATA_REG,byte);
- /* program the GBD and SBDs */
- OUTREG32(S3_GLB_BD_LOW,psav->GlobalBD.bd2.LoPart );
- OUTREG32(S3_GLB_BD_HIGH,(psav->GlobalBD.bd2.HiPart
+ if (!psav->IsSecondary) {
+ /* program the GBD and SBDs */
+ OUTREG32(S3_GLB_BD_LOW,psav->GlobalBD.bd2.LoPart );
+ OUTREG32(S3_GLB_BD_HIGH,(psav->GlobalBD.bd2.HiPart
| bci_enable | S3_LITTLE_ENDIAN | 0x10000000 | S3_BD64));
- OUTREG32(S3_PRI_BD_LOW,psav->GlobalBD.bd2.LoPart);
- OUTREG32(S3_PRI_BD_HIGH,psav->GlobalBD.bd2.HiPart);
- OUTREG32(S3_SEC_BD_LOW,psav->GlobalBD.bd2.LoPart);
- OUTREG32(S3_SEC_BD_HIGH,psav->GlobalBD.bd2.HiPart);
+ OUTREG32(S3_PRI_BD_LOW,psav->GlobalBD.bd2.LoPart);
+ OUTREG32(S3_PRI_BD_HIGH,psav->GlobalBD.bd2.HiPart);
+ OUTREG32(S3_SEC_BD_LOW,psav->GlobalBD.bd2.LoPart);
+ OUTREG32(S3_SEC_BD_HIGH,psav->GlobalBD.bd2.HiPart);
+ }
/* turn on screen */
OUTREG8(SEQ_ADDRESS_REG,0x01);
@@ -1433,46 +1439,6 @@ void SavageSetGBD_2000(ScrnInfoPtr pScrn)
OUTREG8(SEQ_DATA_REG,byte);
}
-static
-void SavageRestoreAccelState(ScrnInfoPtr pScrn)
-{
- SavagePtr psav = SAVPTR(pScrn);
- int bci_enable;
- unsigned long cmd;
-
- BCI_GET_PTR;
-
- if (psav->Chipset == S3_SAVAGE_MX)
- bci_enable = BCI_ENABLE;
- else
- bci_enable = BCI_ENABLE_TWISTER;
-
- psav->WaitIdleEmpty(psav);
-
- /* may only need to update the GBD */
-#if 1
- psav->WaitQueue(psav, 2);
-
- cmd = BCI_SET_REGISTER | 0xE0 | (2<<16);
- BCI_SEND(cmd);
- BCI_SEND(psav->GlobalBD.bd2.LoPart);
- BCI_SEND((psav->GlobalBD.bd2.HiPart
- | bci_enable | S3_LITTLE_ENDIAN | S3_BD64));
-#endif
-#if 0
- /* program the GBD */
- OUTREG32(S3_GLB_BD_LOW,psav->GlobalBD.bd2.LoPart );
- OUTREG32(S3_GLB_BD_HIGH,(psav->GlobalBD.bd2.HiPart
- | bci_enable | S3_LITTLE_ENDIAN | S3_BD64));
- OUTREG32(S3_PRI_BD_LOW,psav->GlobalBD.bd2.LoPart);
- OUTREG32(S3_PRI_BD_HIGH,psav->GlobalBD.bd2.HiPart);
- OUTREG32(S3_SEC_BD_LOW,psav->GlobalBD.bd2.LoPart);
- OUTREG32(S3_SEC_BD_HIGH,psav->GlobalBD.bd2.HiPart);
-#endif
-
- return;
-}
-
/* Acceleration init function, sets up pointers to our accelerated functions */
Bool
@@ -1526,38 +1492,17 @@ SavageInitAccel(ScreenPtr pScreen)
xaaptr->Sync = SavageAccelSync;
- if(xf86IsEntityShared(pScrn->entityList[0]))
- {
- DevUnion* pPriv;
- SavageEntPtr pEnt;
- pPriv = xf86GetEntityPrivate(pScrn->entityList[0],
- gSavageEntityIndex);
- pEnt = pPriv->ptr;
-
- /*if there are more than one devices sharing this entity, we
- have to assign this call back, otherwise the XAA will be
- disabled */
- if(pEnt->HasSecondary)
- xaaptr->RestoreAccelState = SavageRestoreAccelState;
- }
-
-
/* ScreenToScreen copies */
#if 1
- /* screen to screen copies cause corruption when used on crtc2 @32 bpp
- not sure why -- AGD */
- if ((pScrn->bitsPerPixel == 32) && (psav->IsSecondary)) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "XAAScreenToScreenCopy disabled on crtc2 at depth 24\n");
- } else {
+
xaaptr->SetupForScreenToScreenCopy = SavageSetupForScreenToScreenCopy;
xaaptr->SubsequentScreenToScreenCopy = SavageSubsequentScreenToScreenCopy;
xaaptr->ScreenToScreenCopyFlags = 0
| NO_TRANSPARENCY
| NO_PLANEMASK
| ROP_NEEDS_SOURCE;
- }
+
#endif
@@ -2125,7 +2070,8 @@ SavageSetupForScreenToScreenCopy(
SavagePtr psav = SAVPTR(pScrn);
int cmd;
- cmd = BCI_CMD_RECT | BCI_CMD_DEST_GBD | BCI_CMD_SRC_GBD;
+ cmd = BCI_CMD_RECT | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_SBD_COLOR_NEW;
+
BCI_CMD_SET_ROP( cmd, XAAGetCopyROP(rop) );
if (transparency_color != -1)
cmd |= BCI_CMD_SEND_COLOR | BCI_CMD_SRC_TRANSPARENT;
@@ -2148,9 +2094,11 @@ SavageSubsequentScreenToScreenCopy(
int h)
{
SavagePtr psav = SAVPTR(pScrn);
+
BCI_GET_PTR;
if (!w || !h) return;
+
if (!(psav->SavedBciCmd & BCI_CMD_RECT_XP)) {
w --;
x1 += w;
@@ -2164,8 +2112,17 @@ SavageSubsequentScreenToScreenCopy(
h ++;
}
- psav->WaitQueue(psav,6);
+ psav->WaitQueue(psav,9);
+
+
BCI_SEND(psav->SavedBciCmd);
+
+ BCI_SEND(psav->GlobalBD.bd2.LoPart);
+ BCI_SEND(psav->GlobalBD.bd2.HiPart);
+
+ BCI_SEND(psav->GlobalBD.bd2.LoPart);
+ BCI_SEND(psav->GlobalBD.bd2.HiPart);
+
if (psav->SavedBgColor != 0xffffffff)
BCI_SEND(psav->SavedBgColor);
BCI_SEND(BCI_X_Y(x1, y1));
@@ -2192,7 +2149,7 @@ SavageSetupForSolidFill(
cmd = BCI_CMD_RECT
| BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
- | BCI_CMD_DEST_GBD | BCI_CMD_SRC_SOLID;
+ | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_SOLID;
/* Don't send a color if we don't have to. */
@@ -2230,9 +2187,13 @@ SavageSubsequentSolidFillRect(
if( !w || !h )
return;
- psav->WaitQueue(psav,5);
+ psav->WaitQueue(psav,7);
BCI_SEND(psav->SavedBciCmd);
+
+ BCI_SEND(psav->GlobalBD.bd2.LoPart);
+ BCI_SEND(psav->GlobalBD.bd2.HiPart);
+
if( psav->SavedBciCmd & BCI_CMD_SEND_COLOR )
BCI_SEND(psav->SavedFgColor);
BCI_SEND(BCI_X_Y(x, y));
@@ -2279,7 +2240,7 @@ SavageSetupForCPUToScreenColorExpandFill(
cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
| BCI_CMD_CLIP_LR
- | BCI_CMD_DEST_GBD | BCI_CMD_SRC_MONO;
+ | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_MONO;
mix = SavageHelpPatternROP( pScrn, &fg, &bg, planemask, &rop );
@@ -2314,9 +2275,13 @@ SavageSubsequentScanlineCPUToScreenColorExpandFill(
/* XAA will be sending bitmap data next. */
/* We should probably wait for empty/idle here. */
- psav->WaitQueue(psav,20);
+ psav->WaitQueue(psav,22);
BCI_SEND(psav->SavedBciCmd);
+
+ BCI_SEND(psav->GlobalBD.bd2.LoPart);
+ BCI_SEND(psav->GlobalBD.bd2.HiPart);
+
BCI_SEND(BCI_CLIP_LR(x+skipleft, x+w-1));
w = (w + 31) & ~31;
if( psav->SavedBciCmd & BCI_CMD_SEND_COLOR )
@@ -2382,7 +2347,7 @@ SavageSetupForMono8x8PatternFill(
mix = XAAHelpPatternROP( pScrn, &fg, &bg, planemask, &rop );
cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
- | BCI_CMD_DEST_GBD;
+ | BCI_CMD_DEST_PBD_NEW;
if( mix & ROP_PAT )
cmd |= BCI_CMD_SEND_COLOR | BCI_CMD_PAT_MONO;
@@ -2420,8 +2385,12 @@ SavageSubsequentMono8x8PatternFillRect(
if( !w || !h )
return;
- psav->WaitQueue(psav,7);
+ psav->WaitQueue(psav,9);
BCI_SEND(psav->SavedBciCmd);
+
+ BCI_SEND(psav->GlobalBD.bd2.LoPart);
+ BCI_SEND(psav->GlobalBD.bd2.HiPart);
+
if( psav->SavedBciCmd & BCI_CMD_SEND_COLOR )
BCI_SEND(psav->SavedFgColor);
if( psav->SavedBgColor != 0xffffffff )
diff --git a/src/savage_image.c b/src/savage_image.c
index 62e5c52..766c810 100644
--- a/src/savage_image.c
+++ b/src/savage_image.c
@@ -105,13 +105,17 @@ SavageWriteBitmapCPUToScreenColorExpand (
cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
| BCI_CMD_SEND_COLOR | BCI_CMD_CLIP_LR
- | BCI_CMD_DEST_GBD | BCI_CMD_SRC_MONO;
+ | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_MONO;
cmd |= XAAGetCopyROP(rop) << 16;
if( bg == -1 )
cmd |= BCI_CMD_SRC_TRANSPARENT;
BCI_SEND(cmd);
+
+ BCI_SEND(psav->GlobalBD.bd2.LoPart);
+ BCI_SEND(psav->GlobalBD.bd2.HiPart);
+
BCI_SEND(BCI_CLIP_LR(x+skipleft, x+w-1));
BCI_SEND(fg);
if( bg != -1 )
@@ -162,7 +166,7 @@ SavageSetupForImageWrite(
cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
| BCI_CMD_CLIP_LR
- | BCI_CMD_DEST_GBD | BCI_CMD_SRC_COLOR;
+ | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_COLOR;
cmd |= XAAGetCopyROP(rop) << 16;
@@ -186,8 +190,12 @@ void SavageSubsequentImageWriteRect
SavagePtr psav = SAVPTR(pScrn);
BCI_GET_PTR;
- psav->WaitQueue( psav, 6 );
+ psav->WaitQueue( psav, 8 );
BCI_SEND(psav->SavedBciCmd);
+
+ BCI_SEND(psav->GlobalBD.bd2.LoPart);
+ BCI_SEND(psav->GlobalBD.bd2.HiPart);
+
BCI_SEND(BCI_CLIP_LR(x+skipleft, x+w-1));
if( psav->SavedBgColor != 0xffffffff )
BCI_SEND(psav->SavedBgColor);