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