mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-31 12:35:51 +00:00
sceVrTracker2Initialize follows the order read from firmware 13.60 libSceVrTracker2.sprx (disassembly, not measured on a console). It rejects with 0x8A740006, in order: a null record or a size other than 72; a mode other than 0, 1000 or 1001; a null work memory; a size below the mode's 32 MiB, 7 MiB or 3 MiB; an alignment below 0x10000; a non-zero reserved byte at 0x3a..0x47; a thread priority outside 256..767; an affinity mask outside bits 0..12 in mode 0 or outside 0xEA00 in modes 1000 and 1001. It then moves the module state from 0 to 1 and returns 0x8A740002 if it was not 0. From there every failure undoes what the call opened and resets the state to 0. Mode 0 clears the first 32 MiB of work memory first. The application attribute checks on the sceKernelGetAppInfo2 record (0x8A74001E, 0x8A740020) are skipped: the host has none, and a zeroed record passes them. The signed option at 0x39 accepts -1 and 0, and 1 only for titles compiled with SDK 7.00 or later. Modes 0 and 1000 then call libSceHmd2 TrackingOpen, TrackingStart, LedDetectorOpen and LedDetectorStart and return the first non-zero result unchanged. Without a headset main's libSceHmd2 answers 0 and -1 (its measured pre-initialization answers), so Initialize returns -1 and every other export keeps answering 0x8A740001. Modes 1000 and 1001 need the application category, which the host does not have, and a fully successful Hmd2 sequence would need the tracker runtime; both throw. The eight tracking and LED-detector exports become named functions in libSceHmd2 so that libSceVrTracker2 can import them by name; their answers are unchanged. Co-Authored-By: Claude Opus 5.5 <[email protected]>