fix(hmd): restore device queries and reprojection setup signatures

This commit is contained in:
boykopovar committed 2026-10-21 21:51:32 +03:00
1 parent aca0f63647
commit 7b97d7552c
2 files changed
+44 -28

No files matched your search

+38 -13
View File
@@ -3,6 +3,24 @@
#include <atomic>
struct HmdReprojectionInitializeParameter;
struct HmdReprojectionMultilayerParameter;
struct HmdDeviceInformation;
struct HmdDistortionParameters;
struct HmdInertialSensorData;
struct HmdStatusReport;
struct HmdFieldOfView {
float angles[4];
};
struct HmdAssemblyError {
float offsets[4];
};
static_assert(sizeof(HmdFieldOfView) == 16);
static_assert(sizeof(HmdAssemblyError) == 16);
struct HmdVr2dData;
struct HmdPuPositionParameter;
struct HmdOpticalParameter;
@@ -48,6 +66,13 @@ struct HmdMirroringAspect {
std::uint16_t reserved2;
};
struct HmdMirroringAspectDebug {
std::uint16_t values[5];
std::uint8_t mode;
};
static_assert(sizeof(HmdMirroringAspectDebug) == 12);
static_assert(offsetof(HmdMirroringAspectDebug, mode) == 10);
static_assert(sizeof(HmdMirroringAspect) == 8);
static_assert(offsetof(HmdMirroringAspect, aspect) == 2);
@@ -219,7 +244,7 @@ int APS5_VABI sceHmdInternalMirroringModeSetAspect(const HmdMirroringAspect* asp
return 0;
}
int APS5_VABI sceHmdInternalDfuGetStatus(void) {
int APS5_VABI sceHmdInternalDfuGetStatus(std::uint64_t* status) {
NotImplemented_nid_no_patch(__func__);
return 0;
}
@@ -339,7 +364,7 @@ int APS5_VABI sceHmdGetDistortionWorkMemorySize(void) {
return 0x20000;
}
int APS5_VABI sceHmdReprojectionSetDisplayBuffers(void) {
int APS5_VABI sceHmdReprojectionSetDisplayBuffers(std::int32_t videoOutHandle, std::int32_t firstBufferIndex, std::int32_t secondBufferIndex, const void* reserved) {
NotImplemented_nid_no_patch(__func__);
return 0;
}
@@ -354,7 +379,7 @@ int APS5_VABI sceHmdInternalCreateSharedMemory(void) {
return 0;
}
int APS5_VABI sceHmdInternalMirroringModeSetAspectDebug(void) {
int APS5_VABI sceHmdInternalMirroringModeSetAspectDebug(const HmdMirroringAspectDebug* aspect) {
NotImplemented_nid_no_patch(__func__);
return 0;
}
@@ -432,13 +457,13 @@ int APS5_VABI sceHmdInternalSetM2LedOn(std::int32_t handle, std::uint32_t ledMas
return 0;
}
int APS5_VABI sceHmdGetFieldOfView(std::int32_t handle, void* fieldOfView) {
int APS5_VABI sceHmdGetFieldOfView(std::int32_t handle, HmdFieldOfView* fieldOfView) {
(void)handle;
if (!fieldOfView) return Hmd::ParameterNull;
return initialized.load() ? Hmd::InvalidHandle : Hmd::NotInitialized;
}
int APS5_VABI sceHmdReprojectionAddDisplayBuffer(void) {
int APS5_VABI sceHmdReprojectionAddDisplayBuffer(std::int32_t bufferIndex, const void* reserved) {
NotImplemented_nid_no_patch(__func__);
return 0;
}
@@ -458,12 +483,12 @@ int APS5_VABI sceHmdInternal3dAudioSendData(std::int32_t port, const void* data,
return 0;
}
int APS5_VABI sceHmdReprojectionInitialize(void) {
int APS5_VABI sceHmdReprojectionInitialize(const HmdReprojectionInitializeParameter* parameter, std::uint32_t mode, const void* reserved) {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceHmdInternalGetDeviceInformationByHandle(void) {
int APS5_VABI sceHmdInternalGetDeviceInformationByHandle(std::int32_t handle, HmdDeviceInformation* information) {
NotImplemented_nid_no_patch(__func__);
return 0;
}
@@ -483,7 +508,7 @@ int APS5_VABI sceHmdInternalCrashReportReadData(void* buffer, std::uint32_t* byt
return 0;
}
int APS5_VABI sceHmdInternalGetDeviceInformation(void) {
int APS5_VABI sceHmdInternalGetDeviceInformation(HmdDeviceInformation* information) {
NotImplemented_nid_no_patch(__func__);
return 0;
}
@@ -552,7 +577,7 @@ bool APS5_VABI sceHmdInternalIsGameVr2d(void) {
return 0;
}
int APS5_VABI sceHmdGetAssyError(void* data) {
int APS5_VABI sceHmdGetAssyError(HmdAssemblyError* data) {
if (!data) return Hmd::ParameterNull;
return initialized.load() ? Hmd::DeviceDisconnected : Hmd::NotInitialized;
}
@@ -692,7 +717,7 @@ int APS5_VABI sceHmdGetWideNearDistortionCorrectionCommand(void) {
return 0;
}
int APS5_VABI sceHmdReprojectionStartMultilayer2(void) {
int APS5_VABI sceHmdReprojectionStartMultilayer2(const HmdReprojectionMultilayerParameter* parameter, std::int32_t mode) {
NotImplemented_nid_no_patch(__func__);
return 0;
}
@@ -761,7 +786,7 @@ int APS5_VABI sceHmdReprojectionStartWideNearWithOverlay(void) {
return 0;
}
int APS5_VABI sceHmdGetDistortionParams(void) {
int APS5_VABI sceHmdGetDistortionParams(HmdDistortionParameters* parameters) {
NotImplemented_nid_no_patch(__func__);
return 0;
}
@@ -821,7 +846,7 @@ int APS5_VABI sceHmdInternalSetDefaultLedData(void) {
return 0;
}
int APS5_VABI sceHmdGetInertialSensorData(std::int32_t handle, void* data, std::int32_t count) {
int APS5_VABI sceHmdGetInertialSensorData(std::int32_t handle, HmdInertialSensorData* data, std::uint32_t count) {
(void)handle;
(void)data;
(void)count;
@@ -848,7 +873,7 @@ int APS5_VABI sceHmdInternalSeparateModeSendAudio(const HmdScreenData* data) {
return 0;
}
int APS5_VABI sceHmdInternalGetStatusReport(void) {
int APS5_VABI sceHmdInternalGetStatusReport(std::int32_t handle, HmdStatusReport* report) {
NotImplemented_nid_no_patch(__func__);
return 0;
}
+6 -15
View File
@@ -10,33 +10,24 @@
- [libSceHmd queries without a headset](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - the signatures, the distortion work memory (`0x20000`, aligned to `0x400`) and reprojection buffer sizes (garlic `0x100000`, onion `0x810`, both aligned to `0x100`), and the results of `sceHmdGetFieldOfView`, `sceHmdGet2DEyeOffset`, `sceHmdGetInertialSensorData` (`HANDLE_INVALID` once initialized; field of view checks its output for null first) and `sceHmdGetAssyError` (null output, then `DEVICE_DISCONNECTED` once initialized) follow [shadPS4](https://github.com/shadps4-emu/shadPS4/blob/a808e76/src/core/libraries/hmd/hmd.cpp) (PS4) with no headset, not a PS5 measurement. Before initialization `sceHmdGetFieldOfView` returns `NOT_INITIALIZED` for a non-null output, where shadPS4 checks the handle first and returns `HANDLE_INVALID`. The third argument of `sceHmdGetInertialSensorData` is unnamed there and taken as a count
- [sceHmdReprojectionStartWideNear](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdInternalDfuGetStatus](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdGetDistortionWorkMemoryAlign](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdReprojectionStartMultilayer](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdGetDistortionWorkMemorySize](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdReprojectionSetDisplayBuffers](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdInternalMirroringModeSetAspectDebug](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdDistortionGetCompoundEyeCorrectionCommand](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdDistortionGetCorrectionCommand](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdReprojectionAddDisplayBuffer](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdReprojectionInitialize](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdInternalGetDeviceInformationByHandle](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdInternalGetDeviceInformation](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdReprojectionStartCapture](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdInternalGetDefaultLedData](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdDistortionGetWideNearCorrectionCommand](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdDistortionInitialize](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdReprojectionStart](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdInternalCrashReportCancel](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdInternalSeparateModeOpen](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdDistortionGet2dVrCommand](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdGetWideNearDistortionCorrectionCommand](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdReprojectionStartMultilayer2](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdGetDistortionCorrectionCommand](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdReprojectionStartWithOverlay](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdReprojectionStartWideNearWithOverlay](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdGetDistortionParams](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdReprojectionStart2dVr](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdInternalSetDefaultLedData](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdInternalGetStatusReport](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
- [sceHmdGet2dVrCommand](../../../core/libs/prx/libSceHmd/Export.cpp) (libSceHmd) - unknown signature
[Device, field-of-view, assembly-error, distortion, sensor and DFU query signatures](../../../core/libs/prx/libSceHmd/Export.cpp) are recovered from native register use. Field of view and assembly errors each output four floats; device information occupies 64 bytes and distortion output spans 76 bytes. The remaining device/sensor/report field semantics and DFU status bit meanings are unresolved. Assembly confirms integer error returns where decompilation incorrectly inferred void. Protected bodies are unchanged.
[Reprojection initialization and display-buffer signatures](../../../core/libs/prx/libSceHmd/Export.cpp) are recovered: initialization takes a parameter pointer, 32-bit mode and null reserved pointer; display-buffer setup takes a VideoOut handle, two buffer indices and reserved pointer, while adding a buffer takes an index and reserved pointer. `StartMultilayer2` takes a parameter pointer and 32-bit mode. Parameter fields remain incomplete. Protected bodies are unchanged.
[Work-memory queries, capture start, separate-mode open and crash-report cancellation](../../../core/libs/prx/libSceHmd/Export.cpp) consume no arguments in the supplied native implementation. The mirroring aspect debug setter takes five 16-bit values followed by a byte mode; the individual scalar meanings remain unresolved. These argument lists are confirmed; protected bodies remain unimplemented.