xf86-video-savage 2.1.3

This commit is contained in:
matthieu 2007-09-30 14:57:19 +00:00
parent 8b96042c3c
commit e5b75a59c1
6 changed files with 758 additions and 727 deletions

View File

@ -22,7 +22,7 @@
AC_PREREQ(2.57)
AC_INIT([xf86-video-savage],
2.1.2,
2.1.3,
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
xf86-video-savage)

View File

@ -80,7 +80,7 @@ Default: hardware cursor.
.TP
.BI "Option \*qNoAccel\*q \*q" boolean \*q
Disable or enable acceleration. Default: acceleration is enabled.
TP
.TP
.BI "Option \*qAccelMethod\*q \*q" "string" \*q
Chooses between available acceleration architectures. Valid options are
.B XAA
@ -95,13 +95,18 @@ possibly unstable. The default is
.BI "Option \*qRotate\*q \*qCW\*q"
.TP
.BI "Option \*qRotate\*q \*qCCW\*q"
Rotate the desktop 90 degrees clockwise or counterclockwise. This option
forces the ShadowFB option on, and disables acceleration.
Rotate the desktop 90 degrees clockwise or counterclockwise.
This option forces the ShadowFB option on, and disables acceleration and
the RandR extension.
Default: no rotation.
.TP
.BI "Option \*qShadowFB\*q \*q" boolean \*q
Enable or disable use of the shadow framebuffer layer. This option
disables acceleration. Default: off.
Enable or disable use of the shadow framebuffer layer.
.\" See
.\" .BR shadowfb (__drivermansuffix__)
.\" for further information.
This option disables acceleration.
Default: off.
.TP
.BI "Option \*qLCDClock\*q \*q" frequency \*q
Override the maximum dot clock. Some LCD panels produce incorrect results if
@ -216,6 +221,10 @@ on an AGP card the AGP bus speed is not set and no AGP aperture is
allocated. This implies
.BI DmaType
\*qPCI\*q.
.TP
.BI "Option \*qDRI\*q \*q" boolean \*q
Enable DRI support. This option allows you to enable or disable the DRI.
Default: \*qon\*q (enable DRI).
.SH FILES
savage_drv.o
.SH "SEE ALSO"

View File

@ -118,6 +118,12 @@
#define BCI_SET_REGISTER_COUNT(count) ((count) << 16)
#define BCI_BITPLANE_WRITE_MASK 0xD7
#define BCI_BITPLANE_READ_MASK 0xD8
#define BCI_GBD_1 0xE0
#define BCI_GBD_2 0xE1
#define BCI_PBD_1 0xE2
#define BCI_PBD_2 0xE3
#define BCI_SBD_1 0xE4
#define BCI_SBD_2 0xE5
#define BCI_W_H(w, h) ((((h) << 16) | (w)) & 0x0FFF0FFF)
#define BCI_X_Y(x, y) ((((y) << 16) | (x)) & 0x0FFF0FFF)

File diff suppressed because it is too large Load Diff

View File

@ -95,29 +95,30 @@ static int SavageGetCopyROP(int rop) {
}
static int SavageGetCopyROP_PM(int rop) {
static int SavageGetSolidROP(int rop) {
int ALUCopyROP_PM[16] =
int ALUSolidROP[16] =
{
0x00, /*ROP_0*/ /* not used */
0x75, /*ROP_DSPnoa*/
0x45, /*ROP_DPSnaon*/
0xCA, /*ROP_DPSDxax*/
0xD5, /*ROP_DPSana*/
0xAA, /*ROP_D*/ /* not used */
0x6A, /*ROP_DPSax*/
0xEA, /*ROP_DPSao*/
0x15, /*ROP_DPSaon*/
0x95, /*ROP_DPSaxn*/
0x55, /*ROP_Dn*/ /* not used */
0xD5, /*ROP_DPSanan*/
0x2E, /*ROP_PSDPxox*/ /* is that correct ? */
0xBA, /*ROP_DPSnao*/
0x75, /*ROP_DSPnoan*/
0xFF, /*ROP_1*/ /* not used */
/* GXclear */ 0x00, /* 0 */
/* GXand */ 0xA0, /* src AND dst */
/* GXandReverse */ 0x50, /* src AND NOT dst */
/* GXcopy */ 0xF0, /* src */
/* GXandInverted*/ 0x0A, /* NOT src AND dst */
/* GXnoop */ 0xAA, /* dst */
/* GXxor */ 0x5A, /* src XOR dst */
/* GXor */ 0xFA, /* src OR dst */
/* GXnor */ 0x05, /* NOT src AND NOT dst */
/* GXequiv */ 0xA5, /* NOT src XOR dst */
/* GXinvert */ 0x55, /* NOT dst */
/* GXorReverse */ 0xF5, /* src OR NOT dst */
/* GXcopyInverted*/ 0x0F, /* NOT src */
/* GXorInverted */ 0xAF, /* NOT src OR dst */
/* GXnand */ 0x5F, /* NOT src OR NOT dst */
/* GXset */ 0xFF, /* 1 */
};
return (ALUCopyROP_PM[rop]);
return (ALUSolidROP[rop]);
}
@ -171,14 +172,14 @@ SavageEXAInit(ScreenPtr pScreen)
if (psav->Chipset == S3_SAVAGE2000 ||
psav->Chipset == S3_SUPERSAVAGE) {
psav->EXADriverPtr->pixmapOffsetAlign = 128; /* octword */
psav->EXADriverPtr->pixmapOffsetAlign = 16; /* octword */
} else {
psav->EXADriverPtr->pixmapOffsetAlign = 64; /* qword */
psav->EXADriverPtr->pixmapOffsetAlign = 8; /* quadword */
}
/* engine has 12 bit coordinates */
psav->EXADriverPtr->maxX = 4095;
psav->EXADriverPtr->maxY = 4095;
psav->EXADriverPtr->maxX = 4096;
psav->EXADriverPtr->maxY = 4096;
/* Sync */
psav->EXADriverPtr->WaitMarker = SavageEXASync;
@ -200,7 +201,7 @@ SavageEXAInit(ScreenPtr pScreen)
/* host data blit */
psav->EXADriverPtr->UploadToScreen = SavageUploadToScreen;
#endif
#if 1
#if 0
psav->EXADriverPtr->DownloadFromScreen = SavageDownloadFromScreen;
#endif
@ -272,17 +273,52 @@ SavagePrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
{
ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
SavagePtr psav = SAVPTR(pScrn);
int cmd;
int cmd, rop;
BCI_GET_PTR;
/*ErrorF("in preparesolid\n");*/
/* HW seems to ignore alpha */
if (pPixmap->drawable.bitsPerPixel == 32)
return FALSE;
cmd = BCI_CMD_RECT
| BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
| BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_SOLID
| BCI_CMD_SEND_COLOR;
BCI_CMD_SET_ROP( cmd, SavageGetCopyROP(alu) );
| BCI_CMD_DEST_PBD /*BCI_CMD_DEST_PBD_NEW*/
| BCI_CMD_SRC_SOLID;
#if 0
if (alu == 3 /*GXcopy*/) {
if (fg == 0)
alu = 0 /*GXclear*/;
else if (fg == planemask)
alu = 15 /*GXset*/;
}
if (EXA_PM_IS_SOLID(&pPixmap->drawable, planemask)) {
if (!((alu == 5 /*GXnoop*/) || (alu == 15 /*GXset*/) || (alu == 0 /*GXclear*/) || (alu == 10 /*GXinvert*/)))
cmd |= BCI_CMD_SEND_COLOR;
rop = SavageGetCopyROP(alu);
} else {
switch(alu) {
case 5 /*GXnoop*/:
break;
case 15 /*GXset*/:
case 0 /*GXclear*/:
case 10 /*GXinvert*/:
cmd |= BCI_CMD_SEND_COLOR;
fg = planemask;
break;
default:
cmd |= BCI_CMD_SEND_COLOR;
break;
}
rop = SavageGetSolidROP(alu);
}
#else
cmd |= BCI_CMD_SEND_COLOR;
rop = SavageGetSolidROP(alu);
#endif
BCI_CMD_SET_ROP( cmd, rop );
psav->pbd_offset = exaGetPixmapOffset(pPixmap);
psav->pbd_high = SavageSetBD(psav, pPixmap);
@ -290,17 +326,18 @@ SavagePrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
psav->SavedBciCmd = cmd;
psav->SavedFgColor = fg;
psav->WaitQueue(psav,6);
psav->WaitQueue(psav,5);
BCI_SEND(BCI_SET_REGISTER
| BCI_SET_REGISTER_COUNT(1)
| BCI_BITPLANE_WRITE_MASK);
BCI_SEND(planemask);
BCI_SEND(psav->SavedBciCmd);
BCI_SEND(BCI_SET_REGISTER
| BCI_SET_REGISTER_COUNT(2)
| BCI_PBD_1);
BCI_SEND(psav->pbd_offset);
BCI_SEND(psav->pbd_high);
BCI_SEND(psav->SavedFgColor);
return TRUE;
}
@ -313,11 +350,17 @@ SavageSolid(PixmapPtr pPixmap, int x1, int y1, int x2, int y2)
int w = x2 - x1;
int h = y2 - y1;
BCI_GET_PTR;
if( !w || !h )
return;
psav->WaitQueue(psav,2);
/* yes, it has to be done this way... */
psav->WaitQueue(psav,4);
BCI_SEND(psav->SavedBciCmd);
/*BCI_SEND(psav->pbd_offset);
BCI_SEND(psav->pbd_high);*/
#if 0
if ( psav->SavedBciCmd & BCI_CMD_SEND_COLOR )
BCI_SEND(psav->SavedFgColor);
#endif
BCI_SEND(psav->SavedFgColor);
BCI_SEND(BCI_X_Y(x1, y1));
BCI_SEND(BCI_W_H(w, h));
@ -412,18 +455,19 @@ SavageUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, char *src, int
ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
SavagePtr psav = SAVPTR(pScrn);
BCI_GET_PTR;
int i, j, dwords, Bpp;
int i, j, dwords, queue, Bpp;
unsigned int cmd;
CARD32 * srcp;
Bpp = pDst->drawable.bitsPerPixel / 8;
dwords = ((w * Bpp) + 3) >> 2;
dwords = (((w * Bpp) + 3) >> 2) * h;
psav->sbd_offset = exaGetPixmapOffset(pDst);
psav->sbd_high = SavageSetBD(psav, pDst);
cmd = BCI_CMD_RECT
| BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
| BCI_CMD_CLIP_LR
| BCI_CMD_DEST_SBD_NEW
| BCI_CMD_SRC_COLOR; /* host color data */
@ -442,17 +486,21 @@ SavageUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, char *src, int
BCI_SEND(BCI_X_Y(x, y));
BCI_SEND(BCI_W_H(w, h));
for (i = 0; i < h; i++) {
srcp = (CARD32 *)src;
BCI_RESET;
for (j = dwords; j > 0; j--) {
CARD32 dw = *srcp;
BCI_SEND(dw);
srcp++;
srcp = (CARD32 *)src;
queue = 120 * 1024;
while (dwords) {
if (queue < 4) {
BCI_RESET;
queue = 120 * 1024;
}
src += src_pitch;
BCI_SEND(*srcp);
queue -= 4;
dwords--;
srcp++;
}
/*exaWaitSync(pDst->drawable.pScreen);*/
return TRUE;
}

View File

@ -1378,39 +1378,7 @@ SavageAllocateMemory(
}
offset = linear->offset * cpp;
}
#if 0
if(area) {
if((area->box.y2 - area->box.y1) >= numlines)
return area;
if(xf86ResizeOffscreenArea(area, pScrn->displayWidth, numlines))
return area;
xf86FreeOffscreenArea(area);
}
pScreen = screenInfo.screens[pScrn->scrnIndex];
xf86PurgeUnlockedOffscreenAreas(pScreen);
new_area = xf86AllocateOffscreenArea(pScreen, pScrn->displayWidth,
numlines, 0, NULL, NULL, NULL);
if(!new_area) {
int max_w, max_h;
xf86QueryLargestOffscreenArea(pScreen, &max_w, &max_h, 0,
FAVOR_WIDTH_THEN_AREA, PRIORITY_EXTREME);
if((max_w < pScrn->displayWidth) || (max_h < numlines))
return NULL;
xf86PurgeUnlockedOffscreenAreas(pScreen);
new_area = xf86AllocateOffscreenArea(pScreen, pScrn->displayWidth,
numlines, 0, NULL, NULL, NULL);
}
return new_area;
#endif
return offset;
}