Module Name: xsrc
Committed By: macallan
Date: Wed Nov 25 18:01:30 UTC 2015
Modified Files:
xsrc/external/mit/xf86-video-suncg6/dist/src: cg6.h cg6_accel.c
cg6_driver.c
Added Files:
xsrc/external/mit/xf86-video-suncg6/dist/src: cg6_exa.c
Log Message:
support EXA
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 xsrc/external/mit/xf86-video-suncg6/dist/src/cg6.h \
xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_accel.c
cvs rdiff -u -r1.8 -r1.9 \
xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_driver.c
cvs rdiff -u -r0 -r1.1 xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_exa.c
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-suncg6/dist/src/cg6.h
diff -u xsrc/external/mit/xf86-video-suncg6/dist/src/cg6.h:1.3 xsrc/external/mit/xf86-video-suncg6/dist/src/cg6.h:1.4
--- xsrc/external/mit/xf86-video-suncg6/dist/src/cg6.h:1.3 Tue Jun 4 22:20:41 2013
+++ xsrc/external/mit/xf86-video-suncg6/dist/src/cg6.h Wed Nov 25 18:01:29 2015
@@ -32,6 +32,7 @@
#include "cg6_regs.h"
#include "xf86sbusBus.h"
#include "xaa.h"
+#include "exa.h"
/* Various offsets in virtual (ie. mmap()) spaces Linux and Solaris support. */
#define CG6_FBC_VOFF 0x70000000
@@ -68,6 +69,7 @@ typedef struct {
sbusDevicePtr psdp;
Bool HWCursor;
Bool NoAccel;
+ Bool useXAA;
CloseScreenProcPtr CloseScreen;
xf86CursorInfoPtr CursorInfoRec;
unsigned int CursorXY;
@@ -80,6 +82,8 @@ typedef struct {
int words_in_scanline, scan_x, scan_y, scan_xe;
int clipxa, clipxe;
XAAInfoRecPtr pXAA;
+ ExaDriverPtr pExa;
+ int srcoff, fg;
} Cg6Rec, *Cg6Ptr;
extern int Cg6ScreenPrivateIndex;
@@ -103,6 +107,7 @@ extern int Cg6WindowPrivateIndex;
extern int cg6RopTable[];
int CG6AccelInit(ScrnInfoPtr);
-Bool Cg6DGAInit(ScreenPtr pScreen);
+Bool Cg6DGAInit(ScreenPtr);
+int CG6EXAInit(ScreenPtr);
#endif /* CG6_H */
Index: xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_accel.c
diff -u xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_accel.c:1.3 xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_accel.c:1.4
--- xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_accel.c:1.3 Wed Jul 18 00:06:14 2012
+++ xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_accel.c Wed Nov 25 18:01:29 2015
@@ -166,7 +166,7 @@ unClip(Cg6Ptr pCg6)
pCg6->fbc->clipmaxx = pCg6->clipxe;
}
-static void
+void
Cg6InitEngine(Cg6Ptr pCg6)
{
pCg6->clipxa = 0;
Index: xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_driver.c
diff -u xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_driver.c:1.8 xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_driver.c:1.9
--- xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_driver.c:1.8 Tue Jun 4 22:20:41 2013
+++ xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_driver.c Wed Nov 25 18:01:29 2015
@@ -93,13 +93,15 @@ _X_EXPORT DriverRec SUNCG6 = {
typedef enum {
OPTION_SW_CURSOR,
OPTION_HW_CURSOR,
- OPTION_NOACCEL
+ OPTION_NOACCEL,
+ OPTION_ACCELMETHOD
} CG6Opts;
static const OptionInfoRec CG6Options[] = {
{ 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 }
};
@@ -404,7 +406,14 @@ CG6PreInit(ScrnInfoPtr pScrn, int flags)
pCg6->NoAccel = TRUE;
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Acceleration disabled\n");
}
-
+ pCg6->useXAA = FALSE;
+
+ char *optstr;
+ optstr = (char *)xf86GetOptValString(pCg6->Options, OPTION_ACCELMETHOD);
+ if (optstr == NULL) optstr = "exa";
+ if (xf86NameCmp(optstr, "xaa") == 0)
+ pCg6->useXAA = TRUE;
+
if (xf86LoadSubModule(pScrn, "fb") == NULL) {
CG6FreeRec(pScrn);
return FALSE;
@@ -415,11 +424,6 @@ CG6PreInit(ScrnInfoPtr pScrn, int flags)
return FALSE;
}
- if (pCg6->HWCursor && xf86LoadSubModule(pScrn, "xaa") == NULL) {
- CG6FreeRec(pScrn);
- return FALSE;
- }
-
/*********************
set up clock and mode stuff
*********************/
@@ -562,17 +566,37 @@ CG6ScreenInit(SCREEN_INIT_ARGS_DECL)
xf86SetBlackWhitePixels(pScreen);
if (!pCg6->NoAccel) {
- BoxRec bx;
- pCg6->pXAA=XAACreateInfoRec();
- CG6AccelInit(pScrn);
- bx.x1=bx.y1=0;
- bx.x2=pCg6->width;
- bx.y2=pCg6->maxheight;
- xf86InitFBManager(pScreen,&bx);
- if(!XAAInit(pScreen, pCg6->pXAA))
- return FALSE;
+ if (pCg6->useXAA) {
+ BoxRec bx;
+ if (!xf86LoadSubModule(pScrn, "xaa"))
+ return FALSE;
+ pCg6->pXAA=XAACreateInfoRec();
+ CG6AccelInit(pScrn);
+ bx.x1=bx.y1=0;
+ bx.x2=pCg6->width;
+ bx.y2=pCg6->maxheight;
+ xf86InitFBManager(pScreen,&bx);
+ if(!XAAInit(pScreen, pCg6->pXAA))
+ return FALSE;
- xf86Msg(X_INFO, "%s: Using acceleration\n", pCg6->psdp->device);
+ xf86Msg(X_INFO, "%s: Using XAA acceleration\n", pCg6->psdp->device);
+ } else {
+ /* EXA */
+ XF86ModReqInfo req;
+ int errmaj, errmin;
+
+ memset(&req, 0, sizeof(XF86ModReqInfo));
+ req.majorversion = EXA_VERSION_MAJOR;
+ req.minorversion = EXA_VERSION_MINOR;
+ if (!LoadSubModule(pScrn->module, "exa", NULL, NULL, NULL, &req,
+ &errmaj, &errmin)) {
+ LoaderErrorMsg(NULL, "exa", errmaj, errmin);
+ return FALSE;
+ }
+ if (!CG6EXAInit(pScreen))
+ return FALSE;
+ xf86Msg(X_INFO, "%s: Using EXA acceleration\n", pCg6->psdp->device);
+ }
}
/* setup DGA */
Added files:
Index: xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_exa.c
diff -u /dev/null xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_exa.c:1.1
--- /dev/null Wed Nov 25 18:01:30 2015
+++ xsrc/external/mit/xf86-video-suncg6/dist/src/cg6_exa.c Wed Nov 25 18:01:29 2015
@@ -0,0 +1,305 @@
+/*
+ * Sun GX and Turbo GX EXA support
+ *
+ * Copyright (C) 2015 Michael Lorenz
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * MICHAEL LORENZ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/suncg6/cg6_accel.c $ */
+
+#include "cg6.h"
+#include "cg6_regs.h"
+
+
+static CARD32 Cg6BlitROP[] = {
+ ROP_BLIT(GX_ROP_CLEAR, GX_ROP_CLEAR), /* GXclear */
+ ROP_BLIT(GX_ROP_CLEAR, GX_ROP_NOOP), /* GXand */
+ ROP_BLIT(GX_ROP_CLEAR, GX_ROP_INVERT), /* GXandReverse */
+ ROP_BLIT(GX_ROP_CLEAR, GX_ROP_SET), /* GXcopy */
+ ROP_BLIT(GX_ROP_NOOP, GX_ROP_CLEAR), /* GXandInverted */
+ ROP_BLIT(GX_ROP_NOOP, GX_ROP_NOOP), /* GXnoop */
+ ROP_BLIT(GX_ROP_NOOP, GX_ROP_INVERT), /* GXxor */
+ ROP_BLIT(GX_ROP_NOOP, GX_ROP_SET), /* GXor */
+ ROP_BLIT(GX_ROP_INVERT, GX_ROP_CLEAR), /* GXnor */
+ ROP_BLIT(GX_ROP_INVERT, GX_ROP_NOOP), /* GXequiv */
+ ROP_BLIT(GX_ROP_INVERT, GX_ROP_INVERT), /* GXinvert */
+ ROP_BLIT(GX_ROP_INVERT, GX_ROP_SET), /* GXorReverse */
+ ROP_BLIT(GX_ROP_SET, GX_ROP_CLEAR), /* GXcopyInverted */
+ ROP_BLIT(GX_ROP_SET, GX_ROP_NOOP), /* GXorInverted */
+ ROP_BLIT(GX_ROP_SET, GX_ROP_INVERT), /* GXnand */
+ ROP_BLIT(GX_ROP_SET, GX_ROP_SET), /* GXset */
+};
+
+static CARD32 Cg6DrawROP[] = {
+ ROP_FILL(GX_ROP_CLEAR, GX_ROP_CLEAR), /* GXclear */
+ ROP_FILL(GX_ROP_CLEAR, GX_ROP_NOOP), /* GXand */
+ ROP_FILL(GX_ROP_CLEAR, GX_ROP_INVERT), /* GXandReverse */
+ ROP_FILL(GX_ROP_CLEAR, GX_ROP_SET), /* GXcopy */
+ ROP_FILL(GX_ROP_NOOP, GX_ROP_CLEAR), /* GXandInverted */
+ ROP_FILL(GX_ROP_NOOP, GX_ROP_NOOP), /* GXnoop */
+ ROP_FILL(GX_ROP_NOOP, GX_ROP_INVERT), /* GXxor */
+ ROP_FILL(GX_ROP_NOOP, GX_ROP_SET), /* GXor */
+ ROP_FILL(GX_ROP_INVERT, GX_ROP_CLEAR), /* GXnor */
+ ROP_FILL(GX_ROP_INVERT, GX_ROP_NOOP), /* GXequiv */
+ ROP_FILL(GX_ROP_INVERT, GX_ROP_INVERT), /* GXinvert */
+ ROP_FILL(GX_ROP_INVERT, GX_ROP_SET), /* GXorReverse */
+ ROP_FILL(GX_ROP_SET, GX_ROP_CLEAR), /* GXcopyInverted */
+ ROP_FILL(GX_ROP_SET, GX_ROP_NOOP), /* GXorInverted */
+ ROP_FILL(GX_ROP_SET, GX_ROP_INVERT), /* GXnand */
+ ROP_FILL(GX_ROP_SET, GX_ROP_SET), /* GXset */
+};
+
+#define runDraw(pCg6) { volatile CARD32 rubbish = pCg6->fbc->draw; }
+#define runBlit(pCg6) { volatile CARD32 rubbish = pCg6->fbc->blit; }
+
+/*
+ * XXX
+ * was GX_FULL, which apparently isn't enough on some (slower) CG6 like
+ * the one found on the SPARCstation LX mainboard
+ */
+#define waitReady(pCg6) while(pCg6->fbc->s & GX_INPROGRESS)
+
+void Cg6InitEngine(Cg6Ptr);
+
+static void
+Cg6WaitMarker(ScreenPtr pScreen, int Marker)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ Cg6Ptr p = GET_CG6_FROM_SCRN(pScrn);
+
+ waitReady(p);
+}
+
+static Bool
+Cg6PrepareCopy
+(
+ PixmapPtr pSrcPixmap,
+ PixmapPtr pDstPixmap,
+ int xdir,
+ int ydir,
+ int alu,
+ Pixel planemask
+)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
+ Cg6Ptr pCg6 = GET_CG6_FROM_SCRN(pScrn);
+
+ waitReady(pCg6);
+
+ pCg6->fbc->mode = GX_BLIT_SRC |
+ GX_MODE_COLOR8 |
+ GX_DRAW_RENDER |
+ GX_BWRITE0_ENABLE |
+ GX_BWRITE1_DISABLE |
+ GX_BREAD_0 |
+ GX_BDISP_0;
+
+ /* we probably don't need the following three */
+ pCg6->fbc->fg = 0xff;
+ pCg6->fbc->bg = 0x00;
+ pCg6->fbc->s = 0;
+
+ pCg6->srcoff = exaGetPixmapOffset(pSrcPixmap) / pCg6->width;
+ pCg6->fbc->alu = Cg6BlitROP[alu];
+ pCg6->fbc->pm = planemask;
+ return TRUE;
+}
+
+static void
+Cg6Copy
+(
+ PixmapPtr pDstPixmap,
+ int xSrc,
+ int ySrc,
+ int xDst,
+ int yDst,
+ int w,
+ int h
+)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
+ Cg6Ptr pCg6 = GET_CG6_FROM_SCRN(pScrn);
+ int doff;
+
+ doff = exaGetPixmapOffset(pDstPixmap) / pCg6->width;
+ waitReady(pCg6);
+ pCg6->fbc->x0 = xSrc;
+ pCg6->fbc->y0 = ySrc + pCg6->srcoff;
+ pCg6->fbc->x1 = xSrc + w - 1;
+ pCg6->fbc->y1 = ySrc + pCg6->srcoff + h - 1;
+ pCg6->fbc->x2 = xDst;
+ pCg6->fbc->y2 = yDst + doff;
+ pCg6->fbc->x3 = xDst + w - 1;
+ pCg6->fbc->y3 = yDst + doff + h - 1;
+ runBlit(pCg6);
+ exaMarkSync(pDstPixmap->drawable.pScreen);
+}
+
+static void
+Cg6DoneCopy(PixmapPtr pDstPixmap)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
+ Cg6Ptr pCg6 = GET_CG6_FROM_SCRN(pScrn);
+
+ waitReady(pCg6);
+}
+
+static Bool
+Cg6PrepareSolid(
+ PixmapPtr pPixmap,
+ int alu,
+ Pixel planemask,
+ Pixel fg)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
+ Cg6Ptr pCg6 = GET_CG6_FROM_SCRN(pScrn);
+ CARD32 c2;
+
+ pCg6->srcoff = exaGetPixmapOffset(pPixmap) / pCg6->width;
+
+ waitReady(pCg6);
+
+ pCg6->fbc->mode = GX_BLIT_SRC |
+ GX_MODE_COLOR8 |
+ GX_DRAW_RENDER |
+ GX_BWRITE0_ENABLE |
+ GX_BWRITE1_DISABLE |
+ GX_BREAD_0 |
+ GX_BDISP_0;
+ pCg6->fbc->fg = fg;
+ pCg6->fbc->s = 0;
+ pCg6->fbc->alu = Cg6DrawROP[alu];
+ pCg6->fbc->pm = planemask;
+ return TRUE;
+}
+
+static void
+Cg6Solid(
+ PixmapPtr pPixmap,
+ int x,
+ int y,
+ int x2,
+ int y2)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
+ Cg6Ptr pCg6 = GET_CG6_FROM_SCRN(pScrn);
+
+ waitReady(pCg6);
+ pCg6->fbc->arecty = y + pCg6->srcoff;
+ pCg6->fbc->arectx = x;
+ pCg6->fbc->rrecty = y2 - y - 1;
+ pCg6->fbc->rrectx = x2 - x - 1;
+ runDraw(pCg6);
+ exaMarkSync(pPixmap->drawable.pScreen);
+}
+
+/*
+ * Memcpy-based UTS.
+ * TODO: use host blit
+ */
+static Bool
+Cg6UploadToScreen(PixmapPtr pDst, int x, int y, int w, int h,
+ char *src, int src_pitch)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
+ Cg6Ptr pCg6 = GET_CG6_FROM_SCRN(pScrn);
+ char *dst = pCg6->fb + exaGetPixmapOffset(pDst);
+ int dst_pitch = exaGetPixmapPitch(pDst);
+
+
+ dst += x + (y * dst_pitch);
+
+ while (h--) {
+ memcpy(dst, src, w);
+ src += src_pitch;
+ dst += dst_pitch;
+ }
+ return TRUE;
+}
+
+/*
+ * Memcpy-based DFS.
+ */
+static Bool
+Cg6DownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, int h,
+ char *dst, int dst_pitch)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum];
+ Cg6Ptr pCg6 = GET_CG6_FROM_SCRN(pScrn);
+ char *src = pCg6->fb + exaGetPixmapOffset(pSrc);
+ int src_pitch = exaGetPixmapPitch(pSrc);
+
+ src += x + (y * src_pitch);
+
+ while (h--) {
+ memcpy(dst, src, w);
+ src += src_pitch;
+ dst += dst_pitch;
+ }
+ return TRUE;
+}
+
+int
+CG6EXAInit(ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ Cg6Ptr pCg6 = GET_CG6_FROM_SCRN(pScrn);
+ ExaDriverPtr pExa;
+
+ Cg6InitEngine(pCg6);
+
+ pExa = exaDriverAlloc();
+ if (!pExa)
+ return FALSE;
+
+ pCg6->pExa = pExa;
+
+ pExa->exa_major = EXA_VERSION_MAJOR;
+ pExa->exa_minor = EXA_VERSION_MINOR;
+
+ pExa->memoryBase = pCg6->fb;
+ pExa->memorySize = pCg6->vidmem;
+ pExa->offScreenBase = pCg6->width * pCg6->height;
+
+ /*
+ * our blitter can't deal with variable pitches
+ */
+ pExa->pixmapOffsetAlign = pCg6->width;
+ pExa->pixmapPitchAlign = pCg6->width;
+
+ pExa->flags = EXA_OFFSCREEN_PIXMAPS |
+ EXA_MIXED_PIXMAPS;
+
+ pExa->maxX = 4096;
+ pExa->maxY = 4096;
+
+ pExa->WaitMarker = Cg6WaitMarker;
+
+ pExa->PrepareSolid = Cg6PrepareSolid;
+ pExa->Solid = Cg6Solid;
+ pExa->DoneSolid = Cg6DoneCopy;
+
+ pExa->PrepareCopy = Cg6PrepareCopy;
+ pExa->Copy = Cg6Copy;
+ pExa->DoneCopy = Cg6DoneCopy;
+
+ pExa->UploadToScreen = Cg6UploadToScreen;
+ pExa->DownloadFromScreen = Cg6DownloadFromScreen;
+
+ return exaDriverInit(pScreen, pExa);;
+}