Module Name: xsrc Committed By: macallan Date: Wed Jan 15 08:21:06 UTC 2025
Modified Files: xsrc/external/mit/xf86-video-ngle/dist/src: ngle.h summit_accel.c Log Message: some udates: - don't use hwmode, just track read- and write mode directly - use FIFO pacing now that we know how, only stall the engine if we need to access video memory or change buffer access modes - use a back buffer as off-screen memory, modify Prepare*() etc. accordingly To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h cvs rdiff -u -r1.3 -r1.4 \ 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.4 xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h:1.5 --- xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h:1.4 Fri Dec 27 00:57:53 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h Wed Jan 15 08:21:06 2025 @@ -64,11 +64,12 @@ typedef struct { OptionInfoPtr Options; ExaDriverPtr pExa; uint32_t gid, buf, fbacc; - int offset, hwmode; + int offset, hwmode, offsetd; #define HW_FB 0 #define HW_FILL 1 #define HW_BLIT 2 #define HW_BINC 3 + uint32_t read_mode, write_mode; } NGLERec, *NGLEPtr; #define NGLEPTR(p) ((NGLEPtr)((p)->driverPrivate)) Index: xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c diff -u xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c:1.3 xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c:1.4 --- xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c:1.3 Thu Dec 26 11:26:15 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c Wed Jan 15 08:21:06 2025 @@ -21,7 +21,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $NetBSD: summit_accel.c,v 1.3 2024/12/26 11:26:15 macallan Exp $ */ +/* $NetBSD: summit_accel.c,v 1.4 2025/01/15 08:21:06 macallan Exp $ */ #include <sys/types.h> #include <dev/ic/summitreg.h> @@ -41,6 +41,36 @@ #define LEAVE #endif +#define SUMMIT_READ_MODE(m) \ + if ((m) != fPtr->read_mode) { \ + SummitWait(fPtr); \ + NGLEWrite4(fPtr, VISFX_VRAM_READ_MODE, (m)); \ + fPtr->read_mode = (m); \ + } + +#define SUMMIT_WRITE_MODE(m) \ + if ((m) != fPtr->write_mode) { \ + SummitWait(fPtr); \ + NGLEWrite4(fPtr, VISFX_VRAM_WRITE_MODE, (m)); \ + fPtr->write_mode = (m); \ + } + +static void +SummitWait(NGLEPtr fPtr) +{ + int reg; + + ENTER; + do { + reg = NGLERead4(fPtr, VISFX_STATUS); + } while ((reg & 0x01000000) != 0); + if (reg != 0) { + xf86Msg(X_ERROR, "%s status %08x\n", __func__, reg); + xf86Msg(X_ERROR, "fault %08x\n", NGLERead4(fPtr, 0x641040)); + } + LEAVE; +} + static void SummitWaitMarker(ScreenPtr pScreen, int Marker) { @@ -64,8 +94,11 @@ SummitWaitFifo(NGLEPtr fPtr, int count) { int reg; do { - reg = NGLERead4(fPtr, 0xa41440/*VISFX_FIFO*/); + reg = NGLERead4(fPtr, VISFX_FIFO); } while (reg < count); +#ifdef DEBUG + if (reg != 0x800) xf86Msg(X_ERROR, "%s %x\n", __func__, reg); +#endif } static Bool @@ -81,20 +114,33 @@ SummitPrepareCopy { ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum]; NGLEPtr fPtr = NGLEPTR(pScrn); - int srcpitch = exaGetPixmapPitch(pSrcPixmap); + int dstoff = exaGetPixmapOffset(pDstPixmap); int srcoff = exaGetPixmapOffset(pSrcPixmap); + uint32_t sm, dm; + int y; ENTER; - DBGMSG(X_ERROR, "%s %d %d\n", __func__, srcoff, srcpitch); - fPtr->offset = srcoff / srcpitch; - if (fPtr->hwmode != HW_BLIT) { - SummitWaitMarker(pSrcPixmap->drawable.pScreen, 0); - //SummitWaitFifo(fPtr, 3); - NGLEWrite4(fPtr, VISFX_VRAM_WRITE_MODE, OTC01 | BIN8F | BUFFL); - NGLEWrite4(fPtr, VISFX_VRAM_READ_MODE, OTC01 | BIN8F | BUFFL); - fPtr->hwmode = HW_BLIT; + sm = dm = OTC01 | BIN8F | BUFFL; + DBGMSG(X_ERROR, "%s %d %d\n", __func__, srcoff, dstoff); + + y = (srcoff >> 13); /* pitch is 8192 bytes in 24 bit */ + if (y >= fPtr->fbi.fbi_height) { + sm = OTC01 | BIN8F | BUFBL; + y -= fPtr->fbi.fbi_height; + } + fPtr->offset = y; + SUMMIT_READ_MODE(sm); + + y = (dstoff >> 13); /* pitch is 8192 bytes in 24 bit */ + if (y >= fPtr->fbi.fbi_height) { + dm = OTC01 | BIN8F | BUFBL; + y -= fPtr->fbi.fbi_height; } + fPtr->offsetd = y; + SUMMIT_WRITE_MODE(dm); + + SummitWaitFifo(fPtr, 6); NGLEWrite4(fPtr, VISFX_IBO, alu); NGLEWrite4(fPtr, VISFX_PLANE_MASK, planemask); LEAVE; @@ -115,15 +161,12 @@ SummitCopy { 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); - //SummitWaitFifo(fPtr, 8); + SummitWaitFifo(fPtr, 8); 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))); + NGLEWrite4(fPtr, VISFX_COPY_DST, (xd << 16) | (yd + fPtr->offsetd)); exaMarkSync(pDstPixmap->drawable.pScreen); LEAVE; @@ -145,14 +188,21 @@ SummitPrepareSolid( { ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; NGLEPtr fPtr = NGLEPTR(pScrn); + int ofs = exaGetPixmapOffset(pPixmap); + int y; + uint32_t wm = OTC32 | BIN8F | BUFFL | 0x8c0, rm = OTC01 | BIN8F | BUFFL; ENTER; - //SummitWaitFifo(fPtr, 6); - if (fPtr->hwmode != HW_FILL) { - SummitWaitMarker(pPixmap->drawable.pScreen, 0); - NGLEWrite4(fPtr, VISFX_VRAM_WRITE_MODE, OTC32 | BIN8F | BUFFL | 0x8c0); - fPtr->hwmode = HW_FILL; + y = (ofs >> 13); /* pitch is 8192 bytes in 24 bit */ + if (y >= fPtr->fbi.fbi_height) { + wm = OTC32 | BIN8F | BUFBL | 0x8c0; + rm = OTC01 | BIN8F | BUFBL; + y -= fPtr->fbi.fbi_height; } + SUMMIT_READ_MODE(rm); + SUMMIT_WRITE_MODE(wm); + fPtr->offset = y; + SummitWaitFifo(fPtr, 6); NGLEWrite4(fPtr, VISFX_IBO, alu); NGLEWrite4(fPtr, VISFX_FG_COLOUR, fg); NGLEWrite4(fPtr, VISFX_PLANE_MASK, planemask); @@ -171,16 +221,12 @@ SummitSolid( 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; + y1 += fPtr->offset; - SummitWaitMarker(pPixmap->drawable.pScreen, 0); - //SummitWaitFifo(fPtr, 6); + SummitWaitFifo(fPtr, 6); NGLEWrite4(fPtr, VISFX_START, (x1 << 16) | y1); NGLEWrite4(fPtr, VISFX_SIZE, (wi << 16) | he); @@ -195,28 +241,25 @@ SummitUploadToScreen(PixmapPtr pDst, int ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; NGLEPtr fPtr = NGLEPTR(pScrn); int ofs = exaGetPixmapOffset(pDst); - int dst_pitch = exaGetPixmapPitch(pDst); int i; - uint32_t *line; - -// int bpp = pDst->drawable.bitsPerPixel; -// int cpp = (bpp + 7) >> 3; -// int wBytes = w * cpp; + uint32_t *line, mode = OTC01 | BIN8F | BUFFL; ENTER; - //xf86Msg(X_ERROR, "%s bpp %d\n", __func__, pDst->drawable.bitsPerPixel); - if (fPtr->hwmode != HW_BINC) { - SummitWaitMarker(pDst->drawable.pScreen, 0); - //SummitWaitFifo(fPtr, 3); - NGLEWrite4(fPtr, VISFX_VRAM_WRITE_MODE, OTC01 | BIN8F | BUFFL); - NGLEWrite4(fPtr, VISFX_VRAM_READ_MODE, OTC01 | BIN8F | BUFFL); - NGLEWrite4(fPtr, VISFX_PLANE_MASK, 0xffffffff); - NGLEWrite4(fPtr, VISFX_IBO, GXcopy); - fPtr->hwmode = HW_BINC; + + y += (ofs >> 13); /* pitch is 8192 bytes in 24 bit */ + if (y >= fPtr->fbi.fbi_height) { + mode = OTC01 | BIN8F | BUFBL; + y -= fPtr->fbi.fbi_height; } + SUMMIT_WRITE_MODE(mode); + NGLEWrite4(fPtr, VISFX_PLANE_MASK, 0xffffffff); + NGLEWrite4(fPtr, VISFX_IBO, GXcopy); + while (h--) { + SummitWaitFifo(fPtr, w + 1); NGLEWrite4(fPtr, VISFX_VRAM_WRITE_DEST, (y << 16) | x); line = (uint32_t *)src; + for (i = 0; i < w; i++) NGLEWrite4(fPtr, VISFX_VRAM_WRITE_DATA_INCRX, line[i]); src += src_pitch; @@ -225,19 +268,59 @@ SummitUploadToScreen(PixmapPtr pDst, int return TRUE; } +static Bool +SummitDownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, int h, + char *dst, int dst_pitch) +{ + ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum]; + NGLEPtr fPtr = NGLEPTR(pScrn); + uint8_t *src; + int ofs = exaGetPixmapOffset(pSrc); + uint32_t mode = OTC01 | BIN8F | BUFFL; + + ENTER; + + y += (ofs >> 13); + if (y >= fPtr->fbi.fbi_height) { + mode = OTC01 | BIN8F | BUFBL; + y -= fPtr->fbi.fbi_height; + } + SUMMIT_READ_MODE(mode); + SummitWait(fPtr); + + src = fPtr->fbmem; + src += (y << 13) + (x << 2); + + while (h--) { + memcpy(dst, src, w << 2); + src += 8192; + dst += dst_pitch; + } + + return TRUE; +} + Bool SummitPrepareAccess(PixmapPtr pPixmap, int index) { ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; NGLEPtr fPtr = NGLEPTR(pScrn); + int ofs = exaGetPixmapOffset(pPixmap); ENTER; - SummitWaitMarker(pPixmap->drawable.pScreen, 0); - NGLEWrite4(fPtr, VISFX_VRAM_WRITE_MODE, OTC01 | BIN8F | BUFFL); - NGLEWrite4(fPtr, VISFX_VRAM_READ_MODE, OTC01 | BIN8F | BUFFL); - NGLEWrite4(fPtr, VISFX_IBO, GXcopy); - NGLEWrite4(fPtr, VISFX_CONTROL, 0x200); - fPtr->hwmode = HW_FB; + /* + * XXX + * since we abuse the back buffer as off-screen storage we can't + * safely allow direct access to it - this will make X use + * {Up|Down}load{To|From}Screen() instead + */ + if (ofs > 0) return FALSE; + + SUMMIT_READ_MODE(OTC01 | BIN8F | BUFFL); + SUMMIT_WRITE_MODE(OTC01 | BIN8F | BUFFL); + NGLEWrite4(fPtr, VISFX_FOE, 0); + //NGLEWrite4(fPtr, VISFX_CONTROL, 0x200); + SummitWait(fPtr); LEAVE; return TRUE; } @@ -249,7 +332,8 @@ SummitFinishAccess(PixmapPtr pPixmap, in NGLEPtr fPtr = NGLEPTR(pScrn); ENTER; - NGLEWrite4(fPtr, VISFX_CONTROL, 0); + NGLEWrite4(fPtr, VISFX_FOE, FOE_BLEND_ROP); + //NGLEWrite4(fPtr, VISFX_CONTROL, 0); LEAVE; } @@ -259,7 +343,7 @@ SummitInitAccel(ScreenPtr pScreen) ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; NGLEPtr fPtr = NGLEPTR(pScrn); ExaDriverPtr pExa; - int lines, bpp = pScrn->bitsPerPixel >> 3; + int bpp = pScrn->bitsPerPixel >> 3; pExa = exaDriverAlloc(); if (!pExa) @@ -271,9 +355,7 @@ SummitInitAccel(ScreenPtr pScreen) 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->memorySize = fPtr->fbi.fbi_stride * (fPtr->fbi.fbi_height * 2); pExa->offScreenBase = fPtr->fbi.fbi_stride * fPtr->fbi.fbi_height; pExa->pixmapOffsetAlign = fPtr->fbi.fbi_stride; pExa->pixmapPitchAlign = fPtr->fbi.fbi_stride; @@ -283,8 +365,6 @@ SummitInitAccel(ScreenPtr pScreen) pExa->maxX = 2048; pExa->maxY = 2048; - fPtr->hwmode = -1; - pExa->WaitMarker = SummitWaitMarker; pExa->Solid = SummitSolid; pExa->DoneSolid = SummitDoneCopy; @@ -293,11 +373,17 @@ SummitInitAccel(ScreenPtr pScreen) pExa->PrepareCopy = SummitPrepareCopy; pExa->PrepareSolid = SummitPrepareSolid; pExa->UploadToScreen = SummitUploadToScreen; + pExa->DownloadFromScreen = SummitDownloadFromScreen; pExa->PrepareAccess = SummitPrepareAccess; pExa->FinishAccess = SummitFinishAccess; - SummitWaitMarker(pScreen, 0); + + fPtr->read_mode = -1; + fPtr->write_mode = -1; + SUMMIT_READ_MODE(OTC01 | BIN8F | BUFFL); + SUMMIT_WRITE_MODE(OTC01 | BIN8F | BUFFL); NGLEWrite4(fPtr, VISFX_FOE, FOE_BLEND_ROP); NGLEWrite4(fPtr, VISFX_IBO, GXcopy); + NGLEWrite4(fPtr, VISFX_CONTROL, 0); return exaDriverInit(pScreen, pExa); }