Module Name:    xsrc
Committed By:   macallan
Date:           Sat Jan  7 16:07:07 UTC 2017

Added Files:
        xsrc/external/mit/xf86-video-chips/dist/src: ct_exa.c

Log Message:
first shot at EXA support. Mostly works but needs cleanup and the chip
doesn't really support 32bit pixels either.


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 xsrc/external/mit/xf86-video-chips/dist/src/ct_exa.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Added files:

Index: xsrc/external/mit/xf86-video-chips/dist/src/ct_exa.c
diff -u /dev/null xsrc/external/mit/xf86-video-chips/dist/src/ct_exa.c:1.1
--- /dev/null	Sat Jan  7 16:07:07 2017
+++ xsrc/external/mit/xf86-video-chips/dist/src/ct_exa.c	Sat Jan  7 16:07:07 2017
@@ -0,0 +1,300 @@
+/*
+ * EXA acceleration for now ct65550 only, for lack of other hardware 
+ *
+ * Copyright (C) 2016 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.
+ */
+
+/* $NetBSD: ct_exa.c,v 1.1 2017/01/07 16:07:07 macallan Exp $ */
+
+#include <sys/types.h>
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* All drivers should typically include these */
+#include "xf86.h"
+#include "xf86_OSproc.h"
+
+/* Everything using inb/outb, etc needs "compiler.h" */
+#include "compiler.h"
+
+#include "ct_driver.h"
+#include "ct_BltHiQV.h"
+
+
+#ifdef DEBUG
+#define ENTER xf86Msg(X_ERROR, "%s\n", __func__)
+#define LEAVE xf86Msg(X_ERROR, "%s done\n", __func__)
+#else
+#define ENTER
+#define LEAVE
+#endif
+
+static void
+ctWaitMarker(ScreenPtr pScreen, int Marker)
+{
+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+    CHIPSPtr cPtr = CHIPSPTR(pScrn);
+    ENTER;
+    ctBLTWAIT;
+}
+
+static int
+ctMarkSync(ScreenPtr pScreenInfo)
+{
+    ENTER;
+    return 0;
+}
+
+static Bool
+ctPrepareCopy
+(
+    PixmapPtr pSrcPixmap,
+    PixmapPtr pDstPixmap,
+    int       xdir,
+    int       ydir,
+    int       alu,
+    Pixel     planemask
+)
+{
+    ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
+    CHIPSPtr cPtr = CHIPSPTR(pScrn);
+    CHIPSACLPtr cAcl = CHIPSACLPTR(pScrn);
+
+    ENTER;
+    ctBLTWAIT;
+    cAcl->srcpitch = exaGetPixmapPitch(pSrcPixmap);
+    cAcl->srcoffset = exaGetPixmapOffset(pSrcPixmap);
+    cAcl->xdir = xdir;
+    cAcl->ydir = ydir;
+    ctSETROP(ChipsAluConv[alu & 0xF] | ((xdir < 0) ? ctRIGHT2LEFT : 0) |
+    				       ((ydir < 0) ? ctBOTTOM2TOP : 0) |
+    				       ctPATSOLID/* | ctPATMONO*/);
+    ctSETMONOCTL(ctDWORDALIGN);
+    ctSETPITCH(cAcl->srcpitch, exaGetPixmapPitch(pDstPixmap));
+    LEAVE;
+    return TRUE;
+}
+
+static void
+ctCopy
+(
+    PixmapPtr pDstPixmap,
+    int       srcX,
+    int       srcY,
+    int       dstX,
+    int       dstY,
+    int       w,
+    int       h
+)
+{
+    ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
+    CHIPSPtr cPtr = CHIPSPTR(pScrn);
+    CHIPSACLPtr cAcl = CHIPSACLPTR(pScrn);
+    int src = cAcl->srcoffset;
+    int dst = exaGetPixmapOffset(pDstPixmap);
+    int dstpitch = exaGetPixmapPitch(pDstPixmap);
+
+    if (cAcl->ydir < 0) {
+	srcY += (h - 1);
+	dstY += (h - 1);
+    }
+
+    if (cAcl->xdir < 0) {
+	srcX += (w - 1);
+	dstX += (w - 1);
+    }
+
+    src += srcX * cAcl->BytesPerPixel + srcY * cAcl->srcpitch;
+    dst += dstX * cAcl->BytesPerPixel + dstY * dstpitch;
+    ctBLTWAIT;
+    ctSETSRCADDR(src);
+    ctSETDSTADDR(dst);
+    ctSETHEIGHTWIDTHGO(h, w * cAcl->BytesPerPixel);
+    LEAVE;
+}
+
+static void
+ctDoneCopy(PixmapPtr pDstPixmap)
+{
+    ENTER;
+    LEAVE;
+}
+
+static Bool
+ctPrepareSolid(
+    PixmapPtr pPixmap,
+    int alu,
+    Pixel planemask,
+    Pixel fg)
+{
+    ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
+    CHIPSPtr cPtr = CHIPSPTR(pScrn);
+    CHIPSACLPtr cAcl = CHIPSACLPTR(pScrn);
+    int pitch = exaGetPixmapPitch(pPixmap);
+
+    ENTER;
+    ctBLTWAIT;
+    ctSETPITCH(pitch, pitch);
+    ctSETROP(ChipsAluConv2[alu & 0xF] | ctPATSOLID | ctPATMONO);
+    ctSETMONOCTL(ctDWORDALIGN);
+    ctSETBGCOLOR24(fg);
+    LEAVE;
+    return TRUE;
+}
+
+static void
+ctSolid(
+    PixmapPtr pPixmap,
+    int x1,
+    int y1,
+    int x2,
+    int y2)
+{
+    ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
+    CHIPSPtr cPtr = CHIPSPTR(pScrn);
+    CHIPSACLPtr cAcl = CHIPSACLPTR(pScrn);
+    int dst = exaGetPixmapOffset(pPixmap);
+
+    ENTER;
+    ctBLTWAIT;
+    dst +=  x1 * cAcl->BytesPerPixel + y1 * exaGetPixmapPitch(pPixmap);
+    ctSETDSTADDR(dst);
+    ctSETSRCADDR(dst);
+    ctSETHEIGHTWIDTHGO(y2 - y1, (x2 - x1) * cAcl->BytesPerPixel);
+          LEAVE;
+}
+
+/*
+ * Memcpy-based UTS.
+ */
+static Bool
+ctUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h,
+    char *src, int src_pitch)
+{
+    ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
+    CHIPSPtr cPtr = CHIPSPTR(pScrn);
+    char  *dst        = cPtr->FbBase + exaGetPixmapOffset(pDst);
+    int    dst_pitch  = exaGetPixmapPitch(pDst);
+
+    int bpp    = pDst->drawable.bitsPerPixel;
+    int cpp    = (bpp + 7) / 8;
+    int wBytes = w * cpp;
+
+    ENTER;
+    ctBLTWAIT;
+    dst += (x * cpp) + (y * dst_pitch);
+
+    while (h--) {
+        memcpy(dst, src, wBytes);
+        src += src_pitch;
+        dst += dst_pitch;
+    }
+    LEAVE;
+    return TRUE;
+}
+
+/*
+ * Memcpy-based DFS.
+ */
+static Bool
+ctDownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, int h,
+    char *dst, int dst_pitch)
+{
+    ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum];
+    CHIPSPtr cPtr = CHIPSPTR(pScrn);
+    char  *src        = cPtr->FbBase + exaGetPixmapOffset(pSrc);
+    int    src_pitch  = exaGetPixmapPitch(pSrc);
+
+    int bpp    = pSrc->drawable.bitsPerPixel;
+    int cpp    = (bpp + 7) / 8;
+    int wBytes = w * cpp;
+
+    ENTER;
+    ctBLTWAIT;
+    src += (x * cpp) + (y * src_pitch);
+
+    while (h--) {
+        memcpy(dst, src, wBytes);
+        src += src_pitch;
+        dst += dst_pitch;
+    }
+    LEAVE;
+    return TRUE;
+}
+
+Bool
+CHIPSInitEXA(ScreenPtr pScreen)
+{
+    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+    CHIPSPtr cPtr = CHIPSPTR(pScrn);
+    CHIPSACLPtr cAcl = CHIPSACLPTR(pScrn);
+    ExaDriverPtr pExa;
+
+    pExa = exaDriverAlloc();
+    if (!pExa)
+        return FALSE;
+
+    cPtr->pExa = pExa;
+
+    //cPtr->writeXR(cPtr, 0x20, 0);	/* XXX blitter in 8bit mode */
+
+    cAcl->BytesPerPixel = pScrn->bitsPerPixel >> 3;
+    cAcl->BitsPerPixel = pScrn->bitsPerPixel;
+    cAcl->planemask = -1;
+    cAcl->bgColor = -1;
+    cAcl->fgColor = -1;
+    cAcl->FbOffset = 0;
+
+    pExa->exa_major = EXA_VERSION_MAJOR;
+    pExa->exa_minor = EXA_VERSION_MINOR;
+
+    pExa->memoryBase = cPtr->FbBase;
+    pExa->offScreenBase = cAcl->CacheStart;
+    pExa->memorySize = cAcl->CacheEnd;
+    pExa->pixmapOffsetAlign = 4;
+    pExa->pixmapPitchAlign = 4;
+
+    pExa->flags = EXA_OFFSCREEN_PIXMAPS;
+
+    /* entirely bogus since the chip doesn't use coordinates */
+    pExa->maxX = 2048;
+    pExa->maxY = 2048;
+
+    pExa->MarkSync = ctMarkSync;
+    pExa->WaitMarker = ctWaitMarker;
+
+    pExa->PrepareSolid = ctPrepareSolid;
+    pExa->Solid = ctSolid;
+    pExa->DoneSolid = ctDoneCopy;
+
+    pExa->PrepareCopy = ctPrepareCopy;
+    pExa->Copy = ctCopy;
+    pExa->DoneCopy = ctDoneCopy;
+
+    /* EXA hits more optimized paths when it does not have to fallback because
+     * of missing UTS/DFS, hook memcpy-based UTS/DFS.
+     */
+    pExa->UploadToScreen = ctUploadToScreen;
+    pExa->DownloadFromScreen = ctDownloadFromScreen;
+
+    return exaDriverInit(pScreen, pExa);
+}

Reply via email to