feat(libs): declare the PS VR2 exports PPSA15878 imports

Propagation: Paradise Hotel (PPSA15878) does not load on main: its
executable imports 15 PS VR2 functions that no library exports, the
first reported being sceVrTracker2GetPlayAreaOrientedBoundingBox
(snYs7Nf-RKk). Declare the nine libSceHmd2 reprojection and gaze
exports, three libSceVrTracker2 exports and three scePadVrController
trigger effect exports, without parameters, as throwing stubs. Names
come from the aerolib NID list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
hugodearaujo 2026-10-10 23:12:17 -03:00
parent a11c8f7f70
commit bdf67fcc49
4 changed files with 76 additions and 0 deletions

View File

@ -21,6 +21,11 @@ int APS5_VABI sceHmd2Close() {
return 0;
}
int APS5_VABI sceHmd2GazeGetResult() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceHmd2GazeGetResultForFoveatedRendering() {
NotImplemented_nid_no_patch(__func__);
return 0;
@ -46,16 +51,36 @@ int APS5_VABI sceHmd2ReprojectionBeginFrame() {
return 0;
}
int APS5_VABI sceHmd2ReprojectionDisableMirroring() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceHmd2ReprojectionDisableVrMode() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceHmd2ReprojectionEnableMirroring() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceHmd2ReprojectionEnableVrMode() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceHmd2ReprojectionGetMirroringDisplayBufferSizeAlign() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceHmd2ReprojectionGetMirroringWorkMemorySizeAlign() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceHmd2ReprojectionGetPredictedDisplayTime() {
NotImplemented_nid_no_patch(__func__);
return 0;
@ -81,6 +106,16 @@ int APS5_VABI sceHmd2ReprojectionSetAllowPositionalReprojection() {
return 0;
}
int APS5_VABI sceHmd2ReprojectionSetMirroringOption() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceHmd2ReprojectionSetParam() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceHmd2ReprojectionSetParamWithBuffer() {
NotImplemented_nid_no_patch(__func__);
return 0;
@ -91,6 +126,16 @@ int APS5_VABI sceHmd2ReprojectionSetRenderConfig() {
return 0;
}
int APS5_VABI sceHmd2ReprojectionSetTiming() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceHmd2ReprojectionTerminate() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceHmd2SetVibration() {
NotImplemented_nid_no_patch(__func__);
return 0;

View File

@ -256,6 +256,11 @@ int APS5_VABI scePadVrControllerRead() {
return 0;
}
int APS5_VABI scePadVrControllerGetTriggerEffectState() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI scePadVrControllerReadState(int handle, void* state) {
(void)handle;
(void)state;
@ -263,6 +268,16 @@ int APS5_VABI scePadVrControllerReadState(int handle, void* state) {
return 0;
}
int APS5_VABI scePadVrControllerSetTriggerEffect() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI scePadVrControllerSetTriggerEffects() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI scePadIsRemoteController(int handle, bool* remote) {
if (handle != PAD_HANDLE) return PAD_ERROR_INVALID_HANDLE;
if (remote == nullptr) return PAD_ERROR_INVALID_ARG;

View File

@ -5,6 +5,16 @@
extern "C" {
int APS5_VABI sceVrTracker2Finalize() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceVrTracker2GetPlayAreaOrientedBoundingBox() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceVrTracker2GetResult() {
NotImplemented_nid_no_patch(__func__);
return 0;
@ -15,6 +25,11 @@ int APS5_VABI sceVrTracker2Initialize() {
return 0;
}
int APS5_VABI sceVrTracker2LocateCoordinateSystem() {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceVrTracker2QueryMemory() {
NotImplemented_nid_no_patch(__func__);
return 0;

View File

@ -72,6 +72,7 @@ Throughout the project, every function at every stage either **does exactly what
- [sceHmd2Initialize](../../core/libs/prx/libSceHmd2/Export.cpp) (libSceHmd2) - the error the console returns when the PS VR2 runtime is unavailable is unknown; it returns libSceHmd's `UNSUPPORTED_FEATURE` (0x81110016). PPSA01317 passes a pointer to 16 zeroed bytes and only tests the result for non-zero
- PPSA01317 imports declared without parameters, signatures unknown: the remaining [libSceHmd2](../../core/libs/prx/libSceHmd2/Export.cpp) and [libSceVrTracker2](../../core/libs/prx/libSceVrTracker2/Export.cpp) exports. Names from the aerolib NID list
- PPSA15878 imports declared without parameters, signatures unknown: the [libSceHmd2](../../core/libs/prx/libSceHmd2/Export.cpp) reprojection and gaze exports, `sceVrTracker2Finalize`, `sceVrTracker2GetPlayAreaOrientedBoundingBox` and `sceVrTracker2LocateCoordinateSystem` in [libSceVrTracker2](../../core/libs/prx/libSceVrTracker2/Export.cpp), and the `scePadVrController` trigger effect exports in [libScePad](../../core/libs/prx/libScePad/Export.cpp). Names from the aerolib NID list
- [libSceMbus](../../core/libs/prx/libSceMbus/Export.cpp) (`libSceDeviceService`) - signatures taken from PPSA01317, which calls `sceDeviceServiceInitialize(3, 0)`, polls `sceDeviceServiceGetEventState(1)` and queries again when bit 0 or 1 is set, and calls `sceDeviceServiceQueryDeviceInfo_(0x7001, 0, 0, infos, 1, &count, &unknown, 0x70)`, treating a negative result as an error and `count` as the number of entries. The host has no devices: the event state is 0 and a query returns 0 with `count` 0
- [NGS2 ATRAC9 waveform loops](../../core/libs/prx/libSceNgs2.native/src/Atrac9.cpp) accepts one integer forward `smpl` loop. Inclusive RIFF endpoints and encoder-delay adjustment follow [vgmstream riff.c](https://github.com/vgmstream/vgmstream/blob/7dc938fa2f210943b37c7b6511852b516ef432ab/src/meta/riff.c). PPSA03747 supplies a 60-byte sampler chunk with one loop, `samplerData` 24, start 256, inclusive end 299224 and delay 256 for 298969 audible samples. The chunk size and loop count bound the records; `samplerData` is not interpreted. Output positions are assumed to use audible samples and an exclusive end. Blocks split into an optional intro, a repeated range and an optional tail; zero play count means infinite repeats, positive play count includes the first pass. ATRAC9 ranges include a preceding codec frame for decoder history. The output block layout, repeat-count mapping and error codes are unverified on hardware. Multiple, reverse, alternating and fractional loops throw.
- [NGS2 submixer UserFx](../../core/libs/prx/libSceNgs2.native/src/Custom.cpp) (control `0x20000004`) invokes the title's callback after input mixing on every playing grain, including silence. The 40-byte control and 48-byte process context follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/945dbc3cc3eee80ac3e053b438502ed936fa6bb2/src/core/libraries/ngs2/ngs2_submixer.h). PPSA03747 installs a peak-meter callback; its code confirms the channel pointers, user data 0, channel count, grain size and sample-rate offsets and returns 0. Other user data words are preserved. Flags are assumed to be 1 after registration/restart and 0 thereafter, following UserFx2's first-process convention; this callback does not inspect them. Null handlers disable the effect, setup clears it, and nonzero callback results throw. These lifecycle and error semantics are unverified on console hardware.