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);
 }

Reply via email to