Files
AnyPS5/docs/dev/debt/libSceFontGs.native.md
T

3.9 KiB

libSceFontGs.native technical debt

Unknown function info

  • sceFontGraphicsAgcSurfaceInit (libSceFontGs.native) - still throws through NotImplemented_nid_no_patch. The libSceFontGsm.prx body (PPSA13197 unwrapped ELF, VA 0x39e0, size 0x324) validates surface format/attributes, writes a large AGC surface descriptor through a deep helper tree and returns 0x8a6cXXXX family errors; the full object layout it produces is not yet mapped, so no general implementation exists.
  • sceFontSelectGraphicsAgc (libSceFontGs.native) - throws for index 0 and returns nullptr for other indices. Verified bodies disagree on index 0: the 4.03 libSceFontGs.native.sprx body is xor eax,eax; ret (VA 0x250; SHA-256 6c72c3ff5785d6bc68984de885d19a812f98626d45d2909794c31f489926101c), while the newer libSceFontGsm.prx body returns a backend descriptor pointer for index 0 (3890: 31 c0 / xor eax,eax; 85 ff / test edi,edi; 48 8d 0d 85 07 03 00 / lea rcx,[rip->0x34020]; 48 0f 44 c1 / cmove rax,rcx; c3 / ret). The repository targets the 13.60 export table, and no 13.60 native body proving nullptr is available, so index 0 stays unimplemented until the descriptor table is mapped. The nullptr for index != 0 is verified by both bodies.
  • FontAgcSurface producer (libSceFontGs.native) - the object consumed by sceFontGraphicsAgcDrawupFillTextureImage/sceFontGraphicsAgcDrawupFillTexturePattern (tag byte 0x58 at +0x0d, mode at +0x0f, busy flag at +0x1c, fill object at +0x28, initialized flag at +0x38) is produced by an export outside the six bridge functions (the FontGsm sceFontGraphicsAgcSurfaceInit path does not set +0x38), so its producer is not yet identified; the layout is firmware-verified from the libSceFontGsm.prx bridge bodies.
  • FontAgcSequence producer (libSceFontGs.native) - the sequence object consumed by sceFontGraphicsSequenceGetAgcCommandsForJump/...ForSubmit (tag 0xf80 at +0x00, lock bit at +0x1b, commands descriptor at +0x28) is produced by sceFontGraphicsStructureCanvasSequence in libSceFont, which is itself still a stub; the descriptor layout (+0x28 first stream, +0x30 first size, +0x34 second count, +0x38 second stream) is firmware-verified.

Notes

  • The four drawup/sequence bridge exports are transliterated from the libSceFontGsm.prx bodies (PPSA13197 sce_module/, SHA-256 0c7ebf7f36aba76df09cba3509bf91e4a716c58963ce3f70198eeadec3527cd9): XKfh4naaANE @0x3890 (select), PwZEP8ZBK2Y @0x38a0 (image), z-m061OoEqQ @0x3950 (pattern), qEGeDXvL3fc @0x39e0 (surface-init), 6zxuBlsGF0I @0x3d10 (submit), CeSI7C4ihjo @0x3dc0 (jump). The image bridge head — 38a0: mov eax,0x80460002; test rdx,rdx; je; movq [rdx],0, then cmpb [rsi+0xd],0x58, cmpq [rsi],0, cmpl [rsi+0x38],1 — matches the implemented tag/head/initialized ordering.
  • The drawup bridges forward to sceFontGraphicsDrawupFillTextureImageObject/...PatternObject in core/libs/prx/libSceFont/src/Graphics.cpp through the same export boundary firmware uses (FontGsm PLT imports CfkpBe2CqBQ/FL0unhGcFvI from libSceFont-module).
  • Nothing in PPSA13197 imports the six bridge NIDs: they appear only in the bundled libSceFontGsm.prx's own export table (module tag #F = libSceFontGsm itself; its import table lists only libSceLibcInternal, libSceFont-module, libSceAgcDriver, libSceAgc). No guest module binds them against libSceFontGs.native in this title; the exports are implemented here because libSceFontGs.native is the canonical provider module for these NIDs in the 13.60 inventory.