Fix off-by-one error in xf86SetWeight(); ffs(3) returns one-based index, but most drivers expect zero-based one. Few drivers work around this bug by themselves. So, remove these codes simultanemously. Index: xsrc/external/mit/xf86-video-geode/dist/src/gx_video.c =================================================================== RCS file: /home/netbsd/xsrc/external/mit/xf86-video-geode/dist/src/gx_video.c,v retrieving revision 1.2 diff -p -u -r1.2 gx_video.c --- xsrc/external/mit/xf86-video-geode/dist/src/gx_video.c 30 May 2017 15:54:38 -0000 1.2 +++ xsrc/external/mit/xf86-video-geode/dist/src/gx_video.c 28 May 2021 09:21:47 -0000 @@ -300,7 +300,7 @@ GXSetColorkey(ScrnInfoPtr pScrni, GeodeP green = ((key >> 8) & 0xFF); blue = (key & 0xFF); break; - case 16: + default: red = (pPriv->colorKey & pScrni->mask.red) >> pScrni->offset.red << (8 - pScrni->weight.red); green = (pPriv->colorKey & pScrni->mask.green) >> @@ -308,18 +308,6 @@ GXSetColorkey(ScrnInfoPtr pScrni, GeodeP blue = (pPriv->colorKey & pScrni->mask.blue) >> pScrni->offset.blue << (8 - pScrni->weight.blue); break; - default: - /* for > 16 bpp we send in the mask in xf86SetWeight. This - * function is providing the offset by 1 more. So we take - * this as a special case and subtract 1 for > 16 - */ - red = (pPriv->colorKey & pScrni->mask.red) >> - (pScrni->offset.red - 1) << (8 - pScrni->weight.red); - green = (pPriv->colorKey & pScrni->mask.green) >> - (pScrni->offset.green - 1) << (8 - pScrni->weight.green); - blue = (pPriv->colorKey & pScrni->mask.blue) >> - (pScrni->offset.blue - 1) << (8 - pScrni->weight.blue); - break; } GFX(set_video_color_key((blue | (green << 8) | (red << 16)), 0xFFFFFF, Index: xsrc/external/mit/xf86-video-geode/dist/src/lx_video.c =================================================================== RCS file: /home/netbsd/xsrc/external/mit/xf86-video-geode/dist/src/lx_video.c,v retrieving revision 1.2 diff -p -u -r1.2 lx_video.c --- xsrc/external/mit/xf86-video-geode/dist/src/lx_video.c 30 May 2017 15:54:38 -0000 1.2 +++ xsrc/external/mit/xf86-video-geode/dist/src/lx_video.c 28 May 2021 09:22:14 -0000 @@ -146,7 +146,7 @@ LXSetColorkey(ScrnInfoPtr pScrni, GeodeP green = ((key >> 8) & 0xFF); blue = (key & 0xFF); break; - case 16: + default: red = (pPriv->colorKey & pScrni->mask.red) >> pScrni->offset.red << (8 - pScrni->weight.red); green = (pPriv->colorKey & pScrni->mask.green) >> @@ -154,19 +154,6 @@ LXSetColorkey(ScrnInfoPtr pScrni, GeodeP blue = (pPriv->colorKey & pScrni->mask.blue) >> pScrni->offset.blue << (8 - pScrni->weight.blue); break; - default: - /* for > 16 bpp we send in the mask in xf86SetWeight. This - * function is providing the offset by 1 more. So we take - * this as a special case and subtract 1 for > 16 - */ - - red = (pPriv->colorKey & pScrni->mask.red) >> - (pScrni->offset.red - 1) << (8 - pScrni->weight.red); - green = (pPriv->colorKey & pScrni->mask.green) >> - (pScrni->offset.green - 1) << (8 - pScrni->weight.green); - blue = (pPriv->colorKey & pScrni->mask.blue) >> - (pScrni->offset.blue - 1) << (8 - pScrni->weight.blue); - break; } df_set_video_color_key((blue | (green << 8) | (red << 16)), Index: xsrc/external/mit/xf86-video-nouveau/dist/src/nv_driver.c =================================================================== RCS file: /home/netbsd/xsrc/external/mit/xf86-video-nouveau/dist/src/nv_driver.c,v retrieving revision 1.4 diff -p -u -r1.4 nv_driver.c --- xsrc/external/mit/xf86-video-nouveau/dist/src/nv_driver.c 27 Apr 2021 01:22:55 -0000 1.4 +++ xsrc/external/mit/xf86-video-nouveau/dist/src/nv_driver.c 28 May 2021 09:23:39 -0000 @@ -1002,11 +1002,6 @@ NVPreInit(ScrnInfoPtr pScrn, int flags) rgbmask.blue = 0x3ff00000; if (!xf86SetWeight(pScrn, rgbzeros, rgbmask)) NVPreInitFail("\n"); - - /* xf86SetWeight() seems to think ffs(1) == 0... */ - pScrn->offset.red--; - pScrn->offset.green--; - pScrn->offset.blue--; } else { if (!xf86SetWeight(pScrn, rgbzeros, rgbzeros)) NVPreInitFail("\n"); Index: xsrc/external/mit/xf86-video-nsc/dist/src/nsc_gx2_video.c =================================================================== RCS file: /home/netbsd/xsrc/external/mit/xf86-video-nsc/dist/src/nsc_gx2_video.c,v retrieving revision 1.1.1.1 diff -p -u -r1.1.1.1 nsc_gx2_video.c --- xsrc/external/mit/xf86-video-nsc/dist/src/nsc_gx2_video.c 2 Aug 2008 05:13:44 -0000 1.1.1.1 +++ xsrc/external/mit/xf86-video-nsc/dist/src/nsc_gx2_video.c 28 May 2021 09:23:59 -0000 @@ -368,7 +368,7 @@ GX2SetColorkey(ScrnInfoPtr pScrn, GeodeP green = ((key >> 8) & 0xFF); blue = (key & 0xFF); break; - case 16: + default: red = (pPriv->colorKey & pScrn->mask.red) >> pScrn->offset.red << (8 - pScrn->weight.red); green = (pPriv->colorKey & pScrn->mask.green) >> @@ -376,18 +376,6 @@ GX2SetColorkey(ScrnInfoPtr pScrn, GeodeP blue = (pPriv->colorKey & pScrn->mask.blue) >> pScrn->offset.blue << (8 - pScrn->weight.blue); break; - default: - /* for > 16 bpp we send in the mask in xf86SetWeight. This - * function is providing the offset by 1 more. So we take - * this as a special case and subtract 1 for > 16 - */ - red = (pPriv->colorKey & pScrn->mask.red) >> - (pScrn->offset.red - 1) << (8 - pScrn->weight.red); - green = (pPriv->colorKey & pScrn->mask.green) >> - (pScrn->offset.green - 1) << (8 - pScrn->weight.green); - blue = (pPriv->colorKey & pScrn->mask.blue) >> - (pScrn->offset.blue - 1) << (8 - pScrn->weight.blue); - break; } GFX(set_video_color_key((blue | (green << 8) | (red << 16)), 0xFFFFFF, Index: xsrc/external/mit/xorg-server/dist/hw/xfree86/common/xf86Helper.c =================================================================== RCS file: /home/netbsd/xsrc/external/mit/xorg-server/dist/hw/xfree86/common/xf86Helper.c,v retrieving revision 1.4 diff -p -u -r1.4 xf86Helper.c --- xsrc/external/mit/xorg-server/dist/hw/xfree86/common/xf86Helper.c 31 Dec 2018 09:50:00 -0000 1.4 +++ xsrc/external/mit/xorg-server/dist/hw/xfree86/common/xf86Helper.c 28 May 2021 09:25:18 -0000 @@ -728,9 +728,9 @@ xf86SetWeight(ScrnInfoPtr scrp, rgb weig scrp->mask.red = mask.red; scrp->mask.green = mask.green; scrp->mask.blue = mask.blue; - scrp->offset.red = ffs(mask.red); - scrp->offset.green = ffs(mask.green); - scrp->offset.blue = ffs(mask.blue); + scrp->offset.red = ffs(mask.red) - 1; + scrp->offset.green = ffs(mask.green) - 1; + scrp->offset.blue = ffs(mask.blue) - 1; } return TRUE; } Index: xsrc/external/mit/xorg-server.old/dist/hw/xfree86/common/xf86Helper.c =================================================================== RCS file: /home/netbsd/xsrc/external/mit/xorg-server.old/dist/hw/xfree86/common/xf86Helper.c,v retrieving revision 1.1.1.1 diff -p -u -r1.1.1.1 xf86Helper.c --- xsrc/external/mit/xorg-server.old/dist/hw/xfree86/common/xf86Helper.c 9 Jun 2016 09:07:58 -0000 1.1.1.1 +++ xsrc/external/mit/xorg-server.old/dist/hw/xfree86/common/xf86Helper.c 28 May 2021 09:25:44 -0000 @@ -760,9 +760,9 @@ xf86SetWeight(ScrnInfoPtr scrp, rgb weig scrp->mask.red = mask.red; scrp->mask.green = mask.green; scrp->mask.blue = mask.blue; - scrp->offset.red = ffs(mask.red); - scrp->offset.green = ffs(mask.green); - scrp->offset.blue = ffs(mask.blue); + scrp->offset.red = ffs(mask.red) - 1; + scrp->offset.green = ffs(mask.green) - 1; + scrp->offset.blue = ffs(mask.blue) - 1; } return TRUE; }