From 43a460cc6603c1d9dafcba5c980e6e7b9b1a1738 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 7 Oct 2026 13:22:29 -0500 Subject: [PATCH 1/5] fix(videoout): report GPU driver shutdown failure from the present thread at Shutdown presentLoop called AgcDriverShutdown outside its try block, so a stored worker failure rethrown there terminated the process. Store it in flipQueue->failure so VideoOutDriver::Shutdown rethrows it after the join. Register the lifetime, decode and controls modes of video_out_flip_tests in ctest. --- core/libs/prx/libSceVideoOut/CMakeLists.txt | 11 +++++++++++ core/libs/prx/libSceVideoOut/src/VideoOutDriver.cpp | 7 ++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/core/libs/prx/libSceVideoOut/CMakeLists.txt b/core/libs/prx/libSceVideoOut/CMakeLists.txt index 2a15963e5..f21e04ff7 100644 --- a/core/libs/prx/libSceVideoOut/CMakeLists.txt +++ b/core/libs/prx/libSceVideoOut/CMakeLists.txt @@ -31,6 +31,17 @@ target_include_directories(video_out_flip_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CM target_link_libraries(video_out_flip_tests PRIVATE libSceVideoOut libSceAgcDriver libkernel libc) set_target_properties(video_out_flip_tests PROPERTIES CXX_EXTENSIONS OFF) configure_windows_unwind(video_out_flip_tests) +if(BUILD_TESTING) + set_target_properties(video_out_flip_tests PROPERTIES EXCLUDE_FROM_ALL OFF) + foreach(flipMode IN ITEMS lifetime decode controls) + if(flipMode STREQUAL "lifetime") + add_test(NAME video_out_flip_${flipMode} COMMAND video_out_flip_tests) + else() + add_test(NAME video_out_flip_${flipMode} COMMAND video_out_flip_tests ${flipMode}) + endif() + set_tests_properties(video_out_flip_${flipMode} PROPERTIES TIMEOUT 60 ENVIRONMENT "SDL_VIDEODRIVER=offscreen") + endforeach() +endif() if(BUILD_TESTING) add_test_executable(pad_sdl_tests tests/PadSdl.cpp) diff --git a/core/libs/prx/libSceVideoOut/src/VideoOutDriver.cpp b/core/libs/prx/libSceVideoOut/src/VideoOutDriver.cpp index 8f185445a..615d3201c 100644 --- a/core/libs/prx/libSceVideoOut/src/VideoOutDriver.cpp +++ b/core/libs/prx/libSceVideoOut/src/VideoOutDriver.cpp @@ -574,7 +574,12 @@ void VideoOutDriver::presentLoop(std::stop_token token, std::promise& star cancelled.swap(flipQueue->requests); } } - AgcDriverShutdown_nid_postfix(); + try { + AgcDriverShutdown_nid_postfix(); + } catch (...) { + std::lock_guard lock(flipQueue->mutex); + if (!flipQueue->failure) flipQueue->failure = std::current_exception(); + } window.Destroy(); } From 64b97c89813795e3a641db0d43c8eea7071ed6f9 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 8 Oct 2026 08:49:46 -0500 Subject: [PATCH 2/5] test(videoout): prepend libc dir to PATH for video_out_flip tests on Windows Co-Authored-By: Claude Sonnet 5.5 --- core/libs/prx/libSceVideoOut/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/libs/prx/libSceVideoOut/CMakeLists.txt b/core/libs/prx/libSceVideoOut/CMakeLists.txt index f21e04ff7..54f37249e 100644 --- a/core/libs/prx/libSceVideoOut/CMakeLists.txt +++ b/core/libs/prx/libSceVideoOut/CMakeLists.txt @@ -40,6 +40,10 @@ if(BUILD_TESTING) add_test(NAME video_out_flip_${flipMode} COMMAND video_out_flip_tests ${flipMode}) endif() set_tests_properties(video_out_flip_${flipMode} PROPERTIES TIMEOUT 60 ENVIRONMENT "SDL_VIDEODRIVER=offscreen") + if(WIN32) + set_tests_properties(video_out_flip_${flipMode} PROPERTIES ENVIRONMENT_MODIFICATION + "PATH=path_list_prepend:$") + endif() endforeach() endif() From 3e01e740e480a92b776a71ec4792b1db1a7c27c4 Mon Sep 17 00:00:00 2001 From: Pedro Date: Thu, 8 Oct 2026 20:06:31 -0500 Subject: [PATCH 3/5] test(videoout): drop video_out_flip_tests from KNOWN_UNRUN now that ctest runs it --- tools/check_test_registration.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/check_test_registration.py b/tools/check_test_registration.py index a0115b2cd..7e926d356 100644 --- a/tools/check_test_registration.py +++ b/tools/check_test_registration.py @@ -7,7 +7,6 @@ TEST_OUTPUT = r"tests[\\/]" KNOWN_UNRUN = { "agc_driver_recorder_tests", - "video_out_flip_tests", } From 2663699dc53042f79a08ae7d1356a9bd8568649f Mon Sep 17 00:00:00 2001 From: Pedro Date: Fri, 9 Oct 2026 06:55:19 -0500 Subject: [PATCH 4/5] test(videoout): skip flip tests without a Vulkan window and create param.json The offscreen SDL driver cannot create a Vulkan window on Windows since the VideoOut window uses SDL_WINDOW_VULKAN, so the tests that open a port now exit 77 (skipped) like the other display tests, unless ANYPS5_REQUIRE_DISPLAY is set. The tests also write app0/sce_sys/param.json, which AppMetadata now requires. --- core/libs/prx/libSceVideoOut/CMakeLists.txt | 2 +- core/libs/prx/libSceVideoOut/tests/Flip.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/libs/prx/libSceVideoOut/CMakeLists.txt b/core/libs/prx/libSceVideoOut/CMakeLists.txt index 54f37249e..cbfd0cbee 100644 --- a/core/libs/prx/libSceVideoOut/CMakeLists.txt +++ b/core/libs/prx/libSceVideoOut/CMakeLists.txt @@ -39,7 +39,7 @@ if(BUILD_TESTING) else() add_test(NAME video_out_flip_${flipMode} COMMAND video_out_flip_tests ${flipMode}) endif() - set_tests_properties(video_out_flip_${flipMode} PROPERTIES TIMEOUT 60 ENVIRONMENT "SDL_VIDEODRIVER=offscreen") + set_tests_properties(video_out_flip_${flipMode} PROPERTIES TIMEOUT 60 SKIP_RETURN_CODE 77 ENVIRONMENT "SDL_VIDEODRIVER=offscreen") if(WIN32) set_tests_properties(video_out_flip_${flipMode} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") diff --git a/core/libs/prx/libSceVideoOut/tests/Flip.cpp b/core/libs/prx/libSceVideoOut/tests/Flip.cpp index ed59a5177..abfe80153 100644 --- a/core/libs/prx/libSceVideoOut/tests/Flip.cpp +++ b/core/libs/prx/libSceVideoOut/tests/Flip.cpp @@ -13,6 +13,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -532,6 +535,8 @@ void testOneDevice() { int main(int argc, char** argv) { try { + std::filesystem::create_directories("app0/sce_sys"); + std::ofstream("app0/sce_sys/param.json", std::ios::binary) << R"({"titleId":"PPSA00000","localizedParameters":{"en-US":{"titleName":"Example"}},"downloadDataSize":0})"; if (argc == 2 && std::string(argv[1]) == "decode") testDecode(); else if (argc == 2 && std::string(argv[1]) == "controls") testControls(); else if (argc == 2 && std::string(argv[1]) == "present") testPresentation(); @@ -548,6 +553,7 @@ int main(int argc, char** argv) { std::fprintf(stderr, "%s\n", error.what()); try { LibcRunShutdown_nid_postfix(); } catch (const std::exception& shutdown) { std::fprintf(stderr, "shutdown: %s\n", shutdown.what()); } + if (std::string(error.what()).find("Vulkan support") != std::string::npos && !std::getenv("ANYPS5_REQUIRE_DISPLAY")) return 77; return 1; } } From 59c98bde58852eb88f39f18c92600852dcfc409e Mon Sep 17 00:00:00 2001 From: Pedro Date: Fri, 9 Oct 2026 09:40:45 -0500 Subject: [PATCH 5/5] test(videoout): limit the flip tests to the 30 second contribution timeout --- core/libs/prx/libSceVideoOut/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/libs/prx/libSceVideoOut/CMakeLists.txt b/core/libs/prx/libSceVideoOut/CMakeLists.txt index cbfd0cbee..3c91d54e8 100644 --- a/core/libs/prx/libSceVideoOut/CMakeLists.txt +++ b/core/libs/prx/libSceVideoOut/CMakeLists.txt @@ -39,7 +39,7 @@ if(BUILD_TESTING) else() add_test(NAME video_out_flip_${flipMode} COMMAND video_out_flip_tests ${flipMode}) endif() - set_tests_properties(video_out_flip_${flipMode} PROPERTIES TIMEOUT 60 SKIP_RETURN_CODE 77 ENVIRONMENT "SDL_VIDEODRIVER=offscreen") + set_tests_properties(video_out_flip_${flipMode} PROPERTIES TIMEOUT 30 SKIP_RETURN_CODE 77 ENVIRONMENT "SDL_VIDEODRIVER=offscreen") if(WIN32) set_tests_properties(video_out_flip_${flipMode} PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$")