Пример #1
0
static void
GXInitEXAMemory(ScrnInfoPtr pScrni, unsigned int *offset, unsigned int *avail)
{
    GeodePtr pGeode = GEODEPTR(pScrni);

    if (pGeode->exaBfrSz > 0 && pGeode->exaBfrSz <= *avail) {
        pGeode->exaBfrOffset = *offset;
        *offset += pGeode->exaBfrOffset;
        *avail -= pGeode->exaBfrOffset;
    }
}
static void *
GXWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode,
               CARD32 *size, void *closure)
{
    ScrnInfoPtr pScrni = xf86ScreenToScrn(pScreen);
    GeodeRec *pGeode = GEODEPTR(pScrni);

    *size = pGeode->displayPitch;

    return (pGeode->FBBase + pGeode->displayOffset) +
        row * pGeode->displayPitch + offset;
}
Пример #3
0
static void
GXInitXAAMemory(ScrnInfoPtr pScrni, unsigned int *offset, unsigned int *avail)
{
    GeodePtr pGeode = GEODEPTR(pScrni);
    unsigned int size, i, pitch;

    /* XXX - FIXME - What if we are out of room?  Then what? */
    /* For now, we NULL them all out.                        */

    if (pGeode->NoOfImgBuffers > 0) {
        size = pGeode->displayPitch * pGeode->NoOfImgBuffers;
        if (size <= *avail) {
            for (i = 0; i < pGeode->NoOfImgBuffers; i++) {
                pGeode->AccelImageWriteBuffers[i] = pGeode->FBBase + *offset;
                *offset += pGeode->displayPitch;
                *avail -= pGeode->displayPitch;
            }
        }
        else {
            xf86DrvMsg(pScrni->scrnIndex, X_ERROR,
                       "Not enough memory for image write buffers.\n");

            for (i = 0; i < pGeode->NoOfImgBuffers; i++)
                pGeode->AccelImageWriteBuffers[i] = NULL;
        }
    }

    if (pGeode->NoOfColorExpandLines > 0) {
        pitch = ((pGeode->displayPitch + 31) >> 5) << 2;
        size = pitch * pGeode->NoOfColorExpandLines;

        if (size <= *avail) {
            for (i = 0; i < pGeode->NoOfColorExpandLines; i++) {
                pGeode->AccelColorExpandBuffers[i] = pGeode->FBBase + *offset;
                *offset += pitch;
                *avail -= pitch;
            }
        }
        else {
            xf86DrvMsg(pScrni->scrnIndex, X_ERROR,
                       "Not enough memory for color expansion buffers.\n");

            for (i = 0; i < pGeode->NoOfImgBuffers; i++)
                pGeode->AccelColorExpandBuffers[i] = NULL;
        }
    }
static void
GXUpdate(ScreenPtr pScreen, shadowBufPtr pBuf)
{
    ScrnInfoPtr pScrni = xf86ScreenToScrn(pScreen);
    GeodeRec *pGeode = GEODEPTR(pScrni);
    int rotate = pGeode->rotation;

    switch (rotate) {
    case RR_Rotate_90:

        if (pScrni->bitsPerPixel == 8)
            shadowUpdateRotate8_90(pScreen, pBuf);
        else if (pScrni->bitsPerPixel == 16)
            shadowUpdateRotate16_90(pScreen, pBuf);
        else
            shadowUpdateRotate32_90(pScreen, pBuf);

        break;

    case RR_Rotate_180:

        if (pScrni->bitsPerPixel == 8)
            shadowUpdateRotate8_180(pScreen, pBuf);
        else if (pScrni->bitsPerPixel == 16)
            shadowUpdateRotate16_180(pScreen, pBuf);
        else
            shadowUpdateRotate32_180(pScreen, pBuf);

        break;

    case RR_Rotate_270:
        if (pScrni->bitsPerPixel == 8)
            shadowUpdateRotate8_270(pScreen, pBuf);
        else if (pScrni->bitsPerPixel == 16)
            shadowUpdateRotate16_270(pScreen, pBuf);
        else
            shadowUpdateRotate32_270(pScreen, pBuf);

        break;
    }
}
Bool
GXRotate(ScrnInfoPtr pScrni, DisplayModePtr mode)
{
    GeodeRec *pGeode = GEODEPTR(pScrni);
    Rotation curr = pGeode->rotation;
    unsigned int curdw = pScrni->displayWidth;
    PixmapPtr pPixmap;
    BOOL ret;

    pPixmap = pScrni->pScreen->GetScreenPixmap(pScrni->pScreen);
    pGeode->rotation = GXGetRotation(pScrni->pScreen);

    /* Leave if we have nothing to do */

    if (pGeode->rotation == curr && pGeode->curMode == mode) {
        return TRUE;
    }

    shadowRemove(pScrni->pScreen, NULL);

    switch (pGeode->rotation) {
    case RR_Rotate_0:
        ErrorF("Rotate to 0 degrees\n");
        pScrni->displayWidth = pGeode->displayWidth;
        pGeode->Pitch = pGeode->displayPitch;
        break;

    case RR_Rotate_90:
        ErrorF("Rotate to 90 degrees\n");
        pScrni->displayWidth = pScrni->pScreen->width;
        break;

    case RR_Rotate_180:
        ErrorF("Rotate to 180 degrees\n");
        pScrni->displayWidth = pGeode->displayWidth;
        break;

    case RR_Rotate_270:
        ErrorF("Rotate to 270 degrees\n");
        pScrni->displayWidth = pScrni->pScreen->width;
        break;
    }

    if (pGeode->rotation != RR_Rotate_0) {

        ret =
            shadowAdd(pScrni->pScreen, pPixmap, GXUpdate, GXWindowLinear,
                      pGeode->rotation, NULL);

        if (!ret) {
            ErrorF("shadowAdd failed\n");
            goto error;
        }
    }

    if (pGeode->rotation == RR_Rotate_0)
        pScrni->fbOffset = pGeode->displayOffset;
    else
        pScrni->fbOffset = pGeode->shadowOffset;

    pScrni->pScreen->ModifyPixmapHeader(pPixmap,
                                        pScrni->pScreen->width,
                                        pScrni->pScreen->height,
                                        pScrni->pScreen->rootDepth,
                                        pScrni->bitsPerPixel,
                                        PixmapBytePad(pScrni->displayWidth,
                                                      pScrni->
                                                      pScreen->rootDepth),
                                        (pointer) (pGeode->FBBase +
                                                   pScrni->fbOffset));

    /* Don't use XAA pixmap cache or offscreen pixmaps when rotated */
#if XF86XAA
    if (pGeode->AccelInfoRec) {
        if (pGeode->rotation == RR_Rotate_0) {
            pGeode->AccelInfoRec->Flags =
                LINEAR_FRAMEBUFFER | OFFSCREEN_PIXMAPS | PIXMAP_CACHE;
            pGeode->AccelInfoRec->UsingPixmapCache = TRUE;
            pGeode->AccelInfoRec->maxOffPixWidth = 0;
            pGeode->AccelInfoRec->maxOffPixHeight = 0;
        }
        else {
            pGeode->AccelInfoRec->Flags = LINEAR_FRAMEBUFFER;
            pGeode->AccelInfoRec->UsingPixmapCache = FALSE;
            pGeode->AccelInfoRec->maxOffPixWidth = 1;
            pGeode->AccelInfoRec->maxOffPixHeight = 1;
        }
    }
#endif

    return TRUE;

 error:
    /* Restore the old rotation */
    pScrni->displayWidth = curdw;

    if (curr & (RR_Rotate_0 | RR_Rotate_180)) {
        pScrni->pScreen->width = pScrni->virtualX;
        pScrni->pScreen->height = pScrni->virtualY;
    }
    else {
        pScrni->pScreen->width = pScrni->virtualY;
        pScrni->pScreen->height = pScrni->virtualX;
    }

    pGeode->rotation = curr;
    return FALSE;
}