Module Name:    xsrc
Committed By:   macallan
Date:           Thu Jul 26 21:29:16 UTC 2018

Modified Files:
        xsrc/external/mit/xf86-video-nv/dist/src: nv_exa.c nv_local.h nv_type.h
            nv_xaa.c

Log Message:
- increase offscreen pixmap alignment
- don't pretend to support overlapping pixmaps
- reshuffle some register writes
- set surface formats every time we Prepare*()
-> less garbage, almost works correctly now


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 xsrc/external/mit/xf86-video-nv/dist/src/nv_exa.c \
    xsrc/external/mit/xf86-video-nv/dist/src/nv_type.h
cvs rdiff -u -r1.2 -r1.3 xsrc/external/mit/xf86-video-nv/dist/src/nv_local.h \
    xsrc/external/mit/xf86-video-nv/dist/src/nv_xaa.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-nv/dist/src/nv_exa.c
diff -u xsrc/external/mit/xf86-video-nv/dist/src/nv_exa.c:1.3 xsrc/external/mit/xf86-video-nv/dist/src/nv_exa.c:1.4
--- xsrc/external/mit/xf86-video-nv/dist/src/nv_exa.c:1.3	Mon Jul 16 16:30:04 2018
+++ xsrc/external/mit/xf86-video-nv/dist/src/nv_exa.c	Thu Jul 26 21:29:16 2018
@@ -21,7 +21,7 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-/* $NetBSD: nv_exa.c,v 1.3 2018/07/16 16:30:04 macallan Exp $ */
+/* $NetBSD: nv_exa.c,v 1.4 2018/07/26 21:29:16 macallan Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -65,24 +65,28 @@ NvPrepareCopy
 {
 	ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
 	NVPtr pNv = NVPTR(pScrn);
-	int srcpitch, srcoff, dstpitch, dstoff;
+	uint32_t dstpitch, dstoff, srcpitch, srcoff;
 
 	ENTER;
 	if (pSrcPixmap->drawable.bitsPerPixel != 32)
 		xf86Msg(X_ERROR, "%s %d bpp\n", __func__, pSrcPixmap->drawable.bitsPerPixel);
 	planemask |= ~0 << pNv->CurrentLayout.depth;
 	NVSetRopSolid(pScrn, rop, planemask);
-	pNv->DMAKickoffCallback = NVDMAKickoffCallback;
+
 	dstpitch = exaGetPixmapPitch(pDstPixmap);
 	dstoff = exaGetPixmapOffset(pDstPixmap);
 	srcpitch = exaGetPixmapPitch(pSrcPixmap);
 	srcoff = exaGetPixmapOffset(pSrcPixmap);
 
-	NVDmaStart(pNv, SURFACE_PITCH, 3);
+
+	NVDmaStart(pNv, SURFACE_FORMAT, 4);
+	NVDmaNext (pNv, pNv->surfaceFormat);
 	NVDmaNext (pNv, srcpitch | (dstpitch << 16));
 	NVDmaNext (pNv, srcoff);
 	NVDmaNext (pNv, dstoff);
 
+	pNv->DMAKickoffCallback = NVDMAKickoffCallback;
+
 	LEAVE;
 	return TRUE;
 }
@@ -102,6 +106,8 @@ NvCopy
 	ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
 	NVPtr pNv = NVPTR(pScrn);
 
+	ENTER;
+
 	NVDmaStart(pNv, BLIT_POINT_SRC, 3);
 	NVDmaNext (pNv, (srcY << 16) | srcX);
 	NVDmaNext (pNv, (dstY << 16) | dstX);
@@ -129,27 +135,32 @@ NvPrepareSolid(
 {
 	ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
 	NVPtr pNv = NVPTR(pScrn);
-	int pitch, off;
+	uint32_t pitch, off;
 
 	ENTER;
 	if (pPixmap->drawable.bitsPerPixel != 32)
 		xf86Msg(X_ERROR, "%s %d bpp\n", __func__, pPixmap->drawable.bitsPerPixel);
 	planemask |= ~0 << pNv->CurrentLayout.depth;
 
-
 	pitch = exaGetPixmapPitch(pPixmap);
 	off = exaGetPixmapOffset(pPixmap);
 
-	NVDmaStart(pNv, SURFACE_PITCH, 3);
+	NVDmaStart(pNv, SURFACE_FORMAT, 4);
+	NVDmaNext (pNv, pNv->surfaceFormat);
 	NVDmaNext (pNv, pitch | (pitch << 16));
 	NVDmaNext (pNv, off);
 	NVDmaNext (pNv, off);
 
+	NVDmaStart(pNv, RECT_FORMAT, 1);
+	NVDmaNext (pNv, pNv->rectFormat);
+
 	NVSetRopSolid(pScrn, rop, planemask);
-	pNv->DMAKickoffCallback = NVDMAKickoffCallback;
+
 	NVDmaStart(pNv, RECT_SOLID_COLOR, 1);
 	NVDmaNext (pNv, color);
 
+	pNv->DMAKickoffCallback = NVDMAKickoffCallback;
+
 	LEAVE;
 	return TRUE;
 }
@@ -167,6 +178,7 @@ NvSolid(
 	int w = x2 - x1, h = y2 - y1;
 
 	ENTER;
+
 	NVDmaStart(pNv, RECT_SOLID_RECTS(0), 2);
 	NVDmaNext (pNv, (x1 << 16) | y1);
 	NVDmaNext (pNv, (w << 16) | h);
@@ -203,7 +215,7 @@ NvUploadToScreen(PixmapPtr pDst, int x, 
 		src += src_pitch;
 		dst += dst_pitch;
 	}
-	_NV_FENCE()
+
 	LEAVE;
 	return TRUE;
 }
@@ -272,18 +284,17 @@ NvInitExa(ScreenPtr pScreen)
 	pExa->exa_minor = EXA_VERSION_MINOR;
 
 	pExa->memoryBase = pNv->FbStart;
-	pExa->memorySize = pNv->ScratchBufferStart & (~63);
-	pExa->offScreenBase = pScrn->virtualY * 
-				pScrn->displayWidth * pScrn->bitsPerPixel >> 3;
-	pExa->pixmapOffsetAlign = 64;
-	pExa->pixmapPitchAlign = 64;
-
-	pExa->flags = EXA_OFFSCREEN_PIXMAPS |
-		      EXA_SUPPORTS_OFFSCREEN_OVERLAPS |
-		      EXA_MIXED_PIXMAPS;
+	pExa->memorySize = pNv->ScratchBufferStart & (~255);
+	pExa->offScreenBase = (((pScrn->virtualY * pScrn->displayWidth *
+			       pScrn->bitsPerPixel >> 3) + 255) & (~255));
+	pExa->pixmapOffsetAlign = 256;
+	pExa->pixmapPitchAlign = 256;
+
+	pExa->flags = EXA_OFFSCREEN_PIXMAPS/* |
+		      EXA_MIXED_PIXMAPS*/;
 
-	pExa->maxX = 8192;
-	pExa->maxY = 8192;	
+	pExa->maxX = 4096;
+	pExa->maxY = 4096;	
 
 	pExa->WaitMarker = NvWaitMarker;
 	pExa->PrepareSolid = NvPrepareSolid;
@@ -295,23 +306,23 @@ NvInitExa(ScreenPtr pScreen)
 
 	switch(pNv->CurrentLayout.depth) {
 	case 24:
-		surfaceFormat = SURFACE_FORMAT_DEPTH24;
-		rectFormat = RECT_FORMAT_DEPTH24;
+		pNv->surfaceFormat = SURFACE_FORMAT_DEPTH24;
+		pNv->rectFormat = RECT_FORMAT_DEPTH24;
 		break;
 	case 16:
 	case 15:
-		surfaceFormat = SURFACE_FORMAT_DEPTH16;
-		rectFormat = RECT_FORMAT_DEPTH16;
+		pNv->surfaceFormat = SURFACE_FORMAT_DEPTH16;
+		pNv->rectFormat = RECT_FORMAT_DEPTH16;
 		break;
 	default:
-		surfaceFormat = SURFACE_FORMAT_DEPTH8;
-		rectFormat = RECT_FORMAT_DEPTH8;
+		pNv->surfaceFormat = SURFACE_FORMAT_DEPTH8;
+		pNv->rectFormat = RECT_FORMAT_DEPTH8;
 		break;
 	}
 	NVDmaStart(pNv, SURFACE_FORMAT, 1);
-	NVDmaNext (pNv, surfaceFormat);
+	NVDmaNext (pNv, pNv->surfaceFormat);
 	NVDmaStart(pNv, RECT_FORMAT, 1);
-	NVDmaNext (pNv, rectFormat);
+	NVDmaNext (pNv, pNv->rectFormat);
 
 	pNv->currentRop = ~0;  /* set to something invalid */
 	NVSetRopSolid(pScrn, GXcopy, ~0);
Index: xsrc/external/mit/xf86-video-nv/dist/src/nv_type.h
diff -u xsrc/external/mit/xf86-video-nv/dist/src/nv_type.h:1.3 xsrc/external/mit/xf86-video-nv/dist/src/nv_type.h:1.4
--- xsrc/external/mit/xf86-video-nv/dist/src/nv_type.h:1.3	Fri Jul 13 09:37:13 2018
+++ xsrc/external/mit/xf86-video-nv/dist/src/nv_type.h	Thu Jul 26 21:29:16 2018
@@ -131,6 +131,7 @@ typedef struct {
     XAAInfoRecPtr       AccelInfoRec;
 #endif
     ExaDriverPtr 	pExa;
+    U032		surfaceFormat, rectFormat;
     xf86CursorInfoPtr   CursorInfoRec;
     DGAModePtr          DGAModes;
     int                 numDGAModes;

Index: xsrc/external/mit/xf86-video-nv/dist/src/nv_local.h
diff -u xsrc/external/mit/xf86-video-nv/dist/src/nv_local.h:1.2 xsrc/external/mit/xf86-video-nv/dist/src/nv_local.h:1.3
--- xsrc/external/mit/xf86-video-nv/dist/src/nv_local.h:1.2	Thu Jul 12 21:16:33 2018
+++ xsrc/external/mit/xf86-video-nv/dist/src/nv_local.h	Thu Jul 26 21:29:16 2018
@@ -57,7 +57,7 @@ typedef unsigned int   U032;
 #if defined(__i386__)
 #define _NV_FENCE() outb(0x3D0, 0);
 #elif defined(__powerpc__)
-#define _NV_FENCE() __asm("eieio; sync;");
+#define _NV_FENCE() __asm("eieio; sync;" ::: "memory");
 #else
 #define _NV_FENCE() mem_barrier();
 #endif
Index: xsrc/external/mit/xf86-video-nv/dist/src/nv_xaa.c
diff -u xsrc/external/mit/xf86-video-nv/dist/src/nv_xaa.c:1.2 xsrc/external/mit/xf86-video-nv/dist/src/nv_xaa.c:1.3
--- xsrc/external/mit/xf86-video-nv/dist/src/nv_xaa.c:1.2	Thu Jul 12 21:19:54 2018
+++ xsrc/external/mit/xf86-video-nv/dist/src/nv_xaa.c	Thu Jul 26 21:29:16 2018
@@ -106,7 +106,7 @@ NVDmaKickoff(NVPtr pNv)
    You can't jump to the location of your put offset.  We write put
    at the jump offset + SKIPS dwords with noop padding in between
    to solve this problem */
-#define SKIPS  16
+#define SKIPS  8
 
 void 
 NVDmaWait (

Reply via email to