Module Name: xsrc Committed By: macallan Date: Wed Jan 22 12:55:06 UTC 2025
Modified Files: xsrc/external/mit/xf86-video-ngle/dist/src: ngle.h ngle_driver.c Added Files: xsrc/external/mit/xf86-video-ngle/dist/src: summit_cursor.c Log Message: add direct support for hardware cursor on Summit To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h cvs rdiff -u -r1.9 -r1.10 \ xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c cvs rdiff -u -r0 -r1.1 \ xsrc/external/mit/xf86-video-ngle/dist/src/summit_cursor.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.5 xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h:1.6 --- xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h:1.5 Wed Jan 15 08:21:06 2025 +++ xsrc/external/mit/xf86-video-ngle/dist/src/ngle.h Wed Jan 22 12:55:06 2025 @@ -63,7 +63,7 @@ typedef struct { xf86CursorInfoPtr CursorInfoRec; OptionInfoPtr Options; ExaDriverPtr pExa; - uint32_t gid, buf, fbacc; + uint32_t gid, buf, fbacc, creg; int offset, hwmode, offsetd; #define HW_FB 0 #define HW_FILL 1 @@ -76,6 +76,7 @@ typedef struct { Bool NGLESetupCursor(ScreenPtr); Bool NGLEInitAccel(ScreenPtr); +Bool SummitSetupCursor(ScreenPtr); Bool SummitInitAccel(ScreenPtr); static inline void Index: xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c diff -u xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c:1.9 xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c:1.10 --- xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c:1.9 Tue Dec 10 10:13:19 2024 +++ xsrc/external/mit/xf86-video-ngle/dist/src/ngle_driver.c Wed Jan 22 12:55:06 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: ngle_driver.c,v 1.9 2024/12/10 10:13:19 macallan Exp $ */ +/* $NetBSD: ngle_driver.c,v 1.10 2025/01/22 12:55:06 macallan Exp $ */ /* * Copyright (c) 2024 Michael Lorenz * All rights reserved. @@ -118,7 +118,7 @@ typedef enum { } NGLEOpts; static const OptionInfoRec NGLEOptions[] = { - { OPTION_HW_CURSOR, "HWcursor", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_HW_CURSOR, "HWcursor", OPTV_BOOLEAN, {0}, TRUE }, { OPTION_DEVICE, "Device", OPTV_ANYSTR, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE} }; @@ -601,7 +601,10 @@ NGLEScreenInit(SCREEN_INIT_ARGS_DECL) miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); /* check for hardware cursor support */ - NGLESetupCursor(pScreen); + if (fPtr->gid == STI_DD_SUMMIT) { + SummitSetupCursor(pScreen); + } else + NGLESetupCursor(pScreen); /* colormap */ if (!miCreateDefColormap(pScreen)) Added files: Index: xsrc/external/mit/xf86-video-ngle/dist/src/summit_cursor.c diff -u /dev/null xsrc/external/mit/xf86-video-ngle/dist/src/summit_cursor.c:1.1 --- /dev/null Wed Jan 22 12:55:06 2025 +++ xsrc/external/mit/xf86-video-ngle/dist/src/summit_cursor.c Wed Jan 22 12:55:06 2025 @@ -0,0 +1,137 @@ +/* $NetBSD: summit_cursor.c,v 1.1 2025/01/22 12:55:06 macallan Exp $ */ +/* + * Copyright (c) 2025 Michael Lorenz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include <sys/types.h> +#include <dev/ic/summitreg.h> +#include "ngle.h" + +static void SummitLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src); +static void SummitSetCursorPosition(ScrnInfoPtr pScrn, int x, int y); +static void SummitSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg); + +static void +SummitLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) +{ + NGLEPtr pNGLE = NGLEPTR(pScrn); + uint32_t latch; + int i; + + /* image first */ + NGLEWrite4(pNGLE, VISFX_CURSOR_INDEX, 0x80); + for (i = 0; i < 128; i++) { + memcpy(&latch, src, 4); + NGLEWrite4(pNGLE, VISFX_CURSOR_DATA, latch); + src += 4; + } + + /* and now the mask */ + NGLEWrite4(pNGLE, VISFX_CURSOR_INDEX, 0); + for (i = 0; i < 128; i++) { + memcpy(&latch, src, 4); + NGLEWrite4(pNGLE, VISFX_CURSOR_DATA, latch); + src += 4; + } +} + +void +SummitShowCursor(ScrnInfoPtr pScrn) +{ + NGLEPtr pNGLE = NGLEPTR(pScrn); + + pNGLE->cursor.enable = 1; + NGLEWrite4(pNGLE, VISFX_CURSOR_POS, pNGLE->creg | VISFX_CURSOR_ENABLE); +} + +void +SummitHideCursor(ScrnInfoPtr pScrn) +{ + NGLEPtr pNGLE = NGLEPTR(pScrn); + + pNGLE->cursor.enable = 0; + NGLEWrite4(pNGLE, VISFX_CURSOR_POS, pNGLE->creg); +} + +static void +SummitSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) +{ + NGLEPtr pNGLE = NGLEPTR(pScrn); + + if (x < 0) + x = 0x1000 - x; + if (y < 0) + y = 0x1000 - y; + pNGLE->creg = (x << 16) | y; + NGLEWrite4(pNGLE, VISFX_CURSOR_POS, pNGLE->creg | + (pNGLE->cursor.enable ? VISFX_CURSOR_ENABLE : 0)); +} + +static void +SummitSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) +{ + NGLEPtr pNGLE = NGLEPTR(pScrn); + + NGLEWrite4(pNGLE, VISFX_CURSOR_FG, fg); + NGLEWrite4(pNGLE, VISFX_CURSOR_BG, bg); +} + +Bool +SummitSetupCursor(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + NGLEPtr pNGLE = NGLEPTR(pScrn); + xf86CursorInfoPtr infoPtr; + + pNGLE->cursor.enable = 0; + pNGLE->creg = 0; + + infoPtr = xf86CreateCursorInfoRec(); + if(!infoPtr) return FALSE; + + pNGLE->CursorInfoRec = infoPtr; + + xf86Msg(X_INFO, "Summit HW cursor enabled\n"); + + infoPtr->MaxWidth = 64; + infoPtr->MaxHeight = 64; + pNGLE->maskoffset = 8 * 64; + + infoPtr->Flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK | + HARDWARE_CURSOR_TRUECOLOR_AT_8BPP; + + infoPtr->SetCursorColors = SummitSetCursorColors; + infoPtr->SetCursorPosition = SummitSetCursorPosition; + infoPtr->LoadCursorImage = SummitLoadCursorImage; + infoPtr->HideCursor = SummitHideCursor; + infoPtr->ShowCursor = SummitShowCursor; + infoPtr->UseHWCursor = NULL; + + return xf86InitCursor(pScreen, infoPtr); +}