diff --git a/CMakeLists.txt b/CMakeLists.txt index 5f4899c67..9fb3e615f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -604,6 +604,8 @@ set(ZLIB_LIB src/core/libraries/zlib/zlib.cpp ) set(VR_LIBS src/core/libraries/hmd/hmd.cpp + src/core/libraries/hmd/hmd_reprojection.cpp + src/core/libraries/hmd/hmd_distortion.cpp src/core/libraries/hmd/hmd.h ) diff --git a/src/common/elf_info.h b/src/common/elf_info.h index 02b845cb5..2f2f150b2 100644 --- a/src/common/elf_info.h +++ b/src/common/elf_info.h @@ -85,6 +85,7 @@ public: static constexpr u32 FW_45 = 0x4500000; static constexpr u32 FW_50 = 0x5000000; static constexpr u32 FW_55 = 0x5500000; + static constexpr u32 FW_60 = 0x6000000; static constexpr u32 FW_80 = 0x8000000; static ElfInfo& Instance() { diff --git a/src/core/libraries/hmd/hmd.cpp b/src/core/libraries/hmd/hmd.cpp index 43c9cb5d5..17c88370d 100644 --- a/src/core/libraries/hmd/hmd.cpp +++ b/src/core/libraries/hmd/hmd.cpp @@ -1,135 +1,216 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "common/elf_info.h" #include "common/logging/log.h" #include "core/libraries/error_codes.h" #include "core/libraries/hmd/hmd.h" +#include "core/libraries/hmd/hmd_error.h" +#include "core/libraries/kernel/process.h" #include "core/libraries/libs.h" namespace Libraries::Hmd { -s32 PS4_SYSV_ABI sceHmdReprojectionStartMultilayer() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); +static bool g_library_initialized = false; +static s32 g_firmware_version = 0; +static s32 g_internal_handle = 0; +static Libraries::UserService::OrbisUserServiceUserId g_user_id = -1; + +s32 PS4_SYSV_ABI sceHmdInitialize(const OrbisHmdInitializeParam* param) { + if (g_library_initialized) { + return ORBIS_HMD_ERROR_ALREADY_INITIALIZED; + } + if (param == nullptr) { + return ORBIS_HMD_ERROR_PARAMETER_NULL; + } + LOG_WARNING(Lib_Hmd, "PSVR headsets are not supported yet"); + if (param->reserved0 != nullptr) { + sceHmdDistortionInitialize(param->reserved0); + } + g_library_initialized = true; return ORBIS_OK; } -s32 PS4_SYSV_ABI sceHmdDistortionGet2dVrCommand() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); +s32 PS4_SYSV_ABI sceHmdInitialize315(const OrbisHmdInitializeParam* param) { + if (g_library_initialized) { + return ORBIS_HMD_ERROR_ALREADY_INITIALIZED; + } + if (param == nullptr) { + return ORBIS_HMD_ERROR_PARAMETER_NULL; + } + LOG_WARNING(Lib_Hmd, "PSVR headsets are not supported yet"); + g_library_initialized = true; return ORBIS_OK; } -s32 PS4_SYSV_ABI sceHmdDistortionGetCompoundEyeCorrectionCommand() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); +s32 PS4_SYSV_ABI sceHmdOpen(Libraries::UserService::OrbisUserServiceUserId user_id, s32 type, + s32 index, OrbisHmdOpenParam* param) { + LOG_DEBUG(Lib_Hmd, "called"); + if (!g_library_initialized) { + return ORBIS_HMD_ERROR_NOT_INITIALIZED; + } + if (type != 0 || index != 0 || param != nullptr) { + return ORBIS_HMD_ERROR_PARAMETER_INVALID; + } + if (g_internal_handle != 0) { + return ORBIS_HMD_ERROR_ALREADY_OPENED; + } + if (user_id == Libraries::UserService::ORBIS_USER_SERVICE_USER_ID_INVALID || + user_id == Libraries::UserService::ORBIS_USER_SERVICE_USER_ID_SYSTEM) { + return ORBIS_HMD_ERROR_PARAMETER_INVALID; + } + + // Return positive value representing handle + g_user_id = user_id; + g_internal_handle = 1; + return g_internal_handle; +} + +s32 PS4_SYSV_ABI sceHmdGet2DEyeOffset(s32 handle, OrbisHmdEyeOffset* left_offset, + OrbisHmdEyeOffset* right_offset) { + LOG_DEBUG(Lib_Hmd, "called"); + if (!g_library_initialized) { + return ORBIS_HMD_ERROR_NOT_INITIALIZED; + } + if (handle != g_internal_handle) { + return ORBIS_HMD_ERROR_HANDLE_INVALID; + } + if (g_firmware_version >= Common::ElfInfo::FW_45) { + // Due to some faulty in-library checks, a missing headset results in this error + // instead of the expected ORBIS_HMD_ERROR_DEVICE_DISCONNECTED error. + return ORBIS_HMD_ERROR_HANDLE_INVALID; + } + if (left_offset == nullptr || right_offset == nullptr) { + return ORBIS_HMD_ERROR_PARAMETER_NULL; + } + + // Return default values + left_offset->offset_x = -0.0315; + left_offset->offset_y = 0; + left_offset->offset_z = 0; + right_offset->offset_x = 0.0315; + right_offset->offset_y = 0; + right_offset->offset_z = 0; + return ORBIS_OK; } -s32 PS4_SYSV_ABI sceHmdDistortionGetCorrectionCommand() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); +s32 PS4_SYSV_ABI sceHmdGetAssyError(void* data) { + LOG_DEBUG(Lib_Hmd, "called"); + if (data == nullptr) { + return ORBIS_HMD_ERROR_PARAMETER_NULL; + } + if (!g_library_initialized) { + return ORBIS_HMD_ERROR_NOT_INITIALIZED; + } + + return ORBIS_HMD_ERROR_DEVICE_DISCONNECTED; +} + +s32 PS4_SYSV_ABI sceHmdGetDeviceInformation(OrbisHmdDeviceInformation* info) { + LOG_DEBUG(Lib_Hmd, "called"); + if (info == nullptr) { + return ORBIS_HMD_ERROR_PARAMETER_NULL; + } + if (!g_library_initialized) { + return ORBIS_HMD_ERROR_NOT_INITIALIZED; + } + + memset(info, 0, sizeof(OrbisHmdDeviceInformation)); + info->status = OrbisHmdDeviceStatus::ORBIS_HMD_DEVICE_STATUS_NOT_DETECTED; + info->user_id = g_user_id; return ORBIS_OK; } -s32 PS4_SYSV_ABI sceHmdDistortionGetWideNearCorrectionCommand() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); +s32 PS4_SYSV_ABI sceHmdGetDeviceInformationByHandle(s32 handle, OrbisHmdDeviceInformation* info) { + LOG_DEBUG(Lib_Hmd, "called"); + if (handle != g_internal_handle) { + return ORBIS_HMD_ERROR_HANDLE_INVALID; + } + if (g_firmware_version >= Common::ElfInfo::FW_45) { + // Due to some faulty in-library checks, a missing headset results in this error + // instead of the expected ORBIS_HMD_ERROR_DEVICE_DISCONNECTED error. + return ORBIS_HMD_ERROR_HANDLE_INVALID; + } + if (info == nullptr) { + return ORBIS_HMD_ERROR_PARAMETER_NULL; + } + if (!g_library_initialized) { + return ORBIS_HMD_ERROR_NOT_INITIALIZED; + } + + memset(info, 0, sizeof(OrbisHmdDeviceInformation)); + info->status = OrbisHmdDeviceStatus::ORBIS_HMD_DEVICE_STATUS_NOT_DETECTED; + info->user_id = g_user_id; return ORBIS_OK; } -s32 PS4_SYSV_ABI sceHmdDistortionGetWorkMemoryAlign() { +s32 PS4_SYSV_ABI sceHmdGetFieldOfView(s32 handle, OrbisHmdFieldOfView* field_of_view) { + LOG_DEBUG(Lib_Hmd, "called"); + if (field_of_view == nullptr) { + return ORBIS_HMD_ERROR_PARAMETER_NULL; + } + if (handle != g_internal_handle) { + return ORBIS_HMD_ERROR_HANDLE_INVALID; + } + if (g_firmware_version >= Common::ElfInfo::FW_45) { + // Due to some faulty in-library checks, a missing headset results in this error + // instead of the expected ORBIS_HMD_ERROR_DEVICE_DISCONNECTED error. + return ORBIS_HMD_ERROR_HANDLE_INVALID; + } + if (!g_library_initialized) { + return ORBIS_HMD_ERROR_NOT_INITIALIZED; + } + + // These values are a hardcoded return when a headset is connected. + // Leaving this here for future developers. + // field_of_view->tan_out = 1.20743; + // field_of_view->tan_in = 1.181346; + // field_of_view->tan_top = 1.262872; + // field_of_view->tan_bottom = 1.262872; + + // Fails internally due to some internal library checks that break without a connected headset. + return ORBIS_HMD_ERROR_HANDLE_INVALID; +} + +s32 PS4_SYSV_ABI sceHmdGetInertialSensorData(s32 handle, void* data, s32 unk) { LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + if (!g_library_initialized) { + return ORBIS_HMD_ERROR_NOT_INITIALIZED; + } + if (handle != g_internal_handle) { + return ORBIS_HMD_ERROR_HANDLE_INVALID; + } + if (g_firmware_version >= Common::ElfInfo::FW_45) { + // Due to some faulty in-library checks, a missing headset results in this error + // instead of the expected ORBIS_HMD_ERROR_DEVICE_DISCONNECTED error. + return ORBIS_HMD_ERROR_HANDLE_INVALID; + } + + return ORBIS_HMD_ERROR_DEVICE_DISCONNECTED; +} + +s32 PS4_SYSV_ABI sceHmdClose(s32 handle) { + LOG_DEBUG(Lib_Hmd, "called"); + if (!g_library_initialized) { + return ORBIS_HMD_ERROR_NOT_INITIALIZED; + } + if (handle != g_internal_handle) { + return ORBIS_HMD_ERROR_HANDLE_INVALID; + } + + g_internal_handle = 0; + g_user_id = -1; return ORBIS_OK; } -s32 PS4_SYSV_ABI sceHmdDistortionGetWorkMemorySize() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdDistortionInitialize() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdDistortionSetOutputMinColor() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI Func_B26430EA74FC3DC0() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdClose() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdGet2DEyeOffset() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdGet2dVrCommand() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdGetAssyError() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdGetDeviceInformation() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdGetDeviceInformationByHandle() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdGetDistortionCorrectionCommand() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdGetDistortionParams() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdGetDistortionWorkMemoryAlign() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdGetDistortionWorkMemorySize() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdGetFieldOfView() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdGetInertialSensorData() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdGetWideNearDistortionCorrectionCommand() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdInitialize() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdInitialize315() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); +s32 PS4_SYSV_ABI sceHmdTerminate() { + LOG_DEBUG(Lib_Hmd, "called"); + if (!g_library_initialized) { + return ORBIS_HMD_ERROR_NOT_INITIALIZED; + } + sceHmdDistortionTerminate(); + g_library_initialized = false; return ORBIS_OK; } @@ -333,8 +414,13 @@ s32 PS4_SYSV_ABI sceHmdInternalGetDeviceInformationByHandle() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceHmdInternalGetDeviceStatus() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); +s32 PS4_SYSV_ABI sceHmdInternalGetDeviceStatus(OrbisHmdDeviceStatus* status) { + LOG_DEBUG(Lib_Hmd, "called"); + if (status == nullptr) { + return ORBIS_HMD_ERROR_PARAMETER_NULL; + } + // Internal function fails with error DEVICE_DISCONNECTED + *status = OrbisHmdDeviceStatus::ORBIS_HMD_DEVICE_STATUS_NOT_DETECTED; return ORBIS_OK; } @@ -479,8 +565,9 @@ s32 PS4_SYSV_ABI sceHmdInternalMmapGetSensorCalibrationData() { } s32 PS4_SYSV_ABI sceHmdInternalMmapIsConnect() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; + LOG_DEBUG(Lib_Hmd, "called"); + // Returns 0 when device is disconnected. + return 0; } s32 PS4_SYSV_ABI sceHmdInternalPushVr2dData() { @@ -683,167 +770,6 @@ s32 PS4_SYSV_ABI sceHmdInternalSocialScreenSetOutput() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceHmdOpen() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionAddDisplayBuffer() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionClearUserEventEnd() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionClearUserEventStart() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionDebugGetLastInfo() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionDebugGetLastInfoMultilayer() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionFinalize() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionFinalizeCapture() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionInitialize() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionInitializeCapture() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionQueryGarlicBuffAlign() { - return 0x100; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionQueryGarlicBuffSize() { - return 0x100000; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionQueryOnionBuffAlign() { - return 0x100; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionQueryOnionBuffSize() { - return 0x810; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionSetCallback() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionSetDisplayBuffers() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionSetOutputMinColor() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionSetUserEventEnd() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionSetUserEventStart() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionStart() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionStart2dVr() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionStartCapture() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionStartLiveCapture() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionStartMultilayer2() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionStartWideNear() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionStartWideNearWithOverlay() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionStartWithOverlay() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionStop() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionStopCapture() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionStopLiveCapture() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionUnsetCallback() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdReprojectionUnsetDisplayBuffers() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceHmdTerminate() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - s32 PS4_SYSV_ABI Func_202D0D1A687FCD2F() { LOG_ERROR(Lib_Hmd, "(STUBBED) called"); return ORBIS_OK; @@ -864,9 +790,21 @@ s32 PS4_SYSV_ABI Func_63D403167DC08CF0() { return ORBIS_OK; } -s32 PS4_SYSV_ABI Func_69383B2B4E3AEABF() { +s32 PS4_SYSV_ABI Func_69383B2B4E3AEABF(s32 handle, void* data, s32 unk) { LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; + if (!g_library_initialized) { + return ORBIS_HMD_ERROR_NOT_INITIALIZED; + } + if (handle != g_internal_handle) { + return ORBIS_HMD_ERROR_HANDLE_INVALID; + } + if (g_firmware_version >= Common::ElfInfo::FW_45) { + // Due to some faulty in-library checks, a missing headset results in this error + // instead of the expected ORBIS_HMD_ERROR_DEVICE_DISCONNECTED error. + return ORBIS_HMD_ERROR_HANDLE_INVALID; + } + + return ORBIS_HMD_ERROR_DEVICE_DISCONNECTED; } s32 PS4_SYSV_ABI Func_791560C32F4F6D68() { @@ -885,17 +823,12 @@ s32 PS4_SYSV_ABI Func_9952277839236BA7() { } s32 PS4_SYSV_ABI Func_9A276E739E54EEAF() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + // Stubbed on real hardware. return ORBIS_OK; } s32 PS4_SYSV_ABI Func_9E501994E289CBE7() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI Func_A31A0320D80EAD99() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + // Stubbed on real hardware. return ORBIS_OK; } @@ -910,7 +843,7 @@ s32 PS4_SYSV_ABI Func_A92D7C23AC364993() { } s32 PS4_SYSV_ABI Func_ADCCC25CB876FDBE() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + // Stubbed on real hardware. return ORBIS_OK; } @@ -919,16 +852,6 @@ s32 PS4_SYSV_ABI Func_B16652641FE69F0E() { return ORBIS_OK; } -s32 PS4_SYSV_ABI Func_B614F290B67FB59B() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI Func_B9A6FA0735EC7E49() { - LOG_ERROR(Lib_Hmd, "(STUBBED) called"); - return ORBIS_OK; -} - s32 PS4_SYSV_ABI Func_FC193BD653F2AF2E() { LOG_ERROR(Lib_Hmd, "(STUBBED) called"); return ORBIS_OK; @@ -940,43 +863,15 @@ s32 PS4_SYSV_ABI Func_FF2E0E53015FE231() { } void RegisterLib(Core::Loader::SymbolsResolver* sym) { - LIB_FUNCTION("8gH1aLgty5I", "libsceHmdReprojectionMultilayer", 1, "libSceHmd", 1, 1, - sceHmdReprojectionStartMultilayer); - LIB_FUNCTION("gEokC+OGI8g", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, - sceHmdDistortionGet2dVrCommand); - LIB_FUNCTION("ER2ar8yUmbk", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, - sceHmdDistortionGetCompoundEyeCorrectionCommand); - LIB_FUNCTION("HT8qWOTOGmo", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, - sceHmdDistortionGetCorrectionCommand); - LIB_FUNCTION("Vkkhy8RFIuk", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, - sceHmdDistortionGetWideNearCorrectionCommand); - LIB_FUNCTION("1cS7W5J-v3k", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, - sceHmdDistortionGetWorkMemoryAlign); - LIB_FUNCTION("36xDKk+Hw7o", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, - sceHmdDistortionGetWorkMemorySize); - LIB_FUNCTION("ao8NZ+FRYJE", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, - sceHmdDistortionInitialize); - LIB_FUNCTION("8A4T5ahi790", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, - sceHmdDistortionSetOutputMinColor); - LIB_FUNCTION("smQw6nT8PcA", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, Func_B26430EA74FC3DC0); + Libraries::Kernel::sceKernelGetCompiledSdkVersion(&g_firmware_version); LIB_FUNCTION("6biw1XHTSqQ", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdClose); LIB_FUNCTION("BWY-qKM5hxE", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGet2DEyeOffset); - LIB_FUNCTION("za4xJfzCBcM", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGet2dVrCommand); LIB_FUNCTION("Yx+CuF11D3Q", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGetAssyError); LIB_FUNCTION("thDt9upZlp8", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGetDeviceInformation); LIB_FUNCTION("1pxQfif1rkE", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGetDeviceInformationByHandle); - LIB_FUNCTION("grCYks4m8Jw", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdGetDistortionCorrectionCommand); - LIB_FUNCTION("mP2ZcYmDg-o", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGetDistortionParams); - LIB_FUNCTION("8Ick-e6cDVY", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdGetDistortionWorkMemoryAlign); - LIB_FUNCTION("D5JfdpJKvXk", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdGetDistortionWorkMemorySize); LIB_FUNCTION("NPQwYFqi0bs", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGetFieldOfView); LIB_FUNCTION("rU3HK9Q0r8o", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGetInertialSensorData); - LIB_FUNCTION("goi5ASvH-V8", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdGetWideNearDistortionCorrectionCommand); LIB_FUNCTION("K4KnH0QkT2c", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInitialize); LIB_FUNCTION("s-J66ar9g50", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInitialize315); LIB_FUNCTION("riPQfAdebHk", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternal3dAudioClose); @@ -1044,6 +939,7 @@ void RegisterLib(Core::Loader::SymbolsResolver* sym) { sceHmdInternalGetHmuPowerStatusForDebug); LIB_FUNCTION("UhFPniZvm8U", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetHmuSerialNumber); + LIB_FUNCTION("aTg7K0466r8", "libSceHmd", 1, "libSceHmd", 1, 1, Func_69383B2B4E3AEABF); LIB_FUNCTION("9exeDpk7JU8", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetIPD); LIB_FUNCTION("yNtYRsxZ6-A", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetIpdSettingEnableForSystemService); @@ -1140,80 +1036,25 @@ void RegisterLib(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("-6FjKlMA+Yc", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSocialScreenSetOutput); LIB_FUNCTION("d2g5Ij7EUzo", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdOpen); - LIB_FUNCTION("NTIbBpSH9ik", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionAddDisplayBuffer); - LIB_FUNCTION("94+Ggm38KCg", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionClearUserEventEnd); - LIB_FUNCTION("mdyFbaJj66M", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionClearUserEventStart); - LIB_FUNCTION("MdV0akauNow", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionDebugGetLastInfo); - LIB_FUNCTION("ymiwVjPB5+k", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionDebugGetLastInfoMultilayer); - LIB_FUNCTION("ZrV5YIqD09I", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionFinalize); - LIB_FUNCTION("utHD2Ab-Ixo", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionFinalizeCapture); - LIB_FUNCTION("OuygGEWkins", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionInitialize); - LIB_FUNCTION("BTrQnC6fcAk", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionInitializeCapture); - LIB_FUNCTION("TkcANcGM0s8", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionQueryGarlicBuffAlign); - LIB_FUNCTION("z0KtN1vqF2E", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionQueryGarlicBuffSize); - LIB_FUNCTION("IWybWbR-xvA", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionQueryOnionBuffAlign); - LIB_FUNCTION("kLUAkN6a1e8", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionQueryOnionBuffSize); - LIB_FUNCTION("6CRWGc-evO4", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionSetCallback); - LIB_FUNCTION("E+dPfjeQLHI", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionSetDisplayBuffers); - LIB_FUNCTION("LjdLRysHU6Y", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionSetOutputMinColor); - LIB_FUNCTION("knyIhlkpLgE", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionSetUserEventEnd); - LIB_FUNCTION("7as0CjXW1B8", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionSetUserEventStart); - LIB_FUNCTION("dntZTJ7meIU", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStart); - LIB_FUNCTION("q3e8+nEguyE", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStart2dVr); - LIB_FUNCTION("RrvyU1pjb9A", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStartCapture); - LIB_FUNCTION("XZ5QUzb4ae0", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionStartLiveCapture); - LIB_FUNCTION("8gH1aLgty5I", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionStartMultilayer); - LIB_FUNCTION("gqAG7JYeE7A", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionStartMultilayer2); - LIB_FUNCTION("3JyuejcNhC0", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStartWideNear); - LIB_FUNCTION("mKa8scOc4-k", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionStartWideNearWithOverlay); - LIB_FUNCTION("kcldQ7zLYQQ", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionStartWithOverlay); - LIB_FUNCTION("vzMEkwBQciM", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStop); - LIB_FUNCTION("F7Sndm5teWw", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStopCapture); - LIB_FUNCTION("PAa6cUL5bR4", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionStopLiveCapture); - LIB_FUNCTION("0wnZViigP9o", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionUnsetCallback); - LIB_FUNCTION("iGNNpDDjcwo", "libSceHmd", 1, "libSceHmd", 1, 1, - sceHmdReprojectionUnsetDisplayBuffers); LIB_FUNCTION("z-RMILqP6tE", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdTerminate); LIB_FUNCTION("IC0NGmh-zS8", "libSceHmd", 1, "libSceHmd", 1, 1, Func_202D0D1A687FCD2F); LIB_FUNCTION("NY2-gYo9ihI", "libSceHmd", 1, "libSceHmd", 1, 1, Func_358DBF818A3D8A12); LIB_FUNCTION("XMutp2-o9A4", "libSceHmd", 1, "libSceHmd", 1, 1, Func_5CCBADA76FE8F40E); LIB_FUNCTION("Y9QDFn3AjPA", "libSceHmd", 1, "libSceHmd", 1, 1, Func_63D403167DC08CF0); - LIB_FUNCTION("aTg7K0466r8", "libSceHmd", 1, "libSceHmd", 1, 1, Func_69383B2B4E3AEABF); LIB_FUNCTION("eRVgwy9PbWg", "libSceHmd", 1, "libSceHmd", 1, 1, Func_791560C32F4F6D68); LIB_FUNCTION("fJVZYeqFttM", "libSceHmd", 1, "libSceHmd", 1, 1, Func_7C955961EA85B6D3); LIB_FUNCTION("mVIneDkja6c", "libSceHmd", 1, "libSceHmd", 1, 1, Func_9952277839236BA7); LIB_FUNCTION("miduc55U7q8", "libSceHmd", 1, "libSceHmd", 1, 1, Func_9A276E739E54EEAF); LIB_FUNCTION("nlAZlOKJy+c", "libSceHmd", 1, "libSceHmd", 1, 1, Func_9E501994E289CBE7); - LIB_FUNCTION("oxoDINgOrZk", "libSceHmd", 1, "libSceHmd", 1, 1, Func_A31A0320D80EAD99); LIB_FUNCTION("ox9NqLO9LhI", "libSceHmd", 1, "libSceHmd", 1, 1, Func_A31F4DA8B3BD2E12); LIB_FUNCTION("qS18I6w2SZM", "libSceHmd", 1, "libSceHmd", 1, 1, Func_A92D7C23AC364993); LIB_FUNCTION("rczCXLh2-b4", "libSceHmd", 1, "libSceHmd", 1, 1, Func_ADCCC25CB876FDBE); LIB_FUNCTION("sWZSZB-mnw4", "libSceHmd", 1, "libSceHmd", 1, 1, Func_B16652641FE69F0E); - LIB_FUNCTION("thTykLZ-tZs", "libSceHmd", 1, "libSceHmd", 1, 1, Func_B614F290B67FB59B); - LIB_FUNCTION("uab6BzXsfkk", "libSceHmd", 1, "libSceHmd", 1, 1, Func_B9A6FA0735EC7E49); LIB_FUNCTION("-Bk71lPyry4", "libSceHmd", 1, "libSceHmd", 1, 1, Func_FC193BD653F2AF2E); LIB_FUNCTION("-y4OUwFf4jE", "libSceHmd", 1, "libSceHmd", 1, 1, Func_FF2E0E53015FE231); + + RegisterDistortion(sym); + RegisterReprojection(sym); }; } // namespace Libraries::Hmd \ No newline at end of file diff --git a/src/core/libraries/hmd/hmd.h b/src/core/libraries/hmd/hmd.h index 1f1455989..67ee6c1d8 100644 --- a/src/core/libraries/hmd/hmd.h +++ b/src/core/libraries/hmd/hmd.h @@ -4,6 +4,7 @@ #pragma once #include "common/types.h" +#include "core/libraries/system/userservice.h" namespace Core::Loader { class SymbolsResolver; @@ -11,31 +12,125 @@ class SymbolsResolver; namespace Libraries::Hmd { +enum OrbisHmdDeviceStatus : u32 { + ORBIS_HMD_DEVICE_STATUS_READY, + ORBIS_HMD_DEVICE_STATUS_NOT_READY, + ORBIS_HMD_DEVICE_STATUS_NOT_DETECTED, + ORBIS_HMD_DEVICE_STATUS_NOT_READY_HMU_DISCONNECT, +}; + +struct OrbisHmdInitializeParam { + void* reserved0; + u8 reserved[8]; +}; + +struct OrbisHmdOpenParam { + u8 reserve[32]; +}; + +struct OrbisHmdFieldOfView { + float tan_out; + float tan_in; + float tan_top; + float tan_bottom; +}; + +struct OrbisHmdPanelResolution { + u32 width; + u32 height; +}; + +struct OrbisHmdFlipToDisplayLatency { + u16 refresh_rate_90hz; + u16 refresh_rate_120hz; +}; + +struct OrbisHmdDeviceInfo { + OrbisHmdPanelResolution panel_resolution; + OrbisHmdFlipToDisplayLatency flip_to_display_latency; +}; + +struct OrbisHmdDeviceInformation { + OrbisHmdDeviceStatus status; + Libraries::UserService::OrbisUserServiceUserId user_id; + u8 reserve0[4]; + OrbisHmdDeviceInfo device_info; + u8 hmu_mount; + u8 reserve1[7]; +}; + +struct OrbisHmdEyeOffset { + float offset_x; + float offset_y; + float offset_z; + u8 reserve[20]; +}; + +// Reprojection s32 PS4_SYSV_ABI sceHmdReprojectionStartMultilayer(); +s32 PS4_SYSV_ABI sceHmdReprojectionAddDisplayBuffer(); +s32 PS4_SYSV_ABI sceHmdReprojectionClearUserEventEnd(); +s32 PS4_SYSV_ABI sceHmdReprojectionClearUserEventStart(); +s32 PS4_SYSV_ABI sceHmdReprojectionDebugGetLastInfo(); +s32 PS4_SYSV_ABI sceHmdReprojectionDebugGetLastInfoMultilayer(); +s32 PS4_SYSV_ABI sceHmdReprojectionFinalize(); +s32 PS4_SYSV_ABI sceHmdReprojectionFinalizeCapture(); +s32 PS4_SYSV_ABI sceHmdReprojectionInitialize(); +s32 PS4_SYSV_ABI sceHmdReprojectionInitializeCapture(); +s32 PS4_SYSV_ABI sceHmdReprojectionQueryGarlicBuffAlign(); +s32 PS4_SYSV_ABI sceHmdReprojectionQueryGarlicBuffSize(); +s32 PS4_SYSV_ABI sceHmdReprojectionQueryOnionBuffAlign(); +s32 PS4_SYSV_ABI sceHmdReprojectionQueryOnionBuffSize(); +s32 PS4_SYSV_ABI sceHmdReprojectionSetCallback(); +s32 PS4_SYSV_ABI sceHmdReprojectionSetDisplayBuffers(); +s32 PS4_SYSV_ABI sceHmdReprojectionSetOutputMinColor(); +s32 PS4_SYSV_ABI sceHmdReprojectionSetUserEventEnd(); +s32 PS4_SYSV_ABI sceHmdReprojectionSetUserEventStart(); +s32 PS4_SYSV_ABI sceHmdReprojectionStart(); +s32 PS4_SYSV_ABI sceHmdReprojectionStart2dVr(); +s32 PS4_SYSV_ABI sceHmdReprojectionStartCapture(); +s32 PS4_SYSV_ABI sceHmdReprojectionStartLiveCapture(); +s32 PS4_SYSV_ABI sceHmdReprojectionStartMultilayer2(); +s32 PS4_SYSV_ABI sceHmdReprojectionStartWideNear(); +s32 PS4_SYSV_ABI sceHmdReprojectionStartWideNearWithOverlay(); +s32 PS4_SYSV_ABI sceHmdReprojectionStartWithOverlay(); +s32 PS4_SYSV_ABI sceHmdReprojectionStop(); +s32 PS4_SYSV_ABI sceHmdReprojectionStopCapture(); +s32 PS4_SYSV_ABI sceHmdReprojectionStopLiveCapture(); +s32 PS4_SYSV_ABI sceHmdReprojectionUnsetCallback(); +s32 PS4_SYSV_ABI sceHmdReprojectionUnsetDisplayBuffers(); + +// Distortion s32 PS4_SYSV_ABI sceHmdDistortionGet2dVrCommand(); s32 PS4_SYSV_ABI sceHmdDistortionGetCompoundEyeCorrectionCommand(); s32 PS4_SYSV_ABI sceHmdDistortionGetCorrectionCommand(); s32 PS4_SYSV_ABI sceHmdDistortionGetWideNearCorrectionCommand(); s32 PS4_SYSV_ABI sceHmdDistortionGetWorkMemoryAlign(); s32 PS4_SYSV_ABI sceHmdDistortionGetWorkMemorySize(); -s32 PS4_SYSV_ABI sceHmdDistortionInitialize(); +s32 PS4_SYSV_ABI sceHmdDistortionInitialize(void* reserved); s32 PS4_SYSV_ABI sceHmdDistortionSetOutputMinColor(); -s32 PS4_SYSV_ABI Func_B26430EA74FC3DC0(); -s32 PS4_SYSV_ABI sceHmdClose(); -s32 PS4_SYSV_ABI sceHmdGet2DEyeOffset(); -s32 PS4_SYSV_ABI sceHmdGet2dVrCommand(); -s32 PS4_SYSV_ABI sceHmdGetAssyError(); -s32 PS4_SYSV_ABI sceHmdGetDeviceInformation(); -s32 PS4_SYSV_ABI sceHmdGetDeviceInformationByHandle(); -s32 PS4_SYSV_ABI sceHmdGetDistortionCorrectionCommand(); +s32 PS4_SYSV_ABI sceHmdDistortionTerminate(); s32 PS4_SYSV_ABI sceHmdGetDistortionParams(); -s32 PS4_SYSV_ABI sceHmdGetDistortionWorkMemoryAlign(); -s32 PS4_SYSV_ABI sceHmdGetDistortionWorkMemorySize(); -s32 PS4_SYSV_ABI sceHmdGetFieldOfView(); -s32 PS4_SYSV_ABI sceHmdGetInertialSensorData(); -s32 PS4_SYSV_ABI sceHmdGetWideNearDistortionCorrectionCommand(); -s32 PS4_SYSV_ABI sceHmdInitialize(); -s32 PS4_SYSV_ABI sceHmdInitialize315(); +s32 PS4_SYSV_ABI Func_B26430EA74FC3DC0(); +s32 PS4_SYSV_ABI Func_B614F290B67FB59B(); + +// libSceHmd +s32 PS4_SYSV_ABI sceHmdClose(s32 handle); +s32 PS4_SYSV_ABI sceHmdGet2DEyeOffset(s32 handle, OrbisHmdEyeOffset* left_offset, + OrbisHmdEyeOffset* right_offset); +s32 PS4_SYSV_ABI sceHmdGetAssyError(void* data); +s32 PS4_SYSV_ABI sceHmdGetDeviceInformation(OrbisHmdDeviceInformation* info); +s32 PS4_SYSV_ABI sceHmdGetDeviceInformationByHandle(s32 handle, OrbisHmdDeviceInformation* info); + +s32 PS4_SYSV_ABI sceHmdGetFieldOfView(s32 handle, OrbisHmdFieldOfView* field_of_view); +s32 PS4_SYSV_ABI sceHmdGetInertialSensorData(s32 handle, void* data, s32 unk); +s32 PS4_SYSV_ABI sceHmdInitialize(const OrbisHmdInitializeParam* param); +s32 PS4_SYSV_ABI sceHmdInitialize315(const OrbisHmdInitializeParam* param); +s32 PS4_SYSV_ABI sceHmdOpen(Libraries::UserService::OrbisUserServiceUserId user_id, s32 type, + s32 index, OrbisHmdOpenParam* param); +s32 PS4_SYSV_ABI sceHmdTerminate(); + +// Internal s32 PS4_SYSV_ABI sceHmdInternal3dAudioClose(); s32 PS4_SYSV_ABI sceHmdInternal3dAudioOpen(); s32 PS4_SYSV_ABI sceHmdInternal3dAudioSendData(); @@ -76,7 +171,7 @@ s32 PS4_SYSV_ABI sceHmdInternalGetDefaultLedData(); s32 PS4_SYSV_ABI sceHmdInternalGetDemoMode(); s32 PS4_SYSV_ABI sceHmdInternalGetDeviceInformation(); s32 PS4_SYSV_ABI sceHmdInternalGetDeviceInformationByHandle(); -s32 PS4_SYSV_ABI sceHmdInternalGetDeviceStatus(); +s32 PS4_SYSV_ABI sceHmdInternalGetDeviceStatus(OrbisHmdDeviceStatus* status); s32 PS4_SYSV_ABI sceHmdInternalGetEyeStatus(); s32 PS4_SYSV_ABI sceHmdInternalGetHmuOpticalParam(); s32 PS4_SYSV_ABI sceHmdInternalGetHmuPowerStatusForDebug(); @@ -146,44 +241,12 @@ s32 PS4_SYSV_ABI sceHmdInternalSetVRMode(); s32 PS4_SYSV_ABI sceHmdInternalSocialScreenGetFadeState(); s32 PS4_SYSV_ABI sceHmdInternalSocialScreenSetFadeAndSwitch(); s32 PS4_SYSV_ABI sceHmdInternalSocialScreenSetOutput(); -s32 PS4_SYSV_ABI sceHmdOpen(); -s32 PS4_SYSV_ABI sceHmdReprojectionAddDisplayBuffer(); -s32 PS4_SYSV_ABI sceHmdReprojectionClearUserEventEnd(); -s32 PS4_SYSV_ABI sceHmdReprojectionClearUserEventStart(); -s32 PS4_SYSV_ABI sceHmdReprojectionDebugGetLastInfo(); -s32 PS4_SYSV_ABI sceHmdReprojectionDebugGetLastInfoMultilayer(); -s32 PS4_SYSV_ABI sceHmdReprojectionFinalize(); -s32 PS4_SYSV_ABI sceHmdReprojectionFinalizeCapture(); -s32 PS4_SYSV_ABI sceHmdReprojectionInitialize(); -s32 PS4_SYSV_ABI sceHmdReprojectionInitializeCapture(); -s32 PS4_SYSV_ABI sceHmdReprojectionQueryGarlicBuffAlign(); -s32 PS4_SYSV_ABI sceHmdReprojectionQueryGarlicBuffSize(); -s32 PS4_SYSV_ABI sceHmdReprojectionQueryOnionBuffAlign(); -s32 PS4_SYSV_ABI sceHmdReprojectionQueryOnionBuffSize(); -s32 PS4_SYSV_ABI sceHmdReprojectionSetCallback(); -s32 PS4_SYSV_ABI sceHmdReprojectionSetDisplayBuffers(); -s32 PS4_SYSV_ABI sceHmdReprojectionSetOutputMinColor(); -s32 PS4_SYSV_ABI sceHmdReprojectionSetUserEventEnd(); -s32 PS4_SYSV_ABI sceHmdReprojectionSetUserEventStart(); -s32 PS4_SYSV_ABI sceHmdReprojectionStart(); -s32 PS4_SYSV_ABI sceHmdReprojectionStart2dVr(); -s32 PS4_SYSV_ABI sceHmdReprojectionStartCapture(); -s32 PS4_SYSV_ABI sceHmdReprojectionStartLiveCapture(); -s32 PS4_SYSV_ABI sceHmdReprojectionStartMultilayer2(); -s32 PS4_SYSV_ABI sceHmdReprojectionStartWideNear(); -s32 PS4_SYSV_ABI sceHmdReprojectionStartWideNearWithOverlay(); -s32 PS4_SYSV_ABI sceHmdReprojectionStartWithOverlay(); -s32 PS4_SYSV_ABI sceHmdReprojectionStop(); -s32 PS4_SYSV_ABI sceHmdReprojectionStopCapture(); -s32 PS4_SYSV_ABI sceHmdReprojectionStopLiveCapture(); -s32 PS4_SYSV_ABI sceHmdReprojectionUnsetCallback(); -s32 PS4_SYSV_ABI sceHmdReprojectionUnsetDisplayBuffers(); -s32 PS4_SYSV_ABI sceHmdTerminate(); + s32 PS4_SYSV_ABI Func_202D0D1A687FCD2F(); s32 PS4_SYSV_ABI Func_358DBF818A3D8A12(); s32 PS4_SYSV_ABI Func_5CCBADA76FE8F40E(); s32 PS4_SYSV_ABI Func_63D403167DC08CF0(); -s32 PS4_SYSV_ABI Func_69383B2B4E3AEABF(); +s32 PS4_SYSV_ABI Func_69383B2B4E3AEABF(s32 handle, void* data, s32 unk); s32 PS4_SYSV_ABI Func_791560C32F4F6D68(); s32 PS4_SYSV_ABI Func_7C955961EA85B6D3(); s32 PS4_SYSV_ABI Func_9952277839236BA7(); @@ -194,10 +257,11 @@ s32 PS4_SYSV_ABI Func_A31F4DA8B3BD2E12(); s32 PS4_SYSV_ABI Func_A92D7C23AC364993(); s32 PS4_SYSV_ABI Func_ADCCC25CB876FDBE(); s32 PS4_SYSV_ABI Func_B16652641FE69F0E(); -s32 PS4_SYSV_ABI Func_B614F290B67FB59B(); s32 PS4_SYSV_ABI Func_B9A6FA0735EC7E49(); s32 PS4_SYSV_ABI Func_FC193BD653F2AF2E(); s32 PS4_SYSV_ABI Func_FF2E0E53015FE231(); +void RegisterDistortion(Core::Loader::SymbolsResolver* sym); +void RegisterReprojection(Core::Loader::SymbolsResolver* sym); void RegisterLib(Core::Loader::SymbolsResolver* sym); } // namespace Libraries::Hmd \ No newline at end of file diff --git a/src/core/libraries/hmd/hmd_distortion.cpp b/src/core/libraries/hmd/hmd_distortion.cpp new file mode 100644 index 000000000..37d0b2824 --- /dev/null +++ b/src/core/libraries/hmd/hmd_distortion.cpp @@ -0,0 +1,107 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/hmd/hmd.h" +#include "core/libraries/hmd/hmd_error.h" +#include "core/libraries/libs.h" + +namespace Libraries::Hmd { + +static bool g_library_initialized = false; + +s32 PS4_SYSV_ABI sceHmdDistortionInitialize(void* reserved) { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + g_library_initialized = true; + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionGet2dVrCommand() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionGetCompoundEyeCorrectionCommand() { + // Stubbed on real hardware. + return ORBIS_HMD_ERROR_PARAMETER_INVALID; +} + +s32 PS4_SYSV_ABI sceHmdDistortionGetCorrectionCommand() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionGetWideNearCorrectionCommand() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionGetWorkMemoryAlign() { + return 0x400; +} + +s32 PS4_SYSV_ABI sceHmdDistortionGetWorkMemorySize() { + return 0x20000; +} + +s32 PS4_SYSV_ABI sceHmdDistortionSetOutputMinColor() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_B26430EA74FC3DC0() { + // Stubbed on real hardware. + return ORBIS_HMD_ERROR_PARAMETER_INVALID; +} + +s32 PS4_SYSV_ABI sceHmdGetDistortionParams() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionTerminate() { + // Internal (non-exported) library function for terminating the distortion sub-library. + if (!g_library_initialized) { + return ORBIS_HMD_ERROR_NOT_INITIALIZED; + } + g_library_initialized = false; + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_B614F290B67FB59B() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterDistortion(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("gEokC+OGI8g", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionGet2dVrCommand); + LIB_FUNCTION("za4xJfzCBcM", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdDistortionGet2dVrCommand); + LIB_FUNCTION("ER2ar8yUmbk", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetCompoundEyeCorrectionCommand); + LIB_FUNCTION("HT8qWOTOGmo", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetCorrectionCommand); + LIB_FUNCTION("grCYks4m8Jw", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetCorrectionCommand); + LIB_FUNCTION("Vkkhy8RFIuk", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetWideNearCorrectionCommand); + LIB_FUNCTION("goi5ASvH-V8", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetWideNearCorrectionCommand); + LIB_FUNCTION("1cS7W5J-v3k", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetWorkMemoryAlign); + LIB_FUNCTION("8Ick-e6cDVY", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetWorkMemoryAlign); + LIB_FUNCTION("36xDKk+Hw7o", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetWorkMemorySize); + LIB_FUNCTION("D5JfdpJKvXk", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetWorkMemorySize); + LIB_FUNCTION("ao8NZ+FRYJE", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionInitialize); + LIB_FUNCTION("8A4T5ahi790", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionSetOutputMinColor); + LIB_FUNCTION("mP2ZcYmDg-o", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGetDistortionParams); + LIB_FUNCTION("smQw6nT8PcA", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, Func_B26430EA74FC3DC0); + LIB_FUNCTION("thTykLZ-tZs", "libSceHmd", 1, "libSceHmd", 1, 1, Func_B614F290B67FB59B); +} +} // namespace Libraries::Hmd \ No newline at end of file diff --git a/src/core/libraries/hmd/hmd_error.h b/src/core/libraries/hmd/hmd_error.h new file mode 100644 index 000000000..8e6a7f753 --- /dev/null +++ b/src/core/libraries/hmd/hmd_error.h @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +constexpr int ORBIS_HMD_ERROR_ALREADY_INITIALIZED = 0x81110001; +constexpr int ORBIS_HMD_ERROR_NOT_INITIALIZED = 0x81110002; +constexpr int ORBIS_HMD_ERROR_HANDLE_INVALID = 0x81110003; +constexpr int ORBIS_HMD_ERROR_DEVICE_DISCONNECTED = 0x81110004; +constexpr int ORBIS_HMD_ERROR_WRONG_ID = 0x81110005; +constexpr int ORBIS_HMD_ERROR_ALREADY_OPENED = 0x81110006; +constexpr int ORBIS_HMD_ERROR_INSUFFICIENT_RESOURCE = 0x81110007; +constexpr int ORBIS_HMD_ERROR_PARAMETER_NULL = 0x81110008; +constexpr int ORBIS_HMD_ERROR_PARAMETER_INVALID = 0x81110009; +constexpr int ORBIS_HMD_ERROR_NO_2D_DISTORTION_MAP_MEMORY = 0x8111000A; +constexpr int ORBIS_HMD_ERROR_2D_DISTORTION_MAP_INITIALIZATION_ERROR = 0x8111000B; +constexpr int ORBIS_HMD_ERROR_REPROJECTION_NOT_INITIALIZED = 0x8111000C; +constexpr int ORBIS_HMD_ERROR_REPROJECTION_ALREADY_INITIALIZED = 0x8111000D; +constexpr int ORBIS_HMD_ERROR_REPROJECTION_HMD_NOT_READY = 0x8111000E; +constexpr int ORBIS_HMD_ERROR_REPROJECTION_NO_DISPLAY_BUFFER = 0x8111000F; +constexpr int ORBIS_HMD_ERROR_REPROJECTION_WRONG_DISPLAY_BUFFER = 0x81110010; +constexpr int ORBIS_HMD_ERROR_REPROJECTION_DISPLAY_BUFFER_BUSY = 0x81110011; +constexpr int ORBIS_HMD_ERROR_REPROJECTION_RESOURCE_ALREADY_SET = 0x81110012; +constexpr int ORBIS_HMD_ERROR_REPROJECTION_RESOURCE_NOT_SET = 0x81110013; +constexpr int ORBIS_HMD_ERROR_REPROJECTION_THREAD_NOT_WORKING = 0x81110014; +constexpr int ORBIS_HMD_ERROR_REPROJECTION_NEVER_PROCESSED = 0x81110015; +constexpr int ORBIS_HMD_ERROR_UNSUPPORTED_FEATURE = 0x81110016; \ No newline at end of file diff --git a/src/core/libraries/hmd/hmd_reprojection.cpp b/src/core/libraries/hmd/hmd_reprojection.cpp new file mode 100644 index 000000000..a203a88b1 --- /dev/null +++ b/src/core/libraries/hmd/hmd_reprojection.cpp @@ -0,0 +1,238 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/hmd/hmd.h" +#include "core/libraries/hmd/hmd_error.h" +#include "core/libraries/libs.h" + +namespace Libraries::Hmd { + +s32 PS4_SYSV_ABI sceHmdReprojectionStartMultilayer() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionAddDisplayBuffer() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionClearUserEventEnd() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionClearUserEventStart() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionDebugGetLastInfo() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionDebugGetLastInfoMultilayer() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionFinalize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionFinalizeCapture() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionInitialize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionInitializeCapture() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionQueryGarlicBuffAlign() { + return 0x100; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionQueryGarlicBuffSize() { + return 0x100000; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionQueryOnionBuffAlign() { + return 0x100; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionQueryOnionBuffSize() { + return 0x810; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionSetCallback() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionSetDisplayBuffers() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionSetOutputMinColor() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionSetUserEventEnd() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionSetUserEventStart() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStart() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStart2dVr() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStartCapture() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStartLiveCapture() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStartMultilayer2() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStartWideNear() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStartWideNearWithOverlay() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStartWithOverlay() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStop() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStopCapture() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStopLiveCapture() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionUnsetCallback() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionUnsetDisplayBuffers() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_A31A0320D80EAD99() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_B9A6FA0735EC7E49() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterReprojection(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("8gH1aLgty5I", "libsceHmdReprojectionMultilayer", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStartMultilayer); + LIB_FUNCTION("NTIbBpSH9ik", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionAddDisplayBuffer); + LIB_FUNCTION("94+Ggm38KCg", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionClearUserEventEnd); + LIB_FUNCTION("mdyFbaJj66M", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionClearUserEventStart); + LIB_FUNCTION("MdV0akauNow", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionDebugGetLastInfo); + LIB_FUNCTION("ymiwVjPB5+k", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionDebugGetLastInfoMultilayer); + LIB_FUNCTION("ZrV5YIqD09I", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionFinalize); + LIB_FUNCTION("utHD2Ab-Ixo", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionFinalizeCapture); + LIB_FUNCTION("OuygGEWkins", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionInitialize); + LIB_FUNCTION("BTrQnC6fcAk", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionInitializeCapture); + LIB_FUNCTION("TkcANcGM0s8", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionQueryGarlicBuffAlign); + LIB_FUNCTION("z0KtN1vqF2E", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionQueryGarlicBuffSize); + LIB_FUNCTION("IWybWbR-xvA", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionQueryOnionBuffAlign); + LIB_FUNCTION("kLUAkN6a1e8", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionQueryOnionBuffSize); + LIB_FUNCTION("6CRWGc-evO4", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionSetCallback); + LIB_FUNCTION("E+dPfjeQLHI", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionSetDisplayBuffers); + LIB_FUNCTION("LjdLRysHU6Y", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionSetOutputMinColor); + LIB_FUNCTION("knyIhlkpLgE", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionSetUserEventEnd); + LIB_FUNCTION("7as0CjXW1B8", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionSetUserEventStart); + LIB_FUNCTION("dntZTJ7meIU", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStart); + LIB_FUNCTION("q3e8+nEguyE", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStart2dVr); + LIB_FUNCTION("RrvyU1pjb9A", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStartCapture); + LIB_FUNCTION("XZ5QUzb4ae0", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStartLiveCapture); + LIB_FUNCTION("8gH1aLgty5I", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStartMultilayer); + LIB_FUNCTION("gqAG7JYeE7A", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStartMultilayer2); + LIB_FUNCTION("3JyuejcNhC0", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStartWideNear); + LIB_FUNCTION("mKa8scOc4-k", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStartWideNearWithOverlay); + LIB_FUNCTION("kcldQ7zLYQQ", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStartWithOverlay); + LIB_FUNCTION("vzMEkwBQciM", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStop); + LIB_FUNCTION("F7Sndm5teWw", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStopCapture); + LIB_FUNCTION("PAa6cUL5bR4", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStopLiveCapture); + LIB_FUNCTION("0wnZViigP9o", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionUnsetCallback); + LIB_FUNCTION("iGNNpDDjcwo", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionUnsetDisplayBuffers); + LIB_FUNCTION("oxoDINgOrZk", "libSceHmd", 1, "libSceHmd", 1, 1, Func_A31A0320D80EAD99); + LIB_FUNCTION("uab6BzXsfkk", "libSceHmd", 1, "libSceHmd", 1, 1, Func_B9A6FA0735EC7E49); +} +} // namespace Libraries::Hmd \ No newline at end of file diff --git a/src/emulator.cpp b/src/emulator.cpp index ec307488a..7f87e4f20 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -166,6 +166,8 @@ void Emulator::Run(std::filesystem::path file, const std::vector ar if (param_sfo_exists) { LOG_INFO(Loader, "Game id: {} Title: {}", id, title); LOG_INFO(Loader, "Fw: {:#x} App Version: {}", fw_version, app_version); + LOG_INFO(Loader, "PSVR Supported: {}", (bool)psf_attributes.support_ps_vr.Value()); + LOG_INFO(Loader, "PSVR Required: {}", (bool)psf_attributes.require_ps_vr.Value()); } if (!args.empty()) { const auto argc = std::min(args.size(), 32);