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