diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/savage_bci.h | 6 | ||||
-rw-r--r-- | src/savage_driver.c | 104 | ||||
-rw-r--r-- | src/savage_driver.h | 8 | ||||
-rw-r--r-- | src/savage_exa.c | 142 | ||||
-rw-r--r-- | src/savage_video.c | 32 |
5 files changed, 190 insertions, 102 deletions
diff --git a/src/savage_bci.h b/src/savage_bci.h index 833a55d..410925d 100644 --- a/src/savage_bci.h +++ b/src/savage_bci.h @@ -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) diff --git a/src/savage_driver.c b/src/savage_driver.c index c76147f..9975119 100644 --- a/src/savage_driver.c +++ b/src/savage_driver.c @@ -39,6 +39,8 @@ #include "config.h" #endif +#include <unistd.h> + #include "xf86RAC.h" #include "shadowfb.h" @@ -235,6 +237,7 @@ typedef enum { ,OPTION_DMA_MODE ,OPTION_AGP_MODE ,OPTION_AGP_SIZE + ,OPTION_DRI } SavageOpts; @@ -267,6 +270,7 @@ static const OptionInfoRec SavageOptions[] = { OPTION_DMA_MODE, "DmaMode", OPTV_ANYSTR, {0}, FALSE }, { OPTION_AGP_MODE, "AGPMode", OPTV_INTEGER, {0}, FALSE }, { OPTION_AGP_SIZE, "AGPSize", OPTV_INTEGER, {0}, FALSE }, + { OPTION_DRI, "DRI", OPTV_BOOLEAN, {0}, TRUE }, #endif { -1, NULL, OPTV_NONE, {0}, FALSE } }; @@ -770,9 +774,9 @@ static void SavageFreeRec(ScrnInfoPtr pScrn) TRACE(( "SavageFreeRec(%x)\n", pScrn->driverPrivate )); if (!pScrn->driverPrivate) return; + SavageUnmapMem(pScrn, 1); xfree(pScrn->driverPrivate); pScrn->driverPrivate = NULL; - SavageUnmapMem(pScrn, 1); } @@ -908,6 +912,63 @@ static void SavageDoDDC(ScrnInfoPtr pScrn) } } +/* Copied from ddc/Property.c via nv */ +static DisplayModePtr +SavageModesAdd(DisplayModePtr Modes, DisplayModePtr Additions) +{ + if (!Modes) { + if (Additions) + return Additions; + else + return NULL; + } + + if (Additions) { + DisplayModePtr Mode = Modes; + + while (Mode->next) + Mode = Mode->next; + + Mode->next = Additions; + Additions->prev = Mode; + } + + return Modes; +} + +/* borrowed from nv */ +static void +SavageAddPanelMode(ScrnInfoPtr pScrn) +{ + SavagePtr psav= SAVPTR(pScrn); + DisplayModePtr Mode = NULL; + + Mode = xf86CVTMode(psav->PanelX, psav->PanelY, 60.00, TRUE, FALSE); + Mode->type = M_T_DRIVER | M_T_PREFERRED; + pScrn->monitor->Modes = SavageModesAdd(pScrn->monitor->Modes, Mode); + + if ((pScrn->monitor->nHsync == 0) && + (pScrn->monitor->nVrefresh == 0)) { + if (!Mode->HSync) + Mode->HSync = ((float) Mode->Clock ) / ((float) Mode->HTotal); + if (!Mode->VRefresh) + Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) / + ((float) (Mode->HTotal * Mode->VTotal)); + + if (Mode->HSync < pScrn->monitor->hsync[0].lo) + pScrn->monitor->hsync[0].lo = Mode->HSync; + if (Mode->HSync > pScrn->monitor->hsync[0].hi) + pScrn->monitor->hsync[0].hi = Mode->HSync; + if (Mode->VRefresh < pScrn->monitor->vrefresh[0].lo) + pScrn->monitor->vrefresh[0].lo = Mode->VRefresh; + if (Mode->VRefresh > pScrn->monitor->vrefresh[0].hi) + pScrn->monitor->vrefresh[0].hi = Mode->VRefresh; + + pScrn->monitor->nHsync = 1; + pScrn->monitor->nVrefresh = 1; + } +} + static void SavageGetPanelInfo(ScrnInfoPtr pScrn) { SavagePtr psav= SAVPTR(pScrn); @@ -1139,15 +1200,23 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) if ((s = xf86GetOptValString(psav->Options, OPTION_ROTATE))) { if(!xf86NameCmp(s, "CW")) { /* accel is disabled below for shadowFB */ + /* RandR is disabled when the Rotate option is used (does + * not work well together and scrambles the screen) */ + psav->shadowFB = TRUE; psav->rotate = 1; + xf86DisableRandR(); xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, - "Rotating screen clockwise - acceleration disabled\n"); + "Rotating screen clockwise" + "- acceleration and RandR disabled\n"); } else if(!xf86NameCmp(s, "CCW")) { psav->shadowFB = TRUE; psav->rotate = -1; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rotating screen" - "counter clockwise - acceleration disabled\n"); + xf86DisableRandR(); + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Rotating screen counter clockwise" + " - acceleration and RandR disabled\n"); + } else { xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "\"%s\" is not a valid" "value for Option \"Rotate\"\n", s); @@ -1858,6 +1927,7 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) if(psav->DisplayType == MT_LCD) { SavageGetPanelInfo(pScrn); + SavageAddPanelMode(pScrn); } #if 0 @@ -2997,6 +3067,9 @@ static Bool SavageScreenInit(int scrnIndex, ScreenPtr pScreen, SavageEnableMMIO(pScrn); + if (!SavageMapMem(pScrn)) + return FALSE; + psav->FBStart2nd = 0; if (psav->overlayDepth) { @@ -3018,8 +3091,12 @@ static Bool SavageScreenInit(int scrnIndex, ScreenPtr pScreen, vgaHWBlankScreen(pScrn, TRUE); #ifdef XF86DRI - if (psav->IsSecondary) { - psav->directRenderingEnabled = FALSE; + if (!xf86ReturnOptValBool(psav->Options, OPTION_DRI, TRUE)) { + psav->directRenderingEnabled = FALSE; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Direct rendering forced off\n"); + } else if (psav->IsSecondary) { + psav->directRenderingEnabled = FALSE; } else if (xf86IsEntityShared(psav->pEnt->index)) { /* Xinerama has sync problem with DRI, disable it for now */ psav->directRenderingEnabled = FALSE; @@ -3732,6 +3809,8 @@ static Bool SavageCloseScreen(int scrnIndex, ScreenPtr pScreen) #ifdef XF86DRI if (psav->directRenderingEnabled) { SAVAGEDRICloseScreen(pScreen); + /* reset shadow values */ + SavageInitShadowStatus(pScrn); psav->directRenderingEnabled=FALSE; } #endif @@ -3807,7 +3886,6 @@ void SavageDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y, int crtc2) { SavagePtr psav = SAVPTR(pScrn); - DisplayModePtr currentMode = pScrn->currentMode; int address=0,top=0,left=0,tile_height,tile_size; TRACE(("SavageDoAdjustFrame(%d,%d,%x)\n", x, y, flags)); @@ -3838,15 +3916,6 @@ SavageDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y, int crtc2) address += pScrn->fbOffset; - /* - * because we align the viewport to the width and height of one tile - * we should update the locate of frame - */ - pScrn->frameX0 = left; - pScrn->frameY0 = top; - pScrn->frameX1 = left + currentMode->HDisplay - 1; - pScrn->frameY1 = top + currentMode->VDisplay - 1; - if (psav->Chipset == S3_SAVAGE_MX) { if (!crtc2) { OUTREG32(PRI_STREAM_FBUF_ADDR0, address & 0xFFFFFFFC); @@ -4065,9 +4134,6 @@ void SavageLoadPaletteSavage4(ScrnInfoPtr pScrn, int numColors, int *indicies, } static void SavageCalcClock(long freq, int min_m, int min_n1, int max_n1, - - /* Make sure linear addressing is enabled after the BIOS call. */ - /* Note that we must use an I/O port to do this. */ int min_n2, int max_n2, long freq_min, long freq_max, unsigned int *mdiv, unsigned int *ndiv, unsigned int *r) diff --git a/src/savage_driver.h b/src/savage_driver.h index cb6b557..9286c1e 100644 --- a/src/savage_driver.h +++ b/src/savage_driver.h @@ -180,10 +180,10 @@ typedef struct #define SAVAGE_TV_ON 4 #define SAVAGE_DRIVER_NAME "savage" -#define SAVAGE_DRIVER_VERSION "2.1.2" -#define SAVAGE_VERSION_MAJOR 2 -#define SAVAGE_VERSION_MINOR 1 -#define SAVAGE_PATCHLEVEL 2 +#define SAVAGE_DRIVER_VERSION PACKAGE_VERSION +#define SAVAGE_VERSION_MAJOR PACKAGE_VERSION_MAJOR +#define SAVAGE_VERSION_MINOR PACKAGE_VERSION_MINOR +#define SAVAGE_PATCHLEVEL PACKAGE_VERSION_PATCHLEVEL #define SAVAGE_VERSION ((SAVAGE_VERSION_MAJOR << 24) | \ (SAVAGE_VERSION_MINOR << 16) | \ SAVAGE_PATCHLEVEL) diff --git a/src/savage_exa.c b/src/savage_exa.c index 8e6da38..aa6905a 100644 --- a/src/savage_exa.c +++ b/src/savage_exa.c @@ -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; } diff --git a/src/savage_video.c b/src/savage_video.c index ed45b0f..64dcef1 100644 --- a/src/savage_video.c +++ b/src/savage_video.c @@ -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; } |