Repository navigation
Conversation
… fixed-rate screen, where the 30 Hz link skipped ticks and kept frames on screen 66.7 ms: Ocarina of Time's 180 s walk at a 30 fps cap on a MacBook Air M4 had 388-996 frames over 50 ms in fullscreen, 7 with the 60 Hz link and 3-4 in a window
This was referenced Nov 6, 2026
Contributor
Author
|
The fullscreen numbers in the description were measured on another tree; this is the confirmation on main. Setup:
The window went fullscreen:
Results:
|
seedds
added a commit
that referenced
this pull request
Nov 7, 2026
…ink stays at 60 Hz and the present interval paces the 30: the 30 Hz link skipped ticks there and kept frames on screen 66.7 ms (Ocarina of Time on a MacBook Air M4: 388 and 996 frames over 50 ms on a 180 s walk, 7 after; PR #1555) Fixes #1554 Co-authored-by: Puca <65235669+PucaVaz@users.noreply.github.com>
Owner
|
Landed unchanged as 490859e (with you as co-author; only the generated symptom index was regenerated against current main). |
gnosticgeek
pushed a commit
to gnosticgeek/nxforge
that referenced
this pull request
Nov 7, 2026
…cing (seedds#1555), device-shared memory pool storage, short NDSR records in the shader split (seedds#1298, took upstream's form of our own fix) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016qteK3qWJVi2jG3Gz4i1eY
gnosticgeek
pushed a commit
to gnosticgeek/nxforge
that referenced
this pull request
Nov 7, 2026
…h the link in fullscreen; dm_device_share grows its table through a temporary t_present_rescue (upstream seedds#1555's thirty()) expects the display link to run in fullscreen; NXForge leaves it there unless DM_PRESENT_LATENCY is set (latency() checks that), so four checks failed. thirty() now sets the latency, which is where upstream's fullscreen 30 fps pacing applies on NXForge. hle_svc.c dm_device_share assigned realloc's result straight back (bugprone-suspicious-realloc-usage, lint-c ratchet); it dies on failure all the same. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016qteK6QbhFrzr2Vop9t34k
john62036203-ops
pushed a commit
to john62036203-ops/NXNativeWindows
that referenced
this pull request
Nov 7, 2026
…ink stays at 60 Hz and the present interval paces the 30: the 30 Hz link skipped ticks there and kept frames on screen 66.7 ms (Ocarina of Time on a MacBook Air M4: 388 and 996 frames over 50 ms on a 180 s walk, 7 after; PR seedds#1555) Fixes seedds#1554 Co-authored-by: Puca <65235669+PucaVaz@users.noreply.github.com> (cherry picked from commit 490859e)
Know-It-All-Brother
pushed a commit
to Know-It-All-Brother/nxnative
that referenced
this pull request
Nov 9, 2026
…ink stays at 60 Hz and the present interval paces the 30: the 30 Hz link skipped ticks there and kept frames on screen 66.7 ms (Ocarina of Time on a MacBook Air M4: 388 and 996 frames over 50 ms on a 180 s walk, 7 after; PR seedds#1555) Fixes seedds#1554 Co-authored-by: Puca <65235669+PucaVaz@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #1554.
At a 30 fps target,
link_syncruns the display link at 30 Hz. In fullscreen on a fixed 60 Hz screen, that link skipped ticks (16.5-25.4 callbacks a second over stretches of 300 frames), and each skipped tick kept a frame on screen 66.7 ms. In a window the same link called back 30.0 times a second. Details and logs are in the issue.Change
dm/gfx/nvn/nvn_mtl.m:link_synctakes the 30 Hz link only whenlink_30hz()allows it. That is everywhere except fullscreen on a fixed-rate screen (front_fullscreen()and notfront_screen_variable_refresh(), the classificationlink_latencyalready uses). There the link stays at 60 Hz and the present interval paces the 30 fps, as the 60 Hz link already does for interval-2 frames: the acquire waits two ticks (mtl_link_wait_tick) and the callback keeps each frame on screen for its period (g_link_hold_until). A frame that misses its refresh then shows 16.7 ms later instead of 33.3.front_fullscreen), and 60 fps targets. Entering or leaving fullscreen switches the mode at run time throughlink_sync, as it already does for the frame latency.dm/gfx/tests/t_present_rescue.m: a newthirty()checks the link's mode and range at a 30 fps target in a window, in fixed-rate fullscreen and in variable-refresh fullscreen, and back again. The test reads the target through a renamednvn_game_fpshook int_present_rescue_focus.c, becausehle_nvn.c, which defines the real one, is linked into the test.docs/reference/frame-rate.md: a new entry, "The 30 Hz display link in fullscreen on a fixed-rate screen", with the symptom index regenerated and a line in Ocarina of Time's note.Testing
Unit tests:
make -C dm/gfx/tests GAME=0400486024DEC000 check_t_present_rescue: 86 checks, 0 failed. With the oldlink_sync, the two fixed-rate fullscreen checks fail.make -C dm/gfx/tests GAME=0400486024DEC000 run, M4): 107 of the 109 tests built and ran, plustest_dmsh_pullandtest_tbdr_budget. All passed exceptt_fuse_check: 2 of its 10 checks fail ("the later pass's logical target is kept afterwards"), the same on unmodified main.t_nvnandt_gfx_suspenddo not link on main either (dm_vi_frame_queuedundefined, since 51cc8bc), with or without this change.python3 -m unittest dm/tools/tests/test_docs.py: OK, afterdm/tools/docs_symptoms.py.dm/tools/lint_c.py tidy(LLVM 22.1.1 here, against a baseline made with 23.1.4): no findings in the test files.nvn_mtl.mhas three file/check pairs above the baseline, none near the change, and main'snvn_mtl.mhas the same three with this LLVM.scripts/regress.py impact: Breath of the Wild, Tears of the Kingdom and Pokémon Scarlet (throughnvnQueuePresentTexture).In game: MacBook Air M4, 24 GB, macOS 27.2, built-in 60 Hz screen. The Legend of Zelda: Ocarina of Time at
DM_FPS_TARGET=30. Main does not apply that cap to this game, so the change was applied to the tree of the issue (main 75c1a8c + #1453, #1455, #1332, #1446, LeonardoBai12's frame-delta change and #1527). The patched code is identical to this PR's; only the comment differs. The same app bundle was used with only the host swapped. Handheld, MetalFX. The route is scripted: 90 s idle in Link's house, then 180 s of stick pushes outside (the walk). One run per row, alternating before and after.An earlier fullscreen run before the change had 24.2 fps and 996 frames over 50 ms on the same walk.
present pacing mode 0 → 1withdisplay link: frame latency 1 (fullscreen, fixed refresh), and each frame held one extra tick (held for the present intervalrises by 300 per 300 presents). In the window it is still0 → 3.[RED]kinds in every run.Not run:
scripts/regress.py check, because I have none of the gamesimpactnames. Also not tested: variable-refresh (ProMotion) fullscreen, which this change leaves as it was; an external fixed-rate screen; another game at a 30 fps target on main; and the power cost of 60 callbacks a second instead of 30 in fixed-rate fullscreen.