Module Name: xsrc Committed By: macallan Date: Tue Aug 11 03:57:36 UTC 2015
Modified Files: xsrc/external/mit/xf86-video-sunffb/dist/src: ffb.h ffb_accel.c ffb_driver.c ffb_regs.h Added Files: xsrc/external/mit/xf86-video-sunffb/dist/src: ffb_exa.c Log Message: add basic EXA support To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 xsrc/external/mit/xf86-video-sunffb/dist/src/ffb.h cvs rdiff -u -r1.3 -r1.4 \ xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_accel.c cvs rdiff -u -r1.7 -r1.8 \ xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_driver.c cvs rdiff -u -r0 -r1.1 xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_exa.c cvs rdiff -u -r1.1.1.2 -r1.2 \ xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_regs.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: xsrc/external/mit/xf86-video-sunffb/dist/src/ffb.h diff -u xsrc/external/mit/xf86-video-sunffb/dist/src/ffb.h:1.5 xsrc/external/mit/xf86-video-sunffb/dist/src/ffb.h:1.6 --- xsrc/external/mit/xf86-video-sunffb/dist/src/ffb.h:1.5 Tue Jun 4 22:20:42 2013 +++ xsrc/external/mit/xf86-video-sunffb/dist/src/ffb.h Tue Aug 11 03:57:36 2015 @@ -34,6 +34,8 @@ #ifdef HAVE_XAA_H #include "xaa.h" #endif +#include "exa.h" + #include <X11/Xmd.h> #include "gcstruct.h" #include "windowstr.h" @@ -179,9 +181,6 @@ typedef struct { #ifdef HAVE_XAA_H XAAInfoRecPtr pXAAInfo; #endif - unsigned int xaa_fbc; - unsigned int xaa_wid; - unsigned int xaa_planemask; unsigned int xaa_linepat; int xaa_xdir, xaa_ydir, xaa_rop; unsigned char *xaa_scanline_buffers[2]; @@ -205,6 +204,12 @@ typedef struct { unsigned char CursorShiftX, CursorShiftY; unsigned char *CursorData; + /* EXA stuff */ + ExaDriverPtr pExa; + int srcpitch, srcoff; + int xdir, ydir, rop; + CARD32 planemask, fbc, wid; + PixmapPtr pix32, pix8; void *I2C; @@ -215,6 +220,7 @@ typedef struct { /* Acceleration */ extern Bool FFBAccelInit(ScreenPtr, FFBPtr); +extern Bool FFBInitEXA(ScreenPtr); extern void CreatorVtChange (ScreenPtr pScreen, int enter); /* HW cursor support */ Index: xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_accel.c diff -u xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_accel.c:1.3 xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_accel.c:1.4 --- xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_accel.c:1.3 Tue Jun 4 22:20:42 2013 +++ xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_accel.c Tue Aug 11 03:57:36 2015 @@ -102,7 +102,7 @@ CreatorVtChange (ScreenPtr pScreen, int FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_ON); pFfb->ppc_cache &= ~FFB_PPC_XS_MASK; pFfb->ppc_cache |= FFB_PPC_XS_WID; - pFfb->wid_cache = (enter ? pFfb->xaa_wid : 0xff); + pFfb->wid_cache = (enter ? pFfb->wid : 0xff); FFBFifo(pFfb, 11); ffb->fbc = pFfb->fbc_cache; ffb->ppc = FFB_PPC_XS_WID; @@ -138,48 +138,6 @@ CreatorVtChange (ScreenPtr pScreen, int FILE *FDEBUG_FD = NULL; #endif -#define FFB_ATTR_SFB_VAR_XAA(__fpriv, __pmask, __alu) \ -do { unsigned int __ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_WID; \ - unsigned int __ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; \ - unsigned int __rop = (FFB_ROP_EDIT_BIT | (__alu))|(FFB_ROP_NEW<<8); \ - unsigned int __fbc = (__fpriv)->xaa_fbc; \ - unsigned int __wid = (__fpriv)->xaa_wid; \ - if (((__fpriv)->ppc_cache & __ppc_mask) != __ppc || \ - (__fpriv)->fbc_cache != __fbc || \ - (__fpriv)->wid_cache != __wid || \ - (__fpriv)->rop_cache != __rop || \ - (__fpriv)->pmask_cache != (__pmask)) \ - __FFB_Attr_SFB_VAR(__fpriv, __ppc, __ppc_mask, __fbc, \ - __wid, __rop, (__pmask)); \ -} while(0) - -#define FFB_ATTR_VSCROLL_XAA(__fpriv, __pmask) \ -do { unsigned int __ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_WID; \ - unsigned int __ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; \ - unsigned int __rop = (FFB_ROP_OLD | (FFB_ROP_OLD << 8)); \ - unsigned int __fbc = (__fpriv)->xaa_fbc; \ - (__fpriv)->ppc_cache &= ~__ppc_mask; \ - (__fpriv)->ppc_cache |= __ppc; \ - (__fpriv)->regs->ppc = __ppc; \ - if ((__fpriv)->fbc_cache != __fbc || \ - (__fpriv)->rop_cache != __rop || \ - (__fpriv)->pmask_cache != (__pmask) || \ - (__fpriv)->drawop_cache != FFB_DRAWOP_VSCROLL) { \ - ffb_fbcPtr __ffb = (__fpriv)->regs; \ - (__fpriv)->fbc_cache = __fbc; \ - (__fpriv)->rop_cache = __rop; \ - (__fpriv)->pmask_cache = (__pmask); \ - (__fpriv)->drawop_cache = FFB_DRAWOP_VSCROLL; \ - (__fpriv)->rp_active = 1; \ - FFBFifo(__fpriv, 4); \ - (__ffb)->fbc = __fbc; \ - (__ffb)->rop = __rop; \ - (__ffb)->pmask = (__pmask); \ - (__ffb)->drawop = FFB_DRAWOP_VSCROLL; \ - } \ -} while(0) - - static CARD32 FFBAlphaTextureFormats[2] = { PICT_a8, 0 }; static CARD32 FFBTextureFormats[2] = { PICT_a8b8g8r8, 0 }; static CARD32 FFBTextureDstFormats[3] = { PICT_a8b8g8r8, PICT_x8b8g8r8, 0 }; @@ -190,8 +148,8 @@ static void FFB_SetupTextureAttrs(FFBPtr unsigned int ppc = FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_VAR; unsigned int ppc_mask = FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; unsigned int rop = FFB_ROP_NEW | (FFB_ROP_NEW << 8); - unsigned int fbc = pFfb->xaa_fbc; - unsigned int wid = pFfb->xaa_wid; + unsigned int fbc = pFfb->fbc; + unsigned int wid = pFfb->wid; ppc |= FFB_PPC_ABE_ENABLE; ppc_mask |= FFB_PPC_ABE_MASK; @@ -396,11 +354,11 @@ static void FFB_SetupForMono8x8PatternFi ppc |= FFB_PPC_TBE_OPAQUE; ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_TBE_MASK | FFB_PPC_CS_MASK; - fbc = pFfb->xaa_fbc; + fbc = pFfb->fbc; rop = (rop | FFB_ROP_EDIT_BIT) | (FFB_ROP_NEW << 8); FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, rop, - FFB_DRAWOP_RECTANGLE, fg, fbc, pFfb->xaa_wid); + FFB_DRAWOP_RECTANGLE, fg, fbc, pFfb->wid); if (bg >= 0) FFB_WRITE_BG(pFfb, ffb, bg); @@ -458,7 +416,7 @@ static void FFB_SetupForScanlineCPUToScr ppc |= FFB_PPC_TBE_OPAQUE; ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_TBE_MASK | FFB_PPC_CS_MASK; - fbc = pFfb->xaa_fbc; + fbc = pFfb->fbc; rop = (rop | FFB_ROP_EDIT_BIT) | (FFB_ROP_NEW << 8); if ((pFfb->ppc_cache & ppc_mask) != ppc || @@ -545,20 +503,20 @@ static void FFB_SetupForDashedLine(ScrnI "fg[%x] bg[%x] rop[%d] pmask[%x] patlen[%d] pat[%x]\n", fg, bg, rop, planemask, length, *pat_ptr)); - pFfb->xaa_planemask = planemask; + pFfb->planemask = planemask; pFfb->xaa_rop = rop; pFfb->xaa_linepat = (*pat_ptr << FFB_LPAT_PATTERN_SHIFT) | (1 << FFB_LPAT_SCALEVAL_SHIFT) | ((length & 0xf) << FFB_LPAT_PATLEN_SHIFT); - fbc = pFfb->xaa_fbc; + fbc = pFfb->fbc; ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8), - FFB_DRAWOP_BRLINEOPEN, fg, fbc, pFfb->xaa_wid); + FFB_DRAWOP_BRLINEOPEN, fg, fbc, pFfb->wid); pFfb->rp_active = 1; } @@ -602,16 +560,16 @@ static void FFB_SetupForSolidLine(ScrnIn "color[%d] rop[%d] pmask[%x]\n", color, rop, planemask)); - pFfb->xaa_planemask = planemask; + pFfb->planemask = planemask; pFfb->xaa_rop = rop; - fbc = pFfb->xaa_fbc; + fbc = pFfb->fbc; ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8), - FFB_DRAWOP_BRLINEOPEN, color, fbc, pFfb->xaa_wid); + FFB_DRAWOP_BRLINEOPEN, color, fbc, pFfb->wid); FFBFifo(pFfb, 1); ffb->lpat = 0; pFfb->rp_active = 1; @@ -653,10 +611,10 @@ void FFB_SetupForSolidFill(ScrnInfoPtr p "color[%d] rop[%d] pmask[%u]\n", color, rop, planemask)); - pFfb->xaa_planemask = planemask; + pFfb->planemask = planemask; pFfb->xaa_rop = rop; - fbc = pFfb->xaa_fbc; + fbc = pFfb->fbc; if (pFfb->ffb_res == ffb_res_high) fbc |= FFB_FBC_WB_B; ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; @@ -664,7 +622,7 @@ void FFB_SetupForSolidFill(ScrnInfoPtr p FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, (FFB_ROP_EDIT_BIT | rop) | (FFB_ROP_NEW << 8), - FFB_DRAWOP_RECTANGLE, color, fbc, pFfb->xaa_wid); + FFB_DRAWOP_RECTANGLE, color, fbc, pFfb->wid); pFfb->rp_active = 1; } @@ -801,7 +759,7 @@ void FFB_SetupForScreenToScreenCopy(Scrn "xdir[%d] ydir[%d] rop[%d] pmask[%x] tcolor[%d]\n", xdir, ydir, rop, planemask, trans_color)); - pFfb->xaa_planemask = planemask; + pFfb->planemask = planemask; pFfb->xaa_xdir = xdir; pFfb->xaa_ydir = ydir; pFfb->xaa_rop = rop; @@ -873,19 +831,19 @@ Bool FFBAccelInit(ScreenPtr pScreen, FFB XAAInfoRecPtr infoRec; ffb_fbcPtr ffb = pFfb->regs; - pFfb->xaa_fbc = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A | + pFfb->fbc = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A | FFB_FBC_WE_FORCEON | FFB_FBC_SB_BOTH | FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | FFB_FBC_RGBE_MASK | FFB_FBC_XE_ON); - pFfb->xaa_wid = FFBWidAlloc(pFfb, TrueColor, 0, TRUE); - if (pFfb->xaa_wid == (unsigned int) -1) + pFfb->wid = FFBWidAlloc(pFfb, TrueColor, 0, TRUE); + if (pFfb->wid == (unsigned int) -1) return FALSE; pFfb->pXAAInfo = infoRec = XAACreateInfoRec(); if (!infoRec) { - FFBWidFree(pFfb, pFfb->xaa_wid); + FFBWidFree(pFfb, pFfb->wid); return FALSE; } @@ -1068,7 +1026,7 @@ Bool FFBAccelInit(ScreenPtr pScreen, FFB FFB_PPC_VCE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST | FFB_PPC_DCE_DISABLE | FFB_PPC_ABE_DISABLE | FFB_PPC_TBE_OPAQUE); - pFfb->wid_cache = pFfb->xaa_wid; + pFfb->wid_cache = pFfb->wid; pFfb->pmask_cache = ~0; pFfb->rop_cache = (FFB_ROP_NEW | (FFB_ROP_NEW << 8)); pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE; @@ -1120,7 +1078,7 @@ Bool FFBAccelInit(ScreenPtr pScreen, FFB free(pFfb->xaa_scanline_buffers[0]); free(pFfb->xaa_scanline_buffers[1]); pFfb->pXAAInfo = NULL; - FFBWidFree(pFfb, pFfb->xaa_wid); + FFBWidFree(pFfb, pFfb->wid); return FALSE; } /* Success */ Index: xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_driver.c diff -u xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_driver.c:1.7 xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_driver.c:1.8 --- xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_driver.c:1.7 Tue Jun 4 22:20:42 2013 +++ xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_driver.c Tue Aug 11 03:57:36 2015 @@ -95,6 +95,7 @@ _X_EXPORT DriverRec SUNFFB = { typedef enum { OPTION_SW_CURSOR, OPTION_HW_CURSOR, + OPTION_ACCELMETHOD, OPTION_NOACCEL } FFBOpts; @@ -102,6 +103,7 @@ static const OptionInfoRec FFBOptions[] { OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_HW_CURSOR, "HWcursor", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_ACCELMETHOD, "AccelMethod", OPTV_STRING, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE } }; @@ -417,11 +419,6 @@ FFBPreInit(ScrnInfoPtr pScrn, int flags) return FALSE; } - if (xf86LoadSubModule(pScrn, "xaa") == NULL) { - FFBFreeRec(pScrn); - return FALSE; - } - if (pFfb->HWCursor && xf86LoadSubModule(pScrn, "ramdac") == NULL) { FFBFreeRec(pScrn); return FALSE; @@ -760,9 +757,22 @@ FFBScreenInit(SCREEN_INIT_ARGS_DECL) xf86SetBlackWhitePixels(pScreen); if (!pFfb->NoAccel) { - if (!FFBAccelInit(pScreen, pFfb)) - return FALSE; - xf86Msg(X_INFO, "%s: Using acceleration\n", pFfb->psdp->device); + char *optstr; + optstr = (char *)xf86GetOptValString(pFfb->Options, OPTION_ACCELMETHOD); + if (optstr == NULL) optstr = "xaa"; + if (xf86NameCmp(optstr, "EXA") == 0) { + xf86Msg(X_INFO, "using EXA\n"); + if (xf86LoadSubModule(pScrn, "exa") != NULL) { + if (!FFBInitEXA(pScreen)) + return FALSE; + } + } else if (xf86NameCmp(optstr, "XAA") == 0) { + xf86Msg(X_INFO, "using XAA\n"); + if (xf86LoadSubModule(pScrn, "xaa") != NULL) { + if (!FFBAccelInit(pScreen, pFfb)) + return FALSE; + } + } } Index: xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_regs.h diff -u xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_regs.h:1.1.1.2 xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_regs.h:1.2 --- xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_regs.h:1.1.1.2 Tue Jun 4 21:46:23 2013 +++ xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_regs.h Tue Aug 11 03:57:36 2015 @@ -518,4 +518,45 @@ do { volatile unsigned int *__p = (__reg FFB_WRITE64(__regp, __lo32, __hi32) #endif +#define FFB_ATTR_SFB_VAR_XAA(__fpriv, __pmask, __alu) \ +do { unsigned int __ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_WID; \ + unsigned int __ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; \ + unsigned int __rop = (FFB_ROP_EDIT_BIT | (__alu))|(FFB_ROP_NEW<<8); \ + unsigned int __fbc = (__fpriv)->fbc; \ + unsigned int __wid = (__fpriv)->wid; \ + if (((__fpriv)->ppc_cache & __ppc_mask) != __ppc || \ + (__fpriv)->fbc_cache != __fbc || \ + (__fpriv)->wid_cache != __wid || \ + (__fpriv)->rop_cache != __rop || \ + (__fpriv)->pmask_cache != (__pmask)) \ + __FFB_Attr_SFB_VAR(__fpriv, __ppc, __ppc_mask, __fbc, \ + __wid, __rop, (__pmask)); \ +} while(0) + +#define FFB_ATTR_VSCROLL_XAA(__fpriv, __pmask) \ +do { unsigned int __ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_VAR | FFB_PPC_XS_WID; \ + unsigned int __ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; \ + unsigned int __rop = (FFB_ROP_OLD | (FFB_ROP_OLD << 8)); \ + unsigned int __fbc = (__fpriv)->fbc; \ + (__fpriv)->ppc_cache &= ~__ppc_mask; \ + (__fpriv)->ppc_cache |= __ppc; \ + (__fpriv)->regs->ppc = __ppc; \ + if ((__fpriv)->fbc_cache != __fbc || \ + (__fpriv)->rop_cache != __rop || \ + (__fpriv)->pmask_cache != (__pmask) || \ + (__fpriv)->drawop_cache != FFB_DRAWOP_VSCROLL) { \ + ffb_fbcPtr __ffb = (__fpriv)->regs; \ + (__fpriv)->fbc_cache = __fbc; \ + (__fpriv)->rop_cache = __rop; \ + (__fpriv)->pmask_cache = (__pmask); \ + (__fpriv)->drawop_cache = FFB_DRAWOP_VSCROLL; \ + (__fpriv)->rp_active = 1; \ + FFBFifo(__fpriv, 4); \ + (__ffb)->fbc = __fbc; \ + (__ffb)->rop = __rop; \ + (__ffb)->pmask = (__pmask); \ + (__ffb)->drawop = FFB_DRAWOP_VSCROLL; \ + } \ +} while(0) + #endif /* FFBREGS_H */ Added files: Index: xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_exa.c diff -u /dev/null xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_exa.c:1.1 --- /dev/null Tue Aug 11 03:57:36 2015 +++ xsrc/external/mit/xf86-video-sunffb/dist/src/ffb_exa.c Tue Aug 11 03:57:36 2015 @@ -0,0 +1,389 @@ +/* $NetBSD: ffb_exa.c,v 1.1 2015/08/11 03:57:36 macallan Exp $ */ +/* + * Copyright (c) 2015 Michael Lorenz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include <sys/types.h> + +/* all driver need this */ +#include "xf86.h" +#include "xf86_OSproc.h" +#include "compiler.h" +#include "exa.h" + +#include "ffb_fifo.h" +#include "ffb_rcache.h" +#include "ffb.h" +#include "ffb_regs.h" + +extern void VISmoveImageRL(unsigned char *, unsigned char *, long, long, long, long); +extern void VISmoveImageLR(unsigned char *, unsigned char *, long, long, long, long); + +/*#define FFB_DEBUG*/ + +#ifdef FFB_DEBUG +#define ENTER xf86Msg(X_ERROR, "%s>\n", __func__); +#define DPRINTF xf86Msg +#else +#define ENTER +#define DPRINTF while (0) xf86Msg +#endif + +static void +FFBWaitMarker(ScreenPtr pScreen, int Marker) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + ffb_fbcPtr ffb = pFfb->regs; + + FFBWait(pFfb, ffb); +} + +static Bool +FFBPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, + int xdir, int ydir, int alu, Pixel planemask) +{ + ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum]; + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + ffb_fbcPtr ffb = pFfb->regs; + + ENTER; + pFfb->srcpitch = exaGetPixmapPitch(pSrcPixmap); + pFfb->srcoff = exaGetPixmapOffset(pSrcPixmap); + pFfb->xdir = xdir; + pFfb->ydir = ydir; + pFfb->rop = alu; + pFfb->planemask = planemask; + return TRUE; +} + +static void +FFBCopy(PixmapPtr pDstPixmap, + int srcX, int srcY, int dstX, int dstY, int w, int h) +{ + ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum]; + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + ffb_fbcPtr ffb = pFfb->regs; + unsigned char *src, *dst, *sfb32; + int psz_shift = 2; + int sdkind; + + ENTER; + if ((srcX == dstX) && (srcY != dstY) && (pFfb->rop == GXcopy)) { + /* we can use the vscroll command */ + FFB_ATTR_VSCROLL_XAA(pFfb, pFfb->planemask); + FFBFifo(pFfb, 7); + ffb->drawop = FFB_DRAWOP_VSCROLL; + FFB_WRITE64(&ffb->by, srcY, srcX); + FFB_WRITE64_2(&ffb->dy, dstY, dstX); + FFB_WRITE64_3(&ffb->bh, h, w); + exaMarkSync(pDstPixmap->drawable.pScreen); + return; + } + FFB_ATTR_SFB_VAR_XAA(pFfb, pFfb->planemask, pFfb->rop); + FFBWait(pFfb, ffb); + sfb32 = (unsigned char *) pFfb->sfb32; + src = sfb32 + (srcY * (2048 << psz_shift)) + (srcX << psz_shift); + dst = sfb32 + (dstY * (2048 << psz_shift)) + (dstX << psz_shift); + sdkind = (2048 << psz_shift); + + if (pFfb->ydir < 0) { + src += ((h - 1) * (2048 << psz_shift)); + dst += ((h - 1) * (2048 << psz_shift)); + sdkind = -sdkind; + } + w <<= psz_shift; + if (pFfb->xdir < 0) + VISmoveImageRL(src, dst, w, h, sdkind, sdkind); + else + VISmoveImageLR(src, dst, w, h, sdkind, sdkind); +} + +static void +FFBDoneCopy(PixmapPtr pDstPixmap) +{ +} + +static Bool +FFBPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg) +{ + ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + ffb_fbcPtr ffb = pFfb->regs; + unsigned int ppc, ppc_mask, fbc; + + ENTER; + FFBWait(pFfb, ffb); + pFfb->planemask = planemask; + pFfb->rop = alu; + + fbc = pFfb->fbc; + if (pFfb->ffb_res == ffb_res_high) + fbc |= FFB_FBC_WB_B; + ppc = FFB_PPC_ABE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID; + ppc_mask = FFB_PPC_ABE_MASK | FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK; + + FFB_ATTR_RAW(pFfb, ppc, ppc_mask, planemask, + (FFB_ROP_EDIT_BIT | alu) | (FFB_ROP_NEW << 8), + FFB_DRAWOP_RECTANGLE, fg, fbc, pFfb->wid); + + return TRUE; +} + +static void +FFBSolid(PixmapPtr pPixmap, int x1, int y1, int x2, int y2) +{ + ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + ffb_fbcPtr ffb = pFfb->regs; + + ENTER; + FFBFifo(pFfb, 4); + FFB_WRITE64(&ffb->by, y1, x1); + FFB_WRITE64_2(&ffb->bh, y2 - y1, x2 - x1); + exaMarkSync(pPixmap->drawable.pScreen); +} + +static Bool +FFBUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, + char *src, int src_pitch) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + unsigned char *dst, *sfb32; + int psz_shift = 2; + ffb_fbcPtr ffb = pFfb->regs; + + ENTER; + FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy); + FFBWait(pFfb, ffb); + + sfb32 = (unsigned char *) pFfb->sfb32; + dst = sfb32 + (y * (2048 << psz_shift)) + (x << psz_shift); + VISmoveImageLR(src, dst, w << psz_shift, h, + src_pitch, (2048 << psz_shift)); + return TRUE; +} + +static Bool +FFBDownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, int h, + char *dst, int dst_pitch) +{ + ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum]; + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + unsigned char *src, *sfb32; + int psz_shift = 2; + ffb_fbcPtr ffb = pFfb->regs; + + ENTER; + FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy); + FFBWait(pFfb, ffb); + + sfb32 = (unsigned char *) pFfb->sfb32; + src = sfb32 + (y * (2048 << psz_shift)) + (x << psz_shift); + VISmoveImageLR(src, dst, w << psz_shift, h, + (2048 << psz_shift), dst_pitch); + return TRUE; +} + +#if 0 + +Bool +FFBCheckComposite(int op, PicturePtr pSrcPicture, + PicturePtr pMaskPicture, + PicturePtr pDstPicture) +{ + return FALSE; +} + +Bool +FFBPrepareComposite(int op, PicturePtr pSrcPicture, + PicturePtr pMaskPicture, + PicturePtr pDstPicture, + PixmapPtr pSrc, + PixmapPtr pMask, + PixmapPtr pDst) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + + ENTER; + return FALSE; +} + +void +FFBComposite(PixmapPtr pDst, int srcX, int srcY, + int maskX, int maskY, + int dstX, int dstY, + int width, int height) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + exaMarkSync(pDst->drawable.pScreen); +} + +#endif + +static Bool +FFBPrepareAccess(PixmapPtr pPix, int index) +{ + ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + ffb_fbcPtr ffb = pFfb->regs; + + ENTER; + FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy); + FFBWait(pFfb, ffb); + + return TRUE; +} + +static void +FFBFinishAccess(PixmapPtr pPix, int index) +{ +} + +Bool +FFBInitEXA(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn); + ffb_fbcPtr ffb = pFfb->regs; + ExaDriverPtr pExa; + + pFfb->fbc = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A | + FFB_FBC_WE_FORCEON | + FFB_FBC_SB_BOTH | + FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | + FFB_FBC_RGBE_MASK | + FFB_FBC_XE_ON); + pFfb->wid = FFBWidAlloc(pFfb, TrueColor, 0, TRUE); + if (pFfb->wid == (unsigned int) -1) + return FALSE; + + pFfb->ppc_cache = (FFB_PPC_FW_DISABLE | + FFB_PPC_VCE_DISABLE | FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | + FFB_PPC_XS_WID | FFB_PPC_YS_CONST | FFB_PPC_ZS_CONST | + FFB_PPC_DCE_DISABLE | FFB_PPC_ABE_DISABLE | FFB_PPC_TBE_OPAQUE); + pFfb->wid_cache = pFfb->wid; + pFfb->pmask_cache = ~0; + pFfb->rop_cache = (FFB_ROP_NEW | (FFB_ROP_NEW << 8)); + pFfb->drawop_cache = FFB_DRAWOP_RECTANGLE; + pFfb->fg_cache = pFfb->bg_cache = 0; + pFfb->fontw_cache = 32; + pFfb->fontinc_cache = (1 << 16) | 0; + pFfb->fbc_cache = (FFB_FBC_WB_A | FFB_FBC_WM_COMBINED | FFB_FBC_RB_A | + FFB_FBC_WE_FORCEON | + FFB_FBC_SB_BOTH | + FFB_FBC_ZE_OFF | FFB_FBC_YE_OFF | + FFB_FBC_RGBE_OFF | + FFB_FBC_XE_ON); + + /* We will now clear the screen: we'll draw a rectangle covering all the + * viewscreen, using a 'blackness' ROP. + */ + FFBFifo(pFfb, 22); + ffb->fbc = pFfb->fbc_cache; + ffb->ppc = pFfb->ppc_cache; + ffb->wid = pFfb->wid_cache; + ffb->xpmask = 0xff; + ffb->pmask = pFfb->pmask_cache; + ffb->rop = pFfb->rop_cache; + ffb->drawop = pFfb->drawop_cache; + ffb->fg = pFfb->fg_cache; + ffb->bg = pFfb->bg_cache; + ffb->fontw = pFfb->fontw_cache; + ffb->fontinc = pFfb->fontinc_cache; + ffb->xclip = FFB_XCLIP_TEST_ALWAYS; + ffb->cmp = 0x80808080; + ffb->matchab = 0x80808080; + ffb->magnab = 0x80808080; + ffb->blendc = (FFB_BLENDC_FORCE_ONE | + FFB_BLENDC_DF_ONE_M_A | + FFB_BLENDC_SF_A); + ffb->blendc1 = 0; + ffb->blendc2 = 0; + FFB_WRITE64(&ffb->by, 0, 0); + FFB_WRITE64_2(&ffb->bh, pFfb->psdp->height, pFfb->psdp->width); + FFBWait(pFfb, ffb); + + FFB_ATTR_SFB_VAR_XAA(pFfb, 0xffffffff, GXcopy); + FFBWait(pFfb, ffb); + + pExa = exaDriverAlloc(); + if (!pExa) + return FALSE; + + pFfb->pExa = pExa; + + pExa->exa_major = EXA_VERSION_MAJOR; + pExa->exa_minor = EXA_VERSION_MINOR; + + + pExa->memoryBase = (char *)pFfb->sfb32; + /* + * we don't have usable off-screen memory but EXA craps out if we don't + * pretend that we do, so register a ridiculously small amount and + * cross fingers + */ + pExa->memorySize = 8192 * pFfb->psdp->height + 4; + pExa->offScreenBase = pExa->memorySize - 4; + + /* we want to use 64bit aligned accesses */ + pExa->pixmapOffsetAlign = 8; + pExa->pixmapPitchAlign = 8; + + pExa->flags = EXA_OFFSCREEN_PIXMAPS | + /*EXA_SUPPORTS_OFFSCREEN_OVERLAPS |*/ + EXA_MIXED_PIXMAPS; + + pExa->maxX = 2048; + pExa->maxY = 2048; + + pExa->WaitMarker = FFBWaitMarker; + + pExa->PrepareSolid = FFBPrepareSolid; + pExa->Solid = FFBSolid; + pExa->DoneSolid = FFBDoneCopy; + pExa->PrepareCopy = FFBPrepareCopy; + pExa->Copy = FFBCopy; + pExa->DoneCopy = FFBDoneCopy; + pExa->UploadToScreen = FFBUploadToScreen; + pExa->DownloadFromScreen = FFBDownloadFromScreen; + pExa->PrepareAccess = FFBPrepareAccess; + pExa->FinishAccess = FFBFinishAccess; +#if 0 + pExa->CheckComposite = CG14CheckComposite; + pExa->PrepareComposite = CG14PrepareComposite; + pExa->Composite = CG14Composite; + pExa->DoneComposite = CG14DoneCopy; +#endif + + return exaDriverInit(pScreen, pExa); +}