Skip to content

chore: Run npm audit fix in web/ - #23742

Merged
torokati44 merged 1 commit into
ruffle-rs:masterfrom
torokati44:tsx-4.22.2
May 19, 2026
Merged

chore: Run npm audit fix in web/#23742
torokati44 merged 1 commit into
ruffle-rs:masterfrom
torokati44:tsx-4.22.2

Conversation

@torokati44

Copy link
Copy Markdown
Member

Description

This should clear up the warnings appearing in #23661.
The relevant fix is claimed to be in tsx 4.21.1 - but let's assume it's also in 4.22.2. It wouldn't make sense for it not to...

The second commit was just a tag-along.

Testing

How can we test this PR?

npm run build in web/, see whether DeprecationWarning: module.register() is deprecated.` appears.

Checklist

  • I, a human, have self-reviewed this PR and fully understand the changes within.
  • I have made or updated tests where possible.
  • All of my commits are properly scoped, compile successfully, and pass all tests.
  • This PR does not make sense to split up into smaller PRs.
  • An LLM was involved in the authoring of this code.

@torokati44 torokati44 added A-deps Area: Dependencies T-chore Type: Chore (like updating a dependency, it's gotta be done) labels May 18, 2026
Comment thread web/package-lock.json
@torokati44

Copy link
Copy Markdown
Member Author

(tested locally, the deprecation warning under Node 26 is gone with this)

@torokati44

torokati44 commented May 19, 2026

Copy link
Copy Markdown
Member Author

The tsx bump got merged as part of #23748, so I repurposed the PR to just audit fixes.

@torokati44 torokati44 changed the title chore: Bump tsx to 4.22.2 in web/ chore: Run npm audit fix in web/ May 19, 2026
@torokati44
torokati44 requested a review from danielhjacobs May 19, 2026 12:43
Bumping `brace-expansion` to `5.0.6` and `ws` to `8.20.1`.
@torokati44
torokati44 enabled auto-merge (rebase) May 19, 2026 14:36
@torokati44
torokati44 merged commit 2d6bdcb into ruffle-rs:master May 19, 2026
26 checks passed
Hancock33 added a commit to Hancock33/batocera.piboy that referenced this pull request May 23, 2026
-----------------------------------------------------------------------------------
eden.mk 2a66b40267db6ebcea0cd36a7111abcf85af876f # Version: Commits on May 20, 2026
-----------------------------------------------------------------------------------
[common/cpu_detect] Remove SSE/SSE2/FMA4/AVX_VNNI detection (#3979)

--------------------------------------------------------------------------------------
flycast.mk f3047b2ef12d9e77a661826d663a46beffdc927f # Version: Commits on May 20, 2026
--------------------------------------------------------------------------------------
Virtual-On: Oratorio Tangram (JP) widescreen cheat,

----------------------------------------------------
pcsx2.mk v2.7.356 # Version: Commits on May 19, 2026
----------------------------------------------------
- [GS/HW: Add AA1 triangle corner caps and edge extrapolation.](PCSX2/pcsx2#14439)

,

-------------------------------------------------------------------------------------
ppsspp.mk 4e109dd6ae34cbcb39751bb7647d345569700161 # Version: Commits on May 20, 2026
-------------------------------------------------------------------------------------
Merge pull request #21710 from warmenhoven/warmenhoven/pr/libretro-build-fix

fix libretro build,

------------------------------------------------------------------------------------
rpcs3.mk 6a2ad0a0aa17c994ae95f492bfd27a2a2b3c2b0f # Version: Commits on May 18, 2026
------------------------------------------------------------------------------------
sys_usbd: enable windows hotplug,

-----------------------------------------------------
ryujinx.mk 1.3.298 # Version: Commits on May 20, 2026
-----------------------------------------------------
1.3.298

--------------------------------------------------------------------------------------
shadps4.mk f95edd27e0dde1ea26e94152ac3c6c12ed42ffaf # Version: Commits on May 20, 2026
--------------------------------------------------------------------------------------
major skill issue (#4451),

--------------------------------------------------------------------------------------
tsugaru.mk 83d42379af74e72877863333958234248762c66e # Version: Commits on May 20, 2026
--------------------------------------------------------------------------------------
FLDCW handles exception.,

-------------------------------------------------
vice.mk r46110 # Version: Commits on May 19, 2026
-------------------------------------------------
null

---------------------------------------------------
xemu.mk v0.8.135 # Version: Commits on May 18, 2026
---------------------------------------------------
meson: Bump SPIRV-Reflect to vulkan-sdk-1.4.350.0,

-------------------------------------------------------------------------------------------
xenia-canary.mk a11908fa76eecef7ae7405e0e3ca8f25e622fc81 # Version: Commits on May 19, 2026
-------------------------------------------------------------------------------------------
[XAM] Enable storing IPTV name.

Still needs to be exposed in UI (optional),

-----------------------------------------------------------------------------------------
xenia-edge.mk eee166febd27dfdffc556c4474e1aa49f2b4ccc5 # Version: Commits on May 20, 2026
-----------------------------------------------------------------------------------------
Merge tag 'f88bfbe' into edge,

---------------------------------------------------------------
ruffle.mk nightly-2026-05-20 # Version: Commits on May 20, 2026
---------------------------------------------------------------
## What's Changed

* chore: Bump the npm-minor group in /web with 7 updates by @dependabot[bot] in ruffle-rs/ruffle#23748

* chore: Bump enumset to 1.1.13 by @torokati44 in ruffle-rs/ruffle#23753

* chore: Bump cssnano to 8.0.1 and cssnano-preset-advanced to 8.0.1 in /web by @torokati44 in ruffle-rs/ruffle#23752

* chore: Run `npm audit fix` in web/ by @torokati44 in ruffle-rs/ruffle#23742

**Full Changelog**: ruffle-rs/ruffle@nightly-2026-05-19...nightly-2026-05-20,

-----------------------------------------------------------------------------------------
rpi-eeprom.mk c5ea2eb4dc4de9700d4102cbb5517efb3c1eced6 # Version: Commits on May 20, 2026
-----------------------------------------------------------------------------------------
pieeprom-2026-05-20: recovery: 2712: reboot order and reboot arg option (latest)

* recovery: 2712: reboot order and reboot arg option

  Add support for set_reboot_order and set_reboot_arg1 in

  recovery config.txt, so that recovery.bin can set them when

  it has been loaded over rpiboot.,

------------------------------------------------------------------------------------
rtw88.mk 74e7d03cec5b278a0475b30e80cb8af204ba2c2b # Version: Commits on May 20, 2026
------------------------------------------------------------------------------------
Delete the alt_rtl8821ce driver

Larry added it so some users could test it, but it's probably not needed

anymore. If anyone does need it, we can resurrect it in a separate

repository.

lwfinger/rtw88#98 (comment)

Recently a vulnerability was discovered in rtw_mp_efuse_set(). Ping-Ke

requested we either delete the driver or apply their fix.

https://lore.kernel.org/linux-wireless/1d0efa51a4214ee8b65d7f3ff9d52097@realtek.com/

Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>,

------------------------------------------------------------------------------------------
fallout2-ce.mk 06d7f0972801e9a2c0511255af32ada3b2733ebc # Version: Commits on May 20, 2026
------------------------------------------------------------------------------------------
Implement HOOK_USESKILL, HOOK_USESKILLON (#456)

* Implement HOOK_USESKILL, HOOK_USESKILLON

* make comment more accurate,

---------------------------------------------------------------------------------------
openjazz.mk 0100d5eeb171a243d374d3780a6da8dbc4aa8f4c # Version: Commits on May 20, 2026
---------------------------------------------------------------------------------------
feat: Show key names in configuration

Add initial support for joysticks/gamepads, but not used yet,

------------------------------------------------
vcmi.mk 1.7.4 # Version: Commits on May 20, 2026
------------------------------------------------
Note: saved games from 1.6 release can be loaded in 1.7

### Changelog

- Player Changelog: [1.7.3 -> 1.7.4](https://github.com/vcmi/vcmi/blob/master/ChangeLog.md#173---174)

- Full Changelog: https://github.com/vcmi/vcmi/compare/1.7.3..1.7.4

### Additional builds

<!-- - Android release will be available on Google Play shortly -->

<!-- - Linux release will be available on Flathub shortly -->

<!-- - Ubuntu release will be available on VCMI PPA shortly -->

<!-- - Android release is available on [Google Play](https://play.google.com/store/apps/details?id=is.xyz.vcmi) -->

<!-- - Linux release is available on [Flathub](https://flathub.org/apps/eu.vcmi.VCMI) -->

<!-- - Ubuntu release is available on [VCMI PPA](https://launchpad.net/~vcmi/+archive/ubuntu/ppa) -->

- Android release is available on [Google Play](https://play.google.com/store/apps/details?id=is.xyz.vcmi)

- iOS release is available on [TestFlight](https://testflight.apple.com/join/pJWHSbmu) (AppStore version coming soon)

- Linux release is available on [Flathub](https://flathub.org/apps/eu.vcmi.VCMI)

- Ubuntu release is available on [VCMI PPA](https://launchpad.net/~vcmi/+archive/ubuntu/ppa)

- macOS release can be installed via Homebrew: `brew install --cask vcmi` (official) or `brew install --cask vcmi/vcmi/vcmi` (from our tap),

-------------------------------------------------------------------------------------------------
shadps4-qtlauncher.mk 790d5ad23b132d657f701f8cdd4715c6807a80d0 # Version: Commits on May 20, 2026
-------------------------------------------------------------------------------------------------
audio settings: do not save translated strings to config file that crash games (#357)

* fix translated UI text saving to config

* fixup

* clang

* audio selection per game setting

* revert

* fix openal settings on open,

------------------------------------------------
d7vk.mk v1.10 # Version: Commits on May 19, 2026
------------------------------------------------
Even the major 2D improvements in v1.9 weren't nearly enough for some games, so in v1.10 we've managed to squeeze a bit more performance in 2D heavy titles by skipping data copies on surfaces which would have been overwritten anyway.

Sounds logical and easy enough, but believe me when I say that dealing with the myriad of corner cases DDraw has to offer and figuring out when it is safe to skip an operation is hardly an easy task. I was even a bit too optimistic at first and @CkNoSFeRaTU had to pull me back to reality, but thankfully most of my optimizations have survived the test of time.

It's not anything nearly as groundbreaking as the jump between v1.8 and v1.9, but it's still something, especially in the worst possible situations, such as the inventory screen in  _Omikron: The Nomad Soul_:

| Omikron: The Nomad Soul v1.9 | Omikron: The Nomad Soul v1.10  |

|-------|---------|

|  <img width=\640\ height=\480\ alt=\Omikron_v19\ src=\https://github.com/user-attachments/assets/07025cc0-8f45-4a39-847a-66fa3e16bfd9\ /> | <img width=\640\ height=\480\ alt=\Omikron_v110\ src=\https://github.com/user-attachments/assets/642c9426-1771-426a-8c5a-7a97e0900b64\ />|

## Swapchain fixes and front buffer emulation

In addition to performance improvements, v1.10 also addresses various flickering issues we've had due to an oversight in our back buffer mapping logic. The new approach should also provide a bit less input latency than before, not that it is generally of much concern with these early titles anyway.

While improving things in that department, it also became apparent we were not meeting an expectation of DDraw swapchains, namely that a permanent front buffer should always retain the on screen data, and serve as a source or destination for blits. It became apparent some games were missing backgrounds during pause menus which relied on this effect, but since DXVK's D3D9 backend does not cater for this situation we had to get a bit creative and emulate our way around it.

As all good things in life, this doesn't come for free though, and implies an additional image copy, but we do need to resort to it on occasion, to ensure things are displayed as expected. An obvious example is the in-game pause screen of _Warhammer: Dark Omen_:

| Warhammer: Dark Omen v1.9 | Warhammer: Dark Omen v1.10  |

|-------|---------|

| <img width=\640\ height=\480\ alt=\DO_V19\ src=\https://github.com/user-attachments/assets/abd00501-e0ef-4f22-978e-8fdeaf7b32b1\ /> |<img width=\640\ height=\480\ alt=\DO_v110\ src=\https://github.com/user-attachments/assets/9f12e26c-3632-4ec3-8e53-5409cef30e36\ />|

Fixes/additions:

- Improved the performance of 2D heavy scenarios by skipping D3D9 image downloads of surfaces which would be overwritten during DDraw blits. This provides minor improvements is most 2D heavy games, and more impactful ones on occasion, such as in _Omikron: The Nomad Soul_ and _SCP – Containment Breach_.

- Implemented front buffer emulation, fixing missing backgrounds and camera effects in: _Escape from Monkey Island_, _Evolva_, _Black & White_, _Tomb Raider: The Last Revelation_, _Tomb Raider Chronicles_, _Star Wars: Episode I - The Phantom Menace_, _Descent: FreeSpace_, _FreeSpace 2_, _Warhammer: Dark Omen_ and _Interstate '76_.

- Thanks to @CkNoSFeRaTU, added a workaround to prevent startup crashes in _Interstate '76_ and _Interstate '76: Nitro Pack_, making both games fully playable in D3D(5) mode.

- Also thanks to @CkNoSFeRaTU, added a workaround to fix missing geometry in _COPS 2170: The Power of Law_.

- Added a workaround to fix a black screen in the _Eschalon: Book I_ launcher (which uses D3D7).

- Also thanks to some investigative work by @CkNoSFeRaTU, added a workaround to restore projected shadows in _Expendable_.

- Fixed a regression introduced in v1.9 which could cause rendering issues with mixed D3D3-D3D5 device use.

- Thanks to @CkNoSFeRaTU, identified and implemented a workaround to fix window creation behavior in _Star Trek: The Next Generation - Klingon Honor Guard_, which is now fully playable. Other early / D3D6 Unreal Engine titles may be positively impacted.

- Fixed a rare texture upload quirk which caused minor rendering artifacts in _Z.A.R_.

- Fixed various issues which prevented _Powerslide_ both from starting at all and rendering correctly (also thanks to @CkNoSFeRaTU for fixing a minor execute buffer oversight).

- Cleaned up logging and reduced our dependency on proxied D3D objects coming from the underlying DDraw implementation, which somewhat improves overall CPU bound performance and reduces memory overhead.

## A short rant on the scalability of ancient D3D games on modern systems/GPUs

Not long ago, I ran across a forum comment expressing surprise at how poorly some of the showcased games performed and asking something in the lines of (and I'm paraphrasing): \Shouldn't these ancient games run at 50.000 FPS on modern GPUs?\. The short answer to that is: \it's complicated.\

You see, there are two categories of ancient D3D games:

- **a)** Games developed by people who understood that in order to implement efficient 3D rendering you have to respect some basic etiquette, not stall the GPU or move data around needlessly

- **b)** Everything else

Perhaps I'm a bit too harsh here, since it's true most games at the time were targeting and happy with 20-30 FPS on the hardware of their age, so doing things that would absolutely penalize performance on modern hardware like locking the back buffers repeatedly to blit (yes, _blit_, not _render_) one line of text at a time was not that great of a concern.

Games in category **b)** will most definitely not run \at 50.000 FPS\ on any GPU, no matter how modern, simply because they were designed in a different time and played by very different rules. The good news, however, is that there are also quite a lot of category **a)** games out there which scale just fine on modern hardware and you can play them @8k without issues if you want, at least in theory. DDraw could never display anything above 2048x2048, as a reminder, and we honor that limit, though some patches/mods may work around it.

The bottom line is: don't expect *every* ancient game to scale properly, not with any wrapper or even on modern Windows, because it's not really the norm, rather the happy exception of what is a very cursed set of D3D APIs with a whole lot of DDraw (2D) baggage dragging them down. In most cases, playing these type of games at their original intended resolutions will provide the best experience (and it also comes with a bonus

etro\ feel of pixel gazing).

I hope some of the newly supported titles in this release bring back good memories of the olden days, at least to some people. Until next time, I leave you with a bit of trivia from my favorite vehicular combat game: did you know _Interstate '76_ includes [radio poetry recitals](https://drive.proton.me/urls/XJ2ESFKTHR#3bUqfthWH2WU)?,

----------------------------------------------------------------------------------------
retroarch.mk 67bffed83e16250a32b6c87f5b18af4b30538657 # Version: Commits on May 20, 2026
----------------------------------------------------------------------------------------
Revert

unloop: refactor menu pacing decisions into a bitmask dispatcher\

This reverts commit 46f8b65aa8819ab79defb7a990bc672519d4db57.,

---------------------------------------------------------------------------------------------
easyrpg-player.mk 9a8e2ff633527412fdc7d6f29606e59d39488c32 # Version: Commits on May 20, 2026
---------------------------------------------------------------------------------------------
Merge pull request #3543 from Ghabry/sdl3

SDL3: Make it the default, further Emscripten & Android fixes,

-------------------------------------------------------------------------------------
liblcf.mk 666e6c023696d4a45a67dd9ba879dbff7b0f69f3 # Version: Commits on May 20, 2026
-------------------------------------------------------------------------------------
Merge pull request #509 from Ghabry/issue-505

Fix incorrect UTF-8 -> 1252 conversion when using liblcf without ICU,

----------------------------------------------------------------------------------------
doomretro.mk 894c676d9f3a9319e792d8337f0a186abd030375 # Version: Commits on May 20, 2026
----------------------------------------------------------------------------------------
Don't free SDL graphics on quit,

--------------------------------------------------------------------------------------
yquake2.mk c4abbf53de924abd54cea033dd5883ef9605e892 # Version: Commits on May 19, 2026
--------------------------------------------------------------------------------------
soft: fix incorrect cherrypick in 521495fb,

------------------------------------------------------------------------------------------
xash3d-fwgs.mk 4c2302ec6ca25c2b9ac8592cf45a5d209b886b0b # Version: Commits on May 19, 2026
------------------------------------------------------------------------------------------
engine: pass customization file fragments into IsSafeFileToDownload

This function already validates customization filenames.,

-----------------------------------------------------------------------------------------------------
libretro-beetle-saturn.mk 88db90b6b8d5b98d23fd9db8ea008cb68be4b224 # Version: Commits on May 19, 2026
-----------------------------------------------------------------------------------------------------
libretro: restore 59.82650314089141 NTSC fps; document why it's not MAME's

Reverts the constant change from 7d69396. That commit pointed the

libretro NTSC refresh report at MAME's 59.764802 Hz on the reasoning

that MAME / arcadeitalia / mdk.cab / datomatic all display 59.764802

for saturnjp and every stv romset, so beetle ought to agree.

The flaw: it introduced a 0.1% report-vs-internal skew that beetle

had never had. The pre-existing 59.82650314089141 is not arbitrary;

it matches beetle's actual emulated frame rate to within 0.0007%

(integer-rounding precision on MasterClock vs the exact

8x NTSC subcarrier x 61). Reporting MAME's number while continuing

to emulate at 59.8261 internally means the libretro frontend believes

one frame is 16.730 ms while the SCSP produces 16.715 ms of audio per

frame -- a constant ~0.1% audio clock drift the resampler swallows

silently but that is, mechanically, new drift the core did not have.

The 59.764802 figure is downstream of a MAME screen-device

simplification: saturn.cpp / stv.cpp both call set_raw with

MASTER_CLOCK_320/8 regardless of whether dotsel selects the 320- or

352-dot active region, so MAME's screen pixel clock is pinned to the

320 crystal in both modes. Real Saturn hardware uses the PLL 315-5746

to switch the pixel-generating crystal on dotsel, and 352-dot mode

runs off MASTER_CLOCK_352 (= 8x NTSC subcarrier), which is exactly

what beetle's MasterClock-and-divisor chain models. Beetle is the

strictly more hardware-accurate of the two here. Adopting MAME's

number meant trading off Saturn-hardware fidelity for agreement with

a known third-party approximation -- the wrong direction for an

emulator core.

Restore the literal 59.82650314089141. Wrap the else branch in braces

and add a long comment block at the constant explaining (a) the

derivation from MasterClock / cur_clock_div / HTimings / VTimings,

(b) the 320-vs-352 internal-rate coincidence (the divisor 61|65 and

line-length 455|427 switches cancel exactly), (c) why this is not

MAME's 59.764802 and what the report/internal skew would cost. The

comment is there so the next person noticing the discrepancy doesn't

re-attempt the same patch and re-introduce the same skew.

Also restore the \~180 frames at NTSC's 59.83 Hz\ backup-save-

batching comment that 7d69396 retouched to 59.76 -- it's just a

sanity check that 180 frames is roughly 3 seconds, but it reads

consistently with the restored constant.

The 7d69396 commit message also overclaimed \every other Saturn

emulator that reports MAME's value already has the same skew\ --

that was speculation without verification and shouldn't have shipped.,

-----------------------------------------------------------------------------------------------
libretro-bluemsx.mk b76f27959a32e18aa04c619273152178fd0cf03b # Version: Commits on May 20, 2026
-----------------------------------------------------------------------------------------------
RomMapper: drop the last three sscanf() calls

This file is not currently in Makefile.common and its public functions

(romMapperGetDiskInfo / romMapperGetCasInfo / romMapperRomFromFile) have

no callers, but the sscanf() calls were still hanging around in the

tree. Replace all three with scan_hex() from Src/Utils/ScanParse for

consistency with c7a1867 / 0d98df9.

The original passed (int*) to sscanf %x, which expects (unsigned int*) -

strict UB by the standard, harmless in practice on all targets where

int and unsigned int share a representation. The replacement uses UInt32

directly (matching the type of the 'crc' value being compared against)

so the implicit signed/unsigned compare is gone too.,

---------------------------------------------------------------------------------------------------
libretro-dosbox-pure.mk 9c5c68f446204b09b12f3f1936072e56d91476c0 # Version: Commits on May 20, 2026
---------------------------------------------------------------------------------------------------
Support for dynamic VHD disk images

Installing an operating system will also automatically create dynamic VHD files from now on (which initially is just a few megabytes and grows as needed),

-----------------------------------------------------------------------------------------------
libretro-easyrpg.mk 9a8e2ff633527412fdc7d6f29606e59d39488c32 # Version: Commits on May 20, 2026
-----------------------------------------------------------------------------------------------
Merge pull request #3543 from Ghabry/sdl3

SDL3: Make it the default, further Emscripten & Android fixes,

---------------------------------------------------------------------------------------------
libretro-fbneo.mk 11cb0bba3575d59a0eb6998bbdcbd009e6169176 # Version: Commits on May 20, 2026
---------------------------------------------------------------------------------------------
(libretro) update files,

-----------------------------------------------------------------------------------------------
libretro-flycast.mk f3047b2ef12d9e77a661826d663a46beffdc927f # Version: Commits on May 20, 2026
-----------------------------------------------------------------------------------------------
Virtual-On: Oratorio Tangram (JP) widescreen cheat,

--------------------------------------------------------------------------------------------------
libretro-gearcoleco.mk e1a991d096e215736c0b4abc4768563b9e9f9cf7 # Version: Commits on May 20, 2026
--------------------------------------------------------------------------------------------------
Show database match status in ROM info,

-------------------------------------------------------------------------------------------------
libretro-geargrafx.mk 1cf8c4e7a6680123c573be10da2f434944f14620 # Version: Commits on May 20, 2026
-------------------------------------------------------------------------------------------------
Show database match status in ROM info,

--------------------------------------------------------------------------------------------------
libretro-gearsystem.mk afdfd1ec449409bace5b9fbe24b60d0090336192 # Version: Commits on May 20, 2026
--------------------------------------------------------------------------------------------------
Show database match status in ROM info,

-----------------------------------------------------------------------------------------------------
libretro-mame2003-plus.mk 30f9b3fad906830db5dd653b04081b44c63895fa # Version: Commits on May 20, 2026
-----------------------------------------------------------------------------------------------------
Merge pull request #2021 from GoodLuckTrying/master

Adjust ROM REGION_GFX3 addresses for makknightc & makknightg files,

--------------------------------------------------------------------------------------------------------
libretro-mupen64plus-next.mk 98c1b0d877542b01314b3b04272282ba223b65b3 # Version: Commits on Dec 15, 2025
--------------------------------------------------------------------------------------------------------
Add webOS to Makefile / CI,

----------------------------------------------------------------------------------------------
libretro-ppsspp.mk 4e109dd6ae34cbcb39751bb7647d345569700161 # Version: Commits on May 20, 2026
----------------------------------------------------------------------------------------------
Merge pull request #21710 from warmenhoven/warmenhoven/pr/libretro-build-fix

fix libretro build,

----------------------------------------------------------------------------------------------
libretro-prboom.mk 648223372e24773821a2041e0c39728f723badf4 # Version: Commits on May 20, 2026
----------------------------------------------------------------------------------------------
d_main, libretro: capture wipe-start screen from previous-frame snapshot

Fixes issue #183.  Loading a level under libretro direct-render

shows distorted columns at the end of the screen-melt: the wipe

animates from garbage downward instead of from the previous

frame, and the residual 'old screen sliding off' bands at the

bottom show whatever was in the frontend's recycled buffer rather

than the title screen / intermission the user just left.

Cause.  Under direct-render, every I_StartDisplay swaps

screens[0].data to a fresh buffer the frontend hands us via

GET_CURRENT_SOFTWARE_FRAMEBUFFER.  That buffer has never been

written by us; the previous frame's pixels are in some other

physical buffer the frontend has already rotated away from.

D_Display calls wipe_StartScreen RIGHT AFTER I_StartDisplay

returns and copies screens[0] (= fresh, unwritten FB) into

wipe_scr_start.  The melt then animates from junk.

Reproduced with a 3-FB-rotating libretro host that fills each

fresh FB with a magenta sentinel before handing it out.  The

captured frame on the wipe-start frame is 100% sentinel; the

sentinel pixel count decays linearly over the next ~40 frames as

the wipe progresses, with hundreds still leaking through on the

'first frame after the wipe' the user reports.

Fix.  Two coordinated changes:

  - libretro.c I_FinishUpdate's direct-render branch now copies

    direct_fb_data into screen_buf before unbinding.  screen_buf

    is the persistent heap allocation that screens[0].data

    snaps back to between frames.  Without this snapshot, under

    direct-render screen_buf is never written -- the renderer

    bypasses it on every frame.  Cost: ~128 KB read + 128 KB

    write per frame, ~4.5 MB/s at 35 Hz, well inside cache.

  - d_main.c D_Display now runs wipe_StartScreen BEFORE

    I_StartDisplay rather than after.  At this point screens[0]

    .data is still screen_buf (the previous I_FinishUpdate

    restored it), and screen_buf now holds the snapshotted

    previous frame.  V_CopyRect from screens[0] therefore reads

    the actual previous-frame pixels.

The fallback (non-direct-render) path is unaffected.  There

screens[0].data is screen_buf at all times and screen_buf is the

actual render target across frames, so reading screens[0] either

before or after I_StartDisplay returns the same content.

Verified end-to-end with a libretro host that implements

GET_CURRENT_SOFTWARE_FRAMEBUFFER, rotates between 3 physical

framebuffers, and fills each fresh FB with a 0xF81F (magenta)

sentinel:

  before:                              after:

    frame 31: 64000/64000 sentinels      frame 31: 0

    frame 50: 45104  sentinels           frame 50: 0

    frame 70:   494  sentinels           frame 70: 0

Wipe visually melts from the title screen to the new level

correctly.  No regression on TNT / Doom 2 / chex.wad direct

loads, m3u playlists, or the SIGIL + DOOM.WAD steering path.,

-------------------------------------------------------------------------------------------
libretro-ps2.mk 9ba54f89bb4ca78069bd2e049966fdb96cdeeab8 # Version: Commits on May 20, 2026
-------------------------------------------------------------------------------------------
Remove unwired hardware interrupt handlers

These four interrupt handlers are defined but never reached — no

direct caller, no scheduler/event-table registration (verified

against the EE TESTINT dispatch in R5900.cpp and the IOP event

tables), no address taken, and not produced by any token-pasting

macro:

- EEsif2Interrupt (sif2.cpp): the EE interrupt test wires SIF0 and

  SIF1 via TESTINT(DMAC_SIF0/SIF1, ...) but there is no

  TESTINT(DMAC_SIF2, ...), so this handler is never invoked.

- usbIrq (IopIrq.cpp): would schedule IopEvt_USB, but nothing calls

  it; the USB IRQ path is not wired up.

- psxDma4Interrupt / psxDma7Interrupt (IopDma.cpp): legacy async DMA

  completion handlers, superseded by the synchronous completion in

  psxDmaGeneric (which calls psxDmaInterrupt directly).

Each can be restored if the corresponding path is ever wired up.,

----------------------------------------------------------------------------------------------
libretro-stella.mk 0fb27a35e4bcaed78dc2157eff51be674f93d6dc # Version: Commits on May 20, 2026
----------------------------------------------------------------------------------------------
Updated cart header files with more detailed comments about their schemes.,

---------------------------------------------------------------------------------------------------
libretro-swanstation.mk 62697276b95848bd35b9c7b81daab899a98e0789 # Version: Commits on May 20, 2026
---------------------------------------------------------------------------------------------------
core/d3d12: resolve adaptive downsampling and enable it

Add DownsampleFramebufferAdaptive and route DownsampleFramebuffer to it

when the mode is Adaptive (box otherwise). The resolve mirrors the

D3D11/Vulkan path: copy the source sub-rect into mip 0, build the energy

pyramid up the mips (first pass at level 1, mid pass after, reading

mip[n-1] while writing mip[n]), blur the lowest mip into the weight

texture, then composite the colour pyramid by the weight into the

display texture at the view offset. Per-mip reads/writes use the

hand-built per-subresource views and barriers from the foundation

commit; the SmoothingUBO is pushed as root constants per level.

Set m_supports_adaptive_downsampling so GetDownsampleMode stops

degrading a user's Adaptive selection to Box. The composite lands at

(left, top) in the display texture, which the host-display view-rect

blit already handles, so no flicker regression.

Falls back to presenting the source rect directly if any adaptive PSO

is null, matching the box-filter guard.,
Hancock33 added a commit to Hancock33/batocera.piboy that referenced this pull request Jun 14, 2026
-----------------------------------------------------------------------------------
cemu.mk fe70fdcfe5ced5a4032b7c4561f7cad6f011314b # Version: Commits on Jun 13, 2026
-----------------------------------------------------------------------------------
debugger: Don't clear register views when continuing to run code,

------------------------------------------------------------------------------------------
duckstation.mk cfde5bf5c3418d3ae4be566dc21dca467da1c5b5 # Version: Commits on Jun 07, 2026
------------------------------------------------------------------------------------------
Achievements: Move achievement pinning to database,

--------------------------------------------------------------------------------------
openmsx.mk 3a40a511c97cbf42f86aa90394a4fe07ad455cd3 # Version: Commits on Jun 13, 2026
--------------------------------------------------------------------------------------
corrections and additions to the romdb,

----------------------------------------------------
pcsx2.mk v2.7.416 # Version: Commits on Jun 13, 2026
----------------------------------------------------
- [Misc: clean up COM code](PCSX2/pcsx2#14562)

,

-------------------------------------------------------------------------------------
ppsspp.mk 14dc5a51560628581c023235e9d35ec28fb14b6a # Version: Commits on Jun 14, 2026
-------------------------------------------------------------------------------------
Merge pull request #21825 from hrydgard/ridge-racer-sprite

Fix the ugly line on Ridge Racer lens flares,

------------------------------------------------------------------------------------
rpcs3.mk 4fed5e7b88d78c03359009377b740a3c826505a7 # Version: Commits on Jun 14, 2026
------------------------------------------------------------------------------------
Fix iso integrity log message,

-----------------------------------------------------------------------------------
ymir.mk bca07409fdd89d5e136356a063da71d9874d3424 # Version: Commits on Jun 13, 2026
-----------------------------------------------------------------------------------
feat(sys): Use GCD to ensure SH2 overclocking doesnt introduce slight clock errors to other components,

-------------------------------------------------------------------------------------
ikemen.mk c42967d13e5b229f7dcf9450f471fd2a15d5858f # Version: Commits on Jun 13, 2026
-------------------------------------------------------------------------------------
Merge pull request #3705 from SuperFromND/bgdef-modelrotate

feat: `modelrotate` for 3D BGDefs,

---------------------------------------------------
ruffle.mk v0.3.0 # Version: Commits on Jun 14, 2026
---------------------------------------------------
## What's Changed

* avm2: Fixes to Error's prototype by @Lord-McSweeney in ruffle-rs/ruffle#23719

* aur: Update maintainers for ruffle-nightly-bin by @kjarosh in ruffle-rs/ruffle#23727

* Add testutils CLI by @Dinnerbone in ruffle-rs/ruffle#23677

* ci: Use correct npm dist-tag for nightly and stable releases by @kjarosh in ruffle-rs/ruffle#23728

* desktop: Add Rust stack trace to panic reports by @kjarosh in ruffle-rs/ruffle#23714

* avm2: Fix new Video(0, 0) to use default size by @1bugproof in ruffle-rs/ruffle#23708

* avm2: Stop assuming Object is an enum by @SuchAFuriousDeath in ruffle-rs/ruffle#23725

* Enable jpegxr on Linux Nightlies by @Fancy2209 in ruffle-rs/ruffle#23741

* avm1: Fix behavior of `Sound` ownership by @ChrisCPI in ruffle-rs/ruffle#23733

* chore: Bump the npm-minor group in /web with 7 updates by @dependabot[bot] in ruffle-rs/ruffle#23748

* chore: Bump enumset to 1.1.13 by @torokati44 in ruffle-rs/ruffle#23753

* chore: Bump cssnano to 8.0.1 and cssnano-preset-advanced to 8.0.1 in /web by @torokati44 in ruffle-rs/ruffle#23752

* chore: Run `npm audit fix` in web/ by @torokati44 in ruffle-rs/ruffle#23742

* video/vp6: Init nihav decoder with encoded size, not display size by @SuchAFuriousDeath in ruffle-rs/ruffle#23665

* web/audio: Pin AudioContext to 44.1 kHz by @SuchAFuriousDeath in ruffle-rs/ruffle#23701

* web: Fix MVP wasm build by explicitly disabling post-MVP features by @SuchAFuriousDeath in ruffle-rs/ruffle#23756

* avm2: Set dobj as transformed_by_script on transform `colorTransform` and `matrix` setters by @ChrisCPI in ruffle-rs/ruffle#23759

* avm2: Return ArgumentError instead of panicking on invalid ShaderJob target by @SuchAFuriousDeath in ruffle-rs/ruffle#23763

* chore: Migrate to current Node.js 26 from 25 for testing by @torokati44 in ruffle-rs/ruffle#23661

* avm2: Print full error details when logging caught error by @Lord-McSweeney in ruffle-rs/ruffle#23726

* avm2: Remove mostly unused `crate::avm2::string` by @Lord-McSweeney in ruffle-rs/ruffle#23773

* wstr: Remove unsafe usage from str_eq by @kjarosh in ruffle-rs/ruffle#23774

* desktop: Remove fontconfig from Windows and add fontconfig-dlopen  by @kjarosh in ruffle-rs/ruffle#23768

* chore: Bump nihav-vp6 to latest git master by @torokati44 in ruffle-rs/ruffle#23765

* chore: Bump eslint-plugin-jsdoc from 62.9.0 to 63.0.0 in /web by @dependabot[bot] in ruffle-rs/ruffle#23781

* chore: Bump the npm-minor group across 1 directory with 7 updates by @dependabot[bot] in ruffle-rs/ruffle#23779

* chore: Fix a bunch of typos (mostly in comments) by @torokati44 in ruffle-rs/ruffle#23782

* chore: Bump qs and express in /web by @dependabot[bot] in ruffle-rs/ruffle#23784

* avm2: Fix stack trace for context3DCreated event handler by @Lord-McSweeney in ruffle-rs/ruffle#23745

* avm2: Verify that lazy namespace is actually a Namespace in the verifier by @Lord-McSweeney in ruffle-rs/ruffle#23777

* tests: Begin adding test coverage for signatures of flash.events classes by @Lord-McSweeney in ruffle-rs/ruffle#23786

* ci: Generate AVM2 report only for nightlies by @kjarosh in ruffle-rs/ruffle#23787

* avm1: Clear stack only between frames by @kjarosh in ruffle-rs/ruffle#23795

* avm1: Introduce AVM1 playerglobal by @Dinnerbone in ruffle-rs/ruffle#23730

* core: Fix movie clip looping by @kjarosh in ruffle-rs/ruffle#23802

* tests: Add --skip-no-player to testutils execute by @kjarosh in ruffle-rs/ruffle#23805

* tests: Trace warnings if enabled when executing tests by @kjarosh in ruffle-rs/ruffle#23804

* avm1: Do not trace an error on with(undefined)/with(null) by @kjarosh in ruffle-rs/ruffle#23809

* core: Normalize \blank\ target to \_blank\ in getURL/navigateToURL  by @SuchAFuriousDeath in ruffle-rs/ruffle#23792

* avm1: Remove magic properties and this from SWF4 by @kjarosh in ruffle-rs/ruffle#23806

* avm2: Implement a number of missing `flash.events` classes by @Lord-McSweeney in ruffle-rs/ruffle#23812

* tests: Use FP's output in avm2/graphics_draw_triangles by @kjarosh in ruffle-rs/ruffle#23818

* chore: Bump josStorer/get-current-time from 2.1.2 to 2.1.3 by @dependabot[bot] in ruffle-rs/ruffle#23820

* chore: Bump the npm-minor group in /web with 2 updates by @dependabot[bot] in ruffle-rs/ruffle#23822

* chore: Bump the cargo-minor group with 3 updates by @dependabot[bot] in ruffle-rs/ruffle#23823

* chore: Bump webdriverio package family to 9.27.2 in web/ by @torokati44 in ruffle-rs/ruffle#23828

* avm2: More fixes to signatures of `flash.events` classes by @Lord-McSweeney in ruffle-rs/ruffle#23833

* avm1: Support property syntax in delete2 by @kjarosh in ruffle-rs/ruffle#23834

* 🤖 core: Move flash.text.engine TextLine onto its own DisplayObject by @doctorpangloss in ruffle-rs/ruffle#23817

* core: Extract run_file_dialog helper to reduce boilerplate in file dialog loaders by @SuchAFuriousDeath in ruffle-rs/ruffle#23831

* core/render: Add support for loading JPEGXR images by @ChrisCPI in ruffle-rs/ruffle#23789

* tests: Add asc compiler for compiling AVM2 tests by @kjarosh in ruffle-rs/ruffle#23794

* chore: Bump tmp from 0.2.5 to 0.2.7 in /web by @dependabot[bot] in ruffle-rs/ruffle#23843

* refactor: Enum-map related improvements by @SuchAFuriousDeath in ruffle-rs/ruffle#23846

* wgpu: Yeet the copy_srgb shader and pipeline by @SuchAFuriousDeath in ruffle-rs/ruffle#23827

* tests: Add a failing visual test for scale_rotation_cache by @torokati44 in ruffle-rs/ruffle#23796

* avm2: Minor performance improvements by @Lord-McSweeney in ruffle-rs/ruffle#23840

* core: Include `ruffle_render/jpegxr` in `jpegxr` feature by @ChrisCPI in ruffle-rs/ruffle#23852

* chore: Clippy beta fixes by @danielhjacobs in ruffle-rs/ruffle#23762

* ci: Enable fontconfig-dlopen in the macOS Rust tester job by @torokati44 in ruffle-rs/ruffle#23855

* core: Make loaded image MovieClips work the way SWF >= 5 movies do wrt. scale and rotation caching by @torokati44 in ruffle-rs/ruffle#23838

* avm2: Refactor draw_triangles_internal by @SuchAFuriousDeath in ruffle-rs/ruffle#23761

* core: Rework infrastructure around the FileDialogResult trait by @SuchAFuriousDeath in ruffle-rs/ruffle#23844

* text: Prevent measuring text twice during layout by @kjarosh in ruffle-rs/ruffle#23862

* core: Simplify code in MovieClip.event_dispatch by @kjarosh in ruffle-rs/ruffle#23867

* swf: Add support for PlaceObject/allEventFlags by @kjarosh in ruffle-rs/ruffle#23868

* wstr: Implement Pattern for owned [u8; N] and [u16; N] arrays by @SuchAFuriousDeath in ruffle-rs/ruffle#23858

* ci: Don't enable fontconfig-dlopen in the macOS Rust tester job by @torokati44 in ruffle-rs/ruffle#23873

* ci: Enable full LTO for releases by @kjarosh in ruffle-rs/ruffle#23863

* web: Polyfill document.embeds to return ruffle-embeds too by @danielhjacobs in ruffle-rs/ruffle#22449

* web: Support named access on document.embeds by @danielhjacobs in ruffle-rs/ruffle#23878

* core: Add MultiFileDialogResult and display_file_open_dialog_multiple by @SuchAFuriousDeath in ruffle-rs/ruffle#23866

* avm2: Add type enum for error 2006 by @ChrisCPI in ruffle-rs/ruffle#23883

* chore: Bump the npm-minor group in /web with 11 updates by @dependabot[bot] in ruffle-rs/ruffle#23885

* chore: Bump zbus, zvariant, toml crates by @torokati44 in ruffle-rs/ruffle#23887

* chore: Bump the cargo-minor group across 1 directory with 6 updates by @dependabot[bot] in ruffle-rs/ruffle#23886

* chore: Cargo.lock maintenance by @torokati44 in ruffle-rs/ruffle#23888

* core: Do not dispatch clip events not present in allEventFlags by @kjarosh in ruffle-rs/ruffle#23869

* Fix panic on writeback from empty CPU dirty region (prevalent in Earn to Die) by @n-raine in ruffle-rs/ruffle#23898

* avm2: Implement most of the version gating for `flash.events` classes by @Lord-McSweeney in ruffle-rs/ruffle#23836

* avm2: More minor crossbridge performance improvements by @Lord-McSweeney in ruffle-rs/ruffle#23849

* tests: add `known_failure` support to audio assertions by @moulins in ruffle-rs/ruffle#23861

* avm2: Fix setProgramConstantsFromByteArray implementation by @SuchAFuriousDeath in ruffle-rs/ruffle#23901

* frontend-utils: Use native TLS instead of rustls by @kjarosh in ruffle-rs/ruffle#23894

* chore: Bump openssl from 0.10.73 to 0.10.80 by @dependabot[bot] in ruffle-rs/ruffle#23902

* chore: Additional Rust dependency version bumps by @torokati44 in ruffle-rs/ruffle#23903

* avm1: Match Flash broadcaster prototype enumeration order by @SuchAFuriousDeath in ruffle-rs/ruffle#23892

* avm1: Stub several classes and properties by @SuchAFuriousDeath in ruffle-rs/ruffle#23899

* avm1: Define `constructor` as own property on system class objects by @SuchAFuriousDeath in ruffle-rs/ruffle#23893

* avm2: Add a field to ops instead of adding separate integral variants by @Lord-McSweeney in ruffle-rs/ruffle#23923

* chore: Bump the npm-minor group in /web with 6 updates by @dependabot[bot] in ruffle-rs/ruffle#23925

* avm1: Xmlsocket connect null fix by @SuchAFuriousDeath in ruffle-rs/ruffle#23931

* Slice logic cleanup, take 2 by @moulins in ruffle-rs/ruffle#23676

* core: Make use of  `istr!` macro in several places by @SuchAFuriousDeath in ruffle-rs/ruffle#23935

* core: Remove unnecessary `dyn` usage by @SuchAFuriousDeath in ruffle-rs/ruffle#23936

* core: Use __jcvt() intrinsic on AArch64 for f64→i32 conversion by @SuchAFuriousDeath in ruffle-rs/ruffle#23937

* chore: Bump shell-quote from 1.8.3 to 1.8.4 in /web by @dependabot[bot] in ruffle-rs/ruffle#23941

* frontend-utils: Allow switching reqwest back to rustls by @torokati44 in ruffle-rs/ruffle#23947

* avm1: Remove \Target not found\ trace by @kjarosh in ruffle-rs/ruffle#23946

* avm2: Fix serializing invalid Date objects by @Lord-McSweeney in ruffle-rs/ruffle#23951

* swf: Seek to glyph shape offsets when reading DefineFont2/3 by @kjarosh in ruffle-rs/ruffle#23949

* + libssl-dev, openssl-devel by @sombraguerrero in ruffle-rs/ruffle#23953

* avm1: Support SWF4 target paths properly by @kjarosh in ruffle-rs/ruffle#23948

* chore: Bump WebdriverIO to 9.28.0 in web/ by @torokati44 in ruffle-rs/ruffle#23954

* swf: Fix underflow on keyPress clip action without key code by @kjarosh in ruffle-rs/ruffle#23958

* swf: Fix overflow while reading convolution filter by @kjarosh in ruffle-rs/ruffle#23961

* swf: Fix underflow/OOM errors when decompressing by @kjarosh in ruffle-rs/ruffle#23962

* core: Add AvmString::split_dependent by @SuchAFuriousDeath in ruffle-rs/ruffle#23955

* swf: Fix potential OOM in DefineSceneAndFrameLabelData by @kjarosh in ruffle-rs/ruffle#23960

* avm1: Fix SetTarget2 movie clip selection by @kjarosh in ruffle-rs/ruffle#23964

* chore: Update translations from Crowdin by @kjarosh in ruffle-rs/ruffle#23967

* avm1: Handle edge values in setProperty() by @kjarosh in ruffle-rs/ruffle#23966

* avm2: Simplify AMF serialization logic by @Lord-McSweeney in ruffle-rs/ruffle#23956

* avm2: Remove redundant method `PropertyMap::insert_with_namespace` by @Lord-McSweeney in ruffle-rs/ruffle#23969

* chore: Bump esbuild from 0.28.0 to 0.28.1 in /web by @dependabot[bot] in ruffle-rs/ruffle#23968

* chore: Update translations from Crowdin by @kjarosh in ruffle-rs/ruffle#23970

* refactor: Use api-report as dependency and move stub-report to tools/ by @kjarosh in ruffle-rs/ruffle#23922

* avm1/avm2: Add AMF NetConnection Array serialization known failures by @danielhjacobs in ruffle-rs/ruffle#23957

* tests: Add avm1/set_target_2_swf5 test by @kjarosh in ruffle-rs/ruffle#23965

## New Contributors

* @doctorpangloss made their first contribution in ruffle-rs/ruffle#23817

**Full Changelog**: ruffle-rs/ruffle@v0.2.0...v0.3.0,

---------------------------------------------------------------------------------------
thextech.mk db3a01db31435fc4524bb42ab81d99b3f6aa0807 # Version: Commits on Jun 14, 2026
---------------------------------------------------------------------------------------
changelog.txt: move MDX to 1.3.7.3 changelog,

-------------------------------------------------------------------------------------------
jazz2-native.mk a09fd6b6e54c42c9e5c622704b14a6ae32e06d1c # Version: Commits on Jun 13, 2026
-------------------------------------------------------------------------------------------
Tilemap draw call aggregation, improved player color customization,

-----------------------------------------------------
ledspicer.mk 0.7.6 # Version: Commits on Jun 14, 2026
-----------------------------------------------------
LEDSpicer v0.7.6 - Release Notes

Release Date

June 14, 2026

Overview

This release focuses on critical stability improvements and bug fixes for crafted profile handling and memory management.

� Bug Fixes

Crafted Profile System

    Fixed use-after-free crash when loading the same crafted profile twice

    Improved profile caching - Crafted profiles are now properly cached by game name instead of being rebuilt on every request

    Fixed profile stack history - FinishLastProfile now correctly steps back one profile at a time through the history stack

Flag Handling

    Corrected FORCE_RELOAD flag - Profile reload now properly ignores cache and rebuilds in place

    Corrected REPLACE flag - Profile replacement logic now works correctly on the craft/load path

� Changes

Configuration Updates

    Configuration values now use proper boolean capitalization (True/False instead of true/false)

    Enhanced configuration defaults in ledspicer.conf

Code Quality

    Refactored profile management to eliminate redundant cache operations

    Improved memory management with proper reference counting for replaced profiles

    Enhanced logging for better debugging of profile lifecycle

Documentation & Branding

    Updated README with improved project description and branding

    Enhanced feature list and typical use cases documentation

    Updated copyright year to 2026

CI/CD

    Updated GitHub Actions checkout action from v4 to v6

Package Updates

    Updated version across all package managers (Debian, RPM, Arch)

🔧 Technical Details

    Changed default platform parameter handling in craftProfile()

    Introduced replaceProfileReferences() for cleaner memory management

    Optimized cache key handling for platform templates vs. crafted profiles

----------------------------------------------------------------------------------------
retroarch.mk 2669eaad7b4318c415028e3d2feaf9d7f092885e # Version: Commits on Jun 14, 2026
----------------------------------------------------------------------------------------
Fetch translations from Crowdin,

----------------------------------------------------------------------------------------
doomretro.mk e011e4abf085fbbf5d7c9ba862bab40f48543bed # Version: Commits on Jun 14, 2026
----------------------------------------------------------------------------------------
Fix double use of uppercase(),

--------------------------------------------------------------------------------------
yquake2.mk dcda9144d34a5d76ff462675ff05d8acde30ecfe # Version: Commits on Jun 13, 2026
--------------------------------------------------------------------------------------
models: fix MDR uncompressed-frame heap overflow from byte/float count mix-up,

------------------------------------------------------------------------------------------
xash3d-fwgs.mk 1e31fbcd513bdabd557a098fcdd06fa2037cd99e # Version: Commits on Jun 14, 2026
------------------------------------------------------------------------------------------
ref: shut up DecalShoot about decals must hit mod_brush

This is an annoying message that's caused by the game code. Decals, without

custom renderer, cannot be rendered on non-brush entities, and everybody knows

that anyway.,

-------------------------------------------------------------------------------------------------------
libretro-beetle-pce-fast.mk 718dd0abb9ffcd95308ae79594e86d15148d7a2f # Version: Commits on Jun 14, 2026
-------------------------------------------------------------------------------------------------------
libretro: add zero-copy software-framebuffer direct render path

Use RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER so the VDC can

render straight into the frontend's (often GPU-mapped) framebuffer,

removing the surface->frontend copy that video_cb otherwise performs.

The renderer already writes through a single MDFN_Surface target whose

pixels/pitch it dereferences at render time (target = surface->pixels +

(frame_counter-14)*surface->pitch, all Mix*/Draw* honour surface->pitch),

so the direct path needs no renderer changes: in retro_run, before

Emulate, request a framebuffer; if granted, repoint surf->pixels/pitch at

it for the frame, render, ship video_cb from there with the framebuffer's

pitch, then restore the persistent fallback surface.

Why this is safe:

- The VDC renderer is write-only on the target surface (verified: every

  reference is a store), so an uncached framebuffer (no

  RETRO_MEMORY_TYPE_CACHED) is fine; access_flags is WRITE only.

- We do NOT rely on persistent buffer contents: for every scanline in the

  shipped rect [DisplayRect.y, +h) the renderer writes the whole line

  (Mix + DrawOverscan sides, or a full DrawOverscan in burst/blank), so a

  frontend that rotates buffers per frame yields no garbage.

- Only used when the granted buffer is RGB565 (our native output), large

  enough (>= FB_WIDTH x FB_HEIGHT), and has an even byte pitch; otherwise

  the calloc'd fallback surface is used unchanged.

- Frameskip frames don't request a buffer (video_cb(NULL,...) as before).

- If the frontend doesn't implement the call, the result is latched off

  (fb_direct_supported) so we probe only once.

surf->pixels/pitch are always restored after the frame, so the fallback

surface is intact whenever a frame declines the framebuffer. Pitch is

taken from the framebuffer (bytes -> uint16), not assumed to be FB_WIDTH.

(The old psp_hw_render branch rendered its SW path into its own surface

and used the PSP GU for HW; it predates this env call, so there was no

code to port - only the confirmation that the renderer funnels through

one retargetable surface pointer, which makes this drop-in.)

Verified: full clean build (make -j4, exit 0, .so, 0 warnings); libretro.c

passes -std=gnu89 -Werror=declaration-after-statement.,

--------------------------------------------------------------------------------------------------
libretro-beetle-psx.mk d460f8342060526678e7fd8222048324c2a80d86 # Version: Commits on Jun 14, 2026
--------------------------------------------------------------------------------------------------
gpu: SSE2-direct Gouraud RGB lane build in DrawSpanVec_NT (no stack roundtrip)

Replaces the scalar-loop-then-_mm_loadu_si128 Gouraud channel build with

direct SSE2 lane construction.  The original

    for (l = 0; l < step; l++) {

        R8[l] = (uint16_t)CHAN(cr, dr, l);

        G8[l] = (uint16_t)CHAN(cg, dg, l);

        B8[l] = (uint16_t)CHAN(cb, db, l);

    }

    R = _mm_loadu_si128((const __m128i*)R8);  /* + G, B */

lowered under gcc 13 -O3 to per-lane leal (cr + dr*l) into GPRs, store

to stack at R8[l], movd back to xmm, punpck-chains.  This shape was the

dominant spill source in the GOURAUD-on (G1) non-textured (T0) hot

loops -- in the unpatched gpu.s, the .L31928 family contained loops

with 97-116 xmm operations and 38-39 stack writes each, across every

T0 + (BMopaque | BMavg | BMaddq | BMadd) blend specialization.

The contributing mechanism: the per-lane GPR live ranges produced by

the scalar loop straddle the dense SIMD blend body that follows, so

the register allocator chooses to materialize each lane's GPR result

on the stack before reloading into xmm.  Replacing the loop with

straight SSE2 ops (vbase broadcast + step vectors + paddd + psrld +

packssdw) keeps the channel intermediates xmm-resident across the

entire blend body.

Approach: lane l holds ((base + d*l) >> 24).  d2..d7 are produced via

paired adds (cheaper than the imuls gcc would pick for d * l, and the

32-bit lanes have plenty of headroom -- worst-case dr*7 has fewer than

25 bits given the Gouraud range).  After the >> 24 shift each lane is

<= 255, so the final packs_epi32 down to u16x8 cannot saturate.

setr_epi32 calls fold to a single mov-from-rodata when dr/dg/db are

constant per span (the common case at the polygon level), and to a

small insert chain otherwise.

Spill counts (gcc 13.3, -O3, x86_64):

  function                                          before     after

  G_Command_DrawPolygon_NV4_G1_T0_BMopaque*         spills=39  spills=0

  G_Command_DrawPolygon_NV4_G1_T0_BMavg*            spills=39  spills=0

  G_Command_DrawPolygon_NV4_G1_T0_BMaddq*           spills=39  spills=0

  G_Command_DrawPolygon_NV4_G1_T0_BMadd*            spills=39  spills=0

  G_Command_DrawPolygon_NV4_G1_T0_BMsub*            spills=39  spills=0

The remaining spill leaders shift to the T1 (textured) variants at

xmm=16 spills=28-30; those follow the same scalar-then-pack pattern

on UV coordinates and are a separate follow-up.

End-to-end bench (x86_64 Linux, gcc 13.3, full DrawSpanVec_NT

BMopaque path -- Gouraud build + dither-off + pack RGB565 + bg load +

write-back, 100000 spans x 320 pixels):

  -O3:  21.0 -> 14.8 ms   (1.42x)   1520 -> 2165 Mpix/s

  -O2:  21.9 -> 15.8 ms   (1.39x)   1455 -> 2028 Mpix/s

Bit-exact across 500000 random Gouraud lane verifications (dr range

10..24 bits, both step=4 and step=8, plus edge cases at dr=0 and

dr=0xFFFFFFFF) and 200 random spans rendered into VRAM.

The NEON / scalar path is unchanged.  On NEON, the original

`vld1q_u16(R8)` plus per-lane access via vget_lane_u8 lowers to direct

register extracts without the stack roundtrip the SSE2 path saw, so

the same gcc lowering bug doesn't apply.  ARMv7 NEON specifically may

need its own audit but the codegen on AArch64 doesn't show comparable

spill density.,

----------------------------------------------------------------------------------------------
libretro-fake08.mk 814991a2571ad3970e386cef48f3b148aa1c27b9 # Version: Commits on Jun 13, 2026
----------------------------------------------------------------------------------------------
Merge pull request #267 from ysamlan/fix-vibrato-modulation

Fix vibrato effect: correct sawtooth to triangle wave modulation,

------------------------------------------------------------------------------------------------
libretro-gambatte.mk e99e1bd9b91de67ac12c77c3679c85447c26e8c8 # Version: Commits on Jun 14, 2026
------------------------------------------------------------------------------------------------
ppu: extend BG palette expansion to the CGB fast path

Follow-up to a991736 (\ppu: precomputed BG palette expansion for DMG

fast path\).  That commit treated only doFullTilesUnrolledDmg; the

CGB renderer at doFullTilesUnrolledCgb had the same eight-dependent-

load gather shape but with per-tile palette selection driven by the

attribute byte (bgPalette + (nattrib & 7) * 4) and was deferred

pending an L1-pressure measurement against the [8][256][4] table.

Microbench result: the working set was a non-issue.  Even with all 8

palettes cycling per tile (worst case -- every attribute byte

different), the 32 KiB total table is L1-friendly because the access

pattern (16 bytes per palette per tile) hits the same line repeatedly

within a tile.  Typical CGB scenes use only a few palettes per frame,

making the hot working set much smaller than the full table.

Microbench (full do-while incl. ntileword and nattrib recompute,

5000 frames x 144 lines x 20 tiles, x86_64 gcc 13.3 -O3):

  Scenario A: 1 palette used (typical):

    old: 53.0 ms (272 Mtiles/s) -> new: 27.5 ms (523 Mtiles/s)  1.93x

  Scenario B: 8 palettes cycling (worst-case for L1):

    old: 53.0 ms (272 Mtiles/s) -> new: 27.2 ms (529 Mtiles/s)  1.95x

Bit-exact across 50000 random trials.

Implementation:

  - bgPaletteExpanded changes shape from [256][4] to [8][256][4].

    Size goes from 4 KiB to 32 KiB (u32 build) / from 2 KiB to 16 KiB

    (VIDEO_RGB565 / VIDEO_ABGR1555 build).  The DMG renderer indexes

    the [0] slot; the CGB renderer indexes [nattrib & 7].

  - refreshBgPaletteExpansion gains a unsigned palette_id argument.

    DMG-mode callers pass 0; the CGB hooks pass the slot affected by

    the BCPD write (index >> 3).  Refreshing one palette costs 256

    iterations of the 4-lane inner expansion -- about 1024 stores --

    so per-palette refresh keeps writes proportional to the work the

    palette change actually invalidated.

  - refreshPalettes (the bulk-reload path used by loadState,

    swapToDMG, the colour-correction setters) rebuilds all 8 slots in

    CGB mode and just slot 0 in DMG mode.  doCgbBgColorChange (the

    one-entry-at-a-time BCPD path) rebuilds the affected slot.

    dmgBgPaletteChange (BGP register) rebuilds slot 0.  These are

    the only paths that write ppu.bgPalette in the codebase.

Codegen (gcc 13.3 -O3, x86_64): both inner loops now have the same

shape -- the do-while body lowers to four movdqu pairs per unrolled

iteration (gcc unrolls by 2, processing 16 pixels per loop body),

plus the nattrib/ntileword recompute scalar tail.

The CGB path's 32 KiB worst case is still smaller than every modern

L1d (x86 32-48 KiB, ARM Cortex-A53/A72 32 KiB), and the typical hot

working set is one or two 4 KiB slots.,

--------------------------------------------------------------------------------------------------
libretro-gearcoleco.mk e6c987725eb2ac6dc0edc85b0dea30fdc7e938d7 # Version: Commits on Jun 14, 2026
--------------------------------------------------------------------------------------------------
Update readme,

-------------------------------------------------------------------------------------------------
libretro-geargrafx.mk 31e8fb7d94e4e4b723790fbd19a02760df5ac816 # Version: Commits on Jun 14, 2026
-------------------------------------------------------------------------------------------------
Update readme,

--------------------------------------------------------------------------------------------------
libretro-gearsystem.mk a4f2cf7fdcb946ca3d150206c1b3e426fabd59c1 # Version: Commits on Jun 14, 2026
--------------------------------------------------------------------------------------------------
Update readme,

---------------------------------------------------------------------------------------------
libretro-opera.mk 64f35570aad94992f1122a810af6cc932862505a # Version: Commits on Jun 14, 2026
---------------------------------------------------------------------------------------------
MADAM: ignore bottom 2 bits in CCB processing

The bottom two bits of the address bus aren't even wired up to

MADAM. Most titles use properly aligned addresses but not all. This

patch ensures the pointers read from the CCB and the CCB address

itself are masked to align them to word boundry.

Fixes Ballz and possibly other titles that had unaligned addresses.,

----------------------------------------------------------------------------------------------------
libretro-parallel-n64.mk 2eff7ef440c8411d6b8670ea32d9b5a40492db12 # Version: Commits on Jun 13, 2026
----------------------------------------------------------------------------------------------------
libretro: only auto-force HLE graphics when the RSP plugin is on auto

The core forced the GFX task through the HLE emitter whenever the active

video plugin was not the one paired with the build's native low-level

path (angrylion for the threaded software build, parallel for the Vulkan

build). That override ran unconditionally, so selecting the cxd4 RSP

explicitly while using a different video plugin silently executed the

HLE display-list emitter instead of the requested low-level microcode,

contradicting the user's choice and making the two paths impossible to

compare. Gate the override on the RSP plugin being left on \auto\: an

explicit cxd4 or parallel selection is now honoured as low-level, while

auto keeps the previous convenience fallback.,

----------------------------------------------------------------------------------------------
libretro-ppsspp.mk 14dc5a51560628581c023235e9d35ec28fb14b6a # Version: Commits on Jun 14, 2026
----------------------------------------------------------------------------------------------
Merge pull request #21825 from hrydgard/ridge-racer-sprite

Fix the ugly line on Ridge Racer lens flares,

----------------------------------------------------------------------------------------------
libretro-prboom.mk 84cd28bd2d58bbfc8a2e48997862fefcac132c6e # Version: Commits on Jun 14, 2026
----------------------------------------------------------------------------------------------
Revert the above-eye 3D-floor water chain (translucent ceiling approach)

This reverts the four-commit chain that drew a swimmable water surface seen

across an opening from below it:

  1ae278f draw above-eye 3D-floor water as a translucent ceiling plane

  bb17de3 tint the submerged volume for above-eye 3D-floor water

  554a06b blend 3D-floor water at the map's alpha instead of fixed 50/50

  4327cc2 give 3D-floor water a solid colour when its flat is a bare marker

The approach is structurally wrong and cannot be salvaged by tuning.  It draws

the water as a single flat screen-space translucent span.  But the far wall of

the flooded room spans from its floor (~z -16) to its ceiling (z 448) within one

screen column, and only the part below the surface (z 138) is underwater.  A

flat span cannot express 'underwater up to the waterline, air above it' when the

far geometry crosses the surface mid-column, so the tint covers far above the

real water line regardless of clamp direction or alpha.  The result reads as a

blue sheet hung over the top of the opening, not a water surface -- visibly

worse than drawing nothing.

Correct 3D-floor water needs the surface clipped as a true horizontal plane

against the per-column far geometry (a real waterline), which is a substantial

renderer feature, not a span tweak.  Reverting until that exists rather than

shipping a broken effect.  Restores the exact pre-chain state (bb842a3); vanilla

demo hash unchanged (ab8eb93a72c8a66b).,

-------------------------------------------------------------------------------------------
libretro-ps2.mk 9b74364f0111b2159a47b8a3b12adbb2e255604f # Version: Commits on Jun 14, 2026
-------------------------------------------------------------------------------------------
common/GS: load and run on Windows 8 by resolving placeholder APIs at runtime

The fastmem area (HostSys.cpp) and the GS local-memory mirror (GS.cpp)

called VirtualAlloc2 / MapViewOfFile3 / UnmapViewOfFile2 directly.

These are Windows 10 1803+ exports, so as ordinary imports they land

in the DLL's import table and the loader cannot resolve the module on

Windows 8 / 8.1 - the whole core fails to load before any code runs,

even though both subsystems can operate without those APIs.

Resolve the three placeholder APIs once via GetProcAddress from

kernelbase.dll (added as PCSX2_HasPlaceholderAPIs in RedtapeWindows.h)

so they stay out of the import table, and branch on availability:

- HostSys fastmem: if the APIs are missing, Create() returns null and

  vtlb_Core_Alloc falls back to no-fastmem mode (the same path already

  taken when a 4 GB region can't be placed). Map()/Unmap() call through

  the resolved pointers, which are guaranteed present because the area

  only exists when Create() found all three.

- GS wrapped memory: GSLocalMemory cannot tolerate a null mapping (it

  memsets the buffer immediately), so a Win8 fallback is provided that

  reserves a contiguous repeat*size hole, releases it, and maps the

  file view into each slot with MapViewOfFileEx (available since

  Windows 2000). A flag records which path was used so the matching

  teardown runs in GSFreeWrappedMemory.

On Windows 10+ the resolver finds all three APIs on first use and the

existing placeholder workflow runs exactly as before - only the

otherwise-unreachable absence path is new - so behavior there is

unchanged. No effect on non-Windows builds.

NOTE: unverified on a real Windows toolchain. The added code was

compile-checked against a Windows target with MinGW (typedefs, call

shapes and control flow), but the full core was not built and this has

not been run on Windows 8 or Windows 10. Needs a Win10 SDK build and a

runtime check on both before merging.,

---------------------------------------------------------------------------------------------------
libretro-snes9x-next.mk 305ab6f1ab2c8dd03a70659a43001ec39bf9ac23 # Version: Commits on Jun 14, 2026
---------------------------------------------------------------------------------------------------
tile: register-only palette gather in TILE_ROW_PRE_SSE2 (no stack roundtrip)

Replaces the storel-to-stack + 8 byte-loads + align-load palette gather

with pextrw to GPR + pinsrw straight back into xmm.  Touches the central

TILE_ROW_PRE_SSE2 macro (six callers across the math-variant n1x1

helpers) and the open-coded SSE2 path in tile_draw_row_nomath_n1x1.

Found via autovec-aware codegen audit: gcc 13 -O3 lowers

    _mm_storel_epi64((__m128i *)pix_buf, pix);

    col_buf[0] = palette[pix_buf[0]];

    ... [eight byte indices] ...

    col_buf[7] = palette[pix_buf[7]];

into SEVEN redundant 16-byte stack stores of `pix` plus eight movzbl

loads at distinct offsets.  SLP analysis treats each byte-load as

needing its own non-aliasing copy of the source vector, so the spill

multiplier is one-store-per-byte-load.  Reading the indices through

pextrw goes register-only, and pinsrw places the gathered colors

directly in xmm so the subsequent mask/blend uses no scratchpad either.

Spill counts in the generated assembly (gcc 13.3 -O3 -msse2):

  function                          before        after

  DrawTile16_Normal1x1              spills=14     spills=0

  DrawTile16Add_Normal1x1           spills=15     spills=0

  DrawTile16Sub_Normal1x1           spills=14     spills=0

  DrawTile16SubF1_2_Normal1x1       spills=14     spills=0

The max-spill loop in tile.c (.L20167, xmm=94 spills=15) is gone; the

worst residual loop now has 7 spills, mean dropped from ~14 to ~3.

Microbench (x86_64 Linux, gcc 13.3, full per-row helper -- mask, db,

gather, store):

  -O3:  150.3 -> 137.4 ms   (1.094x speedup)  213 -> 233 Mrows/s

  -O2:  149.6 -> 137.1 ms   (1.091x speedup)  214 -> 234 Mrows/s

Bit-exact against the scalar reference over 200000 random trials,

and across 4000 row calls in the bench harness.

PIX_BUF / COL_BUF stay on the macro parameter list so the six callers

compile unchanged; the unused stack arrays are DCE'd at -O2/-O3.  The

parallel NEON path (TILE_ROW_PRE_NEON, NEON branch of

tile_draw_row_nomath_n1x1) is unchanged -- on NEON, vget_lane_u8

extracts directly into a GPR without a stack roundtrip, so the same

gcc lowering bug doesn't apply; a NEON-side audit can come separately.,

----------------------------------------------------------------------------------------------
libretro-stella.mk 6fcd49280bf923e171cfe87183d97ec20ce2fc99 # Version: Commits on Jun 13, 2026
----------------------------------------------------------------------------------------------
added cassette icons for MP3/WAV files,

---------------------------------------------------------------------------------------------------
libretro-swanstation.mk 93b213d805591c4f1488339c4a16f0b4cb68d44a # Version: Commits on Jun 14, 2026
---------------------------------------------------------------------------------------------------
gpu_sw: SSE2/NEON kernels for CopyOutRow16<RGBA8> and <BGRA8>

The two desktop-output specialisations of CopyOutRow16 -- RGBA8 and

BGRA8, used whenever the host display path is a 32bpp framebuffer

(the common case on Windows/Linux/macOS GL/Vulkan backends) -- were

the only ones left without a SIMD kernel.  The RGBA5551 and RGB565

variants for mobile/GLES targets already had SSE2 and NEON paths.

Each 16-bit MASB1555 source pixel expands to a 32-bit ARGB pixel

with the same per-channel scaling pattern as the existing kernels

(<<3 on each 5-bit channel; bit 15 expanded to 0x00/0xFF for RGBA,

hard-coded to 0xFF for BGRA, matching the scalar VRAM16ToOutput

specialisations bit for bit).

The kernels process 8 pixels per iteration:

  r8 = (v & 0x1F)         << 3

  g8 = ((v >> 5) & 0x1F)  << 3

  b8 = ((v >> 10) & 0x1F) << 3

  a_hi = (v >>arith 15)   << 8     // 0xFF00 if STP bit set else 0

  pair_lo = r8 | (g8 << 8)         // R in low byte, G in high

  pair_hi = b8 | a_hi              // B in low byte, A in high

  store unpacklo(pair_lo, pair_hi)

  store unpackhi(pair_lo, pair_hi)

The 16-lane interleave on SSE2 (punpcklwd/punpckhwd) produces u32

lanes in little-endian R|G|B|A order, which is the RGBA8 byte

layout.  BGRA8 just swaps the channel pairing (B|G in pair_lo,

R|A in pair_hi) and uses a constant alpha vector since BGRA8's

VRAM16ToOutput hard-codes alpha = 0xFF.

The NEON path uses vst2q_u16 to do the same interleave: storing

{r|g, b|a} produces the [r|g, b|a, r|g, b|a, ...] u16 sequence

which reads as [R|G|B|A, R|G|B|A, ...] in u32.

Tail pixels (width % 8) keep the scalar VRAM16ToOutput call exactly

as the RGBA5551 and RGB565 kernels do.

Microbench (x86_64 Linux, gcc 13.3, full 640-pixel row, 500K iters):

  RGBA8:

    -O3: 148 -> 75 ms  (1.97x)   2161 -> 4247 Mpix/s

    -O2: 351 -> 74 ms  (4.74x)    911 -> 4317 Mpix/s

  BGRA8:

    -O3: 119 -> 66 ms  (1.80x)   2683 -> 4827 Mpix/s

    -O2: 299 -> 64 ms  (4.68x)   1070 -> 5004 Mpix/s

Bit-exact across 33000 trials over widths 0..32 (exercising the

scalar tail at every remainder), input pixels drawn from the full

65536 u16 range.,

------------------------------------------------------------------------------------------------
libretro-tyrquake.mk 5e10328faf30161923fa0f918792fbeb7772ef5b # Version: Commits on Jun 14, 2026
------------------------------------------------------------------------------------------------
r_aclip: batch clipped fan into a single D_PolysetDraw dispatch

R_AliasClipTriangle clips an alias triangle against the frustum

planes via Sutherland-Hodgman, producing a polygon of up to 7

vertices, then triangulates it as a fan around vertex 0.  The

old code emitted one D_PolysetDraw call per fan triangle, with

the source carrying a 'FIXME: do all at once as trifan?' note

above the loop.

All fan triangles already share the same pfinalverts buffer

(R_AliasClipTriangle's stack-local fv[pingpong]) and the same

facesfront flag (inherited from the input triangle), so batching

is mechanical: build a mtriangle_t array on the stack with

vertindex[0..2] = (0, t+1, t+2) for t in [0, k-3], set

numtriangles = k - 2, and dispatch once.

mtri_fan[5] covers the worst-case fan size: a 3-vertex triangle

clipped against 4 frustum planes (left, right, top, bottom) grows

to at most 3 + 4 = 7 vertices, yielding a 5-triangle fan.  Z-clip

is handled separately upstream and never inflates the polygon

past the per-plane growth of the XY clips.

Performance impact on the SW path is modest (per-call D_PolysetDraw

overhead is small after the static-spans change in the previous

commit), but the structural change matters for two reasons.  First,

the GPU compute path in D_PolysetDraw (Phase 5b-06: the

g_rhi->dispatch_3d_alias short-circuit) is dispatch-heavy -- one

GPU submit per fan triangle on a partially-clipped entity is

exactly what the unclipped batching in R_AliasPreparePoints

(commit message at r_alias.c:477) was written to avoid.  Bringing

the clipped path under the same batching treatment closes the

remaining per-triangle-dispatch hole.  Second, the loop is now

straight-line code with no global-state mutation inside the body

(no per-iter writes to r_affinetridesc.ptriangles or to a shared

mtri scratch), which simplifies reasoning about the rasterizer's

preconditions when reading this code.

Bit-identical output: the fan triangles are generated in the

same order ((0,1,2), (0,2,3), (0,3,4), ...) and consumed by

D_DrawNonSubdiv / D_DrawSubdiv in the same order (their inner

loops iterate 0..numtriangles-1 with the same per-tri math),

so the resulting pixel emissions are unchanged.

Builds clean on x86_64, aarch64, and armv7 NEON crosses.,
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-deps Area: Dependencies T-chore Type: Chore (like updating a dependency, it's gotta be done)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants