Module Name: xsrc Committed By: macallan Date: Thu Dec 26 11:26:15 UTC 2024
Modified Files: xsrc/external/mit/xf86-video-ngle/dist/src: summit_accel.c Log Message: use ROPs now that we know how To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 \ 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/summit_accel.c diff -u xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c:1.2 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.2 Wed Dec 25 05:45:53 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/src/summit_accel.c Thu Dec 26 11:26:15 2024 @@ -21,7 +21,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $NetBSD: summit_accel.c,v 1.2 2024/12/25 05:45:53 macallan Exp $ */ +/* $NetBSD: summit_accel.c,v 1.3 2024/12/26 11:26:15 macallan Exp $ */ #include <sys/types.h> #include <dev/ic/summitreg.h> @@ -46,20 +46,28 @@ SummitWaitMarker(ScreenPtr pScreen, int { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; NGLEPtr fPtr = NGLEPTR(pScrn); - int bail = 10000000, reg; + int 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); + } 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 +SummitWaitFifo(NGLEPtr fPtr, int count) +{ + int reg; + do { + reg = NGLERead4(fPtr, 0xa41440/*VISFX_FIFO*/); + } while (reg < count); +} + static Bool SummitPrepareCopy ( @@ -79,14 +87,15 @@ SummitPrepareCopy 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); + //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; } + NGLEWrite4(fPtr, VISFX_IBO, alu); NGLEWrite4(fPtr, VISFX_PLANE_MASK, planemask); LEAVE; return TRUE; @@ -111,6 +120,7 @@ SummitCopy ENTER; SummitWaitMarker(pDstPixmap->drawable.pScreen, 0); + //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))); @@ -137,12 +147,13 @@ SummitPrepareSolid( NGLEPtr fPtr = NGLEPTR(pScrn); ENTER; - if (alu != GXcopy) return FALSE; + //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; } + NGLEWrite4(fPtr, VISFX_IBO, alu); NGLEWrite4(fPtr, VISFX_FG_COLOUR, fg); NGLEWrite4(fPtr, VISFX_PLANE_MASK, planemask); LEAVE; @@ -169,6 +180,7 @@ SummitSolid( y1 += offset / pitch; SummitWaitMarker(pPixmap->drawable.pScreen, 0); + //SummitWaitFifo(fPtr, 6); NGLEWrite4(fPtr, VISFX_START, (x1 << 16) | y1); NGLEWrite4(fPtr, VISFX_SIZE, (wi << 16) | he); @@ -176,19 +188,71 @@ SummitSolid( LEAVE; } +static Bool +SummitUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, + char *src, int src_pitch) +{ + 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; + + 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; + } + while (h--) { + 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; + y++; + } + return TRUE; +} + Bool SummitPrepareAccess(PixmapPtr pPixmap, int index) { ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; NGLEPtr fPtr = NGLEPTR(pScrn); + ENTER; SummitWaitMarker(pPixmap->drawable.pScreen, 0); NGLEWrite4(fPtr, VISFX_VRAM_WRITE_MODE, OTC01 | BIN8F | BUFFL); NGLEWrite4(fPtr, VISFX_VRAM_READ_MODE, OTC01 | BIN8F | BUFFL); - fPtr->hwmode = HW_BLIT; - + NGLEWrite4(fPtr, VISFX_IBO, GXcopy); + NGLEWrite4(fPtr, VISFX_CONTROL, 0x200); + fPtr->hwmode = HW_FB; + LEAVE; return TRUE; } + +void +SummitFinishAccess(PixmapPtr pPixmap, int index) +{ + ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum]; + NGLEPtr fPtr = NGLEPTR(pScrn); + + ENTER; + NGLEWrite4(fPtr, VISFX_CONTROL, 0); + LEAVE; +} + Bool SummitInitAccel(ScreenPtr pScreen) { @@ -228,8 +292,12 @@ SummitInitAccel(ScreenPtr pScreen) pExa->DoneCopy = SummitDoneCopy; pExa->PrepareCopy = SummitPrepareCopy; pExa->PrepareSolid = SummitPrepareSolid; + pExa->UploadToScreen = SummitUploadToScreen; pExa->PrepareAccess = SummitPrepareAccess; + pExa->FinishAccess = SummitFinishAccess; SummitWaitMarker(pScreen, 0); + NGLEWrite4(fPtr, VISFX_FOE, FOE_BLEND_ROP); + NGLEWrite4(fPtr, VISFX_IBO, GXcopy); return exaDriverInit(pScreen, pExa); }