Skip to content

fix(libSceVideoOut): answer 0 and UNAVAILABLE_OUTPUT_MODE when the output has no 120 Hz, as the console does - #11405

Merged
oneandonlydean merged 1 commit into
boykopovar:mainfrom
p3n1cillin:claude/videoout-hfr-unavailable-output
Oct 28, 2026
Merged

oneandonlydean merged 1 commit into
boykopovar:mainfrom
p3n1cillin:claude/videoout-hfr-unavailable-output

Conversation

@p3n1cillin

Copy link
Copy Markdown

What

On a host display below 120 Hz, sceVideoOutIsOutputSupported(15) and sceVideoOutConfigureOutput(15) both returned 0x80290016 (UNSUPPORTED_OUTPUT_MODE). The console answers differently.

PS5_Vulkan measured it on a base PS5 with a 1440p display, in a title whose param.json declares high-frame-rate output (attribute3 0x80040) (HARDWARE_FINDINGS.md, 2026-10-10):

  • Console's output set to 1080p (no 120 Hz format; the AV control logs Unavailabe format): sceVideoOutIsOutputSupported(15) answered 0, "neither 1 nor an error code". sceVideoOutConfigureOutput(15), called anyway, returned 0x80290019, and the vblank stayed at 16.68 ms.
  • Set to 1440p: 15 answered 1 and configured with 0.
  • Without 0x80040: ConfigureOutput(15) returned 0x80290016.
  • Declaration bits: none of the other attribute bits changed any answer.

The change:

  • sceVideoOutIsOutputSupported(15) answers 0 when the host display runs below 120 Hz. The other modes are unchanged: 1 answers 1, the unsupported selectors 0x80290016, the unknown ones 0x8029001E.
  • sceVideoOutConfigureOutput(15) returns UNAVAILABLE_OUTPUT_MODE (0x80290019, shadPS4's name; the constant already existed here) when the answer is 0.
  • Undeclared titles: a title that doesn't declare high-frame-rate output still gets 0x80290016, checked first. Which code the console gives when both apply isn't measured, and the debt entry says so.
  • New helper: VideoOutOutputSupport_nid_no_patch(mode, options, refresh) holds the 1, 0 or error answer, so it can be tested at any refresh rate. IsOutputSupported uses it.

A title that tests for == 1, as PPSA26344 does, behaves as before. A title that treats any negative answer as "no" now sees 0, as on the console.

Tests:

  • video_out_output_mode_policy: checks the helper at 59, 60, 119, 120 and 144 Hz.
  • guest_video_out_output_mode and video_out_flip_controls: accept 1 or 0 for mode 15.
  • guest_video_out_high_frame_rate: its below-120 Hz branch now expects 0, then 0x80290019 from ConfigureOutput.

Tested

Windows 11 Pro (26300), WinLibs GCC 15.2.0, Release, full build on main 1f68b1f:

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none (debt text next to fix(libSceVideoOut): refuse to unregister the buffer set on screen as the console does #11196's; whichever lands second rebases)
  • Fixes: none
  • Unblocks: none
  • GPUs tested: NVIDIA GeForce RTX 5070, driver 621.01, Windows 11 Pro 26300 (with and without the validation layer)
  • AI-assisted: yes (Claude Code)

🤖 Generated with Claude Code

@MarcZX10

Copy link
Copy Markdown
Contributor

I verified the PR head's merge base: it is 1f68b1f776, while current main is 4b1a9a3b2f. Since then, main added VideoOut color-space wrappers and related Output.cpp tests. Those changes are in a separate region and the merge preview is clean, but this branch and the reported 33-test/validation-layer run are not on current main. Please sync current main and rerun the focused VideoOut suite on the updated change; the repository's VideoOut rule also calls for the same tests on main and the change with validation enabled on the same machine/GPU. The current hosted product jobs are skipped.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes requested only for the current-main integration and test rerun noted in my comment. The behavior change and console evidence otherwise look consistent with the reviewed implementation.

@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 11948 core/libs/prx/libSceVideoOut/src/Output.cpp L298-302

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 4040 core/libs/prx/libSceVideoOut/src/Output.cpp
docs/dev/debt/libSceVideoOut.md
PR 5021 core/libs/prx/libSceVideoOut/tests/Flip.cpp
PR 6977 core/libs/prx/libSceVideoOut/tests/Flip.cpp
docs/dev/debt/libSceVideoOut.md
PR 9432 core/libs/prx/libSceVideoOut/tests/Flip.cpp
docs/dev/debt/libSceVideoOut.md
PR 9672 core/libs/prx/libSceVideoOut/tests/Flip.cpp
PR 9673 core/libs/prx/libSceVideoOut/tests/Flip.cpp
docs/dev/debt/libSceVideoOut.md
PR 9674 core/libs/prx/libSceVideoOut/tests/Flip.cpp
PR 9675 core/libs/prx/libSceVideoOut/tests/Flip.cpp
PR 9676 core/libs/prx/libSceVideoOut/tests/Flip.cpp
docs/dev/debt/libSceVideoOut.md
PR 9842 core/libs/prx/libSceVideoOut/tests/Flip.cpp
PR 9880 core/libs/prx/libSceVideoOut/src/Output.cpp
docs/dev/debt/libSceVideoOut.md
PR 9891 core/libs/prx/libSceVideoOut/tests/Flip.cpp
PR 9892 core/libs/prx/libSceVideoOut/tests/Flip.cpp
PR 9893 core/libs/prx/libSceVideoOut/tests/Flip.cpp
PR 9895 core/libs/prx/libSceVideoOut/tests/Flip.cpp
PR 10435 core/libs/prx/libSceVideoOut/tests/Flip.cpp

@p3n1cillin
p3n1cillin force-pushed the claude/videoout-hfr-unavailable-output branch from c36f615 to b38d72e Compare October 26, 2026 12:27
@p3n1cillin

Copy link
Copy Markdown
Author

Rebased onto current main 4b1a9a3b2f (head b38d72e5c8; no conflicts) and reran the focused tests on that exact head and on main 4b1a9a3b2f, same machine and GPU (NVIDIA GeForce RTX 5070, driver 621.01, Windows 11 Pro 26300):

  • The 33 libSceVideoOut tests were run with ctest -V, VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, ANYPS5_NO_SHADER_CACHE=1, ANYPS5_REQUIRE_VULKAN=1 and the Windows SDL driver.
  • All 33 pass on both trees. guest_video_out_wqhd_detection_no_vulkan skips by design.
  • Neither log has the was not found but was requested by env var VK_INSTANCE_LAYERS message or any VUID- error.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed exact head b38d72e5c8509574cbef478bc772769913dad900. The hardware finding records mode 15 returning 0 when the console is configured to 1080p on a display that otherwise supports 144 Hz, and sceVideoOutConfigureOutput(15) returning 0x80290019; at 1440p it returns 1 and configures successfully. The helper preserves errors for unknown/invalid modes, maps only mode 15's unavailable-refresh case to 0, and the configure path distinguishes that from the title-attribute error. The test additions cover 59/60/119/120/144 Hz and verify the ordinary mode/error behavior remains unchanged.

The author reports all 33 focused VideoOut tests passing on both the change and tested main 4b1a9a3b2f with the Vulkan validation layer enabled on the same Windows machine/GPU, with no VUID errors. Current main is 2cce8bc51d64bfcff29b967e703d60f246357730; the intervening commits do not touch VideoOut files. I did not run the Windows suite locally. Hosted eligibility, conventions, labels and report checks pass; product/relinker jobs are skipped by path policy. The branch is mergeable, and I found no remaining blocker.

…tput has no 120 Hz

PS5_Vulkan measured on a base PS5 set to 1080p output that
sceVideoOutIsOutputSupported(15) answers 0, neither 1 nor an error, and
that sceVideoOutConfigureOutput(15) then returns 0x80290019, in a title
declaring high-frame-rate output. A host display below 120 Hz answered
0x80290016 to both instead. Titles that branch on the answer being 1
are unchanged; the undeclared-title answer stays 0x80290016.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@p3n1cillin
p3n1cillin force-pushed the claude/videoout-hfr-unavailable-output branch from b38d72e to cce9311 Compare October 28, 2026 14:16
@p3n1cillin

Copy link
Copy Markdown
Author

Rebased onto main 31646b6e17 to keep this current; the head is now cce9311f34. The rebase applied cleanly and the diff is unchanged.

Rerun on that head and on main 31646b6e17, on the same machine and GPU (Windows 11 Pro 26300, WinLibs GCC 15.2.0, Release, full builds, NVIDIA GeForce RTX 5070):

  • The 36 tests libSceVideoOut registers: run with ANYPS5_VIDEO_OUT_TEST_DRIVER=windows on a separate desktop, so the flip tests run. Settings: ctest -V, VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, ANYPS5_NO_SHADER_CACHE=1, ANYPS5_REQUIRE_VULKAN=1 and VK_LOADER_DEBUG=layer (Vulkan SDK 1.4.363.0).
  • Both runs: all 36 pass; guest_video_out_wqhd_detection_no_vulkan skips by design. The loader logs Insert instance layer "VK_LAYER_KHRONOS_validation" 23 times, and neither log has was not found but was requested or any VUID- error.
  • tools/check_conventions.py --base origin/main reports no errors. It warns that the sceVideoOutIsOutputSupported debt entry is over 1000 characters: the entry is 1985 characters on main, and this PR adds the measured 1080p/1440p answers (the text approved above). I can split that addition into its own entry if you prefer.

@oneandonlydean
oneandonlydean merged commit 2ae8649 into boykopovar:main Oct 28, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants