Module Name: xsrc Committed By: macallan Date: Sat Dec 7 10:48:38 UTC 2024
Modified Files: xsrc/external/mit/xf86-video-ngle/dist/src: ngle.h ngle_accel.c ngle_driver.c Added Files: xsrc/external/mit/xf86-video-ngle/dist/src: summit_accel.c Log Message: add *very* experimental Visualize FX support To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h cvs rdiff -u -r1.5 -r1.6 \ xsrc/external/mit/xf86-video-ngle/dist/src/ngle_accel.c cvs rdiff -u -r1.6 -r1.7 \ xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c cvs rdiff -u -r0 -r1.1 \ xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.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-ngle/dist/src/ngle.h diff -u xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h:1.2 xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h:1.3 --- xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h:1.2 Mon Oct 21 13:40:53 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h Sat Dec 7 10:48:38 2024 @@ -53,6 +53,7 @@ typedef struct { unsigned char* fbmem; size_t fbmem_len; void *regs; + size_t reglen; Bool HWCursor; CloseScreenProcPtr CloseScreen; CreateScreenResourcesProcPtr CreateScreenResources; @@ -73,5 +74,34 @@ typedef struct { Bool NGLESetupCursor(ScreenPtr); Bool NGLEInitAccel(ScreenPtr); +Bool SummitInitAccel(ScreenPtr); + +static inline void +NGLEWrite4(NGLEPtr fPtr, int offset, uint32_t val) +{ + volatile uint32_t *ptr = (uint32_t *)((uint8_t *)fPtr->regs + offset); + *ptr = val; +} + +static inline void +NGLEWrite1(NGLEPtr fPtr, int offset, uint8_t val) +{ + volatile uint8_t *ptr = (uint8_t *)fPtr->regs + offset; + *ptr = val; +} + +static inline uint32_t +NGLERead4(NGLEPtr fPtr, int offset) +{ + volatile uint32_t *ptr = (uint32_t *)((uint8_t *)fPtr->regs + offset); + return *ptr; +} + +static inline uint8_t +NGLERead1(NGLEPtr fPtr, int offset) +{ + volatile uint8_t *ptr = (uint8_t *)fPtr->regs + offset; + return *ptr; +} #endif Index: xsrc/external/mit/xf86-video-ngle/dist/src/ngle_accel.c diff -u xsrc/external/mit/xf86-video-ngle/dist/src/ngle_accel.c:1.5 xsrc/external/mit/xf86-video-ngle/dist/src/ngle_accel.c:1.6 --- xsrc/external/mit/xf86-video-ngle/dist/src/ngle_accel.c:1.5 Fri Oct 25 09:20:37 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/src/ngle_accel.c Sat Dec 7 10:48:38 2024 @@ -21,7 +21,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $NetBSD: ngle_accel.c,v 1.5 2024/10/25 09:20:37 macallan Exp $ */ +/* $NetBSD: ngle_accel.c,v 1.6 2024/12/07 10:48:38 macallan Exp $ */ #include <sys/types.h> #include <dev/ic/stireg.h> @@ -41,34 +41,6 @@ #define LEAVE #endif -static inline void -NGLEWrite4(NGLEPtr fPtr, int offset, uint32_t val) -{ - volatile uint32_t *ptr = (uint32_t *)((uint8_t *)fPtr->regs + offset); - *ptr = val; -} - -static inline void -NGLEWrite1(NGLEPtr fPtr, int offset, uint8_t val) -{ - volatile uint8_t *ptr = (uint8_t *)fPtr->regs + offset; - *ptr = val; -} - -static inline uint32_t -NGLERead4(NGLEPtr fPtr, int offset) -{ - volatile uint32_t *ptr = (uint32_t *)((uint8_t *)fPtr->regs + offset); - return *ptr; -} - -static inline uint8_t -NGLERead1(NGLEPtr fPtr, int offset) -{ - volatile uint8_t *ptr = (uint8_t *)fPtr->regs + offset; - return *ptr; -} - static void NGLEWaitMarker(ScreenPtr pScreen, int Marker) { Index: xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c diff -u xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c:1.6 xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c:1.7 --- xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c:1.6 Sun Oct 27 11:09:37 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c Sat Dec 7 10:48:38 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: ngle_driver.c,v 1.6 2024/10/27 11:09:37 macallan Exp $ */ +/* $NetBSD: ngle_driver.c,v 1.7 2024/12/07 10:48:38 macallan Exp $ */ /* * Copyright (c) 2024 Michael Lorenz * All rights reserved. @@ -107,18 +107,19 @@ DriverRec NGLE = { static SymTabRec NGLEChipsets[] = { { STI_DD_EG, "Visualize EG" }, { STI_DD_HCRX, "HCRX" }, + { STI_DD_SUMMIT, "Visualize FX 2/4/6"}, { -1, NULL } }; /* Supported options */ typedef enum { OPTION_HW_CURSOR, - OPTION_SW_CURSOR + OPTION_DEVICE } NGLEOpts; static const OptionInfoRec NGLEOptions[] = { - { OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_HW_CURSOR, "HWcursor", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_DEVICE, "Device", OPTV_ANYSTR, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE} }; @@ -373,6 +374,7 @@ NGLEPreInit(ScrnInfoPtr pScrn, int flags case STI_DD_EG: fPtr->buf = BINapp0I; fPtr->fbacc = BA(IndexedDcd, Otc04, Ots08, AddrByte, 0, fPtr->buf, 0); + fPtr->reglen = 0x400000; break; case STI_DD_HCRX: /* XXX BINovly if in 8 bit */ @@ -386,7 +388,11 @@ NGLEPreInit(ScrnInfoPtr pScrn, int flags * fingers */ fPtr->fbi.fbi_fbsize += 8192; - break; + fPtr->reglen = 0x400000; + break; + case STI_DD_SUMMIT: + fPtr->reglen = 0x1000000; + break; } xf86Msg(X_ERROR, "gid %08x fb access %08x\n", fPtr->gid, fPtr->fbacc); @@ -470,12 +476,10 @@ NGLEPreInit(ScrnInfoPtr pScrn, int flags xf86SetDpi(pScrn, 0, 0); from = X_DEFAULT; - fPtr->HWCursor = TRUE; - if (xf86GetOptValBool(fPtr->Options, OPTION_HW_CURSOR, &fPtr->HWCursor)) + fPtr->HWCursor = FALSE; + if (xf86GetOptValBool(fPtr->Options, OPTION_HW_CURSOR, &fPtr->HWCursor)) { from = X_CONFIG; - if (xf86ReturnOptValBool(fPtr->Options, OPTION_SW_CURSOR, FALSE)) { - from = X_CONFIG; - fPtr->HWCursor = FALSE; + fPtr->HWCursor = TRUE; } xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n", fPtr->HWCursor ? "HW" : "SW"); @@ -489,11 +493,6 @@ NGLEPreInit(ScrnInfoPtr pScrn, int flags NGLEFreeRec(pScrn); return FALSE; } - - if (xf86LoadSubModule(pScrn, "ramdac") == NULL) { - NGLEFreeRec(pScrn); - return FALSE; - } return TRUE; } @@ -525,7 +524,8 @@ NGLEScreenInit(SCREEN_INIT_ARGS_DECL) strerror(errno)); return FALSE; } - fPtr->regs = ngle_mmap(0x400000, 0x80000000, fPtr->fd, 0); + + fPtr->regs = ngle_mmap(fPtr->reglen, 0x80000000, fPtr->fd, 0); if (fPtr->regs == NULL) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, @@ -595,7 +595,10 @@ NGLEScreenInit(SCREEN_INIT_ARGS_DECL) xf86SetBackingStore(pScreen); if (fPtr) { - NGLEInitAccel(pScreen); + if (fPtr->gid == STI_DD_SUMMIT) { + SummitInitAccel(pScreen); + } else + NGLEInitAccel(pScreen); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using acceleration\n"); } @@ -642,7 +645,7 @@ NGLECloseScreen(CLOSE_SCREEN_ARGS_DECL) if (pScrn->vtSema) { NGLERestore(pScrn); - if (munmap(fPtr->regs, 0x40000) == -1) { + if (munmap(fPtr->regs, fPtr->reglen) == -1) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "munmap engine: %s\n", strerror(errno)); } Added files: Index: xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c diff -u /dev/null xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c:1.1 --- /dev/null Sat Dec 7 10:48:38 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c Sat Dec 7 10:48:38 2024 @@ -0,0 +1,235 @@ +/* + * hardware acceleration for Visualize FX 4 + * + * Copyright (C) 2024 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: summit_accel.c,v 1.1 2024/12/07 10:48:38 macallan Exp $ */ + +#include <sys/types.h> +#include <dev/ic/summitreg.h> + + +#include "ngle.h" + +//#define DEBUG + +#ifdef DEBUG +#define ENTER xf86Msg(X_ERROR, "%s\n", __func__) +#define LEAVE xf86Msg(X_ERROR, "%s done\n", __func__) +#define DBGMSG xf86Msg +#else +#define ENTER +#define DBGMSG if (0) xf86Msg +#define LEAVE +#endif + +static void +SummitWaitMarker(ScreenPtr pScreen, int Marker) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + NGLEPtr fPtr = NGLEPTR(pScrn); + int bail = 10000000, reg; + ENTER; + + do { + reg = NGLERead4(fPtr, VISFX_STATUS); + bail--; + if (bail == 0) { + xf86Msg(X_ERROR, "%s status %08x\n", __func__, reg); + return; + } + } while (reg != 0); + LEAVE; +} + +static Bool +SummitPrepareCopy +( + PixmapPtr pSrcPixmap, + PixmapPtr pDstPixmap, + int xdir, + int ydir, + int alu, + Pixel planemask +) +{ + ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum]; + NGLEPtr fPtr = NGLEPTR(pScrn); + int srcpitch = exaGetPixmapPitch(pSrcPixmap); + int srcoff = exaGetPixmapOffset(pSrcPixmap); + + ENTER; + + DBGMSG(X_ERROR, "%s %d %d\n", __func__, srcoff, srcpitch); + if (alu != GXcopy) return FALSE; + fPtr->offset = srcoff / srcpitch; + if (fPtr->hwmode != HW_BLIT) { + SummitWaitMarker(pSrcPixmap->drawable.pScreen, 0); + NGLEWrite4(fPtr, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_PLAIN); + NGLEWrite4(fPtr, VISFX_VRAM_READ_MODE, VISFX_READ_MODE_COPY); + fPtr->hwmode = HW_BLIT; + } + NGLEWrite4(fPtr, VISFX_PLANE_MASK, planemask); + LEAVE; + return TRUE; +} + +static void +SummitCopy +( + PixmapPtr pDstPixmap, + int xs, + int ys, + int xd, + int yd, + int wi, + int he +) +{ + ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum]; + NGLEPtr fPtr = NGLEPTR(pScrn); + int dstpitch = exaGetPixmapPitch(pDstPixmap); + int dstoff = exaGetPixmapOffset(pDstPixmap); + + ENTER; + SummitWaitMarker(pDstPixmap->drawable.pScreen, 0); + NGLEWrite4(fPtr, VISFX_COPY_SRC, (xs << 16) | (ys + fPtr->offset)); + NGLEWrite4(fPtr, VISFX_COPY_WH, (wi << 16) | he); + NGLEWrite4(fPtr, VISFX_COPY_DST, (xd << 16) | (yd + (dstoff / dstpitch))); + + exaMarkSync(pDstPixmap->drawable.pScreen); + LEAVE; +} + +static void +SummitDoneCopy(PixmapPtr pDstPixmap) +{ + ENTER; + LEAVE; +} + +static Bool +SummitPrepareSolid( + PixmapPtr pPixmap, + int alu, + Pixel planemask, + Pixel fg) +{ + ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; + NGLEPtr fPtr = NGLEPTR(pScrn); + + ENTER; + if (alu != GXcopy) return FALSE; + if (fPtr->hwmode != HW_FILL) { + SummitWaitMarker(pPixmap->drawable.pScreen, 0); + NGLEWrite4(fPtr, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_FILL); + fPtr->hwmode = HW_FILL; + } + NGLEWrite4(fPtr, VISFX_FG_COLOUR, fg); + NGLEWrite4(fPtr, VISFX_PLANE_MASK, planemask); + LEAVE; + return TRUE; +} + +static void +SummitSolid( + PixmapPtr pPixmap, + int x1, + int y1, + int x2, + int y2) +{ + ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; + NGLEPtr fPtr = NGLEPTR(pScrn); + int wi = x2 - x1, he = y2 - y1; + int pitch = exaGetPixmapPitch(pPixmap); + int offset = exaGetPixmapOffset(pPixmap); + uint32_t mask; + + ENTER; + + y1 += offset / pitch; + + SummitWaitMarker(pPixmap->drawable.pScreen, 0); + NGLEWrite4(fPtr, VISFX_START, (x1 << 16) | y1); + NGLEWrite4(fPtr, VISFX_SIZE, (wi << 16) | he); + + exaMarkSync(pPixmap->drawable.pScreen); + LEAVE; +} + +Bool +SummitPrepareAccess(PixmapPtr pPixmap, int index) +{ + ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; + NGLEPtr fPtr = NGLEPTR(pScrn); + + SummitWaitMarker(pPixmap->drawable.pScreen, 0); + NGLEWrite4(fPtr, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_PLAIN); + NGLEWrite4(fPtr, VISFX_VRAM_READ_MODE, VISFX_READ_MODE_COPY); + fPtr->hwmode = HW_BLIT; + + return TRUE; +} +Bool +SummitInitAccel(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + NGLEPtr fPtr = NGLEPTR(pScrn); + ExaDriverPtr pExa; + int lines, bpp = pScrn->bitsPerPixel >> 3; + + pExa = exaDriverAlloc(); + if (!pExa) + return FALSE; + + fPtr->pExa = pExa; + + pExa->exa_major = EXA_VERSION_MAJOR; + pExa->exa_minor = EXA_VERSION_MINOR; + + pExa->memoryBase = fPtr->fbmem; + lines = 1;/* until we figure out how to use more memory */ + DBGMSG(X_ERROR, "lines %d\n", lines); + pExa->memorySize = fPtr->fbi.fbi_stride * (fPtr->fbi.fbi_height + 1); //fPtr->fbmem_len; + pExa->offScreenBase = fPtr->fbi.fbi_stride * fPtr->fbi.fbi_height; + pExa->pixmapOffsetAlign = fPtr->fbi.fbi_stride; + pExa->pixmapPitchAlign = fPtr->fbi.fbi_stride; + + pExa->flags = EXA_OFFSCREEN_PIXMAPS | EXA_MIXED_PIXMAPS; + + pExa->maxX = 2048; + pExa->maxY = 2048; + + fPtr->hwmode = -1; + + pExa->WaitMarker = SummitWaitMarker; + pExa->Solid = SummitSolid; + pExa->DoneSolid = SummitDoneCopy; + pExa->Copy = SummitCopy; + pExa->DoneCopy = SummitDoneCopy; + pExa->PrepareCopy = SummitPrepareCopy; + pExa->PrepareSolid = SummitPrepareSolid; + pExa->PrepareAccess = SummitPrepareAccess; + SummitWaitMarker(pScreen, 0); + + return exaDriverInit(pScreen, pExa); +}