Build pinned libretro Snes9x 1.63 with this project's SDK and official metadata.
Convert final RGB565 frames to independent XRGB8888 storage for the existing
Vulkan upload path. Integrate staging, native imports and loader diagnostics.
Keep C++ destructor registration inside the unloadable core. Validate bounded
fini arrays before constructors and execute cleanup at last-reference close.
Test all 65536 colours through GPU upload, pitches/bounds/cached frames and
C++ destruction/reload/malformed finalizers. Existing core bytes are unchanged.
Verification: bash tools/verify.sh passed format/unit/build/integration/evidence
with 60 tests. bash tools/run-title.sh --no-build --core-test=snes9x --watch 180
passed loader/recovery and remained running until runner close. Owner: Works
flawlessly, answering colours/audio/input and menu/content-transition checks.
Zero Vulkan refusals, GPU API failures or kernel fatal-signal reports.
Evidence: evidence/snes9x-native/{capture,expectation,iterations,abi,build}.json,
loader/recovery reports and exact linked-driver hashes. Replay with
bash tools/verify.sh evidence. Frontend identity:
64bef2e7826e5a63a6644a933e24ef5403d28c754230c0038eb8a76b4baa1c53.
PS5_Vulkan was not modified; special-mode/save-state/performance coverage is
not implied by this ordinary-game acceptance.
Build pinned mGBA with this PS5 SDK, official metadata and both GB/GBA engines.
Support validated C initializer arrays, native directory/time imports and an
explicit config path. Map large title/core allocations so GBA archives load.
Correct mGBA callback colours and cached frame ownership, crop padded core
textures during presentation, and use the native shell exit after cleanup.
Verified: bash tools/verify.sh (format, unit, build, integration, evidence;
58 tests), then bash tools/run-title.sh --no-build --core-test=mgba --watch 180.
Owner confirms GB/GBC/GBA loading, correct colours/native Quit, and clean menu
and next game. Final capture has zero Vulkan refusals, GPU failure records or
kernel fatal-signal reports; normal frontend exit occurred before window end.
Evidence: evidence/mgba-native/{capture,expectation,iterations,build,abi}.json,
loader/recovery reports and exact linked-driver hashes. Replay with
bash tools/verify.sh evidence. Final build identity:
82024b89e74bbad4ad2ce2e2916d1a49baf26ac325fef20fc71a2c168b862337.
Patch count is deliberately 139: archive diagnostics, menu/cache ownership and
padded-source sampling edits. PS5_Vulkan was not modified. Saves/states,
long-run timing and a fresh FCEUmm/XMB transition matrix remain unverified.
Replace payload dlfcn hooks with a bounded ELF loader and explicit native
runtime bindings. Separate core RX/R/RW segments, reject unsupported ELF
features, and release failed loads. Guard failed menu selection before
frontend teardown and stop polling drivers after failed initialization.
Read core files through mapped buffers and bounded POSIX reads. Convert
libretro XRGB8888 frames to matching RGBA8 staging/sampled textures so real
content uses the verified Vulkan copy path rather than the RGB565 compute
branch. Keep video_ps5 selectable and preserve frontend/audio/error logs.
Validation: tools/verify.sh passed all five gates (52 tests). Console command:
tools/run-title.sh --no-build --core-test --watch 180, with manual core/game
selection. Eight ELF load/unload cycles and live-menu failure recovery passed;
owner confirmed flawless gameplay. Zero GPU refusals/API failure records and
kernel fatal signals across captured launches. Return-to-menu shortcut and
repeated game unload/reload remain unverified; owner closed/reopened the app.
Evidence: evidence/native-core-loading/{capture,expectation,loader,recovery,
abi,iterations}.json; replay with tools/verify.sh evidence. Accepted title
identity 9b287ca7e0d4a04721c68d30fb88b678a62cc568c1f2d44b75716b464c21b6d5.
No PS5_Vulkan edits by this task; its independently advancing checkout is
not used as a substitute for the accepted title's archive-bound identity.
Register a native platform frontend to preserve startup argv and supply browser roots and directory defaults. Keep live settings separate from the packaged seed. Supply the known executable path to avoid the procfs-related config-save crash, and enumerate directories through SDK getdents with a 64 KiB buffer.
Validation: tools/verify.sh passes all five gates (35 unit tests, 15 evidence records). tools/run-title.sh --no-build --watch 90 lists 96 /app0 entries with zero errors, stays alive, and is script-closed with zero Vulkan refusals/API failures. Owner confirms visible folders and configuration files. Live config is unchanged across upload/restart.
Evidence: evidence/native-paths/{capture,expectation}.json includes failed diagnostics and final acceptance. Build identity 26139a294d687ccf21c8fa779e5ad3883273b873b71ce67e1df48f48589f8f76. Patch count 102 to 105; fresh replay/idempotence verified. Runner snapshots build identity to avoid false stale-log failures during subsequent builds. PS5_Vulkan unchanged.
Register audio_ps5 and select it by default. Feed native AudioOut through a bounded worker queue with byte-based writes, rate negotiation, backpressure, pause/resume and cleanup. No SDL or Opus dependency.
Validation: tools/verify.sh passes all five gates (32 unit tests, 14 evidence records). tools/run-title.sh --no-build --audio-test --watch 45 records 193536 accepted/played frames, zero errors/discards, correct channel tones confirmed by the owner. A normal --no-deploy --watch 45 run remains alive and is script-closed with zero Vulkan refusals/API failures.
Evidence: evidence/native-audio/{capture,audio-test,expectation}.json. Build identity 801df0ac6a5754c3e6a6ea688f1e49e8ddd2041aeb131a637b8c8b59f4030d55. Patch count increases from 100 to 102 for registration and default; fresh replay/idempotence verified. PS5_Vulkan unchanged.
Retain frontend INFO/WARN/ERROR, driver errors, startup trace and klog.
Restore frontend log setup after rebuilt arguments, mark its build identity,
and retrieve it with each run. Remove periodic frame and button chatter;
log menu texture handover once. Profiling is opt-in, bounded and written only
after capture; validate per-frame partitions and presentation-return cadence.
Verified: bash tools/verify.sh (all gates, 28 tests); fresh vendor patch
replay/idempotence (86 edits). Two 60-second captures completed: first at
59.940238 FPS with maximum interval 16.905813 ms; fresh frontend logging
exposed three late texture-probe stalls, then those probes were limited.
Final refined build launched with zero refusals, logged handover once and
returned 0 before profiling completed; no final timing claim is made.
User requested ending performance investigation and proceeding to XMB.
Evidence: evidence/vulkan-buffered-logging/{capture,expectation}.json
Replay: python3 tools/evidence.py compare evidence/
Console: bash tools/run-title.sh --no-build --gpu-profile 60 --watch 80
Analysis: python3 tools/analyze-gpu-profile.py klog/gpu-profile-<stamp>.tsv
Investigated with instrumentation on the console, because every one of these
failures produced a clean trace, a presenting driver and a black screen, and
reasoning about the source five times in a row produced five wrong answers.
0042 vulkan_gfx_widgets_enabled answered true, so the frontend took the widgets
branch of its mutually exclusive if/else and never called
gfx_display_init_first_driver - the only thing that sets p_disp->dispctx.
gfx_display_draw returns immediately without it, so every draw the menu
issued returned in silence.
0046 The driver draws the menu only behind VK_FLAG_MENU_ENABLE, and the only
place in the frontend that sets it to true is display_menu_libretro - a
libretro concept, set when a core runs. This title launches straight into
the menu with no content, so nothing ever set it. The menu now marks its
own texture displayable while it is on screen.
0047-0050 Diagnostics that name the fault that remains: RGUI hands its
framebuffer over once, the driver creates a valid 320x240 R8G8B8A8 optimal
image and keeps it, and the staging->dynamic upload never runs - so that
image holds uninitialised memory. The upload is gated on vk->menu.dirty[],
and the runloop calls rgui_set_texture (which sets it) before the frame is
sampled, so the upload opportunity for that flag is the next frame, where
the static texture_optimal->memory branch takes VULKAN_TEXTURE_DYNAMIC and
never re-uploads the staging texture. Not yet fixed.
0043 The run script clears a stale /app0/args.txt before every run. A leftover
capture file from an earlier probe made a run take a picture and then quit
itself 90 frames in - which the console books as an application crash with
a coredump, and which looked from the sofa like a title that never
appeared. The capture block also no longer calls CMD_EVENT_QUIT: a probe
must not end the run it is measuring.
Evidence: the instrumented traces in klog/ (ignored), which carry the handover
sequence at klog console-trace-now.txt and the per-run captures. tools/verify.sh
passes format, unit, build, integration and evidence.
Not claimed: the menu is still not visible on screen. No criterion of
docs/GPU_PATH_CRITERIA.md is closed by this commit: B4 is not met, and A4 and B1
remain met from the previous commit. The fault above is the next step.
tools/run-title.sh owns the whole sequence: build, publish, verify what the console
stored, listen to the kernel log, launch, watch, close the title itself, and print
the title's own trace. The hand-driven loop had produced two bad readings - runs
overlapped so one launch's trace was read as another's, and a probe build left in
place was mistaken for a finding - and neither can happen now.
Verification changed to match this console. It converts a signed fake self into a
raw ELF as it stores it, so the served file is a different container from the one
sent (8,117,072 bytes against 8,029,263; 12.8% of bytes equal). A digest check was
answering the wrong question and rejecting successful uploads, so eboot.bin is now
verified by the strings only this build carries. sce_module/libc.prx is the one
path this console will not replace, so it is reported and kept rather than fatal:
the title runs against the console's copy, and failing on it blocked eboot.bin.
The crash is fixed. Every joypad driver upstream ships needs a library this SDK
does not carry, so primary_joypad is NULL, and input_joypad_analog_axis reads
drv->axis without checking drv - inside an if (menu_is_alive) block, which is why
pass one survived and pass two died with SIGSEGV at fault address 0x18.
patches/series 0004 returns 0 when there is no driver. The title now runs
indefinitely: 1500+ frames in 25 s.
RGUI's bitmap fonts are downloaded assets, not built-ins: without
<assets>/rgui/font/bitmap10x10_eng.bin rgui_fonts_init fails and rgui_init jumps to
its error label. They are now bundled under assets/rgui/font/ and shipped.
The menu still does not draw, and the reason is measured: RGUI is alive with a
320x240 framebuffer but GFX_DISP_FLAG_FB_DIRTY is never set, so rgui_set_texture
returns every frame. That flag is set at the end of rgui_render, reached only
through menu->driver_ctx->render under MENU_STATE_BLIT. docs/FINDINGS.md records
the path there.
Evidence: bash tools/run-title.sh -> 1500+ frames, no-menu-source, closed by the
script; /app0/trace.txt; tools/verify.sh PASS (format unit build integration
evidence); port changes vs upstream retroarch.c 10 lines, gfx/video_driver.{c,h} 5,
input/input_driver.c 6, runloop.c 0, menu/drivers/rgui.c 0, every probe removed.