Skip to content

Sync with upstream seedds/nxnative (4 commits) - #3

Merged
zenvyzenshiro merged 5 commits into
mainfrom
sync-upstream-2
Oct 28, 2026
Merged

zenvyzenshiro merged 5 commits into
mainfrom
sync-upstream-2

Conversation

@zenvyzenshiro

Copy link
Copy Markdown
Owner

Merges seedds/nxnative main (4 commits: controller players on iOS seedds#504, Pokémon Legends: Arceus 1.1.1, Super Mario Party Jamboree 2.3.0).

README.md keeps the fork's. dmsh_chain.h is regenerated with dmsh_chain.py --header (764aff238713).

Checked on Windows 11 x64: dmsh_chain.py --check-tools passes (Metal tools and spirv-cross included), win/tests/test_win.py 11 tests OK. No IPA build run.

🤖 Generated with Claude Code

seedds and others added 5 commits October 28, 2026 21:51
Super Mario Party Jamboree (0100965017338000), update 2.3.0, SDK 17.5.9, on
NintendoWare Bezel Engine 2.9 and NVN; the boards, minigames and modes are 139
NROs loaded with ro::LoadModule. No game-specific rewriter cuts or host rules.

General changes it needed:

- shader_split.py: Bezel Engine 2.9 archives keep their ASST entries inline
  at +0x28 (0x48 bytes each) where 1.56 has an array of entry offsets.
  bea_members reads both forms: 25,693 shaders instead of 246.
- hle_movie.c: in native-texture mode the SDK's GetOutputBuffer returns the
  output index (CopyOutputBufferToClientTextureAndRelease), and this game
  never calls ReleaseOutputBufferIndex, so its opening movie froze on its
  16th picture. The host now tracks the slots the client holds, returns the
  slot after writing the texture, and ignores a release of a slot the client
  does not hold, as the SDK's texture mode does (Metroid Dread releases after
  GetOutputBuffer).
- Profile: Bezel's nninitStartup gives malloc a 2 GB and Bezel a 56 GB
  address region with virtual address memory; in the 4.375 GB alias region
  Bezel got 2.06 GB and returned null loading the Party Plaza. The profile
  reports no system resource, so the game takes its own heap path (3.14 GB
  heap, 4 GB layout), as Big Brain Academy does.

On the Mac, headless: the opening movie, the title, setup, the Party Plaza,
Mario Party on Mega Wiggler's Tree Party through turn 2 and the minigame
Snag the Flags, at 60 fps with no crash. Open: a flat grey backdrop on the
board. iPhone not built or tested.

Checks: dm/tools tests touched (docs, bea_members, split, patches, settings),
lint ratchet with no new findings, and regress.py check --quick on Super
Mario Odyssey, Kirby, Pikmin 4, FINAL FANTASY X/X-2 and Xenoblade
Chronicles 2 (games whose routes play movies): four PASS, FFX CHANGED (its
60 s screenshot caught a later moment of the same opening scene).
Plays on the Mac at 30 fps from the first boot to free movement on the
Obsidian Fieldlands beach; an unsigned IPA (4.2 GB) is built, iOS untested.
The profile has no patches.py and no host code keyed to the game.

General fixes it needed:
- sdk b39add63 (SDK 11.4.0, Kirby's build): register the node area cut and
  32 MB alignment of regions of 1 GB and more, and add the SDK 11.4.0
  implementation of the SDK-wide alignment rule (matches only this build
  and the SDK 11.4.3 one among the 41 sdk builds on the game drive).
- Dual-source blending for NVN shaders: dmsh_build.py fs_dual gives the
  pixel shaders in a profile's dual_want.tsv a main0_d entry point (output 1
  as [[color(0), index(1)]]); pso_desc takes it for a pipeline whose output-0
  target blends with a SRC1 factor, and without it counts the second source
  as zero with a red line instead of letting Metal 4's blend compiler crash.
  DM_NVN_DUAL_WANT lists such shaders. Chain version 3d5af9d36e1e.
- The NSP script's rewrite key always covers sdk_patches.py, whose
  MATCH_CUTS apply to builds it does not name.

regress.py check --quick (baseline 6c4a81d) on Kirby and the Forgotten
Land, Super Mario Odyssey and Pikmin 4: CHANGED, exit 0. No newly failing
shaders, no new red lines, routes reached, frame times equal or better;
MSL and reflection identical, the changed variant hashes are the same keys
an unrelated chain check reported. Three games: the sdk cuts reach only
Kirby, the dual-source entry point only listed shaders (Arceus's), and the
host change only pipelines that blend with a written output 1.
…s-arceus-test-aa020b

# Conflicts:
#	README.md
The iOS gamepad sent every physical controller to player 1, through one
shared state, so the last controller to change overwrote the others (moving
one released buttons held on another). It now does what the Mac front end
does: each controller with an extended gamepad profile holds a slot from
pad_slots.h (player 1 first, a reconnected controller gets its player back,
up to 8), goes to dm_pad_set_player and is reported with dm_pad_players, so
hle_hid.c gives player n its own npad; a one-player game still sees every
controller as player 1. Each player has its controller's rumble and gyro;
the touch gamepad and the phone's gyro stay with player 1, and the touch
gamepad still hides while any controller is connected. The log names each
controller's player and npad. DM_PAD_MERGE=1 (Documents/env.txt) keeps the
old single-player behaviour.

Player 1's stick is now chosen by the host (whichever of touch and
controller is deflected more) instead of a 4000 threshold on the front end.

Checked: compile_check.py (Smash's profile) builds all 179 iOS files, the
gamepad has no new warnings with -Wall -Wextra, t_hid passes (119 checks),
the docs and env-switch tests pass. regress.py was not run: its Mac runs do
not use DmGamepad.m. Not yet tested on a phone with several controllers.

Requested in seedds#504 by oliverames.
README.md keeps the fork's; dmsh_chain.h is regenerated by dmsh_chain.py --header.
@zenvyzenshiro
zenvyzenshiro merged commit c2c09a8 into main Oct 28, 2026
2 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants