diff --git a/Utilities/File.cpp b/Utilities/File.cpp index ec0f49c89e..1adce40f5b 100644 --- a/Utilities/File.cpp +++ b/Utilities/File.cpp @@ -1,8 +1,6 @@ #include "File.h" #include "mutex.h" #include "StrFmt.h" -#include "StrUtil.h" -#include "Crypto/sha1.h" #include #include @@ -18,6 +16,8 @@ using namespace std::literals::string_literals; #ifdef _WIN32 +#include "Utilities/StrUtil.h" + #include #include diff --git a/Utilities/StrFmt.cpp b/Utilities/StrFmt.cpp index dd59303337..3b55ae3861 100644 --- a/Utilities/StrFmt.cpp +++ b/Utilities/StrFmt.cpp @@ -2,7 +2,6 @@ #include "StrUtil.h" #include "cfmt.h" #include "util/endian.hpp" -#include "util/logs.hpp" #include "util/v128.hpp" #include diff --git a/Utilities/Thread.h b/Utilities/Thread.h index edc488e73b..52096a2702 100644 --- a/Utilities/Thread.h +++ b/Utilities/Thread.h @@ -5,10 +5,6 @@ #include "util/shared_ptr.hpp" #include -#include - -#include "mutex.h" -#include "lockless.h" // Hardware core layout enum class native_core_arrangement : u32 diff --git a/Utilities/cfmt.h b/Utilities/cfmt.h index 3b2c94dcbc..9d23c6f759 100644 --- a/Utilities/cfmt.h +++ b/Utilities/cfmt.h @@ -2,7 +2,6 @@ #include "util/types.hpp" #include -#include #include #include "util/asm.hpp" diff --git a/Utilities/cheat_info.cpp b/Utilities/cheat_info.cpp index 42ffb89e52..c46f2089e9 100644 --- a/Utilities/cheat_info.cpp +++ b/Utilities/cheat_info.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "cheat_info.h" -#include "Config.h" #include "StrUtil.h" LOG_CHANNEL(log_cheat, "Cheat"); diff --git a/Utilities/cond.cpp b/Utilities/cond.cpp index af572d191e..425f74d806 100644 --- a/Utilities/cond.cpp +++ b/Utilities/cond.cpp @@ -1,5 +1,4 @@ #include "cond.h" -#include "sync.h" // use constants, increase signal space diff --git a/Utilities/ppu_patch.h b/Utilities/ppu_patch.h index 667242dac5..f88786cf24 100644 --- a/Utilities/ppu_patch.h +++ b/Utilities/ppu_patch.h @@ -2,7 +2,6 @@ #include #include -#include #include // Patch utilities specific to PPU code diff --git a/Utilities/sync.h b/Utilities/sync.h index 7264ba9248..db46d6104f 100644 --- a/Utilities/sync.h +++ b/Utilities/sync.h @@ -12,18 +12,12 @@ #include #include #elif __linux__ -#include #include #include #include #include #include #endif -#include -#include -#include -#include -#include #ifdef _WIN32 DYNAMIC_IMPORT("ntdll.dll", NtWaitForKeyedEvent, NTSTATUS(HANDLE, PVOID Key, BOOLEAN Alertable, PLARGE_INTEGER Timeout)); @@ -60,6 +54,9 @@ struct futex_waitv }; #endif #else + +#include + enum { FUTEX_PRIVATE_FLAG = 0, diff --git a/Utilities/transactional_storage.h b/Utilities/transactional_storage.h index dda86efe05..55e8aa9f95 100644 --- a/Utilities/transactional_storage.h +++ b/Utilities/transactional_storage.h @@ -1,6 +1,7 @@ #include "util/types.hpp" #include #include +#include "Emu/Cell/timers.hpp" // Thread-safe object pool with garbage collection class universal_pool diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index 2b76f3c5e7..bff3ce2529 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -114,6 +114,8 @@ target_link_libraries(rpcs3 3rdparty::fusion ${ADDITIONAL_LIBS}) +set_target_properties(rpcs3_emu PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) + # Unix display manager if(X11_FOUND) target_link_libraries(rpcs3 PRIVATE X11::X11) diff --git a/rpcs3/Crypto/ec.cpp b/rpcs3/Crypto/ec.cpp index a4b11d7c3d..efef91228c 100644 --- a/rpcs3/Crypto/ec.cpp +++ b/rpcs3/Crypto/ec.cpp @@ -2,7 +2,7 @@ // Licensed under the terms of the GNU GPL, version 2 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt -#include "utils.h" +#include "util/types.hpp" #include static inline int bn_compare(u8* a, u8* b, u32 n) diff --git a/rpcs3/Crypto/lz.cpp b/rpcs3/Crypto/lz.cpp index da2b05c361..30e201c5f5 100644 --- a/rpcs3/Crypto/lz.cpp +++ b/rpcs3/Crypto/lz.cpp @@ -2,6 +2,7 @@ // Licensed under the terms of the GNU GPL, version 2.0 or later versions. // http://www.gnu.org/licenses/gpl-2.0.txt +#include #include "lz.h" void decode_range(unsigned int *range, unsigned int *code, unsigned char **src) diff --git a/rpcs3/Crypto/lz.h b/rpcs3/Crypto/lz.h index b8ad0f3a0e..5ad68ea66e 100644 --- a/rpcs3/Crypto/lz.h +++ b/rpcs3/Crypto/lz.h @@ -6,8 +6,6 @@ // Reverse-engineered custom Lempel–Ziv–Markov based compression. -#include - void decode_range(unsigned int *range, unsigned int *code, unsigned char **src); int decode_bit(unsigned int *range, unsigned int *code, int *index, unsigned char **src, unsigned char *c); int decode_number(unsigned char *ptr, int index, int *bit_flag, unsigned int *range, unsigned int *code, unsigned char **src); diff --git a/rpcs3/Crypto/unedat.cpp b/rpcs3/Crypto/unedat.cpp index 0192265298..d7eacd5ca1 100644 --- a/rpcs3/Crypto/unedat.cpp +++ b/rpcs3/Crypto/unedat.cpp @@ -4,6 +4,7 @@ #include "sha1.h" #include "lz.h" #include "ec.h" +#include "utils.h" #include "Emu/system_utils.hpp" diff --git a/rpcs3/Crypto/unedat.h b/rpcs3/Crypto/unedat.h index fa26da2f42..31fce60d4e 100644 --- a/rpcs3/Crypto/unedat.h +++ b/rpcs3/Crypto/unedat.h @@ -1,9 +1,6 @@ #pragma once #include - -#include "utils.h" - #include "Utilities/File.h" constexpr u32 SDAT_FLAG = 0x01000000; diff --git a/rpcs3/Crypto/unpkg.cpp b/rpcs3/Crypto/unpkg.cpp index 5bd04e7e49..baf612657d 100644 --- a/rpcs3/Crypto/unpkg.cpp +++ b/rpcs3/Crypto/unpkg.cpp @@ -5,7 +5,6 @@ #include "util/logs.hpp" #include "Utilities/StrUtil.h" #include "Utilities/Thread.h" -#include "Utilities/mutex.h" #include "Emu/System.h" #include "Emu/system_utils.hpp" #include "Emu/VFS.h" diff --git a/rpcs3/Crypto/unself.cpp b/rpcs3/Crypto/unself.cpp index e6a112e921..66000c4f12 100644 --- a/rpcs3/Crypto/unself.cpp +++ b/rpcs3/Crypto/unself.cpp @@ -1,14 +1,11 @@ #include "stdafx.h" #include "aes.h" -#include "utils.h" #include "unself.h" -#include "Emu/VFS.h" +#include "util/asm.hpp" #include "Emu/System.h" #include "Emu/system_utils.hpp" #include "Crypto/unzip.h" -#include - inline u8 Read8(const fs::file& f) { u8 ret; diff --git a/rpcs3/Crypto/utils.h b/rpcs3/Crypto/utils.h index b7e4634f06..25cdeb7193 100644 --- a/rpcs3/Crypto/utils.h +++ b/rpcs3/Crypto/utils.h @@ -5,7 +5,6 @@ // http://www.gnu.org/licenses/gpl-2.0.txt #include "util/types.hpp" -#include "util/asm.hpp" #include diff --git a/rpcs3/Emu/Audio/AudioBackend.cpp b/rpcs3/Emu/Audio/AudioBackend.cpp index 73c017eef9..e0d96c8c2b 100644 --- a/rpcs3/Emu/Audio/AudioBackend.cpp +++ b/rpcs3/Emu/Audio/AudioBackend.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "AudioBackend.h" -#include "Emu/system_config.h" #include "Emu/IdManager.h" #include "Emu//Cell/Modules/cellAudioOut.h" diff --git a/rpcs3/Emu/Audio/Cubeb/CubebBackend.h b/rpcs3/Emu/Audio/Cubeb/CubebBackend.h index f8c53e7e84..fac9b90e4b 100644 --- a/rpcs3/Emu/Audio/Cubeb/CubebBackend.h +++ b/rpcs3/Emu/Audio/Cubeb/CubebBackend.h @@ -1,7 +1,5 @@ #pragma once -#include -#include "Utilities/mutex.h" #include "util/atomic.hpp" #include "Emu/Audio/AudioBackend.h" diff --git a/rpcs3/Emu/Audio/FAudio/FAudioBackend.cpp b/rpcs3/Emu/Audio/FAudio/FAudioBackend.cpp index 58cd189e77..d0e5728b27 100644 --- a/rpcs3/Emu/Audio/FAudio/FAudioBackend.cpp +++ b/rpcs3/Emu/Audio/FAudio/FAudioBackend.cpp @@ -4,7 +4,6 @@ #include "stdafx.h" #include "FAudioBackend.h" -#include "Emu/system_config.h" #include "Emu/System.h" #include "Emu/Audio/audio_device_enumerator.h" #include "Utilities/StrUtil.h" diff --git a/rpcs3/Emu/Audio/FAudio/FAudioBackend.h b/rpcs3/Emu/Audio/FAudio/FAudioBackend.h index 3f3d6e2ef8..734f56156e 100644 --- a/rpcs3/Emu/Audio/FAudio/FAudioBackend.h +++ b/rpcs3/Emu/Audio/FAudio/FAudioBackend.h @@ -4,8 +4,6 @@ #error "FAudio support disabled but still being built." #endif -#include -#include "Utilities/mutex.h" #include "Emu/Audio/AudioBackend.h" #include "FAudio.h" diff --git a/rpcs3/Emu/Audio/FAudio/faudio_enumerator.cpp b/rpcs3/Emu/Audio/FAudio/faudio_enumerator.cpp index 7308f54b19..fdbfd2a6af 100644 --- a/rpcs3/Emu/Audio/FAudio/faudio_enumerator.cpp +++ b/rpcs3/Emu/Audio/FAudio/faudio_enumerator.cpp @@ -3,7 +3,6 @@ #endif #include "Emu/Audio/FAudio/faudio_enumerator.h" -#include #include #include "Utilities/StrUtil.h" #include "util/logs.hpp" diff --git a/rpcs3/Emu/Audio/XAudio2/XAudio2Backend.h b/rpcs3/Emu/Audio/XAudio2/XAudio2Backend.h index e03cf6cc51..0312e7f633 100644 --- a/rpcs3/Emu/Audio/XAudio2/XAudio2Backend.h +++ b/rpcs3/Emu/Audio/XAudio2/XAudio2Backend.h @@ -4,8 +4,6 @@ #error "XAudio2 can only be built on Windows." #endif -#include -#include "Utilities/mutex.h" #include "Emu/Audio/AudioBackend.h" #include diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 6d6b37afc9..3ba4b7eed4 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -462,6 +462,7 @@ target_sources(rpcs3_emu PRIVATE NP/rpcn_countries.cpp NP/upnp_config.cpp NP/upnp_handler.cpp + NP/ip_address.cpp ) # Memory diff --git a/rpcs3/Emu/CPU/CPUTranslator.cpp b/rpcs3/Emu/CPU/CPUTranslator.cpp index 7c9550ead5..f6893358ff 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.cpp +++ b/rpcs3/Emu/CPU/CPUTranslator.cpp @@ -3,7 +3,6 @@ #include "CPUTranslator.h" #include "util/v128.hpp" -#include "util/simd.hpp" #include "util/logs.hpp" LOG_CHANNEL(llvm_log, "LLVM"); diff --git a/rpcs3/Emu/CPU/CPUTranslator.h b/rpcs3/Emu/CPU/CPUTranslator.h index 56612b8279..7bab6b335a 100644 --- a/rpcs3/Emu/CPU/CPUTranslator.h +++ b/rpcs3/Emu/CPU/CPUTranslator.h @@ -21,7 +21,6 @@ #include "llvm/IR/Module.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Support/KnownBits.h" -#include "llvm/Support/ModRef.h" #include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/IntrinsicsX86.h" @@ -37,7 +36,6 @@ #include "util/types.hpp" #include "util/sysinfo.hpp" #include "Utilities/StrFmt.h" -#include "Utilities/BitField.h" #include "Utilities/JIT.h" #include "util/v128.hpp" diff --git a/rpcs3/Emu/Cell/Modules/HLE_PATCHES.cpp b/rpcs3/Emu/Cell/Modules/HLE_PATCHES.cpp index 0d5fa62f63..8b3ad0b63e 100644 --- a/rpcs3/Emu/Cell/Modules/HLE_PATCHES.cpp +++ b/rpcs3/Emu/Cell/Modules/HLE_PATCHES.cpp @@ -4,7 +4,6 @@ #include "Utilities/Thread.h" #include "Emu/Cell/lv2/sys_spu.h" -#include "Emu/Cell/lv2/sys_sync.h" #include diff --git a/rpcs3/Emu/Cell/Modules/cellAudio.cpp b/rpcs3/Emu/Cell/Modules/cellAudio.cpp index ebb5b134e4..379c17f112 100644 --- a/rpcs3/Emu/Cell/Modules/cellAudio.cpp +++ b/rpcs3/Emu/Cell/Modules/cellAudio.cpp @@ -3,9 +3,9 @@ #include "Emu/system_config.h" #include "Emu/Audio/audio_utils.h" #include "Emu/Cell/PPUModule.h" +#include "Emu/Cell/timers.hpp" #include "Emu/Cell/lv2/sys_process.h" #include "Emu/Cell/lv2/sys_event.h" -#include "Emu/Cell/Modules/cellAudioOut.h" #include "cellAudio.h" #include "util/video_provider.h" diff --git a/rpcs3/Emu/Cell/Modules/cellAudioIn.h b/rpcs3/Emu/Cell/Modules/cellAudioIn.h index a630ce47cd..dc2ca6d130 100644 --- a/rpcs3/Emu/Cell/Modules/cellAudioIn.h +++ b/rpcs3/Emu/Cell/Modules/cellAudioIn.h @@ -1,7 +1,6 @@ #pragma once #include "util/types.hpp" -#include "util/endian.hpp" // Error codes enum CellAudioInError : u32 diff --git a/rpcs3/Emu/Cell/Modules/cellCamera.cpp b/rpcs3/Emu/Cell/Modules/cellCamera.cpp index 39274e8162..6c0abcc160 100644 --- a/rpcs3/Emu/Cell/Modules/cellCamera.cpp +++ b/rpcs3/Emu/Cell/Modules/cellCamera.cpp @@ -6,6 +6,7 @@ #include "Emu/Cell/PPUModule.h" #include "Emu/Cell/lv2/sys_event.h" #include "Emu/IdManager.h" +#include "Emu/Cell/timers.hpp" #include diff --git a/rpcs3/Emu/Cell/Modules/cellCamera.h b/rpcs3/Emu/Cell/Modules/cellCamera.h index 28e8a3152c..56b8334c44 100644 --- a/rpcs3/Emu/Cell/Modules/cellCamera.h +++ b/rpcs3/Emu/Cell/Modules/cellCamera.h @@ -1,9 +1,9 @@ #pragma once -#include "Utilities/Timer.h" -#include "Emu/Cell/lv2/sys_memory.h" #include "Utilities/Thread.h" #include "Emu/Io/camera_handler_base.h" +#include "Emu/Memory/vm_ptr.h" +#include "Utilities/mutex.h" #include diff --git a/rpcs3/Emu/Cell/Modules/cellDmux.cpp b/rpcs3/Emu/Cell/Modules/cellDmux.cpp index 5c94463ea3..d7f6f84f3f 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmux.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmux.cpp @@ -9,6 +9,8 @@ #include "util/asm.hpp" +#include + LOG_CHANNEL(cellDmux); template <> diff --git a/rpcs3/Emu/Cell/Modules/cellDmux.h b/rpcs3/Emu/Cell/Modules/cellDmux.h index 884a3eb050..1767165283 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmux.h +++ b/rpcs3/Emu/Cell/Modules/cellDmux.h @@ -1,6 +1,7 @@ #pragma once #include "Emu/Memory/vm_ptr.h" +#include "cellPamf.h" // Error Codes enum CellDmuxError :u32 diff --git a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp index a7b24c3973..70162d4031 100644 --- a/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp +++ b/rpcs3/Emu/Cell/Modules/cellDmuxPamf.cpp @@ -2,7 +2,6 @@ #include "Emu/Cell/PPUModule.h" #include "Emu/IdManager.h" -#include "cellPamf.h" #include "cellDmux.h" #include "cellDmuxPamf.h" diff --git a/rpcs3/Emu/Cell/Modules/cellGame.cpp b/rpcs3/Emu/Cell/Modules/cellGame.cpp index 6534d07677..17e190898d 100644 --- a/rpcs3/Emu/Cell/Modules/cellGame.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGame.cpp @@ -6,6 +6,7 @@ #include "Emu/IdManager.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/Cell/PPUModule.h" +#include "Emu/Cell/timers.hpp" #include "Emu/Cell/lv2/sys_fs.h" #include "Emu/Cell/lv2/sys_sync.h" diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index ad50282de3..f051b67131 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -3,6 +3,7 @@ #include "cellCamera.h" #include "Emu/Cell/lv2/sys_event.h" +#include "Emu/Cell/lv2/sys_memory.h" #include "Emu/Cell/PPUModule.h" #include "Emu/Cell/timers.hpp" #include "Emu/Io/MouseHandler.h" diff --git a/rpcs3/Emu/Cell/Modules/cellGifDec.cpp b/rpcs3/Emu/Cell/Modules/cellGifDec.cpp index 80242686cb..9a49e03ec3 100644 --- a/rpcs3/Emu/Cell/Modules/cellGifDec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGifDec.cpp @@ -9,8 +9,6 @@ #include "Emu/Cell/lv2/sys_fs.h" #include "cellGifDec.h" -#include "util/asm.hpp" - LOG_CHANNEL(cellGifDec); // Temporarily diff --git a/rpcs3/Emu/Cell/Modules/cellJpgDec.cpp b/rpcs3/Emu/Cell/Modules/cellJpgDec.cpp index 124531826d..be72ce4294 100644 --- a/rpcs3/Emu/Cell/Modules/cellJpgDec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellJpgDec.cpp @@ -9,8 +9,6 @@ #include "Emu/Cell/lv2/sys_fs.h" #include "cellJpgDec.h" -#include "util/asm.hpp" - LOG_CHANNEL(cellJpgDec); // Temporarily diff --git a/rpcs3/Emu/Cell/Modules/cellKey2char.cpp b/rpcs3/Emu/Cell/Modules/cellKey2char.cpp index bbe7e186fe..ba09a702ba 100644 --- a/rpcs3/Emu/Cell/Modules/cellKey2char.cpp +++ b/rpcs3/Emu/Cell/Modules/cellKey2char.cpp @@ -1,6 +1,6 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" -#include "cellKb.h" +#include "Emu/Io/Keyboard.h" LOG_CHANNEL(cellKey2char); diff --git a/rpcs3/Emu/Cell/Modules/cellL10n.cpp b/rpcs3/Emu/Cell/Modules/cellL10n.cpp index 0dd3a8fd95..6b3ffc4448 100644 --- a/rpcs3/Emu/Cell/Modules/cellL10n.cpp +++ b/rpcs3/Emu/Cell/Modules/cellL10n.cpp @@ -16,8 +16,6 @@ typedef const char *HostCode; #include "cellL10n.h" -#include "util/asm.hpp" - LOG_CHANNEL(cellL10n); // Translate code id to code name. some codepage may has another name. diff --git a/rpcs3/Emu/Cell/Modules/cellMic.cpp b/rpcs3/Emu/Cell/Modules/cellMic.cpp index a26050d875..86e4b8bafa 100644 --- a/rpcs3/Emu/Cell/Modules/cellMic.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMic.cpp @@ -1,5 +1,4 @@ #include "stdafx.h" -#include "Emu/System.h" #include "Emu/system_config.h" #include "Emu/Cell/PPUModule.h" #include "Utilities/StrUtil.h" @@ -10,6 +9,8 @@ #include +#include "3rdparty/OpenAL/openal-soft/include/AL/alext.h" + LOG_CHANNEL(cellMic); template<> diff --git a/rpcs3/Emu/Cell/Modules/cellMic.h b/rpcs3/Emu/Cell/Modules/cellMic.h index 3fbe5fba13..b00848218c 100644 --- a/rpcs3/Emu/Cell/Modules/cellMic.h +++ b/rpcs3/Emu/Cell/Modules/cellMic.h @@ -1,9 +1,8 @@ #pragma once #include "Utilities/Thread.h" -#include "Emu/Cell/timers.hpp" - -#include "3rdparty/OpenAL/openal-soft/include/AL/alext.h" +#include "3rdparty/OpenAL/openal-soft/include/AL/alc.h" +#include "Utilities/mutex.h" // Error Codes enum CellMicInError : u32 diff --git a/rpcs3/Emu/Cell/Modules/cellMouse.cpp b/rpcs3/Emu/Cell/Modules/cellMouse.cpp index 8b8d54715a..8bf550a633 100644 --- a/rpcs3/Emu/Cell/Modules/cellMouse.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMouse.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "Emu/IdManager.h" -#include "Emu/System.h" #include "Emu/Cell/PPUModule.h" #include "Emu/Io/MouseHandler.h" diff --git a/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp b/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp index 673bed1de6..c938f723b1 100644 --- a/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMusicDecode.cpp @@ -12,9 +12,6 @@ #include "cellSysutil.h" #include "util/media_utils.h" -#include - - LOG_CHANNEL(cellMusicDecode); template<> diff --git a/rpcs3/Emu/Cell/Modules/cellMusicExport.cpp b/rpcs3/Emu/Cell/Modules/cellMusicExport.cpp index 752d7db394..c01d4b7a51 100644 --- a/rpcs3/Emu/Cell/Modules/cellMusicExport.cpp +++ b/rpcs3/Emu/Cell/Modules/cellMusicExport.cpp @@ -2,7 +2,6 @@ #include "Emu/Cell/PPUModule.h" #include "Emu/IdManager.h" #include "Emu/VFS.h" -#include "Utilities/StrUtil.h" #include "cellSysutil.h" LOG_CHANNEL(cellMusicExport); diff --git a/rpcs3/Emu/Cell/Modules/cellNetCtl.cpp b/rpcs3/Emu/Cell/Modules/cellNetCtl.cpp index e4b4fc82f0..97375c4e6d 100644 --- a/rpcs3/Emu/Cell/Modules/cellNetCtl.cpp +++ b/rpcs3/Emu/Cell/Modules/cellNetCtl.cpp @@ -2,7 +2,6 @@ #include "Emu/system_config.h" #include "Emu/Cell/PPUModule.h" #include "Emu/IdManager.h" -#include "Emu/Cell/lv2/sys_sync.h" #include "cellGame.h" #include "cellSysutil.h" diff --git a/rpcs3/Emu/Cell/Modules/cellOskDialog.cpp b/rpcs3/Emu/Cell/Modules/cellOskDialog.cpp index ecf20643ad..5b2c45e99c 100644 --- a/rpcs3/Emu/Cell/Modules/cellOskDialog.cpp +++ b/rpcs3/Emu/Cell/Modules/cellOskDialog.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "Emu/System.h" -#include "Emu/system_config.h" #include "Emu/Cell/PPUModule.h" #include "Emu/Io/interception.h" #include "Emu/Io/Keyboard.h" diff --git a/rpcs3/Emu/Cell/Modules/cellPad.cpp b/rpcs3/Emu/Cell/Modules/cellPad.cpp index 74b3c5fc60..39ee7d0359 100644 --- a/rpcs3/Emu/Cell/Modules/cellPad.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPad.cpp @@ -3,7 +3,6 @@ #include "Emu/system_config.h" #include "Emu/Cell/PPUModule.h" #include "Emu/Cell/lv2/sys_process.h" -#include "Emu/Cell/lv2/sys_sync.h" #include "Emu/Io/pad_types.h" #include "Emu/RSX/Overlays/overlay_debug_overlay.h" #include "Input/pad_thread.h" diff --git a/rpcs3/Emu/Cell/Modules/cellPhotoDecode.cpp b/rpcs3/Emu/Cell/Modules/cellPhotoDecode.cpp index 843a0adc24..5cef4ba877 100644 --- a/rpcs3/Emu/Cell/Modules/cellPhotoDecode.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPhotoDecode.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" -#include "Emu/IdManager.h" #include "Emu/VFS.h" #include "Emu/System.h" #include "cellSysutil.h" diff --git a/rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp b/rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp index 34a1562153..8a264bc721 100644 --- a/rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPhotoExport.cpp @@ -2,7 +2,6 @@ #include "Emu/Cell/PPUModule.h" #include "Emu/IdManager.h" #include "Emu/VFS.h" -#include "Utilities/StrUtil.h" #include "cellSysutil.h" LOG_CHANNEL(cellPhotoExport); diff --git a/rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp b/rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp index d1cbdc2b56..d56db1f060 100644 --- a/rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" +#include "Emu/IdManager.h" #include "Emu/Cell/lv2/sys_fs.h" #include "Emu/RSX/Overlays/overlay_media_list_dialog.h" #include "Emu/VFS.h" diff --git a/rpcs3/Emu/Cell/Modules/cellPngEnc.cpp b/rpcs3/Emu/Cell/Modules/cellPngEnc.cpp index f723ddf888..c6da0c4e95 100644 --- a/rpcs3/Emu/Cell/Modules/cellPngEnc.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPngEnc.cpp @@ -2,7 +2,6 @@ #include "Emu/Cell/PPUModule.h" #include "Emu/IdManager.h" #include "cellPngEnc.h" -#include "png.h" LOG_CHANNEL(cellPngEnc); diff --git a/rpcs3/Emu/Cell/Modules/cellResc.cpp b/rpcs3/Emu/Cell/Modules/cellResc.cpp index a3cc052d6f..065039b7ff 100644 --- a/rpcs3/Emu/Cell/Modules/cellResc.cpp +++ b/rpcs3/Emu/Cell/Modules/cellResc.cpp @@ -3,6 +3,7 @@ #include "Emu/Cell/PPUModule.h" #include "Emu/RSX/GCM.h" +#include "Emu/RSX/gcm_enums.h" #include "cellResc.h" #include "cellVideoOut.h" diff --git a/rpcs3/Emu/Cell/Modules/cellSail.h b/rpcs3/Emu/Cell/Modules/cellSail.h index 7cad924f6a..2b34e015b4 100644 --- a/rpcs3/Emu/Cell/Modules/cellSail.h +++ b/rpcs3/Emu/Cell/Modules/cellSail.h @@ -2,8 +2,6 @@ #include "cellVpost.h" -#include "Emu/Memory/vm_ptr.h" - // Error Codes enum CellSailError : u32 { diff --git a/rpcs3/Emu/Cell/Modules/cellSailRec.cpp b/rpcs3/Emu/Cell/Modules/cellSailRec.cpp index e6d7d58e5d..c7a3cba549 100644 --- a/rpcs3/Emu/Cell/Modules/cellSailRec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSailRec.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" -#include "cellSail.h" LOG_CHANNEL(cellSailRec); diff --git a/rpcs3/Emu/Cell/Modules/cellSaveData.cpp b/rpcs3/Emu/Cell/Modules/cellSaveData.cpp index 4ce8be031c..be7583074a 100644 --- a/rpcs3/Emu/Cell/Modules/cellSaveData.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSaveData.cpp @@ -8,6 +8,7 @@ #include "Emu/Cell/lv2/sys_sync.h" #include "Emu/Cell/lv2/sys_process.h" #include "Emu/Cell/PPUModule.h" +#include "Emu/Cell/timers.hpp" #include "Emu/Cell/Modules/cellSysutil.h" #include "Emu/Cell/Modules/cellUserInfo.h" #include "Emu/RSX/Overlays/overlay_message.h" @@ -19,6 +20,7 @@ #include "Loader/PSF.h" #include "Utilities/StrUtil.h" #include "Utilities/date_time.h" +#include "Utilities/sema.h" #include #include diff --git a/rpcs3/Emu/Cell/Modules/cellSaveData.h b/rpcs3/Emu/Cell/Modules/cellSaveData.h index c88a4a3f9a..73b0af4f01 100644 --- a/rpcs3/Emu/Cell/Modules/cellSaveData.h +++ b/rpcs3/Emu/Cell/Modules/cellSaveData.h @@ -1,7 +1,6 @@ #pragma once #include "util/types.hpp" -#include "util/endian.hpp" #include "Emu/Memory/vm_ptr.h" #include #include diff --git a/rpcs3/Emu/Cell/Modules/cellSpurs.cpp b/rpcs3/Emu/Cell/Modules/cellSpurs.cpp index 8f3469e031..e35d154eef 100644 --- a/rpcs3/Emu/Cell/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSpurs.cpp @@ -1,7 +1,6 @@ #include "stdafx.h" #include "Emu/System.h" #include "Emu/system_config.h" -#include "Emu/IdManager.h" #include "Emu/Memory/vm_reservation.h" #include "Emu/Cell/PPUModule.h" #include "Emu/Cell/SPUThread.h" diff --git a/rpcs3/Emu/Cell/Modules/cellSpurs.h b/rpcs3/Emu/Cell/Modules/cellSpurs.h index b06cbd079f..f4be6d84d6 100644 --- a/rpcs3/Emu/Cell/Modules/cellSpurs.h +++ b/rpcs3/Emu/Cell/Modules/cellSpurs.h @@ -4,6 +4,10 @@ #include "util/v128.hpp" +#include "Emu/Cell/lv2/sys_lwmutex.h" +#include "Emu/Cell/lv2/sys_lwcond.h" +#include "Emu/Cell/lv2/sys_spu.h" + struct CellSpurs; struct CellSpursTaskset; diff --git a/rpcs3/Emu/Cell/Modules/cellSpursJq.cpp b/rpcs3/Emu/Cell/Modules/cellSpursJq.cpp index dfbc3e0966..b2cb3e4869 100644 --- a/rpcs3/Emu/Cell/Modules/cellSpursJq.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSpursJq.cpp @@ -1,9 +1,6 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" -#include "Emu/Cell/lv2/sys_spu.h" -#include "cellSpursJq.h" - LOG_CHANNEL(cellSpursJq); error_code cellSpursJobQueueAttributeInitialize() diff --git a/rpcs3/Emu/Cell/Modules/cellSpursSpu.cpp b/rpcs3/Emu/Cell/Modules/cellSpursSpu.cpp index 435fa1636d..43b3e04c8b 100644 --- a/rpcs3/Emu/Cell/Modules/cellSpursSpu.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSpursSpu.cpp @@ -4,9 +4,6 @@ #include "Emu/Memory/vm_reservation.h" #include "Emu/Cell/SPUThread.h" #include "Emu/Cell/SPURecompiler.h" -#include "Emu/Cell/lv2/sys_lwmutex.h" -#include "Emu/Cell/lv2/sys_lwcond.h" -#include "Emu/Cell/lv2/sys_spu.h" #include "cellSpurs.h" #include "util/asm.hpp" diff --git a/rpcs3/Emu/Cell/Modules/cellVideoExport.cpp b/rpcs3/Emu/Cell/Modules/cellVideoExport.cpp index 8ee6238c62..8c0ed93771 100644 --- a/rpcs3/Emu/Cell/Modules/cellVideoExport.cpp +++ b/rpcs3/Emu/Cell/Modules/cellVideoExport.cpp @@ -2,7 +2,6 @@ #include "Emu/Cell/PPUModule.h" #include "Emu/IdManager.h" #include "Emu/VFS.h" -#include "Utilities/StrUtil.h" #include "cellSysutil.h" LOG_CHANNEL(cellVideoExport); diff --git a/rpcs3/Emu/Cell/Modules/cellVoice.h b/rpcs3/Emu/Cell/Modules/cellVoice.h index 80fac88c29..2b269f50c6 100644 --- a/rpcs3/Emu/Cell/Modules/cellVoice.h +++ b/rpcs3/Emu/Cell/Modules/cellVoice.h @@ -1,8 +1,5 @@ #pragma once -#include -#include - // libvoice = 0x80310801 - 0x803108ff // libvoice version 100 diff --git a/rpcs3/Emu/Cell/Modules/cellWebBrowser.cpp b/rpcs3/Emu/Cell/Modules/cellWebBrowser.cpp index 8a9991b089..7f560c9ca3 100644 --- a/rpcs3/Emu/Cell/Modules/cellWebBrowser.cpp +++ b/rpcs3/Emu/Cell/Modules/cellWebBrowser.cpp @@ -4,6 +4,8 @@ #include "cellWebBrowser.h" #include "Emu/IdManager.h" +#include "cellSysutil.h" + LOG_CHANNEL(cellSysutil); struct browser_info diff --git a/rpcs3/Emu/Cell/Modules/cellWebBrowser.h b/rpcs3/Emu/Cell/Modules/cellWebBrowser.h index 7a66f5b421..6c46c581b1 100644 --- a/rpcs3/Emu/Cell/Modules/cellWebBrowser.h +++ b/rpcs3/Emu/Cell/Modules/cellWebBrowser.h @@ -1,7 +1,5 @@ #pragma once -#include "cellSysutil.h" - #include "Emu/Memory/vm_ptr.h" //events diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index fb9f46a365..9a8e0dba6b 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -1,7 +1,6 @@ #include "stdafx.h" #include "Emu/System.h" #include "Emu/system_utils.hpp" -#include "Emu/VFS.h" #include "Emu/Cell/PPUModule.h" #include "Emu/Cell/Modules/cellUserInfo.h" #include "Emu/Io/interception.h" @@ -15,6 +14,7 @@ #include "sceNp.h" #include "cellSysutil.h" +#include "Emu/Cell/timers.hpp" #include "Emu/Cell/lv2/sys_time.h" #include "Emu/Cell/lv2/sys_fs.h" #include "Emu/Cell/lv2/sys_sync.h" @@ -22,6 +22,7 @@ #include "Emu/NP/np_contexts.h" #include "Emu/NP/np_helpers.h" #include "Emu/NP/np_structs_extra.h" +#include "Emu/NP/signaling_handler.h" #include "Emu/system_config.h" #include "Emu/RSX/Overlays/overlay_manager.h" diff --git a/rpcs3/Emu/Cell/Modules/sceNp.h b/rpcs3/Emu/Cell/Modules/sceNp.h index e6a1bdc7ea..bc2ab7c6e2 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.h +++ b/rpcs3/Emu/Cell/Modules/sceNp.h @@ -1,7 +1,9 @@ #pragma once +#include "Emu/NP/rpcn_types.h" #include "cellRtc.h" #include "Emu/Cell/ErrorCodes.h" +#include "util/shared_ptr.hpp" #include @@ -1825,7 +1827,7 @@ public: virtual ~SendMessageDialogBase() = default; virtual error_code Exec(message_data& msg_data, std::set& npids) = 0; - virtual void callback_handler(u16 ntype, const std::string& username, bool status) = 0; + virtual void callback_handler(rpcn::NotificationType ntype, const std::string& username, bool status) = 0; protected: std::shared_ptr m_rpcn; diff --git a/rpcs3/Emu/Cell/Modules/sceNp2.cpp b/rpcs3/Emu/Cell/Modules/sceNp2.cpp index 174a9ec0ce..ed4655ccd4 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp2.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp2.cpp @@ -7,6 +7,7 @@ #include "Emu/NP/np_handler.h" #include "Emu/NP/np_contexts.h" #include "Emu/NP/np_helpers.h" +#include "Emu/NP/signaling_handler.h" #include "cellSysutil.h" LOG_CHANNEL(sceNp2); diff --git a/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp b/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp index 3be0571052..0fc2cc5052 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp @@ -4,6 +4,7 @@ #include "Emu/VFS.h" #include "Emu/IdManager.h" #include "Emu/Cell/PPUModule.h" +#include "Emu/Cell/timers.hpp" #include "Emu/Cell/Modules/cellMsgDialog.h" #include "Utilities/rXml.h" diff --git a/rpcs3/Emu/Cell/Modules/sceNpTrophy.h b/rpcs3/Emu/Cell/Modules/sceNpTrophy.h index f97050c968..dfea517fe0 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpTrophy.h +++ b/rpcs3/Emu/Cell/Modules/sceNpTrophy.h @@ -1,10 +1,10 @@ #pragma once #include "util/types.hpp" -#include "util/endian.hpp" #include "Emu/Memory/vm_ptr.h" #include "Emu/Cell/ErrorCodes.h" #include +#include // Error codes enum SceNpTrophyError : u32 diff --git a/rpcs3/Emu/Cell/Modules/sys_heap.cpp b/rpcs3/Emu/Cell/Modules/sys_heap.cpp index a502e26486..c0ba4fb2da 100644 --- a/rpcs3/Emu/Cell/Modules/sys_heap.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_heap.cpp @@ -2,8 +2,6 @@ #include "Emu/IdManager.h" #include "Emu/Cell/PPUModule.h" -#include "sysPrxForUser.h" - LOG_CHANNEL(sysPrxForUser); struct HeapInfo diff --git a/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp b/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp index a9ec0b5b3d..098761b259 100644 --- a/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_lwmutex_.cpp @@ -2,7 +2,7 @@ #include "Emu/System.h" #include "Emu/system_config.h" #include "Emu/Cell/PPUModule.h" - +#include "Emu/Cell/timers.hpp" #include "Emu/Cell/lv2/sys_lwmutex.h" #include "Emu/Cell/lv2/sys_mutex.h" #include "sysPrxForUser.h" diff --git a/rpcs3/Emu/Cell/Modules/sys_mempool.cpp b/rpcs3/Emu/Cell/Modules/sys_mempool.cpp index b7ffa72984..2446619d3a 100644 --- a/rpcs3/Emu/Cell/Modules/sys_mempool.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_mempool.cpp @@ -7,8 +7,6 @@ #include "Emu/Cell/lv2/sys_mutex.h" #include "Emu/Cell/lv2/sys_cond.h" -#include "sysPrxForUser.h" - LOG_CHANNEL(sysPrxForUser); using sys_mempool_t = u32; diff --git a/rpcs3/Emu/Cell/Modules/sys_net_.cpp b/rpcs3/Emu/Cell/Modules/sys_net_.cpp index f566bd2070..9e487aa8eb 100644 --- a/rpcs3/Emu/Cell/Modules/sys_net_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_net_.cpp @@ -1,7 +1,5 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" -#include "Emu/IdManager.h" - #include "sys_net_.h" LOG_CHANNEL(libnet); diff --git a/rpcs3/Emu/Cell/Modules/sys_net_.h b/rpcs3/Emu/Cell/Modules/sys_net_.h index c49a65e26d..9ee344b977 100644 --- a/rpcs3/Emu/Cell/Modules/sys_net_.h +++ b/rpcs3/Emu/Cell/Modules/sys_net_.h @@ -1,7 +1,6 @@ #pragma once #include "Emu/Cell/lv2/sys_net.h" -#include "Emu/Memory/vm.h" struct sys_net_sockinfo_t { diff --git a/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp b/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp index cb3f5f62d1..033242e87c 100644 --- a/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_ppu_thread_.cpp @@ -1,7 +1,5 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" -#include "Emu/IdManager.h" - #include "Emu/Cell/lv2/sys_ppu_thread.h" #include "Emu/Cell/lv2/sys_interrupt.h" #include "Emu/Cell/lv2/sys_lwmutex.h" diff --git a/rpcs3/Emu/Cell/Modules/sys_rsxaudio_.cpp b/rpcs3/Emu/Cell/Modules/sys_rsxaudio_.cpp index d686345738..071a9debb6 100644 --- a/rpcs3/Emu/Cell/Modules/sys_rsxaudio_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_rsxaudio_.cpp @@ -1,8 +1,6 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" -#include "sysPrxForUser.h" - LOG_CHANNEL(sysPrxForUser); error_code sys_rsxaudio_close_connection() diff --git a/rpcs3/Emu/Cell/Modules/sys_spinlock.cpp b/rpcs3/Emu/Cell/Modules/sys_spinlock.cpp index e49998029c..00a71de061 100644 --- a/rpcs3/Emu/Cell/Modules/sys_spinlock.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_spinlock.cpp @@ -1,8 +1,6 @@ #include "stdafx.h" #include "Emu/Cell/PPUModule.h" -#include "sysPrxForUser.h" - LOG_CHANNEL(sysPrxForUser); void sys_spinlock_initialize(vm::ptr> lock) diff --git a/rpcs3/Emu/Cell/Modules/sys_spu_.cpp b/rpcs3/Emu/Cell/Modules/sys_spu_.cpp index 2c584a7fed..2bbbaee4ae 100644 --- a/rpcs3/Emu/Cell/Modules/sys_spu_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_spu_.cpp @@ -3,7 +3,6 @@ #include "Emu/Cell/PPUModule.h" #include "Emu/Cell/lv2/sys_spu.h" -#include "Crypto/unself.h" #include "Loader/ELF.h" #include "sysPrxForUser.h" diff --git a/rpcs3/Emu/Cell/PPUAnalyser.cpp b/rpcs3/Emu/Cell/PPUAnalyser.cpp index 3fef5240dd..a936eb6853 100644 --- a/rpcs3/Emu/Cell/PPUAnalyser.cpp +++ b/rpcs3/Emu/Cell/PPUAnalyser.cpp @@ -3102,1962 +3102,3 @@ bool ppu_module::analyse(u32 lib_toc, u32 entry, const u32 sec_end, con ppu_log.notice("Block analysis: %zu blocks (%zu enqueued)", funcs.size(), block_queue.size()); return true; } - -// Temporarily -#ifndef _MSC_VER -#pragma GCC diagnostic ignored "-Wunused-parameter" -#endif - -void ppu_acontext::UNK(ppu_opcode_t op) -{ - std::fill_n(gpr, 32, spec_gpr{}); - ppu_log.error("Unknown/Illegal opcode: 0x%08x at 0x%x", op.opcode, cia); -} - -void ppu_acontext::MFVSCR(ppu_opcode_t op) -{ -} - -void ppu_acontext::MTVSCR(ppu_opcode_t op) -{ -} - -void ppu_acontext::VADDCUW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VADDFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VADDSBS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VADDSHS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VADDSWS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VADDUBM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VADDUBS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VADDUHM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VADDUHS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VADDUWM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VADDUWS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VAND(ppu_opcode_t op) -{ -} - -void ppu_acontext::VANDC(ppu_opcode_t op) -{ -} - -void ppu_acontext::VAVGSB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VAVGSH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VAVGSW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VAVGUB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VAVGUH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VAVGUW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCFSX(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCFUX(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPBFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPEQFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPEQUB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPEQUH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPEQUW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPGEFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPGTFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPGTSB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPGTSH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPGTSW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPGTUB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPGTUH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCMPGTUW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCTSXS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VCTUXS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VEXPTEFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VLOGEFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMADDFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMAXFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMAXSB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMAXSH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMAXSW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMAXUB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMAXUH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMAXUW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMHADDSHS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMHRADDSHS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMINFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMINSB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMINSH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMINSW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMINUB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMINUH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMINUW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMLADDUHM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMRGHB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMRGHH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMRGHW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMRGLB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMRGLH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMRGLW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMSUMMBM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMSUMSHM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMSUMSHS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMSUMUBM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMSUMUHM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMSUMUHS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMULESB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMULESH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMULEUB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMULEUH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMULOSB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMULOSH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMULOUB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VMULOUH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VNMSUBFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VNOR(ppu_opcode_t op) -{ -} - -void ppu_acontext::VOR(ppu_opcode_t op) -{ -} - -void ppu_acontext::VPERM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VPKPX(ppu_opcode_t op) -{ -} - -void ppu_acontext::VPKSHSS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VPKSHUS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VPKSWSS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VPKSWUS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VPKUHUM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VPKUHUS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VPKUWUM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VPKUWUS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VREFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VRFIM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VRFIN(ppu_opcode_t op) -{ -} - -void ppu_acontext::VRFIP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VRFIZ(ppu_opcode_t op) -{ -} - -void ppu_acontext::VRLB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VRLH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VRLW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VRSQRTEFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSEL(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSL(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSLB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSLDOI(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSLH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSLO(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSLW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSPLTB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSPLTH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSPLTISB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSPLTISH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSPLTISW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSPLTW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSR(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSRAB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSRAH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSRAW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSRB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSRH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSRO(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSRW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUBCUW(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUBFP(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUBSBS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUBSHS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUBSWS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUBUBM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUBUBS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUBUHM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUBUHS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUBUWM(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUBUWS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUMSWS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUM2SWS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUM4SBS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUM4SHS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VSUM4UBS(ppu_opcode_t op) -{ -} - -void ppu_acontext::VUPKHPX(ppu_opcode_t op) -{ -} - -void ppu_acontext::VUPKHSB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VUPKHSH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VUPKLPX(ppu_opcode_t op) -{ -} - -void ppu_acontext::VUPKLSB(ppu_opcode_t op) -{ -} - -void ppu_acontext::VUPKLSH(ppu_opcode_t op) -{ -} - -void ppu_acontext::VXOR(ppu_opcode_t op) -{ -} - -void ppu_acontext::TDI(ppu_opcode_t op) -{ -} - -void ppu_acontext::TWI(ppu_opcode_t op) -{ -} - -void ppu_acontext::MULLI(ppu_opcode_t op) -{ - const s64 amin = gpr[op.ra].imin; - const s64 amax = gpr[op.ra].imax; - - // Undef or mixed range (default) - s64 min = 0; - s64 max = -1; - - // Special cases like powers of 2 and their negations are not handled - if (amin <= amax) - { - min = amin * op.simm16; - max = amax * op.simm16; - - // Check overflow - if (min >> 63 != utils::mulh64(amin, op.simm16) || max >> 63 != utils::mulh64(amax, op.simm16)) - { - min = 0; - max = -1; - } - else if (min > max) - { - std::swap(min, max); - } - } - - gpr[op.rd] = spec_gpr::range(min, max, gpr[op.ra].tz() + std::countr_zero(op.simm16)); -} - -void ppu_acontext::SUBFIC(ppu_opcode_t op) -{ - gpr[op.rd] = ~gpr[op.ra] + spec_gpr::fixed(op.simm16) + spec_gpr::fixed(1); -} - -void ppu_acontext::CMPLI(ppu_opcode_t op) -{ -} - -void ppu_acontext::CMPI(ppu_opcode_t op) -{ -} - -void ppu_acontext::ADDIC(ppu_opcode_t op) -{ - gpr[op.rd] = gpr[op.ra] + spec_gpr::fixed(op.simm16); -} - -void ppu_acontext::ADDI(ppu_opcode_t op) -{ - gpr[op.rd] = op.ra ? gpr[op.ra] + spec_gpr::fixed(op.simm16) : spec_gpr::fixed(op.simm16); -} - -void ppu_acontext::ADDIS(ppu_opcode_t op) -{ - gpr[op.rd] = op.ra ? gpr[op.ra] + spec_gpr::fixed(op.simm16 * 65536) : spec_gpr::fixed(op.simm16 * 65536); -} - -void ppu_acontext::BC(ppu_opcode_t op) -{ -} - -void ppu_acontext::SC(ppu_opcode_t op) -{ -} - -void ppu_acontext::B(ppu_opcode_t op) -{ -} - -void ppu_acontext::MCRF(ppu_opcode_t op) -{ -} - -void ppu_acontext::BCLR(ppu_opcode_t op) -{ -} - -void ppu_acontext::CRNOR(ppu_opcode_t op) -{ -} - -void ppu_acontext::CRANDC(ppu_opcode_t op) -{ -} - -void ppu_acontext::ISYNC(ppu_opcode_t op) -{ -} - -void ppu_acontext::CRXOR(ppu_opcode_t op) -{ -} - -void ppu_acontext::CRNAND(ppu_opcode_t op) -{ -} - -void ppu_acontext::CRAND(ppu_opcode_t op) -{ -} - -void ppu_acontext::CREQV(ppu_opcode_t op) -{ -} - -void ppu_acontext::CRORC(ppu_opcode_t op) -{ -} - -void ppu_acontext::CROR(ppu_opcode_t op) -{ -} - -void ppu_acontext::BCCTR(ppu_opcode_t op) -{ -} - -void ppu_acontext::RLWIMI(ppu_opcode_t op) -{ - const u64 mask = ppu_rotate_mask(32 + op.mb32, 32 + op.me32); - - u64 min = gpr[op.rs].bmin; - u64 max = gpr[op.rs].bmax; - - if (op.mb32 <= op.me32) - { - // 32-bit op, including mnemonics: INSLWI, INSRWI (TODO) - min = utils::rol32(static_cast(min), op.sh32) & mask; - max = utils::rol32(static_cast(max), op.sh32) & mask; - } - else - { - // Full 64-bit op with duplication - min = utils::rol64(static_cast(min) | min << 32, op.sh32) & mask; - max = utils::rol64(static_cast(max) | max << 32, op.sh32) & mask; - } - - if (mask != umax) - { - // Insertion - min |= gpr[op.ra].bmin & ~mask; - max |= gpr[op.ra].bmax & ~mask; - } - - gpr[op.rs] = spec_gpr::approx(min, max); -} - -void ppu_acontext::RLWINM(ppu_opcode_t op) -{ - const u64 mask = ppu_rotate_mask(32 + op.mb32, 32 + op.me32); - - u64 min = gpr[op.rs].bmin; - u64 max = gpr[op.rs].bmax; - - if (op.mb32 <= op.me32) - { - if (op.sh32 == 0) - { - // CLRLWI, CLRRWI mnemonics - gpr[op.ra] = gpr[op.ra] & spec_gpr::fixed(mask); - return; - } - else if (op.mb32 == 0 && op.me32 == 31) - { - // ROTLWI, ROTRWI mnemonics - } - else if (op.mb32 == 0 && op.sh32 == 31 - op.me32) - { - // SLWI mnemonic - } - else if (op.me32 == 31 && op.sh32 == 32 - op.mb32) - { - // SRWI mnemonic - } - else if (op.mb32 == 0 && op.sh32 < 31 - op.me32) - { - // EXTLWI and other possible mnemonics - } - else if (op.me32 == 31 && 32 - op.sh32 < op.mb32) - { - // EXTRWI and other possible mnemonics - } - - min = utils::rol32(static_cast(min), op.sh32) & mask; - max = utils::rol32(static_cast(max), op.sh32) & mask; - } - else - { - // Full 64-bit op with duplication - min = utils::rol64(static_cast(min) | min << 32, op.sh32) & mask; - max = utils::rol64(static_cast(max) | max << 32, op.sh32) & mask; - } - - gpr[op.ra] = spec_gpr::approx(min, max); -} - -void ppu_acontext::RLWNM(ppu_opcode_t op) -{ - const u64 mask = ppu_rotate_mask(32 + op.mb32, 32 + op.me32); - - u64 min = gpr[op.rs].bmin; - u64 max = gpr[op.rs].bmax; - - if (op.mb32 <= op.me32) - { - if (op.mb32 == 0 && op.me32 == 31) - { - // ROTLW mnemonic - } - - // TODO - min = 0; - max = mask; - } - else - { - // Full 64-bit op with duplication - min = 0; - max = mask; - } - - gpr[op.ra] = spec_gpr::approx(min, max); -} - -void ppu_acontext::ORI(ppu_opcode_t op) -{ - gpr[op.ra] = gpr[op.rs] | spec_gpr::fixed(op.uimm16); -} - -void ppu_acontext::ORIS(ppu_opcode_t op) -{ - gpr[op.ra] = gpr[op.rs] | spec_gpr::fixed(op.uimm16 << 16); -} - -void ppu_acontext::XORI(ppu_opcode_t op) -{ - gpr[op.ra] = gpr[op.rs] ^ spec_gpr::fixed(op.uimm16); -} - -void ppu_acontext::XORIS(ppu_opcode_t op) -{ - gpr[op.ra] = gpr[op.rs] ^ spec_gpr::fixed(op.uimm16 << 16); -} - -void ppu_acontext::ANDI(ppu_opcode_t op) -{ - gpr[op.ra] = gpr[op.rs] & spec_gpr::fixed(op.uimm16); -} - -void ppu_acontext::ANDIS(ppu_opcode_t op) -{ - gpr[op.ra] = gpr[op.rs] & spec_gpr::fixed(op.uimm16 << 16); -} - -void ppu_acontext::RLDICL(ppu_opcode_t op) -{ - const u32 sh = op.sh64; - const u32 mb = op.mbe64; - const u64 mask = ~0ull >> mb; - - u64 min = gpr[op.rs].bmin; - u64 max = gpr[op.rs].bmax; - - if (64 - sh < mb) - { - // EXTRDI mnemonic - } - else if (64 - sh == mb) - { - // SRDI mnemonic - } - else if (sh == 0) - { - // CLRLDI mnemonic - gpr[op.ra] = gpr[op.rs] & spec_gpr::fixed(mask); - return; - } - - min = utils::rol64(min, sh) & mask; - max = utils::rol64(max, sh) & mask; - gpr[op.ra] = spec_gpr::approx(min, max); -} - -void ppu_acontext::RLDICR(ppu_opcode_t op) -{ - const u32 sh = op.sh64; - const u32 me = op.mbe64; - const u64 mask = ~0ull << (63 - me); - - u64 min = gpr[op.rs].bmin; - u64 max = gpr[op.rs].bmax; - - if (sh < 63 - me) - { - // EXTLDI mnemonic - } - else if (sh == 63 - me) - { - // SLDI mnemonic - } - else if (sh == 0) - { - // CLRRDI mnemonic - gpr[op.ra] = gpr[op.rs] & spec_gpr::fixed(mask); - return; - } - - min = utils::rol64(min, sh) & mask; - max = utils::rol64(max, sh) & mask; - gpr[op.ra] = spec_gpr::approx(min, max); -} - -void ppu_acontext::RLDIC(ppu_opcode_t op) -{ - const u32 sh = op.sh64; - const u32 mb = op.mbe64; - const u64 mask = ppu_rotate_mask(mb, 63 - sh); - - u64 min = gpr[op.rs].bmin; - u64 max = gpr[op.rs].bmax; - - if (mb == 0 && sh == 0) - { - gpr[op.ra] = gpr[op.rs]; - return; - } - else if (mb <= 63 - sh) - { - // CLRLSLDI - //gpr[op.ra] = (gpr[op.rs] & spec_gpr::fixed(ppu_rotate_mask(0, sh + mb))) << spec_gpr::fixed(sh); - return; - } - - min = utils::rol64(min, sh) & mask; - max = utils::rol64(max, sh) & mask; - gpr[op.ra] = spec_gpr::approx(min, max); -} - -void ppu_acontext::RLDIMI(ppu_opcode_t op) -{ - const u32 sh = op.sh64; - const u32 mb = op.mbe64; - const u64 mask = ppu_rotate_mask(mb, 63 - sh); - - u64 min = gpr[op.rs].bmin; - u64 max = gpr[op.rs].bmax; - - if (mb == 0 && sh == 0) - { - // Copy - } - else if (mb <= 63 - sh) - { - // INSRDI mnemonic - } - - min = utils::rol64(min, sh) & mask; - max = utils::rol64(max, sh) & mask; - - if (mask != umax) - { - // Insertion - min |= gpr[op.ra].bmin & ~mask; - max |= gpr[op.ra].bmax & ~mask; - } - - gpr[op.ra] = spec_gpr::approx(min, max); -} - -void ppu_acontext::RLDCL(ppu_opcode_t op) -{ - const u32 mb = op.mbe64; - const u64 mask = ~0ull >> mb; - - u64 min = gpr[op.rs].bmin; - u64 max = gpr[op.rs].bmax; - - // TODO - min = 0; - max = mask; - gpr[op.ra] = spec_gpr::approx(min, max); -} - -void ppu_acontext::RLDCR(ppu_opcode_t op) -{ - const u32 me = op.mbe64; - const u64 mask = ~0ull << (63 - me); - - u64 min = gpr[op.rs].bmin; - u64 max = gpr[op.rs].bmax; - - // TODO - min = 0; - max = mask; - gpr[op.ra] = spec_gpr::approx(min, max); -} - -void ppu_acontext::CMP(ppu_opcode_t op) -{ -} - -void ppu_acontext::TW(ppu_opcode_t op) -{ -} - -void ppu_acontext::LVSL(ppu_opcode_t op) -{ -} - -void ppu_acontext::LVEBX(ppu_opcode_t op) -{ -} - -void ppu_acontext::SUBFC(ppu_opcode_t op) -{ - gpr[op.rd] = ~gpr[op.ra] + gpr[op.rb] + spec_gpr::fixed(1); -} - -void ppu_acontext::ADDC(ppu_opcode_t op) -{ - gpr[op.rd] = gpr[op.ra] + gpr[op.rb]; -} - -void ppu_acontext::MULHDU(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::MULHWU(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::MFOCRF(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LWARX(ppu_opcode_t op) -{ - gpr[op.rd] = spec_gpr::range(0, u32{umax}); -} - -void ppu_acontext::LDX(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LWZX(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::SLW(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::CNTLZW(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::SLD(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::AND(ppu_opcode_t op) -{ - gpr[op.ra] = gpr[op.rs] & gpr[op.rb]; -} - -void ppu_acontext::CMPL(ppu_opcode_t op) -{ -} - -void ppu_acontext::LVSR(ppu_opcode_t op) -{ -} - -void ppu_acontext::LVEHX(ppu_opcode_t op) -{ -} - -void ppu_acontext::SUBF(ppu_opcode_t op) -{ - gpr[op.rd] = ~gpr[op.ra] + gpr[op.rb] + spec_gpr::fixed(1); -} - -void ppu_acontext::LDUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.rd].set_undef(); - gpr[op.ra] = addr; -} - -void ppu_acontext::DCBST(ppu_opcode_t op) -{ -} - -void ppu_acontext::LWZUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.rd].set_undef(); - gpr[op.ra] = addr; -} - -void ppu_acontext::CNTLZD(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::ANDC(ppu_opcode_t op) -{ - gpr[op.ra] = gpr[op.rs] & ~gpr[op.rb]; -} - -void ppu_acontext::TD(ppu_opcode_t op) -{ -} - -void ppu_acontext::LVEWX(ppu_opcode_t op) -{ -} - -void ppu_acontext::MULHD(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::MULHW(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LDARX(ppu_opcode_t op) -{ - gpr[op.rd] = {}; -} - -void ppu_acontext::DCBF(ppu_opcode_t op) -{ -} - -void ppu_acontext::LBZX(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LVX(ppu_opcode_t op) -{ -} - -void ppu_acontext::NEG(ppu_opcode_t op) -{ - gpr[op.rd] = ~gpr[op.ra] + spec_gpr::fixed(1); -} - -void ppu_acontext::LBZUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.rd].set_undef(); - gpr[op.ra] = addr; -} - -void ppu_acontext::NOR(ppu_opcode_t op) -{ - gpr[op.ra] = ~(gpr[op.rs] | gpr[op.rb]); -} - -void ppu_acontext::STVEBX(ppu_opcode_t op) -{ -} - -void ppu_acontext::SUBFE(ppu_opcode_t op) -{ - gpr[op.rd] = ~gpr[op.ra] + gpr[op.rb] + spec_gpr::range(0, 1); -} - -void ppu_acontext::ADDE(ppu_opcode_t op) -{ - gpr[op.rd] = gpr[op.ra] + gpr[op.rb] + spec_gpr::range(0, 1); -} - -void ppu_acontext::MTOCRF(ppu_opcode_t op) -{ -} - -void ppu_acontext::STDX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STWCX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STWX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STVEHX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STDUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::STWUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::STVEWX(ppu_opcode_t op) -{ -} - -void ppu_acontext::SUBFZE(ppu_opcode_t op) -{ - gpr[op.rd] = ~gpr[op.ra] + spec_gpr::range(0, 1); -} - -void ppu_acontext::ADDZE(ppu_opcode_t op) -{ - gpr[op.rd] = gpr[op.ra] + spec_gpr::range(0, 1); -} - -void ppu_acontext::STDCX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STBX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STVX(ppu_opcode_t op) -{ -} - -void ppu_acontext::SUBFME(ppu_opcode_t op) -{ - gpr[op.rd] = ~gpr[op.ra] + spec_gpr::fixed(-1) + spec_gpr::range(0, 1); -} - -void ppu_acontext::MULLD(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::ADDME(ppu_opcode_t op) -{ - gpr[op.rd] = gpr[op.ra] + spec_gpr::fixed(-1) + spec_gpr::range(0, 1); -} - -void ppu_acontext::MULLW(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::DCBTST(ppu_opcode_t op) -{ -} - -void ppu_acontext::STBUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::ADD(ppu_opcode_t op) -{ - gpr[op.rd] = gpr[op.ra] + gpr[op.rd]; -} - -void ppu_acontext::DCBT(ppu_opcode_t op) -{ -} - -void ppu_acontext::LHZX(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::EQV(ppu_opcode_t op) -{ - gpr[op.ra] = ~(gpr[op.rs] ^ gpr[op.rb]); -} - -void ppu_acontext::ECIWX(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LHZUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.rd].set_undef(); - gpr[op.ra] = addr; -} - -void ppu_acontext::XOR(ppu_opcode_t op) -{ - gpr[op.ra] = gpr[op.rs] ^ gpr[op.rb]; -} - -void ppu_acontext::MFSPR(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LWAX(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::DST(ppu_opcode_t op) -{ -} - -void ppu_acontext::LHAX(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LVXL(ppu_opcode_t op) -{ -} - -void ppu_acontext::MFTB(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LWAUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.rd].set_undef(); - gpr[op.ra] = addr; -} - -void ppu_acontext::DSTST(ppu_opcode_t op) -{ -} - -void ppu_acontext::LHAUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.rd].set_undef(); - gpr[op.ra] = addr; -} - -void ppu_acontext::STHX(ppu_opcode_t op) -{ -} - -void ppu_acontext::ORC(ppu_opcode_t op) -{ - gpr[op.ra] = gpr[op.rs] | ~gpr[op.rb]; -} - -void ppu_acontext::ECOWX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STHUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::OR(ppu_opcode_t op) -{ - gpr[op.ra] = gpr[op.rs] | gpr[op.rb]; -} - -void ppu_acontext::DIVDU(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::DIVWU(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::MTSPR(ppu_opcode_t op) -{ -} - -void ppu_acontext::DCBI(ppu_opcode_t op) -{ -} - -void ppu_acontext::NAND(ppu_opcode_t op) -{ - gpr[op.ra] = ~(gpr[op.rs] & gpr[op.rb]); -} - -void ppu_acontext::STVXL(ppu_opcode_t op) -{ -} - -void ppu_acontext::DIVD(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::DIVW(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LVLX(ppu_opcode_t op) -{ -} - -void ppu_acontext::LDBRX(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LSWX(ppu_opcode_t op) -{ -} - -void ppu_acontext::LWBRX(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LFSX(ppu_opcode_t op) -{ -} - -void ppu_acontext::SRW(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::SRD(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::LVRX(ppu_opcode_t op) -{ -} - -void ppu_acontext::LSWI(ppu_opcode_t op) -{ - std::fill_n(gpr, 32, spec_gpr{}); -} - -void ppu_acontext::LFSUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::SYNC(ppu_opcode_t op) -{ -} - -void ppu_acontext::LFDX(ppu_opcode_t op) -{ -} - -void ppu_acontext::LFDUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::STVLX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STDBRX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STSWX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STWBRX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STFSX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STVRX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STFSUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::STSWI(ppu_opcode_t op) -{ -} - -void ppu_acontext::STFDX(ppu_opcode_t op) -{ -} - -void ppu_acontext::STFDUX(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::LVLXL(ppu_opcode_t op) -{ -} - -void ppu_acontext::LHBRX(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::SRAW(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::SRAD(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::LVRXL(ppu_opcode_t op) -{ -} - -void ppu_acontext::DSS(ppu_opcode_t op) -{ -} - -void ppu_acontext::SRAWI(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::SRADI(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::EIEIO(ppu_opcode_t op) -{ -} - -void ppu_acontext::STVLXL(ppu_opcode_t op) -{ -} - -void ppu_acontext::STHBRX(ppu_opcode_t op) -{ -} - -void ppu_acontext::EXTSH(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::STVRXL(ppu_opcode_t op) -{ -} - -void ppu_acontext::EXTSB(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::STFIWX(ppu_opcode_t op) -{ -} - -void ppu_acontext::EXTSW(ppu_opcode_t op) -{ - gpr[op.ra].set_undef(); -} - -void ppu_acontext::ICBI(ppu_opcode_t op) -{ -} - -void ppu_acontext::DCBZ(ppu_opcode_t op) -{ -} - -void ppu_acontext::LWZ(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LWZU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.rd].set_undef(); - gpr[op.ra] = addr; -} - -void ppu_acontext::LBZ(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LBZU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.rd].set_undef(); - gpr[op.ra] = addr; -} - -void ppu_acontext::STW(ppu_opcode_t op) -{ -} - -void ppu_acontext::STWU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::STB(ppu_opcode_t op) -{ -} - -void ppu_acontext::STBU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::LHZ(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LHZU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.rd].set_undef(); - gpr[op.ra] = addr; -} - -void ppu_acontext::LHA(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LHAU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.rd].set_undef(); - gpr[op.ra] = addr; -} - -void ppu_acontext::STH(ppu_opcode_t op) -{ -} - -void ppu_acontext::STHU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::LMW(ppu_opcode_t op) -{ - std::fill_n(gpr, 32, spec_gpr{}); -} - -void ppu_acontext::STMW(ppu_opcode_t op) -{ -} - -void ppu_acontext::LFS(ppu_opcode_t op) -{ -} - -void ppu_acontext::LFSU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::LFD(ppu_opcode_t op) -{ -} - -void ppu_acontext::LFDU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::STFS(ppu_opcode_t op) -{ -} - -void ppu_acontext::STFSU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::STFD(ppu_opcode_t op) -{ -} - -void ppu_acontext::STFDU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::LD(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::LDU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.rd].set_undef(); - gpr[op.ra] = addr; -} - -void ppu_acontext::LWA(ppu_opcode_t op) -{ - gpr[op.rd].set_undef(); -} - -void ppu_acontext::STD(ppu_opcode_t op) -{ -} - -void ppu_acontext::STDU(ppu_opcode_t op) -{ - const auto addr = gpr[op.ra] + gpr[op.rb]; - gpr[op.ra] = addr; -} - -void ppu_acontext::FDIVS(ppu_opcode_t op) -{ -} - -void ppu_acontext::FSUBS(ppu_opcode_t op) -{ -} - -void ppu_acontext::FADDS(ppu_opcode_t op) -{ -} - -void ppu_acontext::FSQRTS(ppu_opcode_t op) -{ -} - -void ppu_acontext::FRES(ppu_opcode_t op) -{ -} - -void ppu_acontext::FMULS(ppu_opcode_t op) -{ -} - -void ppu_acontext::FMADDS(ppu_opcode_t op) -{ -} - -void ppu_acontext::FMSUBS(ppu_opcode_t op) -{ -} - -void ppu_acontext::FNMSUBS(ppu_opcode_t op) -{ -} - -void ppu_acontext::FNMADDS(ppu_opcode_t op) -{ -} - -void ppu_acontext::MTFSB1(ppu_opcode_t op) -{ -} - -void ppu_acontext::MCRFS(ppu_opcode_t op) -{ -} - -void ppu_acontext::MTFSB0(ppu_opcode_t op) -{ -} - -void ppu_acontext::MTFSFI(ppu_opcode_t op) -{ -} - -void ppu_acontext::MFFS(ppu_opcode_t op) -{ -} - -void ppu_acontext::MTFSF(ppu_opcode_t op) -{ -} - -void ppu_acontext::FCMPU(ppu_opcode_t op) -{ -} - -void ppu_acontext::FRSP(ppu_opcode_t op) -{ -} - -void ppu_acontext::FCTIW(ppu_opcode_t op) -{ -} - -void ppu_acontext::FCTIWZ(ppu_opcode_t op) -{ -} - -void ppu_acontext::FDIV(ppu_opcode_t op) -{ -} - -void ppu_acontext::FSUB(ppu_opcode_t op) -{ -} - -void ppu_acontext::FADD(ppu_opcode_t op) -{ -} - -void ppu_acontext::FSQRT(ppu_opcode_t op) -{ -} - -void ppu_acontext::FSEL(ppu_opcode_t op) -{ -} - -void ppu_acontext::FMUL(ppu_opcode_t op) -{ -} - -void ppu_acontext::FRSQRTE(ppu_opcode_t op) -{ -} - -void ppu_acontext::FMSUB(ppu_opcode_t op) -{ -} - -void ppu_acontext::FMADD(ppu_opcode_t op) -{ -} - -void ppu_acontext::FNMSUB(ppu_opcode_t op) -{ -} - -void ppu_acontext::FNMADD(ppu_opcode_t op) -{ -} - -void ppu_acontext::FCMPO(ppu_opcode_t op) -{ -} - -void ppu_acontext::FNEG(ppu_opcode_t op) -{ -} - -void ppu_acontext::FMR(ppu_opcode_t op) -{ -} - -void ppu_acontext::FNABS(ppu_opcode_t op) -{ -} - -void ppu_acontext::FABS(ppu_opcode_t op) -{ -} - -void ppu_acontext::FCTID(ppu_opcode_t op) -{ -} - -void ppu_acontext::FCTIDZ(ppu_opcode_t op) -{ -} - -void ppu_acontext::FCFID(ppu_opcode_t op) -{ -} - -#include - -const bool s_tes = []() -{ - return true; - - std::mt19937_64 rnd{123}; - - for (u32 i = 0; i < 10000; i++) - { - ppu_acontext::spec_gpr r1, r2, r3; - r1 = ppu_acontext::spec_gpr::approx(rnd(), rnd()); - r2 = ppu_acontext::spec_gpr::range(rnd(), rnd()); - r3 = r1 | r2; - - for (u32 j = 0; j < 10000; j++) - { - u64 v1 = rnd(), v2 = rnd(); - v1 &= r1.mask(); - v1 |= r1.ones(); - if (!r2.test(v2)) - { - v2 = r2.imin; - } - - if (r1.test(v1) && r2.test(v2)) - { - if (!r3.test(v1 | v2)) - { - auto exp = ppu_acontext::spec_gpr::approx(r1.ones() & r2.ones(), r1.mask() & r2.mask()); - - ppu_log.error("ppu_acontext failure:" - "\n\tr1 = 0x%016x..0x%016x, 0x%016x:0x%016x" - "\n\tr2 = 0x%016x..0x%016x, 0x%016x:0x%016x" - "\n\tr3 = 0x%016x..0x%016x, 0x%016x:0x%016x" - "\n\tex = 0x%016x..0x%016x" - "\n\tv1 = 0x%016x, v2 = 0x%016x, v3 = 0x%016x", - r1.imin, r1.imax, r1.bmin, r1.bmax, r2.imin, r2.imax, r2.bmin, r2.bmax, r3.imin, r3.imax, r3.bmin, r3.bmax, exp.imin, exp.imax, v1, v2, v1 | v2); - break; - } - } - } - } - - ppu_acontext::spec_gpr r1; - r1 = ppu_acontext::spec_gpr::range(0x13311, 0x1fe22); - r1 = r1 ^ ppu_acontext::spec_gpr::approx(0x000, 0xf00); - ppu_log.success("0x%x..0x%x", r1.imin, r1.imax); - - return true; -}(); diff --git a/rpcs3/Emu/Cell/PPUAnalyser.h b/rpcs3/Emu/Cell/PPUAnalyser.h index 31571bdf93..5d9053847d 100644 --- a/rpcs3/Emu/Cell/PPUAnalyser.h +++ b/rpcs3/Emu/Cell/PPUAnalyser.h @@ -2,11 +2,9 @@ #include #include -#include #include #include #include "util/types.hpp" -#include "util/endian.hpp" #include "util/asm.hpp" #include "util/to_endian.hpp" @@ -1419,738 +1417,3 @@ struct ppu_iname #undef NAME #undef NAME_ }; - -// PPU Analyser Context -struct ppu_acontext -{ - // General-purpose register range - struct spec_gpr - { - // Integral range: normalized undef = (0;UINT64_MAX), unnormalized undefs are possible (when max = min - 1) - // Bit range: constant 0 = (0;0), constant 1 = (1;1), normalized undef = (0;1), unnormalized undef = (1;0) - - u64 imin = 0ull; // Integral range begin - u64 imax = ~0ull; // Integral range end - u64 bmin = 0ull; // Bit range begin - u64 bmax = ~0ull; // Bit range end - - void set_undef() - { - imin = 0; - imax = -1; - bmin = 0; - bmax = -1; - } - - // (Number of possible values - 1), 0 = const - u64 div() const - { - return imax - imin; - } - - // Return zero bits for zeros, ones for ones or undefs - u64 mask() const - { - return bmin | bmax; - } - - // Return one bits for ones, zeros for zeros or undefs - u64 ones() const - { - return bmin & bmax; - } - - // Return one bits for undefs - u64 undefs() const - { - return bmin ^ bmax; - } - - // Return number of trailing zero bits - u64 tz() const - { - return std::countr_zero(mask()); - } - - // Range NOT - spec_gpr operator ~() const - { - spec_gpr r; - r.imin = ~imax; - r.imax = ~imin; - r.bmin = ~bmax; - r.bmax = ~bmin; - return r; - } - - // Range ADD - spec_gpr operator +(const spec_gpr& rhs) const - { - spec_gpr r{}; - - const u64 adiv = div(); - const u64 bdiv = rhs.div(); - - // Check overflow, generate normalized range - if (adiv != umax && bdiv != umax && adiv <= adiv + bdiv) - { - r = range(imin + rhs.imin, imax + rhs.imax); - } - - // Carry for bitrange computation - u64 cmin = 0; - u64 cmax = 0; - - const u64 amask = mask(); - const u64 bmask = rhs.mask(); - const u64 aones = ones(); - const u64 bones = rhs.ones(); - - for (u32 i = 0; i < 64; i++) - { - cmin += ((amask >> i) & 1) + ((bmask >> i) & 1); - cmax += ((aones >> i) & 1) + ((bones >> i) & 1); - - // Discover some constant bits - if (cmin == cmax) - { - r.bmin |= (cmin & 1) << i; - r.bmax &= ~((~cmin & 1) << i); - } - - cmin >>= 1; - cmax >>= 1; - } - - return r; - } - - // Range AND - spec_gpr operator &(const spec_gpr& rhs) const - { - // Ignore inverted ranges (TODO) - if (imin > imax || rhs.imin > rhs.imax) - { - return approx(ones() & rhs.ones(), mask() & rhs.mask()); - } - - // Const (TODO: remove when unnecessary) - if (imin == imax && rhs.imin == rhs.imax) - { - return fixed(imin & rhs.imin); - } - - // Swap (TODO: remove when unnecessary) - if (imin == imax || rhs.undefs() > undefs()) - { - return rhs & *this; - } - - // Copy and attempt to partially preserve integral range - spec_gpr r = *this; - - for (u32 i = 63; ~i; i--) - { - const u64 m = 1ull << i; - - if (!(rhs.mask() & m)) - { - if (r.undefs() & m) - { - // undef -> 0 - r.imin &= ~(m - 1); - r.imax |= (m - 1); - r.imin &= ~m; - r.imax &= ~m; - } - else if (r.ones() & m) - { - // 1 -> 0 - if ((r.imin ^ r.imax) > (m - 1)) - { - r.imin &= ~(m - 1); - r.imax |= (m - 1); - } - - r.imin &= ~m; - r.imax &= ~m; - } - } - else if (rhs.undefs() & m) - { - // -> undef - r.imin &= ~(m - 1); - r.imax |= (m - 1); - r.imin &= ~m; - r.imax |= m; - } - } - - r.bmin = ones() & rhs.ones(); - r.bmax = mask() & rhs.mask(); - return r; - } - - // Range OR - spec_gpr operator |(const spec_gpr& rhs) const - { - // Ignore inverted ranges (TODO) - if (imin > imax || rhs.imin > rhs.imax) - { - return approx(ones() | rhs.ones(), mask() | rhs.mask()); - } - - // Const (TODO: remove when unnecessary) - if (imin == imax && rhs.imin == rhs.imax) - { - return fixed(imin | rhs.imin); - } - - // Swap (TODO: remove when unnecessary) - if (imin == imax || rhs.undefs() > undefs()) - { - return rhs | *this; - } - - // Copy and attempt to partially preserve integral range - spec_gpr r = *this; - - for (u32 i = 63; ~i; i--) - { - const u64 m = 1ull << i; - - if (rhs.ones() & m) - { - if (r.undefs() & m) - { - // undef -> 1 - r.imin &= ~(m - 1); - r.imax |= (m - 1); - r.imin |= m; - r.imax |= m; - } - else if (!(r.mask() & m)) - { - // 0 -> 1 - if ((r.imin ^ r.imax) > (m - 1)) - { - r.imin &= ~(m - 1); - r.imax |= (m - 1); - } - - r.imin |= m; - r.imax |= m; - } - } - else if (rhs.undefs() & m) - { - // -> undef - r.imin &= ~(m - 1); - r.imax |= (m - 1); - r.imin &= ~m; - r.imax |= m; - } - } - - r.bmin = ones() | rhs.ones(); - r.bmax = mask() | rhs.mask(); - return r; - } - - // Range XOR - spec_gpr operator ^(const spec_gpr& rhs) const - { - return (~*this & rhs) | (*this & ~rhs); - } - - // Check whether the value is in range - bool test(u64 value) const - { - if (imin <= imax) - { - if (value < imin || value > imax) - { - return false; - } - } - else - { - if (value < imin && value > imax) - { - return false; - } - } - - if ((value & mask()) != value) - { - return false; - } - - if ((value | ones()) != value) - { - return false; - } - - return true; - } - - // Constant value - static spec_gpr fixed(u64 value) - { - spec_gpr r; - r.imin = value; - r.imax = value; - r.bmin = value; - r.bmax = value; - return r; - } - - // Range (tz = number of constant trailing zeros) - static spec_gpr range(u64 min, u64 max, u64 tz = 0) - { - const u64 mask = tz < 64 ? ~0ull << tz : 0ull; - - spec_gpr r; - r.bmin = 0; - r.bmax = mask; - - // Normalize min/max for tz (TODO) - if (min < max) - { - // Inverted constant MSB mask - const u64 mix = ~0ull >> std::countl_zero(min ^ max); - r.bmin |= min & ~mix; - r.bmax &= max | mix; - - r.imin = (min + ~mask) & mask; - r.imax = max & mask; - ensure(r.imin <= r.imax); // "Impossible range" - } - else - { - r.imin = min & mask; - r.imax = (max + ~mask) & mask; - ensure(r.imin >= r.imax); // "Impossible range" - } - - // Fix const values - if (r.imin == r.imax) - { - r.bmin = r.imin; - r.bmax = r.imax; - } - - return r; - } - - // Make from bitrange (normalize, approximate range values) - static spec_gpr approx(u64 bmin, u64 bmax) - { - spec_gpr r; - r.imin = bmin & ~(bmin ^ bmax); - r.imax = bmax | (bmin ^ bmax); - r.bmin = bmin & ~(bmin ^ bmax); - r.bmax = bmax | (bmin ^ bmax); - return r; - } - } gpr[32]{}; - - // Vector registers (draft) - struct spec_vec - { - u8 imin8[16]{}; - u8 imax8[16]{255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}; - u16 imin16[8]{}; - u16 imax16[8]{0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}; - u32 imin32[4]{}; - u32 imax32[4]{0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu}; - u64 bmin64[2]{}; - u64 bmax64[2]{0xffffffffffffffffull, 0xffffffffffffffffull}; - }; - - // Info - u32 cia; - - // Analyser step - void UNK(ppu_opcode_t); - - void MFVSCR(ppu_opcode_t); - void MTVSCR(ppu_opcode_t); - void VADDCUW(ppu_opcode_t); - void VADDFP(ppu_opcode_t); - void VADDSBS(ppu_opcode_t); - void VADDSHS(ppu_opcode_t); - void VADDSWS(ppu_opcode_t); - void VADDUBM(ppu_opcode_t); - void VADDUBS(ppu_opcode_t); - void VADDUHM(ppu_opcode_t); - void VADDUHS(ppu_opcode_t); - void VADDUWM(ppu_opcode_t); - void VADDUWS(ppu_opcode_t); - void VAND(ppu_opcode_t); - void VANDC(ppu_opcode_t); - void VAVGSB(ppu_opcode_t); - void VAVGSH(ppu_opcode_t); - void VAVGSW(ppu_opcode_t); - void VAVGUB(ppu_opcode_t); - void VAVGUH(ppu_opcode_t); - void VAVGUW(ppu_opcode_t); - void VCFSX(ppu_opcode_t); - void VCFUX(ppu_opcode_t); - void VCMPBFP(ppu_opcode_t); - void VCMPEQFP(ppu_opcode_t); - void VCMPEQUB(ppu_opcode_t); - void VCMPEQUH(ppu_opcode_t); - void VCMPEQUW(ppu_opcode_t); - void VCMPGEFP(ppu_opcode_t); - void VCMPGTFP(ppu_opcode_t); - void VCMPGTSB(ppu_opcode_t); - void VCMPGTSH(ppu_opcode_t); - void VCMPGTSW(ppu_opcode_t); - void VCMPGTUB(ppu_opcode_t); - void VCMPGTUH(ppu_opcode_t); - void VCMPGTUW(ppu_opcode_t); - void VCTSXS(ppu_opcode_t); - void VCTUXS(ppu_opcode_t); - void VEXPTEFP(ppu_opcode_t); - void VLOGEFP(ppu_opcode_t); - void VMADDFP(ppu_opcode_t); - void VMAXFP(ppu_opcode_t); - void VMAXSB(ppu_opcode_t); - void VMAXSH(ppu_opcode_t); - void VMAXSW(ppu_opcode_t); - void VMAXUB(ppu_opcode_t); - void VMAXUH(ppu_opcode_t); - void VMAXUW(ppu_opcode_t); - void VMHADDSHS(ppu_opcode_t); - void VMHRADDSHS(ppu_opcode_t); - void VMINFP(ppu_opcode_t); - void VMINSB(ppu_opcode_t); - void VMINSH(ppu_opcode_t); - void VMINSW(ppu_opcode_t); - void VMINUB(ppu_opcode_t); - void VMINUH(ppu_opcode_t); - void VMINUW(ppu_opcode_t); - void VMLADDUHM(ppu_opcode_t); - void VMRGHB(ppu_opcode_t); - void VMRGHH(ppu_opcode_t); - void VMRGHW(ppu_opcode_t); - void VMRGLB(ppu_opcode_t); - void VMRGLH(ppu_opcode_t); - void VMRGLW(ppu_opcode_t); - void VMSUMMBM(ppu_opcode_t); - void VMSUMSHM(ppu_opcode_t); - void VMSUMSHS(ppu_opcode_t); - void VMSUMUBM(ppu_opcode_t); - void VMSUMUHM(ppu_opcode_t); - void VMSUMUHS(ppu_opcode_t); - void VMULESB(ppu_opcode_t); - void VMULESH(ppu_opcode_t); - void VMULEUB(ppu_opcode_t); - void VMULEUH(ppu_opcode_t); - void VMULOSB(ppu_opcode_t); - void VMULOSH(ppu_opcode_t); - void VMULOUB(ppu_opcode_t); - void VMULOUH(ppu_opcode_t); - void VNMSUBFP(ppu_opcode_t); - void VNOR(ppu_opcode_t); - void VOR(ppu_opcode_t); - void VPERM(ppu_opcode_t); - void VPKPX(ppu_opcode_t); - void VPKSHSS(ppu_opcode_t); - void VPKSHUS(ppu_opcode_t); - void VPKSWSS(ppu_opcode_t); - void VPKSWUS(ppu_opcode_t); - void VPKUHUM(ppu_opcode_t); - void VPKUHUS(ppu_opcode_t); - void VPKUWUM(ppu_opcode_t); - void VPKUWUS(ppu_opcode_t); - void VREFP(ppu_opcode_t); - void VRFIM(ppu_opcode_t); - void VRFIN(ppu_opcode_t); - void VRFIP(ppu_opcode_t); - void VRFIZ(ppu_opcode_t); - void VRLB(ppu_opcode_t); - void VRLH(ppu_opcode_t); - void VRLW(ppu_opcode_t); - void VRSQRTEFP(ppu_opcode_t); - void VSEL(ppu_opcode_t); - void VSL(ppu_opcode_t); - void VSLB(ppu_opcode_t); - void VSLDOI(ppu_opcode_t); - void VSLH(ppu_opcode_t); - void VSLO(ppu_opcode_t); - void VSLW(ppu_opcode_t); - void VSPLTB(ppu_opcode_t); - void VSPLTH(ppu_opcode_t); - void VSPLTISB(ppu_opcode_t); - void VSPLTISH(ppu_opcode_t); - void VSPLTISW(ppu_opcode_t); - void VSPLTW(ppu_opcode_t); - void VSR(ppu_opcode_t); - void VSRAB(ppu_opcode_t); - void VSRAH(ppu_opcode_t); - void VSRAW(ppu_opcode_t); - void VSRB(ppu_opcode_t); - void VSRH(ppu_opcode_t); - void VSRO(ppu_opcode_t); - void VSRW(ppu_opcode_t); - void VSUBCUW(ppu_opcode_t); - void VSUBFP(ppu_opcode_t); - void VSUBSBS(ppu_opcode_t); - void VSUBSHS(ppu_opcode_t); - void VSUBSWS(ppu_opcode_t); - void VSUBUBM(ppu_opcode_t); - void VSUBUBS(ppu_opcode_t); - void VSUBUHM(ppu_opcode_t); - void VSUBUHS(ppu_opcode_t); - void VSUBUWM(ppu_opcode_t); - void VSUBUWS(ppu_opcode_t); - void VSUMSWS(ppu_opcode_t); - void VSUM2SWS(ppu_opcode_t); - void VSUM4SBS(ppu_opcode_t); - void VSUM4SHS(ppu_opcode_t); - void VSUM4UBS(ppu_opcode_t); - void VUPKHPX(ppu_opcode_t); - void VUPKHSB(ppu_opcode_t); - void VUPKHSH(ppu_opcode_t); - void VUPKLPX(ppu_opcode_t); - void VUPKLSB(ppu_opcode_t); - void VUPKLSH(ppu_opcode_t); - void VXOR(ppu_opcode_t); - void TDI(ppu_opcode_t); - void TWI(ppu_opcode_t); - void MULLI(ppu_opcode_t); - void SUBFIC(ppu_opcode_t); - void CMPLI(ppu_opcode_t); - void CMPI(ppu_opcode_t); - void ADDIC(ppu_opcode_t); - void ADDI(ppu_opcode_t); - void ADDIS(ppu_opcode_t); - void BC(ppu_opcode_t); - void SC(ppu_opcode_t); - void B(ppu_opcode_t); - void MCRF(ppu_opcode_t); - void BCLR(ppu_opcode_t); - void CRNOR(ppu_opcode_t); - void CRANDC(ppu_opcode_t); - void ISYNC(ppu_opcode_t); - void CRXOR(ppu_opcode_t); - void CRNAND(ppu_opcode_t); - void CRAND(ppu_opcode_t); - void CREQV(ppu_opcode_t); - void CRORC(ppu_opcode_t); - void CROR(ppu_opcode_t); - void BCCTR(ppu_opcode_t); - void RLWIMI(ppu_opcode_t); - void RLWINM(ppu_opcode_t); - void RLWNM(ppu_opcode_t); - void ORI(ppu_opcode_t); - void ORIS(ppu_opcode_t); - void XORI(ppu_opcode_t); - void XORIS(ppu_opcode_t); - void ANDI(ppu_opcode_t); - void ANDIS(ppu_opcode_t); - void RLDICL(ppu_opcode_t); - void RLDICR(ppu_opcode_t); - void RLDIC(ppu_opcode_t); - void RLDIMI(ppu_opcode_t); - void RLDCL(ppu_opcode_t); - void RLDCR(ppu_opcode_t); - void CMP(ppu_opcode_t); - void TW(ppu_opcode_t); - void LVSL(ppu_opcode_t); - void LVEBX(ppu_opcode_t); - void SUBFC(ppu_opcode_t); - void ADDC(ppu_opcode_t); - void MULHDU(ppu_opcode_t); - void MULHWU(ppu_opcode_t); - void MFOCRF(ppu_opcode_t); - void LWARX(ppu_opcode_t); - void LDX(ppu_opcode_t); - void LWZX(ppu_opcode_t); - void SLW(ppu_opcode_t); - void CNTLZW(ppu_opcode_t); - void SLD(ppu_opcode_t); - void AND(ppu_opcode_t); - void CMPL(ppu_opcode_t); - void LVSR(ppu_opcode_t); - void LVEHX(ppu_opcode_t); - void SUBF(ppu_opcode_t); - void LDUX(ppu_opcode_t); - void DCBST(ppu_opcode_t); - void LWZUX(ppu_opcode_t); - void CNTLZD(ppu_opcode_t); - void ANDC(ppu_opcode_t); - void TD(ppu_opcode_t); - void LVEWX(ppu_opcode_t); - void MULHD(ppu_opcode_t); - void MULHW(ppu_opcode_t); - void LDARX(ppu_opcode_t); - void DCBF(ppu_opcode_t); - void LBZX(ppu_opcode_t); - void LVX(ppu_opcode_t); - void NEG(ppu_opcode_t); - void LBZUX(ppu_opcode_t); - void NOR(ppu_opcode_t); - void STVEBX(ppu_opcode_t); - void SUBFE(ppu_opcode_t); - void ADDE(ppu_opcode_t); - void MTOCRF(ppu_opcode_t); - void STDX(ppu_opcode_t); - void STWCX(ppu_opcode_t); - void STWX(ppu_opcode_t); - void STVEHX(ppu_opcode_t); - void STDUX(ppu_opcode_t); - void STWUX(ppu_opcode_t); - void STVEWX(ppu_opcode_t); - void SUBFZE(ppu_opcode_t); - void ADDZE(ppu_opcode_t); - void STDCX(ppu_opcode_t); - void STBX(ppu_opcode_t); - void STVX(ppu_opcode_t); - void SUBFME(ppu_opcode_t); - void MULLD(ppu_opcode_t); - void ADDME(ppu_opcode_t); - void MULLW(ppu_opcode_t); - void DCBTST(ppu_opcode_t); - void STBUX(ppu_opcode_t); - void ADD(ppu_opcode_t); - void DCBT(ppu_opcode_t); - void LHZX(ppu_opcode_t); - void EQV(ppu_opcode_t); - void ECIWX(ppu_opcode_t); - void LHZUX(ppu_opcode_t); - void XOR(ppu_opcode_t); - void MFSPR(ppu_opcode_t); - void LWAX(ppu_opcode_t); - void DST(ppu_opcode_t); - void LHAX(ppu_opcode_t); - void LVXL(ppu_opcode_t); - void MFTB(ppu_opcode_t); - void LWAUX(ppu_opcode_t); - void DSTST(ppu_opcode_t); - void LHAUX(ppu_opcode_t); - void STHX(ppu_opcode_t); - void ORC(ppu_opcode_t); - void ECOWX(ppu_opcode_t); - void STHUX(ppu_opcode_t); - void OR(ppu_opcode_t); - void DIVDU(ppu_opcode_t); - void DIVWU(ppu_opcode_t); - void MTSPR(ppu_opcode_t); - void DCBI(ppu_opcode_t); - void NAND(ppu_opcode_t); - void STVXL(ppu_opcode_t); - void DIVD(ppu_opcode_t); - void DIVW(ppu_opcode_t); - void LVLX(ppu_opcode_t); - void LDBRX(ppu_opcode_t); - void LSWX(ppu_opcode_t); - void LWBRX(ppu_opcode_t); - void LFSX(ppu_opcode_t); - void SRW(ppu_opcode_t); - void SRD(ppu_opcode_t); - void LVRX(ppu_opcode_t); - void LSWI(ppu_opcode_t); - void LFSUX(ppu_opcode_t); - void SYNC(ppu_opcode_t); - void LFDX(ppu_opcode_t); - void LFDUX(ppu_opcode_t); - void STVLX(ppu_opcode_t); - void STDBRX(ppu_opcode_t); - void STSWX(ppu_opcode_t); - void STWBRX(ppu_opcode_t); - void STFSX(ppu_opcode_t); - void STVRX(ppu_opcode_t); - void STFSUX(ppu_opcode_t); - void STSWI(ppu_opcode_t); - void STFDX(ppu_opcode_t); - void STFDUX(ppu_opcode_t); - void LVLXL(ppu_opcode_t); - void LHBRX(ppu_opcode_t); - void SRAW(ppu_opcode_t); - void SRAD(ppu_opcode_t); - void LVRXL(ppu_opcode_t); - void DSS(ppu_opcode_t); - void SRAWI(ppu_opcode_t); - void SRADI(ppu_opcode_t); - void EIEIO(ppu_opcode_t); - void STVLXL(ppu_opcode_t); - void STHBRX(ppu_opcode_t); - void EXTSH(ppu_opcode_t); - void STVRXL(ppu_opcode_t); - void EXTSB(ppu_opcode_t); - void STFIWX(ppu_opcode_t); - void EXTSW(ppu_opcode_t); - void ICBI(ppu_opcode_t); - void DCBZ(ppu_opcode_t); - void LWZ(ppu_opcode_t); - void LWZU(ppu_opcode_t); - void LBZ(ppu_opcode_t); - void LBZU(ppu_opcode_t); - void STW(ppu_opcode_t); - void STWU(ppu_opcode_t); - void STB(ppu_opcode_t); - void STBU(ppu_opcode_t); - void LHZ(ppu_opcode_t); - void LHZU(ppu_opcode_t); - void LHA(ppu_opcode_t); - void LHAU(ppu_opcode_t); - void STH(ppu_opcode_t); - void STHU(ppu_opcode_t); - void LMW(ppu_opcode_t); - void STMW(ppu_opcode_t); - void LFS(ppu_opcode_t); - void LFSU(ppu_opcode_t); - void LFD(ppu_opcode_t); - void LFDU(ppu_opcode_t); - void STFS(ppu_opcode_t); - void STFSU(ppu_opcode_t); - void STFD(ppu_opcode_t); - void STFDU(ppu_opcode_t); - void LD(ppu_opcode_t); - void LDU(ppu_opcode_t); - void LWA(ppu_opcode_t); - void STD(ppu_opcode_t); - void STDU(ppu_opcode_t); - void FDIVS(ppu_opcode_t); - void FSUBS(ppu_opcode_t); - void FADDS(ppu_opcode_t); - void FSQRTS(ppu_opcode_t); - void FRES(ppu_opcode_t); - void FMULS(ppu_opcode_t); - void FMADDS(ppu_opcode_t); - void FMSUBS(ppu_opcode_t); - void FNMSUBS(ppu_opcode_t); - void FNMADDS(ppu_opcode_t); - void MTFSB1(ppu_opcode_t); - void MCRFS(ppu_opcode_t); - void MTFSB0(ppu_opcode_t); - void MTFSFI(ppu_opcode_t); - void MFFS(ppu_opcode_t); - void MTFSF(ppu_opcode_t); - void FCMPU(ppu_opcode_t); - void FRSP(ppu_opcode_t); - void FCTIW(ppu_opcode_t); - void FCTIWZ(ppu_opcode_t); - void FDIV(ppu_opcode_t); - void FSUB(ppu_opcode_t); - void FADD(ppu_opcode_t); - void FSQRT(ppu_opcode_t); - void FSEL(ppu_opcode_t); - void FMUL(ppu_opcode_t); - void FRSQRTE(ppu_opcode_t); - void FMSUB(ppu_opcode_t); - void FMADD(ppu_opcode_t); - void FNMSUB(ppu_opcode_t); - void FNMADD(ppu_opcode_t); - void FCMPO(ppu_opcode_t); - void FNEG(ppu_opcode_t); - void FMR(ppu_opcode_t); - void FNABS(ppu_opcode_t); - void FABS(ppu_opcode_t); - void FCTID(ppu_opcode_t); - void FCTIDZ(ppu_opcode_t); - void FCFID(ppu_opcode_t); -}; diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index 3ecb55e32e..d95737ba50 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -15,6 +15,7 @@ #include "Emu/Cell/PPUOpcodes.h" #include "Emu/Cell/SPUThread.h" #include "Emu/Cell/PPUAnalyser.h" +#include "Emu/Cell/timers.hpp" #include "Emu/Cell/lv2/sys_process.h" #include "Emu/Cell/lv2/sys_prx.h" diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 4502ca3616..65467b168b 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -12,9 +12,9 @@ #include "Emu/Memory/vm_locking.h" #include "Emu/RSX/Core/RSXReservationLock.hpp" #include "Emu/VFS.h" -#include "Emu/vfs_config.h" #include "Emu/system_progress.hpp" #include "Emu/system_utils.hpp" +#include "Emu/System.h" #include "PPUThread.h" #include "PPUInterpreter.h" #include "PPUAnalyser.h" @@ -65,6 +65,8 @@ #include "util/simd.hpp" #include "util/sysinfo.hpp" +#include "Utilities/sema.h" + #ifdef __APPLE__ #include #endif diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 66cac9f5ba..8962cc284d 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -1,4 +1,3 @@ -#include #ifdef LLVM_AVAILABLE #include "Emu/system_config.h" diff --git a/rpcs3/Emu/Cell/RawSPUThread.cpp b/rpcs3/Emu/Cell/RawSPUThread.cpp index dd621ae088..01041555e1 100644 --- a/rpcs3/Emu/Cell/RawSPUThread.cpp +++ b/rpcs3/Emu/Cell/RawSPUThread.cpp @@ -3,7 +3,7 @@ #include "Loader/ELF.h" #include "util/asm.hpp" -#include "Emu/Cell/RawSPUThread.h" +#include "SPUThread.h" inline void try_start(spu_thread& spu) { diff --git a/rpcs3/Emu/Cell/RawSPUThread.h b/rpcs3/Emu/Cell/RawSPUThread.h index 921db8f1f6..6f70f09bee 100644 --- a/rpcs3/Emu/Cell/RawSPUThread.h +++ b/rpcs3/Emu/Cell/RawSPUThread.h @@ -1,3 +1 @@ #pragma once - -#include "SPUThread.h" diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index 3a3ef1cda3..3eb75082a2 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -5,15 +5,12 @@ #include "Emu/IdManager.h" #include "Emu/Cell/timers.hpp" -#include "SPUDisAsm.h" #include "SPUThread.h" #include "SPUInterpreter.h" -#include "PPUAnalyser.h" #include "Crypto/sha1.h" #include "util/asm.hpp" #include "util/v128.hpp" -#include "util/simd.hpp" #include "util/sysinfo.hpp" #include diff --git a/rpcs3/Emu/Cell/SPUAnalyser.h b/rpcs3/Emu/Cell/SPUAnalyser.h index faa85a5a41..103c655a9e 100644 --- a/rpcs3/Emu/Cell/SPUAnalyser.h +++ b/rpcs3/Emu/Cell/SPUAnalyser.h @@ -1,7 +1,5 @@ #pragma once -#include "util/types.hpp" - // SPU Instruction Type struct spu_itype { diff --git a/rpcs3/Emu/Cell/SPUInterpreter.cpp b/rpcs3/Emu/Cell/SPUInterpreter.cpp index 3d69d5f9e1..a781da5e8f 100644 --- a/rpcs3/Emu/Cell/SPUInterpreter.cpp +++ b/rpcs3/Emu/Cell/SPUInterpreter.cpp @@ -3,7 +3,6 @@ #include "Utilities/JIT.h" #include "SPUThread.h" -#include "Emu/Cell/Common.h" #include "Emu/Cell/SPUAnalyser.h" #include "Emu/system_config.h" @@ -13,7 +12,6 @@ #include "util/sysinfo.hpp" #include -#include #if !defined(_MSC_VER) #pragma GCC diagnostic push diff --git a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp index 1bbccb2d87..72f589192e 100644 --- a/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPULLVMRecompiler.cpp @@ -1675,7 +1675,9 @@ public: llvm::Value* starta_pc = m_ir->CreateAnd(get_pc(starta), 0x3fffc); llvm::Value* data_addr = m_ir->CreateGEP(get_type(), m_lsptr, starta_pc); - llvm::Value* acc = nullptr; + llvm::Value* acc0 = nullptr; + llvm::Value* acc1 = nullptr; + bool toggle = true; // Use a 512bit simple checksum to verify integrity if size is atleast 512b * 3 // This code uses a 512bit vector for all hardware to ensure behavior matches. @@ -1721,10 +1723,21 @@ public: vls = m_ir->CreateShuffleVector(vls, ConstantAggregateZero::get(vls->getType()), llvm::ArrayRef(indices, 16)); } - acc = acc ? m_ir->CreateAdd(acc, vls) : vls; + // Interleave accumulators for more performance + if (toggle) + { + acc0 = acc0 ? m_ir->CreateAdd(acc0, vls) : vls; + } + else + { + acc1 = acc1 ? m_ir->CreateAdd(acc1, vls) : vls; + } + toggle = !toggle; check_iterations++; } + llvm::Value* acc = (acc0 && acc1) ? m_ir->CreateAdd(acc0, acc1): (acc0 ? acc0 : acc1); + // Create the checksum u32 checksum[16] = {0}; @@ -1818,9 +1831,21 @@ public: } vls = m_ir->CreateXor(vls, ConstantDataVector::get(m_context, llvm::ArrayRef(words, elements))); - acc = acc ? m_ir->CreateOr(acc, vls) : vls; + + // Interleave accumulators for more performance + if (toggle) + { + acc0 = acc0 ? m_ir->CreateAdd(acc0, vls) : vls; + } + else + { + acc1 = acc1 ? m_ir->CreateAdd(acc1, vls) : vls; + } + toggle = !toggle; check_iterations++; } + llvm::Value* acc = (acc0 && acc1) ? m_ir->CreateAdd(acc0, acc1): (acc0 ? acc0 : acc1); + // Pattern for PTEST if (m_use_avx512) { diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 54679dee41..4248fb84f1 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -8,6 +8,7 @@ #include "Loader/ELF.h" #include "Emu/VFS.h" #include "Emu/IdManager.h" +#include "Emu/System.h" #include "Emu/perf_meter.hpp" #include "Emu/Cell/PPUThread.h" #include "Emu/Cell/ErrorCodes.h" @@ -23,7 +24,6 @@ #include "Emu/Cell/timers.hpp" #include "Emu/RSX/Core/RSXReservationLock.hpp" -#include "Emu/RSX/RSXThread.h" #include #include diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h index 9c45e9efe5..37cf1cf074 100644 --- a/rpcs3/Emu/Cell/SPUThread.h +++ b/rpcs3/Emu/Cell/SPUThread.h @@ -10,6 +10,8 @@ #include "util/logs.hpp" #include "util/to_endian.hpp" +#include "Utilities/mutex.h" + #include "Loader/ELF.h" #include diff --git a/rpcs3/Emu/Cell/lv2/lv2.cpp b/rpcs3/Emu/Cell/lv2/lv2.cpp index 6349bd60c6..e5c00fab9d 100644 --- a/rpcs3/Emu/Cell/lv2/lv2.cpp +++ b/rpcs3/Emu/Cell/lv2/lv2.cpp @@ -9,7 +9,6 @@ #include "Emu/Cell/PPUThread.h" #include "Emu/Cell/SPUThread.h" #include "Emu/Cell/ErrorCodes.h" -#include "Emu/Cell/MFC.h" #include "sys_sync.h" #include "sys_lwmutex.h" #include "sys_lwcond.h" @@ -56,7 +55,7 @@ #include #include #include -#include +#include #include "util/tsc.hpp" #include "util/sysinfo.hpp" #include "util/init_mutex.hpp" diff --git a/rpcs3/Emu/Cell/lv2/sys_bdemu.cpp b/rpcs3/Emu/Cell/lv2/sys_bdemu.cpp index 4dfc6eb3fa..51d8e48842 100644 --- a/rpcs3/Emu/Cell/lv2/sys_bdemu.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_bdemu.cpp @@ -1,5 +1,4 @@ #include "stdafx.h" -#include "Emu/Memory/vm.h" #include "Emu/Cell/ErrorCodes.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_cond.cpp b/rpcs3/Emu/Cell/lv2/sys_cond.cpp index 4387d27306..401ed3bd66 100644 --- a/rpcs3/Emu/Cell/lv2/sys_cond.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_cond.cpp @@ -2,7 +2,6 @@ #include "util/serialization.hpp" #include "Emu/IdManager.h" -#include "Emu/IPC.h" #include "Emu/System.h" #include "Emu/Cell/ErrorCodes.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_config.cpp b/rpcs3/Emu/Cell/lv2/sys_config.cpp index 6740759d3b..0179a6b7f2 100644 --- a/rpcs3/Emu/Cell/lv2/sys_config.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_config.cpp @@ -1,6 +1,4 @@ #include "stdafx.h" -#include "Emu/System.h" -#include "Emu/Memory/vm.h" #include "Emu/IdManager.h" #include "Emu/Cell/lv2/sys_event.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_config.h b/rpcs3/Emu/Cell/lv2/sys_config.h index ea9b9da76d..0804671141 100644 --- a/rpcs3/Emu/Cell/lv2/sys_config.h +++ b/rpcs3/Emu/Cell/lv2/sys_config.h @@ -1,11 +1,8 @@ #pragma once -#include -#include - #include "util/atomic.hpp" #include "util/shared_ptr.hpp" - +#include "Emu/Cell/timers.hpp" /* * sys_config is a "subscription-based data storage API" diff --git a/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp b/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp index 971408e042..c28efaf711 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp @@ -2,13 +2,10 @@ #include "sys_event_flag.h" #include "Emu/IdManager.h" -#include "Emu/IPC.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/Cell/PPUThread.h" -#include - #include "util/asm.hpp" LOG_CHANNEL(sys_event_flag); diff --git a/rpcs3/Emu/Cell/lv2/sys_fs.cpp b/rpcs3/Emu/Cell/lv2/sys_fs.cpp index 3cb8e8eb2f..1f76bb7090 100644 --- a/rpcs3/Emu/Cell/lv2/sys_fs.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_fs.cpp @@ -2,8 +2,8 @@ #include "sys_sync.h" #include "sys_fs.h" #include "sys_memory.h" +#include "util/asm.hpp" -#include "Emu/Cell/PPUModule.h" #include "Emu/Cell/PPUThread.h" #include "Crypto/unedat.h" #include "Emu/System.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_fs.h b/rpcs3/Emu/Cell/lv2/sys_fs.h index 825140d7ab..e64a2b4edb 100644 --- a/rpcs3/Emu/Cell/lv2/sys_fs.h +++ b/rpcs3/Emu/Cell/lv2/sys_fs.h @@ -6,7 +6,6 @@ #include "Utilities/StrUtil.h" #include -#include // Open Flags enum : s32 diff --git a/rpcs3/Emu/Cell/lv2/sys_game.cpp b/rpcs3/Emu/Cell/lv2/sys_game.cpp index 6e69b9175f..1164dbd216 100644 --- a/rpcs3/Emu/Cell/lv2/sys_game.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_game.cpp @@ -10,6 +10,7 @@ #include "Utilities/StrUtil.h" #include "Utilities/Thread.h" +#include "Emu/Cell/timers.hpp" #include "sys_game.h" LOG_CHANNEL(sys_game); diff --git a/rpcs3/Emu/Cell/lv2/sys_hid.cpp b/rpcs3/Emu/Cell/lv2/sys_hid.cpp index e5b5a310aa..05f87895ad 100644 --- a/rpcs3/Emu/Cell/lv2/sys_hid.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_hid.cpp @@ -1,7 +1,6 @@ #include "stdafx.h" #include "sys_hid.h" -#include "Emu/Memory/vm.h" #include "Emu/Memory/vm_var.h" #include "Emu/Cell/PPUThread.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_memory.cpp b/rpcs3/Emu/Cell/lv2/sys_memory.cpp index 6cfc3a1860..9f726e994d 100644 --- a/rpcs3/Emu/Cell/lv2/sys_memory.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_memory.cpp @@ -7,7 +7,6 @@ #include "Emu/Cell/SPUThread.h" #include "Emu/IdManager.h" -#include "util/vm.hpp" #include "util/asm.hpp" LOG_CHANNEL(sys_memory); diff --git a/rpcs3/Emu/Cell/lv2/sys_mutex.cpp b/rpcs3/Emu/Cell/lv2/sys_mutex.cpp index f2d23291ff..92bf877a8a 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mutex.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mutex.cpp @@ -1,7 +1,6 @@ #include "stdafx.h" #include "Emu/IdManager.h" -#include "Emu/IPC.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/Cell/PPUThread.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index aae2454619..827a4c98f2 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -15,7 +15,6 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wold-style-cast" #endif -#include #include #include #include @@ -24,7 +23,6 @@ #include #include #include -#include #include #ifdef __clang__ #pragma GCC diagnostic pop @@ -33,9 +31,7 @@ #include "Emu/NP/np_handler.h" #include "Emu/NP/np_helpers.h" -#include "Emu/NP/np_dnshook.h" - -#include +#include "Emu/Cell/timers.hpp" #include #include "sys_net/network_context.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp index 7bdd18b3fd..0d2a598214 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.cpp @@ -35,7 +35,7 @@ std::size_t lv2_socket::get_queue_size() const } socket_type lv2_socket::get_socket() const { - return socket; + return native_socket; } #ifdef _WIN32 diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h index f0e3b61d00..314840f245 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h @@ -6,6 +6,7 @@ #include "Utilities/mutex.h" #include "Emu/IdManager.h" #include "Emu/Cell/lv2/sys_net.h" +#include "Emu/NP/ip_address.h" #ifdef _WIN32 #include @@ -21,12 +22,6 @@ #endif #endif -#ifdef _WIN32 -using socket_type = uptr; -#else -using socket_type = int; -#endif - enum class thread_state : u32; class lv2_socket @@ -126,7 +121,7 @@ protected: shared_mutex mutex; s32 lv2_id = 0; - socket_type socket = 0; + socket_type native_socket = 0; lv2_socket_family family{}; lv2_socket_type type{}; diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp index d0a735b178..d420f23cc8 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp @@ -87,9 +87,9 @@ s32 lv2_socket_native::create_socket() return CELL_OK; } -void lv2_socket_native::set_socket(socket_type socket, lv2_socket_family family, lv2_socket_type type, lv2_ip_protocol protocol) +void lv2_socket_native::set_socket(socket_type native_socket, lv2_socket_family family, lv2_socket_type type, lv2_ip_protocol protocol) { - this->socket = socket; + this->native_socket = native_socket; this->family = family; this->type = type; this->protocol = protocol; @@ -115,12 +115,12 @@ std::tuple, sys_net_sockaddr> lv2_socket_nativ sys_net.error("Calling socket::accept() from a previously connected socket!"); } - socket_type native_socket = ::accept(socket, reinterpret_cast(&native_addr), &native_addrlen); + socket_type client_socket = ::accept(native_socket, reinterpret_cast(&native_addr), &native_addrlen); - if (native_socket != invalid_socket) + if (client_socket != invalid_socket) { auto newsock = make_single(family, type, protocol); - newsock->set_socket(native_socket, family, type, protocol); + newsock->set_socket(client_socket, family, type, protocol); // Sockets inherit non blocking behaviour from their parent newsock->so_nbio = so_nbio; @@ -173,7 +173,7 @@ s32 lv2_socket_native::bind(const sys_net_sockaddr& addr) sys_net.warning("[Native] Trying to bind %s:%d", native_addr.sin_addr, std::bit_cast, u16>(native_addr.sin_port)); - if (::bind(socket, reinterpret_cast(&native_addr), native_addr_len) == 0) + if (::bind(native_socket, reinterpret_cast(&native_addr), native_addr_len) == 0) { // Only UPNP port forward binds to 0.0.0.0 if (saddr == 0) @@ -182,7 +182,7 @@ s32 lv2_socket_native::bind(const sys_net_sockaddr& addr) { sockaddr_in client_addr; socklen_t client_addr_size = sizeof(client_addr); - ensure(::getsockname(socket, reinterpret_cast(&client_addr), &client_addr_size) == 0); + ensure(::getsockname(native_socket, reinterpret_cast(&client_addr), &client_addr_size) == 0); bound_port = std::bit_cast>(client_addr.sin_port); } else @@ -245,7 +245,7 @@ std::optional lv2_socket_native::connect(const sys_net_sockaddr& addr) return -SYS_NET_EALREADY; } - if (::connect(socket, reinterpret_cast(&native_addr), native_addr_len) == 0) + if (::connect(native_socket, reinterpret_cast(&native_addr), native_addr_len) == 0) { return CELL_OK; } @@ -272,7 +272,7 @@ std::optional lv2_socket_native::connect(const sys_net_sockaddr& addr) { int native_error; ::socklen_t size = sizeof(native_error); - if (::getsockopt(socket, SOL_SOCKET, SO_ERROR, reinterpret_cast(&native_error), &size) != 0 || size != sizeof(int)) + if (::getsockopt(native_socket, SOL_SOCKET, SO_ERROR, reinterpret_cast(&native_error), &size) != 0 || size != sizeof(int)) { so_error = 1; } @@ -304,7 +304,7 @@ s32 lv2_socket_native::connect_followup() { int native_error; ::socklen_t size = sizeof(native_error); - if (::getsockopt(socket, SOL_SOCKET, SO_ERROR, reinterpret_cast(&native_error), &size) != 0 || size != sizeof(int)) + if (::getsockopt(native_socket, SOL_SOCKET, SO_ERROR, reinterpret_cast(&native_error), &size) != 0 || size != sizeof(int)) { return -1; } @@ -320,7 +320,7 @@ std::pair lv2_socket_native::getpeername() ::sockaddr_storage native_addr; ::socklen_t native_addrlen = sizeof(native_addr); - if (::getpeername(socket, reinterpret_cast(&native_addr), &native_addrlen) == 0) + if (::getpeername(native_socket, reinterpret_cast(&native_addr), &native_addrlen) == 0) { ensure(native_addr.ss_family == AF_INET); @@ -339,7 +339,7 @@ std::pair lv2_socket_native::getsockname() ::sockaddr_storage native_addr; ::socklen_t native_addrlen = sizeof(native_addr); - if (::getsockname(socket, reinterpret_cast(&native_addr), &native_addrlen) == 0) + if (::getsockname(native_socket, reinterpret_cast(&native_addr), &native_addrlen) == 0) { ensure(native_addr.ss_family == AF_INET); @@ -581,7 +581,7 @@ std::tuple lv2_socket_native::getsockopt(s32 return {-SYS_NET_EINVAL, {}, {}}; } - if (::getsockopt(socket, native_level, native_opt, native_val.ch, &native_len) != 0) + if (::getsockopt(native_socket, native_level, native_opt, native_val.ch, &native_len) != 0) { return {-get_last_error(false), {}, {}}; } @@ -864,7 +864,7 @@ s32 lv2_socket_native::setsockopt(s32 level, s32 optname, const std::vector& return -SYS_NET_EINVAL; } - if (::setsockopt(socket, native_level, native_opt, static_cast(native_val), native_len) == 0) + if (::setsockopt(native_socket, native_level, native_opt, static_cast(native_val), native_len) == 0) { return {}; } @@ -876,7 +876,7 @@ s32 lv2_socket_native::listen(s32 backlog) { std::lock_guard lock(mutex); - if (::listen(socket, backlog) == 0) + if (::listen(native_socket, backlog) == 0) { return CELL_OK; } @@ -930,7 +930,7 @@ std::optional, sys_net_sockaddr>> lv2_socket_nat native_flags |= MSG_WAITALL; } - auto native_result = ::recvfrom(socket, reinterpret_cast(res_buf.data()), len, native_flags, reinterpret_cast(&native_addr), &native_addrlen); + auto native_result = ::recvfrom(native_socket, reinterpret_cast(res_buf.data()), len, native_flags, reinterpret_cast(&native_addr), &native_addrlen); if (native_result >= 0) { @@ -1021,7 +1021,7 @@ std::optional lv2_socket_native::sendto(s32 flags, const std::vector& b } } - native_result = ::sendto(socket, reinterpret_cast(buf.data()), ::narrow(buf.size()), native_flags, native_addr ? reinterpret_cast(&native_addr.value()) : nullptr, native_addr ? sizeof(sockaddr_in) : 0); + native_result = ::sendto(native_socket, reinterpret_cast(buf.data()), ::narrow(buf.size()), native_flags, native_addr ? reinterpret_cast(&native_addr.value()) : nullptr, native_addr ? sizeof(sockaddr_in) : 0); if (native_result >= 0) { @@ -1075,7 +1075,7 @@ std::optional lv2_socket_native::sendmsg(s32 flags, const sys_net_msghdr& m const u32 len = msg.msg_iov[i].iov_len; const std::vector buf_copy(vm::_ptr(iov_base.addr()), vm::_ptr(iov_base.addr()) + len); - native_result = ::send(socket, reinterpret_cast(buf_copy.data()), ::narrow(buf_copy.size()), native_flags); + native_result = ::send(native_socket, reinterpret_cast(buf_copy.data()), ::narrow(buf_copy.size()), native_flags); if (native_result >= 0) { @@ -1096,15 +1096,9 @@ std::optional lv2_socket_native::sendmsg(s32 flags, const sys_net_msghdr& m void lv2_socket_native::close() { std::lock_guard lock(mutex); - if (socket) - { -#ifdef _WIN32 - ::closesocket(socket); -#else - ::close(socket); -#endif - socket = {}; - } + + np::close_socket(native_socket); + native_socket = {}; if (auto dnshook = g_fxo->try_get()) { @@ -1141,7 +1135,7 @@ s32 lv2_socket_native::shutdown(s32 how) SHUT_RDWR; #endif - if (::shutdown(socket, native_how) == 0) + if (::shutdown(native_socket, native_how) == 0) { return CELL_OK; } @@ -1163,7 +1157,7 @@ s32 lv2_socket_native::poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) sys_net.warning("sys_net_bnet_poll(fd=%d): events=0x%x", sn_pfd.fd, sn_pfd.events); } - native_pfd.fd = socket; + native_pfd.fd = native_socket; if (sn_pfd.events & SYS_NET_POLLIN) { @@ -1179,7 +1173,7 @@ s32 lv2_socket_native::poll(sys_net_pollfd& sn_pfd, pollfd& native_pfd) std::tuple lv2_socket_native::select(bs_t selected, pollfd& native_pfd) { - native_pfd.fd = socket; + native_pfd.fd = native_socket; if (selected & lv2_socket::poll_t::read) { native_pfd.events |= POLLIN; @@ -1196,12 +1190,12 @@ void lv2_socket_native::set_default_buffers() { // Those are the default PS3 values u32 default_RCVBUF = (type == SYS_NET_SOCK_STREAM) ? 65535 : 9216; - if (::setsockopt(socket, SOL_SOCKET, SO_RCVBUF, reinterpret_cast(&default_RCVBUF), sizeof(default_RCVBUF)) != 0) + if (::setsockopt(native_socket, SOL_SOCKET, SO_RCVBUF, reinterpret_cast(&default_RCVBUF), sizeof(default_RCVBUF)) != 0) { sys_net.error("Error setting default SO_RCVBUF on sys_net_bnet_socket socket"); } u32 default_SNDBUF = 131072; - if (::setsockopt(socket, SOL_SOCKET, SO_SNDBUF, reinterpret_cast(&default_SNDBUF), sizeof(default_SNDBUF)) != 0) + if (::setsockopt(native_socket, SOL_SOCKET, SO_SNDBUF, reinterpret_cast(&default_SNDBUF), sizeof(default_SNDBUF)) != 0) { sys_net.error("Error setting default SO_SNDBUF on sys_net_bnet_socket socket"); } @@ -1212,12 +1206,7 @@ void lv2_socket_native::set_non_blocking() // Set non-blocking // This is done to avoid having threads stuck on blocking socket functions // Blocking functions just put the thread to sleep and delegate the waking up to network_thread which polls the sockets -#ifdef _WIN32 - u_long _true = 1; - ::ioctlsocket(socket, FIONBIO, &_true); -#else - ::fcntl(socket, F_SETFL, ::fcntl(socket, F_GETFL, 0) | O_NONBLOCK); -#endif + np::set_socket_non_blocking(native_socket); } bool lv2_socket_native::is_socket_connected() @@ -1232,7 +1221,7 @@ bool lv2_socket_native::is_socket_connected() int listening = 0; socklen_t len = sizeof(listening); - if (::getsockopt(socket, SOL_SOCKET, SO_ACCEPTCONN, reinterpret_cast(&listening), &len) == -1) + if (::getsockopt(native_socket, SOL_SOCKET, SO_ACCEPTCONN, reinterpret_cast(&listening), &len) == -1) { return false; } @@ -1248,8 +1237,8 @@ bool lv2_socket_native::is_socket_connected() FD_ZERO(&readfds); FD_ZERO(&writefds); - FD_SET(socket, &readfds); - FD_SET(socket, &writefds); + FD_SET(native_socket, &readfds); + FD_SET(native_socket, &writefds); // Use select to check for readability and writability const int result = ::select(1, &readfds, &writefds, NULL, &timeout); @@ -1261,5 +1250,5 @@ bool lv2_socket_native::is_socket_connected() } // Socket is connected if it's readable or writable - return FD_ISSET(socket, &readfds) || FD_ISSET(socket, &writefds); + return FD_ISSET(native_socket, &readfds) || FD_ISSET(native_socket, &writefds); } diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h index 808529356a..cf07dfcb76 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h @@ -9,7 +9,6 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wold-style-cast" #endif -#include #include #include #include @@ -18,7 +17,6 @@ #include #include #include -#include #include #ifdef __clang__ #pragma GCC diagnostic pop @@ -62,7 +60,7 @@ public: s32 shutdown(s32 how) override; private: - void set_socket(socket_type socket, lv2_socket_family family, lv2_socket_type type, lv2_ip_protocol protocol); + void set_socket(socket_type native_socket, lv2_socket_family family, lv2_socket_type type, lv2_ip_protocol protocol); void set_default_buffers(); void set_non_blocking(); diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp index 8614d37205..7acb1273d6 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp @@ -164,7 +164,7 @@ s32 lv2_socket_p2p::bind(const sys_net_sockaddr& addr) std::lock_guard lock(mutex); port = p2p_port; vport = p2p_vport; - socket = real_socket; + native_socket = real_socket; bound_addr = psa_in_p2p->sin_addr; } @@ -176,7 +176,7 @@ std::pair lv2_socket_p2p::getsockname() std::lock_guard lock(mutex); // Unbound socket - if (!socket) + if (!native_socket) { return {CELL_OK, {}}; } @@ -299,7 +299,7 @@ std::optional lv2_socket_p2p::sendto(s32 flags, const std::vector& buf, native_flags |= MSG_WAITALL; } - auto native_result = ::sendto(socket, reinterpret_cast(p2p_data.data()), ::size32(p2p_data), native_flags, reinterpret_cast(&native_addr), sizeof(native_addr)); + auto native_result = np::sendto_possibly_ipv6(native_socket, reinterpret_cast(p2p_data.data()), ::size32(p2p_data), &native_addr, native_flags); if (native_result >= 0) { diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp index d6c98b670a..3996eae82d 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp @@ -1,7 +1,6 @@ #include "stdafx.h" #include "Utilities/Thread.h" -#include "util/asm.hpp" #include "util/atomic.hpp" #include "lv2_socket_p2ps.h" #include "Emu/NP/np_helpers.h" @@ -275,10 +274,10 @@ lv2_socket_p2ps::lv2_socket_p2ps(lv2_socket_family family, lv2_socket_type type, sockopts[(static_cast(SYS_NET_SOL_SOCKET) << 32ull) | SYS_NET_SO_TYPE] = cache_type; } -lv2_socket_p2ps::lv2_socket_p2ps(socket_type socket, u16 port, u16 vport, u32 op_addr, u16 op_port, u16 op_vport, u64 cur_seq, u64 data_beg_seq, s32 so_nbio) +lv2_socket_p2ps::lv2_socket_p2ps(socket_type native_socket, u16 port, u16 vport, u32 op_addr, u16 op_port, u16 op_vport, u64 cur_seq, u64 data_beg_seq, s32 so_nbio) : lv2_socket_p2p(SYS_NET_AF_INET, SYS_NET_SOCK_STREAM_P2P, SYS_NET_IPPROTO_IP) { - this->socket = socket; + this->native_socket = native_socket; this->port = port; this->vport = vport; this->op_addr = op_addr; @@ -467,7 +466,7 @@ bool lv2_socket_p2ps::handle_listening(p2ps_encapsulated_tcp* tcp_header, [[mayb const u16 new_op_vport = tcp_header->src_port; const u64 new_cur_seq = send_hdr.seq + 1; const u64 new_data_beg_seq = send_hdr.ack; - auto sock_lv2 = make_shared(socket, port, vport, new_op_addr, new_op_port, new_op_vport, new_cur_seq, new_data_beg_seq, so_nbio); + auto sock_lv2 = make_shared(native_socket, port, vport, new_op_addr, new_op_port, new_op_vport, new_cur_seq, new_data_beg_seq, so_nbio); const s32 new_sock_id = idm::import_existing(sock_lv2); sock_lv2->set_lv2_id(new_sock_id); const u64 key_connected = (reinterpret_cast(op_addr)->sin_addr.s_addr) | (static_cast(tcp_header->src_port) << 48) | (static_cast(tcp_header->dst_port) << 32); @@ -518,8 +517,9 @@ void lv2_socket_p2ps::send_u2s_packet(std::vector data, const ::sockaddr_in* { char ip_str[16]; inet_ntop(AF_INET, &dst->sin_addr, ip_str, sizeof(ip_str)); - sys_net.trace("[P2PS] Sending U2S packet on socket %d(id:%d): data(%d, seq %d, require_ack %d) to %s:%d", socket, lv2_id, data.size(), seq, require_ack, ip_str, std::bit_cast>(dst->sin_port)); - while (::sendto(socket, reinterpret_cast(data.data()), ::size32(data), 0, reinterpret_cast(dst), sizeof(sockaddr_in)) == -1) + sys_net.trace("[P2PS] Sending U2S packet on socket %d(id:%d): data(%d, seq %d, require_ack %d) to %s:%d", native_socket, lv2_id, data.size(), seq, require_ack, ip_str, std::bit_cast>(dst->sin_port)); + + while (np::sendto_possibly_ipv6(native_socket, reinterpret_cast(data.data()), ::size32(data), dst, 0) == -1) { const sys_net_error err = get_last_error(false); // concurrency on the socket can result in EAGAIN error in which case we try again @@ -707,7 +707,7 @@ s32 lv2_socket_p2ps::bind(const sys_net_sockaddr& addr) port = p2p_port; vport = p2p_vport; - socket = real_socket; + native_socket = real_socket; bound_addr = psa_in_p2p->sin_addr; } } @@ -720,7 +720,7 @@ std::pair lv2_socket_p2ps::getsockname() std::lock_guard lock(mutex); // Unbound socket - if (!socket) + if (!native_socket) { return {CELL_OK, {}}; } @@ -783,7 +783,7 @@ std::optional lv2_socket_p2ps::connect(const sys_net_sockaddr& addr) } } - socket = real_socket; + native_socket = real_socket; send_hdr.src_port = vport; send_hdr.dst_port = dst_vport; diff --git a/rpcs3/Emu/Cell/lv2/sys_net/network_context.cpp b/rpcs3/Emu/Cell/lv2/sys_net/network_context.cpp index 84e90e53fe..61bd5a4045 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/network_context.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/network_context.cpp @@ -1,35 +1,73 @@ +#include "Emu/NP/ip_address.h" #include "stdafx.h" #include "Emu/Cell/lv2/sys_sync.h" #include "Emu/Cell/Modules/sceNp.h" // for SCE_NP_PORT #include "network_context.h" -#include "Emu/system_config.h" #include "sys_net_helpers.h" LOG_CHANNEL(sys_net); // Used by RPCN to send signaling packets to RPCN server(for UDP hole punching) -s32 send_packet_from_p2p_port(const std::vector& data, const sockaddr_in& addr) +bool send_packet_from_p2p_port_ipv4(const std::vector& data, const sockaddr_in& addr) { - s32 res{}; auto& nc = g_fxo->get(); { std::lock_guard list_lock(nc.list_p2p_ports_mutex); if (nc.list_p2p_ports.contains(SCE_NP_PORT)) { auto& def_port = ::at32(nc.list_p2p_ports, SCE_NP_PORT); - res = ::sendto(def_port.p2p_socket, reinterpret_cast(data.data()), ::size32(data), 0, reinterpret_cast(&addr), sizeof(sockaddr_in)); - if (res == -1) - sys_net.error("Failed to send signaling packet: %s", get_last_error(false, false)); + if (def_port.is_ipv6) + { + const auto addr6 = np::sockaddr_to_sockaddr6(addr); + + if (::sendto(def_port.p2p_socket, reinterpret_cast(data.data()), ::size32(data), 0, reinterpret_cast(&addr6), sizeof(sockaddr_in6)) == -1) + { + sys_net.error("Failed to send IPv4 signaling packet on IPv6 socket: %s", get_last_error(false, false)); + return false; + } + } + else if (::sendto(def_port.p2p_socket, reinterpret_cast(data.data()), ::size32(data), 0, reinterpret_cast(&addr), sizeof(sockaddr_in)) == -1) + { + sys_net.error("Failed to send signaling packet on IPv4 socket: %s", get_last_error(false, false)); + return false; + } } else { - sys_net.error("send_packet_from_p2p_port: port %d not present", +SCE_NP_PORT); + sys_net.error("send_packet_from_p2p_port_ipv4: port %d not present", +SCE_NP_PORT); + return false; } } - return res; + return true; +} + +bool send_packet_from_p2p_port_ipv6(const std::vector& data, const sockaddr_in6& addr) +{ + auto& nc = g_fxo->get(); + { + std::lock_guard list_lock(nc.list_p2p_ports_mutex); + if (nc.list_p2p_ports.contains(SCE_NP_PORT)) + { + auto& def_port = ::at32(nc.list_p2p_ports, SCE_NP_PORT); + ensure(def_port.is_ipv6); + + if (::sendto(def_port.p2p_socket, reinterpret_cast(data.data()), ::size32(data), 0, reinterpret_cast(&addr), sizeof(sockaddr_in6)) == -1) + { + sys_net.error("Failed to send signaling packet on IPv6 socket: %s", get_last_error(false, false)); + return false; + } + } + else + { + sys_net.error("send_packet_from_p2p_port_ipv6: port %d not present", +SCE_NP_PORT); + return false; + } + } + + return true; } std::vector> get_rpcn_msgs() @@ -241,13 +279,18 @@ void p2p_thread::operator()() auto num_p2p_sockets = 0; std::memset(p2p_fd.data(), 0, p2p_fd.size() * sizeof(::pollfd)); { - std::lock_guard lock(list_p2p_ports_mutex); - for (const auto& p2p_port : list_p2p_ports) + auto set_fd = [&](socket_type socket) { p2p_fd[num_p2p_sockets].events = POLLIN; p2p_fd[num_p2p_sockets].revents = 0; - p2p_fd[num_p2p_sockets].fd = p2p_port.second.p2p_socket; + p2p_fd[num_p2p_sockets].fd = socket; num_p2p_sockets++; + }; + + std::lock_guard lock(list_p2p_ports_mutex); + for (const auto& [_, p2p_port] : list_p2p_ports) + { + set_fd(p2p_port.p2p_socket); } } @@ -260,14 +303,20 @@ void p2p_thread::operator()() { std::lock_guard lock(list_p2p_ports_mutex); auto fd_index = 0; - for (auto& p2p_port : list_p2p_ports) + + auto process_fd = [&](nt_p2p_port& p2p_port) { if ((p2p_fd[fd_index].revents & POLLIN) == POLLIN || (p2p_fd[fd_index].revents & POLLRDNORM) == POLLRDNORM) { - while (p2p_port.second.recv_data()) + while (p2p_port.recv_data()) ; } fd_index++; + }; + + for (auto& [_, p2p_port] : list_p2p_ports) + { + process_fd(p2p_port); } wake_threads(); diff --git a/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp b/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp index 574d670978..5f48d273dd 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp @@ -1,11 +1,7 @@ #include "stdafx.h" - -#include - +#include "Emu/NP/ip_address.h" #include "nt_p2p_port.h" -#include "lv2_socket_native.h" #include "lv2_socket_p2ps.h" -#include "util/asm.hpp" #include "sys_net_helpers.h" #include "Emu/NP/signaling_handler.h" #include "sys_net_helpers.h" @@ -44,9 +40,10 @@ namespace sys_net_helpers nt_p2p_port::nt_p2p_port(u16 port) : port(port) { - // Creates and bind P2P Socket - p2p_socket = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); + is_ipv6 = np::is_ipv6_supported(); + // Creates and bind P2P Socket + p2p_socket = is_ipv6 ? ::socket(AF_INET6, SOCK_DGRAM, 0) : ::socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); #ifdef _WIN32 if (p2p_socket == INVALID_SOCKET) #else @@ -54,22 +51,30 @@ nt_p2p_port::nt_p2p_port(u16 port) #endif fmt::throw_exception("Failed to create DGRAM socket for P2P socket: %s!", get_last_error(true)); -#ifdef _WIN32 - u_long _true = 1; - ::ioctlsocket(p2p_socket, FIONBIO, &_true); -#else - ::fcntl(p2p_socket, F_SETFL, ::fcntl(p2p_socket, F_GETFL, 0) | O_NONBLOCK); -#endif + np::set_socket_non_blocking(p2p_socket); u32 optval = 131072; // value obtained from DECR for a SOCK_DGRAM_P2P socket(should maybe be bigger for actual socket?) if (setsockopt(p2p_socket, SOL_SOCKET, SO_RCVBUF, reinterpret_cast(&optval), sizeof(optval)) != 0) fmt::throw_exception("Error setsockopt SO_RCVBUF on P2P socket: %s", get_last_error(true)); - ::sockaddr_in p2p_saddr{}; - p2p_saddr.sin_family = AF_INET; - p2p_saddr.sin_port = std::bit_cast>(port); // htons(port); - p2p_saddr.sin_addr.s_addr = 0; // binds to 0.0.0.0 - const auto ret_bind = ::bind(p2p_socket, reinterpret_cast(&p2p_saddr), sizeof(p2p_saddr)); + int ret_bind = 0; + const u16 be_port = std::bit_cast>(port); + + if (is_ipv6) + { + // Some OS(Windows, maybe more) will only support IPv6 adressing by default and we need IPv4 over IPv6 + optval = 0; + if (setsockopt(p2p_socket, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast(&optval), sizeof(optval)) != 0) + fmt::throw_exception("Error setsockopt IPV6_V6ONLY on P2P socket: %s", get_last_error(true)); + + ::sockaddr_in6 p2p_ipv6_addr{.sin6_family = AF_INET6, .sin6_port = be_port}; + ret_bind = ::bind(p2p_socket, reinterpret_cast(&p2p_ipv6_addr), sizeof(p2p_ipv6_addr)); + } + else + { + ::sockaddr_in p2p_ipv4_addr{.sin_family = AF_INET, .sin_port = be_port}; + ret_bind = ::bind(p2p_socket, reinterpret_cast(&p2p_ipv4_addr), sizeof(p2p_ipv4_addr)); + } if (ret_bind == -1) fmt::throw_exception("Failed to bind DGRAM socket to %d for P2P: %s!", port, get_last_error(true)); @@ -82,14 +87,7 @@ nt_p2p_port::nt_p2p_port(u16 port) nt_p2p_port::~nt_p2p_port() { - if (p2p_socket) - { -#ifdef _WIN32 - ::closesocket(p2p_socket); -#else - ::close(p2p_socket); -#endif - } + np::close_socket(p2p_socket); } void nt_p2p_port::dump_packet(p2ps_encapsulated_tcp* tcph) @@ -153,7 +151,7 @@ bool nt_p2p_port::recv_data() { auto lerr = get_last_error(false); if (lerr != SYS_NET_EINPROGRESS && lerr != SYS_NET_EWOULDBLOCK) - sys_net.error("Error recvfrom on P2P socket: %d", lerr); + sys_net.error("Error recvfrom on %s P2P socket: %d", is_ipv6 ? "IPv6" : "IPv4", lerr); return false; } @@ -166,6 +164,14 @@ bool nt_p2p_port::recv_data() u16 dst_vport = reinterpret_cast&>(p2p_recv_data[0]); + if (is_ipv6) + { + const auto* addr_ipv6 = reinterpret_cast(&native_addr); + const auto addr_ipv4 = np::sockaddr6_to_sockaddr(*addr_ipv6); + native_addr = {}; + std::memcpy(&native_addr, &addr_ipv4, sizeof(addr_ipv4)); + } + if (dst_vport == 0) { if (recv_res < VPORT_0_HEADER_SIZE) @@ -339,7 +345,7 @@ bool nt_p2p_port::recv_data() send_hdr.flags = p2ps_tcp_flags::RST; auto packet = generate_u2s_packet(send_hdr, nullptr, 0); - if (::sendto(p2p_socket, reinterpret_cast(packet.data()), ::size32(packet), 0, reinterpret_cast(&native_addr), sizeof(sockaddr_in)) == -1) + if (np::sendto_possibly_ipv6(p2p_socket, reinterpret_cast(packet.data()), ::size32(packet), reinterpret_cast(&native_addr), 0) == -1) { sys_net.error("[P2PS] Error sending RST to sender to unbound P2PS: %s", get_last_error(false)); return true; diff --git a/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.h b/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.h index 2d57bc8461..3ffc3df54d 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.h @@ -48,6 +48,8 @@ struct nt_p2p_port socket_type p2p_socket = 0; u16 port = 0; + bool is_ipv6 = false; + shared_mutex bound_p2p_vports_mutex; // For DGRAM_P2P sockets (vport, sock_ids) std::map> bound_p2p_vports{}; diff --git a/rpcs3/Emu/Cell/lv2/sys_net/sys_net_helpers.cpp b/rpcs3/Emu/Cell/lv2/sys_net/sys_net_helpers.cpp index 0fabc61cae..acd4bf6a1f 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/sys_net_helpers.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/sys_net_helpers.cpp @@ -1,11 +1,8 @@ #include "stdafx.h" - #include "Emu/IdManager.h" #include "Emu/Cell/PPUThread.h" - #include "lv2_socket.h" #include "sys_net_helpers.h" - #include "network_context.h" LOG_CHANNEL(sys_net); @@ -32,13 +29,13 @@ sys_net_error convert_error(bool is_blocking, int native_error, [[maybe_unused]] #define ERROR_CASE(error) \ case WSA##error: \ result = SYS_NET_##error; \ - name = #error; \ + name = #error; \ break; #else #define ERROR_CASE(error) \ case error: \ result = SYS_NET_##error; \ - name = #error; \ + name = #error; \ break; #endif switch (native_error) @@ -86,11 +83,11 @@ sys_net_error convert_error(bool is_blocking, int native_error, [[maybe_unused]] ERROR_CASE(EHOSTDOWN); ERROR_CASE(EHOSTUNREACH); #ifdef _WIN32 - // Windows likes to be special with unique errors - case WSAENETRESET: - result = SYS_NET_ECONNRESET; - name = "WSAENETRESET"; - break; + // Windows likes to be special with unique errors + case WSAENETRESET: + result = SYS_NET_ECONNRESET; + name = "WSAENETRESET"; + break; #endif default: fmt::throw_exception("sys_net get_last_error(is_blocking=%d, native_error=%d): Unknown/illegal socket error", is_blocking, native_error); @@ -137,11 +134,11 @@ sys_net_sockaddr native_addr_to_sys_net_addr(const ::sockaddr_storage& native_ad sys_net_sockaddr_in* paddr = reinterpret_cast(&sn_addr); - paddr->sin_len = sizeof(sys_net_sockaddr_in); + paddr->sin_len = sizeof(sys_net_sockaddr_in); paddr->sin_family = SYS_NET_AF_INET; - paddr->sin_port = std::bit_cast, u16>(reinterpret_cast(&native_addr)->sin_port); - paddr->sin_addr = std::bit_cast, u32>(reinterpret_cast(&native_addr)->sin_addr.s_addr); - paddr->sin_zero = 0; + paddr->sin_port = std::bit_cast, u16>(reinterpret_cast(&native_addr)->sin_port); + paddr->sin_addr = std::bit_cast, u32>(reinterpret_cast(&native_addr)->sin_addr.s_addr); + paddr->sin_zero = 0; return sn_addr; } @@ -153,8 +150,8 @@ sys_net_sockaddr native_addr_to_sys_net_addr(const ::sockaddr_storage& native_ad const sys_net_sockaddr_in* psa_in = reinterpret_cast(&sn_addr); ::sockaddr_in native_addr{}; - native_addr.sin_family = AF_INET; - native_addr.sin_port = std::bit_cast(psa_in->sin_port); + native_addr.sin_family = AF_INET; + native_addr.sin_port = std::bit_cast(psa_in->sin_port); native_addr.sin_addr.s_addr = std::bit_cast(psa_in->sin_addr); #ifdef _WIN32 @@ -189,9 +186,9 @@ u32 network_clear_queue(ppu_thread& ppu) u32 cleared = 0; idm::select([&](u32, lv2_socket& sock) - { - cleared += sock.clear_queue(&ppu); - }); + { + cleared += sock.clear_queue(&ppu); + }); return cleared; } @@ -204,6 +201,7 @@ void clear_ppu_to_awake(ppu_thread& ppu) #ifdef _WIN32 // Workaround function for WSAPoll not reporting failed connections +// Note that this was fixed in Windows 10 version 2004 (after more than 10 years lol) void windows_poll(std::vector& fds, unsigned long nfds, int timeout, std::vector& connecting) { ensure(fds.size() >= nfds); @@ -237,12 +235,12 @@ void windows_poll(std::vector& fds, unsigned long nfds, int timeout, std { if (!fds[i].revents) { - int error = 0; + int error = 0; socklen_t intlen = sizeof(error); if (getsockopt(fds[i].fd, SOL_SOCKET, SO_ERROR, reinterpret_cast(&error), &intlen) == -1 || error != 0) { // Connection silently failed - connecting[i] = false; + connecting[i] = false; fds[i].revents = POLLERR | POLLHUP | (fds[i].events & (POLLIN | POLLOUT)); } } diff --git a/rpcs3/Emu/Cell/lv2/sys_overlay.h b/rpcs3/Emu/Cell/lv2/sys_overlay.h index 1c950a4d0c..1a204ba9eb 100644 --- a/rpcs3/Emu/Cell/lv2/sys_overlay.h +++ b/rpcs3/Emu/Cell/lv2/sys_overlay.h @@ -3,7 +3,6 @@ #include "Emu/Cell/PPUAnalyser.h" #include "Emu/Memory/vm_ptr.h" #include "sys_sync.h" -#include struct lv2_overlay final : ppu_module { diff --git a/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp b/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp index 80e91bbd0d..1aa9409f46 100644 --- a/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_ppu_thread.cpp @@ -3,7 +3,6 @@ #include "Emu/System.h" #include "Emu/IdManager.h" -#include "Emu/perf_meter.hpp" #include "Emu/Cell/ErrorCodes.h" #include "Emu/Cell/PPUThread.h" @@ -17,6 +16,8 @@ #include "util/asm.hpp" +#include + LOG_CHANNEL(sys_ppu_thread); // Simple structure to cleanup previous thread, because can't remove its own thread diff --git a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp index 896dd0b00c..87176ae035 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "sys_rsx.h" +#include "Emu/System.h" #include "Emu/Cell/PPUModule.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/Cell/timers.hpp" diff --git a/rpcs3/Emu/Cell/lv2/sys_rsx.h b/rpcs3/Emu/Cell/lv2/sys_rsx.h index c681a2dcb2..5188453c5b 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsx.h +++ b/rpcs3/Emu/Cell/lv2/sys_rsx.h @@ -1,6 +1,5 @@ #pragma once -#include "Utilities/mutex.h" #include "Emu/Memory/vm_ptr.h" #include "Emu/Cell/ErrorCodes.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp b/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp index 290f467941..9fa3a890a8 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp @@ -4,10 +4,8 @@ #include "Emu/System.h" #include "Emu/system_config.h" #include "Emu//Audio/audio_utils.h" -#include "Emu//Cell/Modules/cellAudioOut.h" #include "util/video_provider.h" -#include "sys_process.h" #include "sys_rsxaudio.h" #include diff --git a/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp b/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp index 173fe68a79..c2abd40284 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rwlock.cpp @@ -2,7 +2,6 @@ #include "sys_rwlock.h" #include "Emu/IdManager.h" -#include "Emu/IPC.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/Cell/PPUThread.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp b/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp index 02e40522e2..7440cf2def 100644 --- a/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_semaphore.cpp @@ -2,7 +2,6 @@ #include "sys_semaphore.h" #include "Emu/IdManager.h" -#include "Emu/IPC.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/Cell/PPUThread.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_sm.cpp b/rpcs3/Emu/Cell/lv2/sys_sm.cpp index 5700be9aee..50a9b1c679 100644 --- a/rpcs3/Emu/Cell/lv2/sys_sm.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_sm.cpp @@ -1,5 +1,4 @@ #include "stdafx.h" -#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/Cell/ErrorCodes.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_spu.cpp b/rpcs3/Emu/Cell/lv2/sys_spu.cpp index 61a5ee80d1..2c6bd6f3ad 100644 --- a/rpcs3/Emu/Cell/lv2/sys_spu.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_spu.cpp @@ -2,8 +2,6 @@ #include "sys_spu.h" #include "Emu/System.h" -#include "Emu/system_config.h" -#include "Emu/VFS.h" #include "Emu/IdManager.h" #include "Crypto/unself.h" #include "Crypto/unedat.h" @@ -13,7 +11,6 @@ #include "Emu/Cell/ErrorCodes.h" #include "Emu/Cell/PPUThread.h" -#include "Emu/Cell/RawSPUThread.h" #include "Emu/Cell/timers.hpp" #include "Emu/Memory/vm_reservation.h" #include "sys_interrupt.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_ss.cpp b/rpcs3/Emu/Cell/lv2/sys_ss.cpp index 67f4e70148..7eb36d4e19 100644 --- a/rpcs3/Emu/Cell/lv2/sys_ss.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_ss.cpp @@ -3,7 +3,6 @@ #include "sys_process.h" #include "Emu/IdManager.h" -#include "Emu/Cell/PPUThread.h" #include "Emu/Cell/timers.hpp" #include "Emu/system_config.h" #include "util/sysinfo.hpp" diff --git a/rpcs3/Emu/Cell/lv2/sys_storage.cpp b/rpcs3/Emu/Cell/lv2/sys_storage.cpp index d83a5b2d39..d5ee3bbdae 100644 --- a/rpcs3/Emu/Cell/lv2/sys_storage.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_storage.cpp @@ -1,5 +1,4 @@ #include "stdafx.h" -#include "Emu/Memory/vm.h" #include "Emu/IdManager.h" #include "Emu/Cell/ErrorCodes.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_sync.h b/rpcs3/Emu/Cell/lv2/sys_sync.h index bd6004dfaa..bf99bcb056 100644 --- a/rpcs3/Emu/Cell/lv2/sys_sync.h +++ b/rpcs3/Emu/Cell/lv2/sys_sync.h @@ -1,19 +1,14 @@ #pragma once #include "Utilities/mutex.h" -#include "Utilities/sema.h" #include "Emu/CPU/CPUThread.h" #include "Emu/Cell/ErrorCodes.h" -#include "Emu/Cell/timers.hpp" -#include "Emu/Memory/vm_reservation.h" #include "Emu/IdManager.h" #include "Emu/IPC.h" #include "util/shared_ptr.hpp" -#include - // attr_protocol (waiting scheduling policy) enum lv2_protocol : u8 { diff --git a/rpcs3/Emu/Cell/lv2/sys_time.cpp b/rpcs3/Emu/Cell/lv2/sys_time.cpp index b04be640bc..1413304a8b 100644 --- a/rpcs3/Emu/Cell/lv2/sys_time.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_time.cpp @@ -5,13 +5,17 @@ #include "Emu/system_config.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/Cell/timers.hpp" +#include "util/tsc.hpp" -#include "util/asm.hpp" #include "util/sysinfo.hpp" static u64 timebase_offset; static u64 systemtime_offset; +#ifndef __linux__ +#include "util/asm.hpp" +#endif + #ifdef _WIN32 #include diff --git a/rpcs3/Emu/Cell/lv2/sys_timer.h b/rpcs3/Emu/Cell/lv2/sys_timer.h index 14e1f31f8d..8a0b2eda82 100644 --- a/rpcs3/Emu/Cell/lv2/sys_timer.h +++ b/rpcs3/Emu/Cell/lv2/sys_timer.h @@ -1,8 +1,6 @@ #pragma once #include "sys_event.h" - -#include "Utilities/Thread.h" #include "Emu/Memory/vm_ptr.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index 10590d1113..67fde17d83 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -6,12 +6,12 @@ #include #include "Emu/System.h" #include "Emu/system_config.h" -#include "Emu/Memory/vm.h" #include "Emu/IdManager.h" #include "Emu/vfs_config.h" #include "Emu/Cell/PPUThread.h" #include "Emu/Cell/ErrorCodes.h" +#include "Emu/Cell/timers.hpp" #include "Emu/Io/usb_device.h" #include "Emu/Io/usb_vfs.h" diff --git a/rpcs3/Emu/Cell/lv2/sys_vm.cpp b/rpcs3/Emu/Cell/lv2/sys_vm.cpp index 2591824b1d..2a224d2339 100644 --- a/rpcs3/Emu/Cell/lv2/sys_vm.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_vm.cpp @@ -6,7 +6,6 @@ #include "Emu/Cell/ErrorCodes.h" #include "Emu/Cell/PPUThread.h" #include "Emu/Cell/timers.hpp" -#include "Emu/Memory/vm_locking.h" sys_vm_t::sys_vm_t(u32 _addr, u32 vsize, lv2_memory_container* ct, u32 psize) : ct(ct) diff --git a/rpcs3/Emu/GDB.cpp b/rpcs3/Emu/GDB.cpp index dc01e4e3fe..1a4724d47e 100644 --- a/rpcs3/Emu/GDB.cpp +++ b/rpcs3/Emu/GDB.cpp @@ -34,6 +34,8 @@ #endif #endif +#include "Emu/Cell/timers.hpp" + #include #include #include diff --git a/rpcs3/Emu/GDB.h b/rpcs3/Emu/GDB.h index 8ba241e110..75d272f9d7 100644 --- a/rpcs3/Emu/GDB.h +++ b/rpcs3/Emu/GDB.h @@ -1,7 +1,6 @@ #pragma once #include "Utilities/Thread.h" -#include #include struct gdb_cmd; diff --git a/rpcs3/Emu/IPC.h b/rpcs3/Emu/IPC.h index 26819a3fbd..7c94458376 100644 --- a/rpcs3/Emu/IPC.h +++ b/rpcs3/Emu/IPC.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include "Utilities/mutex.h" diff --git a/rpcs3/Emu/IdManager.cpp b/rpcs3/Emu/IdManager.cpp index b8225b07ef..2a8f9ffeee 100644 --- a/rpcs3/Emu/IdManager.cpp +++ b/rpcs3/Emu/IdManager.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "IdManager.h" -#include "Utilities/Thread.h" shared_mutex id_manager::g_mutex; diff --git a/rpcs3/Emu/IdManager.h b/rpcs3/Emu/IdManager.h index 7846d6f70f..3884e439b2 100644 --- a/rpcs3/Emu/IdManager.h +++ b/rpcs3/Emu/IdManager.h @@ -5,8 +5,6 @@ #include #include -#include -#include #include #include "util/serialization.hpp" diff --git a/rpcs3/Emu/Io/Dimensions.cpp b/rpcs3/Emu/Io/Dimensions.cpp index 9a61f7abce..a8ef6bc447 100644 --- a/rpcs3/Emu/Io/Dimensions.cpp +++ b/rpcs3/Emu/Io/Dimensions.cpp @@ -2,11 +2,6 @@ #include "Dimensions.h" #include -#include - -#include "Crypto/aes.h" -#include "Crypto/sha1.h" -#include "util/asm.hpp" #include "Emu/Cell/lv2/sys_usbd.h" diff --git a/rpcs3/Emu/Io/Infinity.cpp b/rpcs3/Emu/Io/Infinity.cpp index ca70c92344..ff4ce9e85b 100644 --- a/rpcs3/Emu/Io/Infinity.cpp +++ b/rpcs3/Emu/Io/Infinity.cpp @@ -5,7 +5,6 @@ #include "Crypto/aes.h" #include "Crypto/sha1.h" -#include "util/asm.hpp" LOG_CHANNEL(infinity_log, "infinity"); diff --git a/rpcs3/Emu/Io/KeyboardHandler.cpp b/rpcs3/Emu/Io/KeyboardHandler.cpp index 73ef8d0696..05ef6ef526 100644 --- a/rpcs3/Emu/Io/KeyboardHandler.cpp +++ b/rpcs3/Emu/Io/KeyboardHandler.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "KeyboardHandler.h" -#include "Utilities/StrUtil.h" LOG_CHANNEL(input_log, "Input"); diff --git a/rpcs3/Emu/Io/PadHandler.cpp b/rpcs3/Emu/Io/PadHandler.cpp index 44648f252f..cafb85bd78 100644 --- a/rpcs3/Emu/Io/PadHandler.cpp +++ b/rpcs3/Emu/Io/PadHandler.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "PadHandler.h" -#include "Emu/system_utils.hpp" #include "Emu/system_config.h" #include "Emu/Cell/timers.hpp" #include "Input/pad_thread.h" diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index eb536fde11..792515c5d8 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -9,7 +9,9 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wold-style-cast" #endif -#include "3rdparty/fusion/fusion/Fusion/Fusion.h" +extern "C" { +#include "3rdparty/fusion/fusion/Fusion/FusionAhrs.h" +} #ifndef _MSC_VER #pragma GCC diagnostic pop #endif diff --git a/rpcs3/Emu/Io/Skylander.cpp b/rpcs3/Emu/Io/Skylander.cpp index 0867918fd7..974e9a887f 100644 --- a/rpcs3/Emu/Io/Skylander.cpp +++ b/rpcs3/Emu/Io/Skylander.cpp @@ -2,8 +2,6 @@ #include "Skylander.h" #include "Emu/Cell/lv2/sys_usbd.h" -#include "util/asm.hpp" - LOG_CHANNEL(skylander_log, "skylander"); sky_portal g_skyportal; diff --git a/rpcs3/Emu/Io/buzz_config.h b/rpcs3/Emu/Io/buzz_config.h index 71f51f972f..f340ecd70e 100644 --- a/rpcs3/Emu/Io/buzz_config.h +++ b/rpcs3/Emu/Io/buzz_config.h @@ -2,8 +2,6 @@ #include "emulated_pad_config.h" -#include - enum class buzz_btn { red, diff --git a/rpcs3/Emu/Io/gem_config.h b/rpcs3/Emu/Io/gem_config.h index 2be86ff3c4..9cfca88ddb 100644 --- a/rpcs3/Emu/Io/gem_config.h +++ b/rpcs3/Emu/Io/gem_config.h @@ -2,8 +2,6 @@ #include "emulated_pad_config.h" -#include - enum class gem_btn : u32 { start, diff --git a/rpcs3/Emu/Io/ghltar_config.h b/rpcs3/Emu/Io/ghltar_config.h index 524542fa9f..dfe43ea2c5 100644 --- a/rpcs3/Emu/Io/ghltar_config.h +++ b/rpcs3/Emu/Io/ghltar_config.h @@ -2,8 +2,6 @@ #include "emulated_pad_config.h" -#include - enum class ghltar_btn { w1, diff --git a/rpcs3/Emu/Io/guncon3_config.h b/rpcs3/Emu/Io/guncon3_config.h index 6224fa856c..c2ea82a9f3 100644 --- a/rpcs3/Emu/Io/guncon3_config.h +++ b/rpcs3/Emu/Io/guncon3_config.h @@ -2,8 +2,6 @@ #include "emulated_pad_config.h" -#include - enum class guncon3_btn { trigger, diff --git a/rpcs3/Emu/Io/rb3drums_config.cpp b/rpcs3/Emu/Io/rb3drums_config.cpp index 34c289818c..76c86252ab 100644 --- a/rpcs3/Emu/Io/rb3drums_config.cpp +++ b/rpcs3/Emu/Io/rb3drums_config.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "rb3drums_config.h" -#include LOG_CHANNEL(cfg_log, "CFG"); diff --git a/rpcs3/Emu/Io/recording_config.cpp b/rpcs3/Emu/Io/recording_config.cpp index 357106e074..9b360a24ef 100644 --- a/rpcs3/Emu/Io/recording_config.cpp +++ b/rpcs3/Emu/Io/recording_config.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "recording_config.h" -#include LOG_CHANNEL(cfg_log, "CFG"); diff --git a/rpcs3/Emu/Io/topshotelite_config.h b/rpcs3/Emu/Io/topshotelite_config.h index e7a5639103..fa9ca952d2 100644 --- a/rpcs3/Emu/Io/topshotelite_config.h +++ b/rpcs3/Emu/Io/topshotelite_config.h @@ -2,8 +2,6 @@ #include "emulated_pad_config.h" -#include - enum class topshotelite_btn { trigger, diff --git a/rpcs3/Emu/Io/topshotfearmaster_config.h b/rpcs3/Emu/Io/topshotfearmaster_config.h index ef372c9b68..cd2aadf02d 100644 --- a/rpcs3/Emu/Io/topshotfearmaster_config.h +++ b/rpcs3/Emu/Io/topshotfearmaster_config.h @@ -2,8 +2,6 @@ #include "emulated_pad_config.h" -#include - enum class topshotfearmaster_btn { trigger, diff --git a/rpcs3/Emu/Io/turntable_config.h b/rpcs3/Emu/Io/turntable_config.h index 8461cf5217..c2237520f9 100644 --- a/rpcs3/Emu/Io/turntable_config.h +++ b/rpcs3/Emu/Io/turntable_config.h @@ -2,8 +2,6 @@ #include "emulated_pad_config.h" -#include - enum class turntable_btn { red, diff --git a/rpcs3/Emu/Io/usb_device.cpp b/rpcs3/Emu/Io/usb_device.cpp index a7c3812b41..be35a61469 100644 --- a/rpcs3/Emu/Io/usb_device.cpp +++ b/rpcs3/Emu/Io/usb_device.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "Emu/System.h" +#include "Emu/Cell/timers.hpp" #include "Emu/Cell/lv2/sys_usbd.h" #include "Emu/Io/usb_device.h" #include "Utilities/StrUtil.h" diff --git a/rpcs3/Emu/Io/usio_config.h b/rpcs3/Emu/Io/usio_config.h index 1ca078b2a4..4c5fe6f017 100644 --- a/rpcs3/Emu/Io/usio_config.h +++ b/rpcs3/Emu/Io/usio_config.h @@ -2,8 +2,6 @@ #include "emulated_pad_config.h" -#include - enum class usio_btn { test, diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index 6ab0ecc71d..28b8b4e279 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -4,10 +4,8 @@ #include "vm_ref.h" #include "vm_reservation.h" -#include "Utilities/mutex.h" #include "Utilities/Thread.h" #include "Utilities/address_range.h" -#include "Utilities/JIT.h" #include "Emu/CPU/CPUThread.h" #include "Emu/RSX/RSXThread.h" #include "Emu/Cell/SPURecompiler.h" @@ -20,6 +18,8 @@ #include "util/simd.hpp" #include "util/serialization.hpp" +#include + LOG_CHANNEL(vm_log, "VM"); void ppu_remove_hle_instructions(u32 addr, u32 size); diff --git a/rpcs3/Emu/Memory/vm.h b/rpcs3/Emu/Memory/vm.h index b76e8a89d3..9680187cd4 100644 --- a/rpcs3/Emu/Memory/vm.h +++ b/rpcs3/Emu/Memory/vm.h @@ -5,7 +5,6 @@ #include "util/types.hpp" #include "util/atomic.hpp" #include "util/auto_typemap.hpp" -#include "Utilities/StrFmt.h" #include "util/to_endian.hpp" diff --git a/rpcs3/Emu/NP/fb_helpers.cpp b/rpcs3/Emu/NP/fb_helpers.cpp index 04a92d77ee..100c3e864c 100644 --- a/rpcs3/Emu/NP/fb_helpers.cpp +++ b/rpcs3/Emu/NP/fb_helpers.cpp @@ -1,5 +1,4 @@ #include "stdafx.h" -#include "np_handler.h" #include "Emu/Cell/lv2/sys_process.h" #include "fb_helpers.h" @@ -46,7 +45,7 @@ namespace np { sce_group->groupId = fb_group->groupId(); sce_group->withPassword = fb_group->withPassword(); - sce_group->withLabel = fb_group->withLabel(); + sce_group->withLabel = fb_group->label() ? 1 : 0; if (fb_group->label()) { for (flatbuffers::uoffset_t l_index = 0; l_index < fb_group->label()->size(); l_index++) diff --git a/rpcs3/Emu/NP/fb_helpers.h b/rpcs3/Emu/NP/fb_helpers.h index 82ab034ea2..6b92cfba37 100644 --- a/rpcs3/Emu/NP/fb_helpers.h +++ b/rpcs3/Emu/NP/fb_helpers.h @@ -1,5 +1,10 @@ #pragma once +#include "Emu/Cell/Modules/sceNp.h" +#include "Emu/Cell/Modules/sceNp2.h" +#include "np_event_data.h" +#include "generated/np2_structs_generated.h" + namespace np { void BinAttr_to_SceNpMatching2BinAttr(event_data& edata, const BinAttr* bin_attr, SceNpMatching2BinAttr* binattr_info); diff --git a/rpcs3/Emu/NP/generated/np2_structs.fbs b/rpcs3/Emu/NP/generated/np2_structs.fbs index 634d3fe6b8..bf360bdb86 100644 --- a/rpcs3/Emu/NP/generated/np2_structs.fbs +++ b/rpcs3/Emu/NP/generated/np2_structs.fbs @@ -1,3 +1,18 @@ +table SignalingAddr { + ip:[uint8]; + port:uint16; +} + +table MatchingSignalingInfo { + npid:string; + addr:SignalingAddr; +} + +table Matching2SignalingInfo { + member_id:uint16; + addr:SignalingAddr; +} + table BinAttr { id:uint16; data:[uint8]; @@ -27,7 +42,6 @@ table OptParam { table GroupConfig { slotNum:uint32; - withLabel:bool; label:[uint8]; withPassword:bool; } @@ -52,7 +66,6 @@ table RoomMemberDataInternal { table RoomGroup { groupId:uint8; withPassword:bool; - withLabel:bool; label:[uint8]; slotNum:uint32; curGroupMemberNum:uint32; @@ -108,7 +121,7 @@ table PresenceOptionData { } table RoomGroupPasswordConfig { - groupId:[uint8]; + groupId:uint8; withPassword:bool; } @@ -161,6 +174,11 @@ table JoinRoomRequest { teamId:uint8; } +table JoinRoomResponse { + room_data: RoomDataInternal; + signaling_data: [Matching2SignalingInfo]; +} + table LeaveRoomRequest { roomId:uint64; optData:PresenceOptionData; @@ -221,6 +239,12 @@ table RoomMemberUpdateInfo { optData:PresenceOptionData; } +table NotificationUserJoinedRoom { + room_id:uint64; + update_info:RoomMemberUpdateInfo; + signaling:SignalingAddr; +} + table RoomUpdateInfo { eventCause:uint8; errorCode:int32; diff --git a/rpcs3/Emu/NP/generated/np2_structs_generated.h b/rpcs3/Emu/NP/generated/np2_structs_generated.h index a31fc0c9c4..f1d24ae568 100644 --- a/rpcs3/Emu/NP/generated/np2_structs_generated.h +++ b/rpcs3/Emu/NP/generated/np2_structs_generated.h @@ -13,6 +13,15 @@ static_assert(FLATBUFFERS_VERSION_MAJOR == 24 && FLATBUFFERS_VERSION_REVISION == 25, "Non-compatible flatbuffers version included"); +struct SignalingAddr; +struct SignalingAddrBuilder; + +struct MatchingSignalingInfo; +struct MatchingSignalingInfoBuilder; + +struct Matching2SignalingInfo; +struct Matching2SignalingInfoBuilder; + struct BinAttr; struct BinAttrBuilder; @@ -70,6 +79,9 @@ struct CreateJoinRoomRequestBuilder; struct JoinRoomRequest; struct JoinRoomRequestBuilder; +struct JoinRoomResponse; +struct JoinRoomResponseBuilder; + struct LeaveRoomRequest; struct LeaveRoomRequestBuilder; @@ -100,6 +112,9 @@ struct GetRoomDataInternalRequestBuilder; struct RoomMemberUpdateInfo; struct RoomMemberUpdateInfoBuilder; +struct NotificationUserJoinedRoom; +struct NotificationUserJoinedRoomBuilder; + struct RoomUpdateInfo; struct RoomUpdateInfoBuilder; @@ -256,6 +271,185 @@ struct SearchJoinRoomGUIRequestBuilder; struct MatchingSearchJoinRoomInfo; struct MatchingSearchJoinRoomInfoBuilder; +struct SignalingAddr FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef SignalingAddrBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_IP = 4, + VT_PORT = 6 + }; + const ::flatbuffers::Vector *ip() const { + return GetPointer *>(VT_IP); + } + uint16_t port() const { + return GetField(VT_PORT, 0); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_IP) && + verifier.VerifyVector(ip()) && + VerifyField(verifier, VT_PORT, 2) && + verifier.EndTable(); + } +}; + +struct SignalingAddrBuilder { + typedef SignalingAddr Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_ip(::flatbuffers::Offset<::flatbuffers::Vector> ip) { + fbb_.AddOffset(SignalingAddr::VT_IP, ip); + } + void add_port(uint16_t port) { + fbb_.AddElement(SignalingAddr::VT_PORT, port, 0); + } + explicit SignalingAddrBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateSignalingAddr( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::Vector> ip = 0, + uint16_t port = 0) { + SignalingAddrBuilder builder_(_fbb); + builder_.add_ip(ip); + builder_.add_port(port); + return builder_.Finish(); +} + +inline ::flatbuffers::Offset CreateSignalingAddrDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + const std::vector *ip = nullptr, + uint16_t port = 0) { + auto ip__ = ip ? _fbb.CreateVector(*ip) : 0; + return CreateSignalingAddr( + _fbb, + ip__, + port); +} + +struct MatchingSignalingInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef MatchingSignalingInfoBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NPID = 4, + VT_ADDR = 6 + }; + const ::flatbuffers::String *npid() const { + return GetPointer(VT_NPID); + } + const SignalingAddr *addr() const { + return GetPointer(VT_ADDR); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_NPID) && + verifier.VerifyString(npid()) && + VerifyOffset(verifier, VT_ADDR) && + verifier.VerifyTable(addr()) && + verifier.EndTable(); + } +}; + +struct MatchingSignalingInfoBuilder { + typedef MatchingSignalingInfo Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_npid(::flatbuffers::Offset<::flatbuffers::String> npid) { + fbb_.AddOffset(MatchingSignalingInfo::VT_NPID, npid); + } + void add_addr(::flatbuffers::Offset addr) { + fbb_.AddOffset(MatchingSignalingInfo::VT_ADDR, addr); + } + explicit MatchingSignalingInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateMatchingSignalingInfo( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset<::flatbuffers::String> npid = 0, + ::flatbuffers::Offset addr = 0) { + MatchingSignalingInfoBuilder builder_(_fbb); + builder_.add_addr(addr); + builder_.add_npid(npid); + return builder_.Finish(); +} + +inline ::flatbuffers::Offset CreateMatchingSignalingInfoDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + const char *npid = nullptr, + ::flatbuffers::Offset addr = 0) { + auto npid__ = npid ? _fbb.CreateString(npid) : 0; + return CreateMatchingSignalingInfo( + _fbb, + npid__, + addr); +} + +struct Matching2SignalingInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef Matching2SignalingInfoBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_MEMBER_ID = 4, + VT_ADDR = 6 + }; + uint16_t member_id() const { + return GetField(VT_MEMBER_ID, 0); + } + const SignalingAddr *addr() const { + return GetPointer(VT_ADDR); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_MEMBER_ID, 2) && + VerifyOffset(verifier, VT_ADDR) && + verifier.VerifyTable(addr()) && + verifier.EndTable(); + } +}; + +struct Matching2SignalingInfoBuilder { + typedef Matching2SignalingInfo Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_member_id(uint16_t member_id) { + fbb_.AddElement(Matching2SignalingInfo::VT_MEMBER_ID, member_id, 0); + } + void add_addr(::flatbuffers::Offset addr) { + fbb_.AddOffset(Matching2SignalingInfo::VT_ADDR, addr); + } + explicit Matching2SignalingInfoBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateMatching2SignalingInfo( + ::flatbuffers::FlatBufferBuilder &_fbb, + uint16_t member_id = 0, + ::flatbuffers::Offset addr = 0) { + Matching2SignalingInfoBuilder builder_(_fbb); + builder_.add_addr(addr); + builder_.add_member_id(member_id); + return builder_.Finish(); +} + struct BinAttr FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef BinAttrBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { @@ -549,16 +743,12 @@ struct GroupConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef GroupConfigBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_SLOTNUM = 4, - VT_WITHLABEL = 6, - VT_LABEL = 8, - VT_WITHPASSWORD = 10 + VT_LABEL = 6, + VT_WITHPASSWORD = 8 }; uint32_t slotNum() const { return GetField(VT_SLOTNUM, 0); } - bool withLabel() const { - return GetField(VT_WITHLABEL, 0) != 0; - } const ::flatbuffers::Vector *label() const { return GetPointer *>(VT_LABEL); } @@ -568,7 +758,6 @@ struct GroupConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, VT_SLOTNUM, 4) && - VerifyField(verifier, VT_WITHLABEL, 1) && VerifyOffset(verifier, VT_LABEL) && verifier.VerifyVector(label()) && VerifyField(verifier, VT_WITHPASSWORD, 1) && @@ -583,9 +772,6 @@ struct GroupConfigBuilder { void add_slotNum(uint32_t slotNum) { fbb_.AddElement(GroupConfig::VT_SLOTNUM, slotNum, 0); } - void add_withLabel(bool withLabel) { - fbb_.AddElement(GroupConfig::VT_WITHLABEL, static_cast(withLabel), 0); - } void add_label(::flatbuffers::Offset<::flatbuffers::Vector> label) { fbb_.AddOffset(GroupConfig::VT_LABEL, label); } @@ -606,28 +792,24 @@ struct GroupConfigBuilder { inline ::flatbuffers::Offset CreateGroupConfig( ::flatbuffers::FlatBufferBuilder &_fbb, uint32_t slotNum = 0, - bool withLabel = false, ::flatbuffers::Offset<::flatbuffers::Vector> label = 0, bool withPassword = false) { GroupConfigBuilder builder_(_fbb); builder_.add_label(label); builder_.add_slotNum(slotNum); builder_.add_withPassword(withPassword); - builder_.add_withLabel(withLabel); return builder_.Finish(); } inline ::flatbuffers::Offset CreateGroupConfigDirect( ::flatbuffers::FlatBufferBuilder &_fbb, uint32_t slotNum = 0, - bool withLabel = false, const std::vector *label = nullptr, bool withPassword = false) { auto label__ = label ? _fbb.CreateVector(*label) : 0; return CreateGroupConfig( _fbb, slotNum, - withLabel, label__, withPassword); } @@ -854,10 +1036,9 @@ struct RoomGroup FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_GROUPID = 4, VT_WITHPASSWORD = 6, - VT_WITHLABEL = 8, - VT_LABEL = 10, - VT_SLOTNUM = 12, - VT_CURGROUPMEMBERNUM = 14 + VT_LABEL = 8, + VT_SLOTNUM = 10, + VT_CURGROUPMEMBERNUM = 12 }; uint8_t groupId() const { return GetField(VT_GROUPID, 0); @@ -865,9 +1046,6 @@ struct RoomGroup FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { bool withPassword() const { return GetField(VT_WITHPASSWORD, 0) != 0; } - bool withLabel() const { - return GetField(VT_WITHLABEL, 0) != 0; - } const ::flatbuffers::Vector *label() const { return GetPointer *>(VT_LABEL); } @@ -881,7 +1059,6 @@ struct RoomGroup FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { return VerifyTableStart(verifier) && VerifyField(verifier, VT_GROUPID, 1) && VerifyField(verifier, VT_WITHPASSWORD, 1) && - VerifyField(verifier, VT_WITHLABEL, 1) && VerifyOffset(verifier, VT_LABEL) && verifier.VerifyVector(label()) && VerifyField(verifier, VT_SLOTNUM, 4) && @@ -900,9 +1077,6 @@ struct RoomGroupBuilder { void add_withPassword(bool withPassword) { fbb_.AddElement(RoomGroup::VT_WITHPASSWORD, static_cast(withPassword), 0); } - void add_withLabel(bool withLabel) { - fbb_.AddElement(RoomGroup::VT_WITHLABEL, static_cast(withLabel), 0); - } void add_label(::flatbuffers::Offset<::flatbuffers::Vector> label) { fbb_.AddOffset(RoomGroup::VT_LABEL, label); } @@ -927,7 +1101,6 @@ inline ::flatbuffers::Offset CreateRoomGroup( ::flatbuffers::FlatBufferBuilder &_fbb, uint8_t groupId = 0, bool withPassword = false, - bool withLabel = false, ::flatbuffers::Offset<::flatbuffers::Vector> label = 0, uint32_t slotNum = 0, uint32_t curGroupMemberNum = 0) { @@ -935,7 +1108,6 @@ inline ::flatbuffers::Offset CreateRoomGroup( builder_.add_curGroupMemberNum(curGroupMemberNum); builder_.add_slotNum(slotNum); builder_.add_label(label); - builder_.add_withLabel(withLabel); builder_.add_withPassword(withPassword); builder_.add_groupId(groupId); return builder_.Finish(); @@ -945,7 +1117,6 @@ inline ::flatbuffers::Offset CreateRoomGroupDirect( ::flatbuffers::FlatBufferBuilder &_fbb, uint8_t groupId = 0, bool withPassword = false, - bool withLabel = false, const std::vector *label = nullptr, uint32_t slotNum = 0, uint32_t curGroupMemberNum = 0) { @@ -954,7 +1125,6 @@ inline ::flatbuffers::Offset CreateRoomGroupDirect( _fbb, groupId, withPassword, - withLabel, label__, slotNum, curGroupMemberNum); @@ -1565,16 +1735,15 @@ struct RoomGroupPasswordConfig FLATBUFFERS_FINAL_CLASS : private ::flatbuffers:: VT_GROUPID = 4, VT_WITHPASSWORD = 6 }; - const ::flatbuffers::Vector *groupId() const { - return GetPointer *>(VT_GROUPID); + uint8_t groupId() const { + return GetField(VT_GROUPID, 0); } bool withPassword() const { return GetField(VT_WITHPASSWORD, 0) != 0; } bool Verify(::flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_GROUPID) && - verifier.VerifyVector(groupId()) && + VerifyField(verifier, VT_GROUPID, 1) && VerifyField(verifier, VT_WITHPASSWORD, 1) && verifier.EndTable(); } @@ -1584,8 +1753,8 @@ struct RoomGroupPasswordConfigBuilder { typedef RoomGroupPasswordConfig Table; ::flatbuffers::FlatBufferBuilder &fbb_; ::flatbuffers::uoffset_t start_; - void add_groupId(::flatbuffers::Offset<::flatbuffers::Vector> groupId) { - fbb_.AddOffset(RoomGroupPasswordConfig::VT_GROUPID, groupId); + void add_groupId(uint8_t groupId) { + fbb_.AddElement(RoomGroupPasswordConfig::VT_GROUPID, groupId, 0); } void add_withPassword(bool withPassword) { fbb_.AddElement(RoomGroupPasswordConfig::VT_WITHPASSWORD, static_cast(withPassword), 0); @@ -1603,25 +1772,14 @@ struct RoomGroupPasswordConfigBuilder { inline ::flatbuffers::Offset CreateRoomGroupPasswordConfig( ::flatbuffers::FlatBufferBuilder &_fbb, - ::flatbuffers::Offset<::flatbuffers::Vector> groupId = 0, + uint8_t groupId = 0, bool withPassword = false) { RoomGroupPasswordConfigBuilder builder_(_fbb); - builder_.add_groupId(groupId); builder_.add_withPassword(withPassword); + builder_.add_groupId(groupId); return builder_.Finish(); } -inline ::flatbuffers::Offset CreateRoomGroupPasswordConfigDirect( - ::flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *groupId = nullptr, - bool withPassword = false) { - auto groupId__ = groupId ? _fbb.CreateVector(*groupId) : 0; - return CreateRoomGroupPasswordConfig( - _fbb, - groupId__, - withPassword); -} - struct SearchRoomRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef SearchRoomRequestBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { @@ -2250,6 +2408,71 @@ inline ::flatbuffers::Offset CreateJoinRoomRequestDirect( teamId); } +struct JoinRoomResponse FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef JoinRoomResponseBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ROOM_DATA = 4, + VT_SIGNALING_DATA = 6 + }; + const RoomDataInternal *room_data() const { + return GetPointer(VT_ROOM_DATA); + } + const ::flatbuffers::Vector<::flatbuffers::Offset> *signaling_data() const { + return GetPointer> *>(VT_SIGNALING_DATA); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_ROOM_DATA) && + verifier.VerifyTable(room_data()) && + VerifyOffset(verifier, VT_SIGNALING_DATA) && + verifier.VerifyVector(signaling_data()) && + verifier.VerifyVectorOfTables(signaling_data()) && + verifier.EndTable(); + } +}; + +struct JoinRoomResponseBuilder { + typedef JoinRoomResponse Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_room_data(::flatbuffers::Offset room_data) { + fbb_.AddOffset(JoinRoomResponse::VT_ROOM_DATA, room_data); + } + void add_signaling_data(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> signaling_data) { + fbb_.AddOffset(JoinRoomResponse::VT_SIGNALING_DATA, signaling_data); + } + explicit JoinRoomResponseBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateJoinRoomResponse( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset room_data = 0, + ::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset>> signaling_data = 0) { + JoinRoomResponseBuilder builder_(_fbb); + builder_.add_signaling_data(signaling_data); + builder_.add_room_data(room_data); + return builder_.Finish(); +} + +inline ::flatbuffers::Offset CreateJoinRoomResponseDirect( + ::flatbuffers::FlatBufferBuilder &_fbb, + ::flatbuffers::Offset room_data = 0, + const std::vector<::flatbuffers::Offset> *signaling_data = nullptr) { + auto signaling_data__ = signaling_data ? _fbb.CreateVector<::flatbuffers::Offset>(*signaling_data) : 0; + return CreateJoinRoomResponse( + _fbb, + room_data, + signaling_data__); +} + struct LeaveRoomRequest FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef LeaveRoomRequestBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { @@ -2995,6 +3218,69 @@ inline ::flatbuffers::Offset CreateRoomMemberUpdateInfo( return builder_.Finish(); } +struct NotificationUserJoinedRoom FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { + typedef NotificationUserJoinedRoomBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ROOM_ID = 4, + VT_UPDATE_INFO = 6, + VT_SIGNALING = 8 + }; + uint64_t room_id() const { + return GetField(VT_ROOM_ID, 0); + } + const RoomMemberUpdateInfo *update_info() const { + return GetPointer(VT_UPDATE_INFO); + } + const SignalingAddr *signaling() const { + return GetPointer(VT_SIGNALING); + } + bool Verify(::flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ROOM_ID, 8) && + VerifyOffset(verifier, VT_UPDATE_INFO) && + verifier.VerifyTable(update_info()) && + VerifyOffset(verifier, VT_SIGNALING) && + verifier.VerifyTable(signaling()) && + verifier.EndTable(); + } +}; + +struct NotificationUserJoinedRoomBuilder { + typedef NotificationUserJoinedRoom Table; + ::flatbuffers::FlatBufferBuilder &fbb_; + ::flatbuffers::uoffset_t start_; + void add_room_id(uint64_t room_id) { + fbb_.AddElement(NotificationUserJoinedRoom::VT_ROOM_ID, room_id, 0); + } + void add_update_info(::flatbuffers::Offset update_info) { + fbb_.AddOffset(NotificationUserJoinedRoom::VT_UPDATE_INFO, update_info); + } + void add_signaling(::flatbuffers::Offset signaling) { + fbb_.AddOffset(NotificationUserJoinedRoom::VT_SIGNALING, signaling); + } + explicit NotificationUserJoinedRoomBuilder(::flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + ::flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = ::flatbuffers::Offset(end); + return o; + } +}; + +inline ::flatbuffers::Offset CreateNotificationUserJoinedRoom( + ::flatbuffers::FlatBufferBuilder &_fbb, + uint64_t room_id = 0, + ::flatbuffers::Offset update_info = 0, + ::flatbuffers::Offset signaling = 0) { + NotificationUserJoinedRoomBuilder builder_(_fbb); + builder_.add_room_id(room_id); + builder_.add_signaling(signaling); + builder_.add_update_info(update_info); + return builder_.Finish(); +} + struct RoomUpdateInfo FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table { typedef RoomUpdateInfoBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { diff --git a/rpcs3/Emu/NP/ip_address.cpp b/rpcs3/Emu/NP/ip_address.cpp new file mode 100644 index 0000000000..705f4782e2 --- /dev/null +++ b/rpcs3/Emu/NP/ip_address.cpp @@ -0,0 +1,249 @@ +#include "stdafx.h" +#include "ip_address.h" +#include "Utilities/StrFmt.h" +#include "Emu/IdManager.h" +#include "util/endian.hpp" +#include "util/types.hpp" +#include "Emu/NP/rpcn_config.h" +#include + +#ifndef _WIN32 +#include +#include +#endif + +LOG_CHANNEL(IPv6_log, "IPv6_layer"); + +namespace np +{ + bool ip_address_translator::is_ipv6(u32 addr_be) + { + const u32 addr = std::bit_cast>(addr_be); + return (addr >= translation_range_begin && addr <= translation_range_end); + } + + u32 ip_address_translator::register_ipv6(const std::array& ipv6_addr) + { + if (ipv6_addr[10] == 0xFF && ipv6_addr[11] == 0xFF && + std::all_of(ipv6_addr.begin(), ipv6_addr.begin() + 10, [](u8 val) + { + return val == 0; + })) + { + // IPv4 over IPv6 + u32 ip_addr{}; + std::memcpy(&ip_addr, &ipv6_addr[12], sizeof(u32)); + return ip_addr; + } + + std::lock_guard lock(mutex); + + const auto it = ipv6_to_ipv4.find(ipv6_addr); + + if (it == ipv6_to_ipv4.end()) + { + ensure(cur_addr != translation_range_end); + const u32 translation_ip = cur_addr++; + const u32 translation_ip_be = std::bit_cast>(translation_ip); + ipv6_to_ipv4.emplace(ipv6_addr, translation_ip_be); + ipv4_to_ipv6.push_back(ipv6_addr); + return translation_ip_be; + } + + return it->second; + } + + sockaddr_in6 ip_address_translator::get_ipv6_sockaddr(u32 addr_be, u16 port_be) + { + const u32 addr_native = std::bit_cast>(addr_be); + const auto ipv6_addr = ::at32(ipv4_to_ipv6, addr_native - translation_range_begin); + + sockaddr_in6 sockaddr_ipv6{.sin6_family = AF_INET6, .sin6_port = port_be}; + std::memcpy(&sockaddr_ipv6.sin6_addr, ipv6_addr.data(), ipv6_addr.size()); + + return sockaddr_ipv6; + } + + u32 register_ip(const flatbuffers::Vector* vec) + { + if (vec->size() == 4) + { + const u32 ip = static_cast(vec->Get(0)) << 24 | static_cast(vec->Get(1)) << 16 | + static_cast(vec->Get(2)) << 8 | static_cast(vec->Get(3)); + + u32 result_ip = std::bit_cast>(ip); + + return result_ip; + } + else if (vec->size() == 16) + { + std::array ipv6_addr{}; + std::memcpy(ipv6_addr.data(), vec->Data(), 16); + + auto& translator = g_fxo->get(); + return translator.register_ipv6(ipv6_addr); + } + else + { + fmt::throw_exception("Received ip address with size = %d", vec->size()); + } + } + + bool is_ipv6_supported(std::optional force_state) + { + static atomic_t ipv6_status = IPV6_SUPPORT::IPV6_UNKNOWN; + + if (force_state) + ipv6_status = *force_state; + + if (ipv6_status != IPV6_SUPPORT::IPV6_UNKNOWN) + return ipv6_status == IPV6_SUPPORT::IPV6_SUPPORTED; + + static shared_mutex mtx; + std::lock_guard lock(mtx); + + if (ipv6_status != IPV6_SUPPORT::IPV6_UNKNOWN) + return ipv6_status == IPV6_SUPPORT::IPV6_SUPPORTED; + + // IPv6 feature is only used by RPCN + if (!g_cfg_rpcn.get_ipv6_support()) + { + IPv6_log.notice("is_ipv6_supported(): disabled through config"); + ipv6_status = IPV6_SUPPORT::IPV6_UNSUPPORTED; + return false; + } + + // We try to connect to ipv6.google.com:8080 + addrinfo* addr_info{}; + socket_type socket_ipv6{}; + + auto cleanup = [&]() + { + if (socket_ipv6) + close_socket(socket_ipv6); + + if (addr_info) + freeaddrinfo(addr_info); + }; + + auto error_and_disable = [&](const char* message) -> bool + { + IPv6_log.error("is_ipv6_supported(): %s", message); + ipv6_status = IPV6_SUPPORT::IPV6_UNSUPPORTED; + cleanup(); + return false; + }; + + addrinfo hints{.ai_family = AF_INET6}; + + if (getaddrinfo("ipv6.google.com", nullptr, &hints, &addr_info)) + return error_and_disable("Failed to resolve ipv6.google.com!"); + + addrinfo* found = addr_info; + + while (found != nullptr) + { + if (found->ai_family == AF_INET6) + break; + + found = found->ai_next; + } + + if (found == nullptr) + return error_and_disable("Failed to find IPv6 for ipv6.google.com"); + + socket_type socket_or_err = ::socket(AF_INET6, SOCK_STREAM, 0); + +#ifdef _WIN32 + if (socket_or_err == INVALID_SOCKET) +#else + if (socket_or_err == -1) +#endif + return error_and_disable("Failed to create IPv6 socket!"); + + socket_ipv6 = socket_or_err; + sockaddr_in6 ipv6_addr = *reinterpret_cast(found->ai_addr); + ipv6_addr.sin6_port = std::bit_cast>(443); + + if (::connect(socket_ipv6, reinterpret_cast(&ipv6_addr), sizeof(ipv6_addr)) != 0) + return error_and_disable("Failed to connect to ipv6.google.com"); + + cleanup(); + + IPv6_log.success("Successfully tested IPv6 support!"); + ipv6_status = IPV6_SUPPORT::IPV6_SUPPORTED; + return true; + } + + s32 sendto_possibly_ipv6(socket_type native_socket, const char* data, u32 size, const sockaddr_in* addr, int native_flags) + { + if (is_ipv6_supported()) + { + sockaddr_in6 addr_ipv6{}; + + if (np::ip_address_translator::is_ipv6(addr->sin_addr.s_addr)) + { + auto& translator = g_fxo->get(); + addr_ipv6 = translator.get_ipv6_sockaddr(addr->sin_addr.s_addr, addr->sin_port); + } + else + { + addr_ipv6 = sockaddr_to_sockaddr6(*addr); + } + + return ::sendto(native_socket, data, size, native_flags, reinterpret_cast(&addr_ipv6), sizeof(sockaddr_in6)); + } + + return ::sendto(native_socket, data, size, native_flags, reinterpret_cast(addr), sizeof(sockaddr_in)); + } + + sockaddr_in6 sockaddr_to_sockaddr6(const sockaddr_in& addr) + { + sockaddr_in6 addr_ipv6{.sin6_family = AF_INET6, .sin6_port = addr.sin_port}; + std::array ipv6{}; + + // IPv4 over IPv6 + ipv6[10] = 0xFF; + ipv6[11] = 0xFF; + std::memcpy(ipv6.data() + 12, &addr.sin_addr.s_addr, 4); + std::memcpy(&addr_ipv6.sin6_addr, ipv6.data(), ipv6.size()); + return addr_ipv6; + } + + sockaddr_in sockaddr6_to_sockaddr(const sockaddr_in6& addr) + { + sockaddr_in addr_ipv4{.sin_family = AF_INET, .sin_port = addr.sin6_port}; + + std::array ipv6{}; + std::memcpy(ipv6.data(), &addr.sin6_addr, 16); + auto& translator = g_fxo->get(); + addr_ipv4.sin_addr.s_addr = translator.register_ipv6(ipv6); + + return addr_ipv4; + } + + void close_socket(socket_type socket) + { + if (socket) + { +#ifdef _WIN32 + ::closesocket(socket); +#else + ::close(socket); +#endif + } + } + + void set_socket_non_blocking(socket_type socket) + { + if (socket) + { +#ifdef _WIN32 + u_long _true = 1; + ::ioctlsocket(socket, FIONBIO, &_true); +#else + ::fcntl(socket, F_SETFL, ::fcntl(socket, F_GETFL, 0) | O_NONBLOCK); +#endif + } + } +} // namespace np diff --git a/rpcs3/Emu/NP/ip_address.h b/rpcs3/Emu/NP/ip_address.h new file mode 100644 index 0000000000..3857275aac --- /dev/null +++ b/rpcs3/Emu/NP/ip_address.h @@ -0,0 +1,86 @@ +#pragma once + +#include +#include + +#include + +#include "util/types.hpp" +#include "Utilities/mutex.h" + +#ifdef _WIN32 +#include +#include +#else +#ifdef __clang__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wold-style-cast" +#endif +#include +#include +#include +#ifdef __clang__ +#pragma GCC diagnostic pop +#endif +#endif + +#ifdef _WIN32 +using socket_type = uptr; +#else +using socket_type = int; +#endif + +template <> +struct std::hash> +{ + std::size_t operator()(const std::array& array) const noexcept + { + std::size_t hash = 0; + std::hash hasher; + + for (auto byte : array) + { + hash ^= hasher(byte) + 0x9e3779b9 + (hash << 6) + (hash >> 2); + } + + return hash; + } +}; + +namespace np +{ + class ip_address_translator + { + public: + static bool is_ipv6(u32 addr_be); + + u32 register_ipv6(const std::array& ipv6_addr); + sockaddr_in6 get_ipv6_sockaddr(u32 addr_be, u16 port_be); + + private: + static constexpr u32 translation_range_begin = 0x00'00'00'01; + static constexpr u32 translation_range_end = 0x00'00'FF'FF; + + shared_mutex mutex; + u32 cur_addr = translation_range_begin; + std::unordered_map, u32> ipv6_to_ipv4; + std::vector> ipv4_to_ipv6; + }; + + u32 register_ip(const flatbuffers::Vector* vec); + + enum class IPV6_SUPPORT : u8 + { + IPV6_UNKNOWN, + IPV6_UNSUPPORTED, + IPV6_SUPPORTED, + }; + + bool is_ipv6_supported(std::optional force_state = std::nullopt); + s32 sendto_possibly_ipv6(socket_type native_socket, const char* data, u32 size, const sockaddr_in* addr, int native_flags); + sockaddr_in6 sockaddr_to_sockaddr6(const sockaddr_in& addr); + sockaddr_in sockaddr6_to_sockaddr(const sockaddr_in6& addr); + + void close_socket(socket_type socket); + void set_socket_non_blocking(socket_type socket); +} // namespace np diff --git a/rpcs3/Emu/NP/np_contexts.cpp b/rpcs3/Emu/NP/np_contexts.cpp index e448a3f56c..acc934c8b9 100644 --- a/rpcs3/Emu/NP/np_contexts.cpp +++ b/rpcs3/Emu/NP/np_contexts.cpp @@ -45,11 +45,10 @@ error_code generic_async_transaction_context::wait_for_completion() return *result; } -bool generic_async_transaction_context::set_result_and_wake(error_code err) +void generic_async_transaction_context::set_result_and_wake(error_code err) { result = err; wake_cond.notify_one(); - return true; } tus_ctx::tus_ctx(vm::cptr communicationId, vm::cptr passphrase) diff --git a/rpcs3/Emu/NP/np_contexts.h b/rpcs3/Emu/NP/np_contexts.h index d82410c0a2..20e123730b 100644 --- a/rpcs3/Emu/NP/np_contexts.h +++ b/rpcs3/Emu/NP/np_contexts.h @@ -4,17 +4,13 @@ #include #include #include -#include #include "Utilities/mutex.h" - -#include "Emu/IdManager.h" #include "Emu/Memory/vm_ptr.h" #include "Emu/Cell/Modules/sceNp.h" #include "Emu/Cell/Modules/sceNp2.h" #include "Emu/Cell/Modules/sceNpCommerce2.h" #include "Emu/Cell/Modules/sceNpTus.h" -#include "Emu/NP/np_event_data.h" #include "Utilities/Thread.h" // Used By Score and Tus @@ -27,7 +23,7 @@ struct generic_async_transaction_context std::optional get_transaction_status(); void abort_transaction(); error_code wait_for_completion(); - bool set_result_and_wake(error_code err); + void set_result_and_wake(error_code err); shared_mutex mutex; std::condition_variable_any wake_cond, completion_cond; diff --git a/rpcs3/Emu/NP/np_gui_cache.h b/rpcs3/Emu/NP/np_gui_cache.h index f3c4125e2e..d742cc5749 100644 --- a/rpcs3/Emu/NP/np_gui_cache.h +++ b/rpcs3/Emu/NP/np_gui_cache.h @@ -1,12 +1,8 @@ #pragma once #include -#include - #include "Utilities/mutex.h" - #include "Emu/Cell/Modules/sceNp.h" -#include "Emu/Cell/Modules/sceNp2.h" template <> struct std::less diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index 7c9723a25f..6c2ac08b48 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -1,17 +1,18 @@ #include "stdafx.h" #include "Emu/system_config.h" #include "Emu/NP/np_handler.h" -#include "Emu/Cell/PPUModule.h" +#include "Emu/Cell/PPUCallback.h" #include "Emu/Cell/Modules/sceNp.h" #include "Emu/Cell/Modules/sceNp2.h" #include "Emu/Cell/Modules/cellNetCtl.h" +#include "Emu/Cell/timers.hpp" #include "Utilities/StrUtil.h" #include "Emu/IdManager.h" -#include "Emu/NP/np_structs_extra.h" #include "Emu/System.h" #include "Emu/NP/rpcn_config.h" #include "Emu/NP/np_contexts.h" #include "Emu/NP/np_helpers.h" +#include "Emu/NP/signaling_handler.h" #include "Emu/RSX/Overlays/overlay_message.h" #include "Emu/Cell/lv2/sys_net/network_context.h" #include "Emu/Cell/lv2/sys_net/sys_net_helpers.h" @@ -42,7 +43,6 @@ #include #endif -#include "util/asm.hpp" #include "util/yaml.hpp" #include @@ -788,7 +788,14 @@ namespace np break; std::lock_guard lock(mutex_rpcn); - rpcn = rpcn::rpcn_client::get_instance(); + + bool was_already_started = true; + + if (!rpcn) + { + rpcn = rpcn::rpcn_client::get_instance(); + was_already_started = false; + } // Make sure we're connected @@ -808,7 +815,8 @@ namespace np return; } - rsx::overlays::queue_message(localized_string_id::RPCN_SUCCESS_LOGGED_ON); + if (!was_already_started) + rsx::overlays::queue_message(localized_string_id::RPCN_SUCCESS_LOGGED_ON); string_to_online_name(rpcn->get_online_name(), online_name); string_to_avatar_url(rpcn->get_avatar_url(), avatar_url); @@ -836,11 +844,20 @@ namespace np { np_memory.release(); + manager_cb = {}; + manager_cb_arg = {}; + basic_handler_registered = false; + room_event_cb = {}; + room_event_cb_ctx = 0; + room_event_cb_arg = {}; + room_msg_cb = {}; + room_msg_cb_ctx = 0; + room_msg_cb_arg = {}; + if (g_cfg.net.psn_status == np_psn_status::psn_rpcn) { - rpcn_log.notice("Disconnecting from RPCN!"); - std::lock_guard lock(mutex_rpcn); - rpcn.reset(); + rpcn_log.notice("Setting RPCN state to disconnected!"); + rpcn->reset_state(); } } @@ -854,10 +871,13 @@ namespace np auto& data = ::at32(match2_req_results, event_key); data.apply_relocations(dest_addr); - vm::ptr dest = vm::cast(dest_addr); + const u32 size_copied = std::min(size, data.size()); - u32 size_copied = std::min(size, data.size()); - memcpy(dest.get_ptr(), data.data(), size_copied); + if (dest_addr && size_copied) + { + vm::ptr dest = vm::cast(dest_addr); + memcpy(dest.get_ptr(), data.data(), size_copied); + } np_memory.free(data.addr()); match2_req_results.erase(event_key); @@ -1073,61 +1093,63 @@ namespace np auto replies = rpcn->get_replies(); for (auto& reply : replies) { - const u16 command = reply.second.first; + const rpcn::CommandType command = static_cast(reply.second.first); const u32 req_id = reply.first; std::vector& data = reply.second.second; // Every reply should at least contain a return value/error code ensure(data.size() >= 1); + const auto error = static_cast(data[0]); + vec_stream reply_data(data, 1); switch (command) { - case rpcn::CommandType::GetWorldList: reply_get_world_list(req_id, data); break; - case rpcn::CommandType::CreateRoom: reply_create_join_room(req_id, data); break; - case rpcn::CommandType::JoinRoom: reply_join_room(req_id, data); break; - case rpcn::CommandType::LeaveRoom: reply_leave_room(req_id, data); break; - case rpcn::CommandType::SearchRoom: reply_search_room(req_id, data); break; - case rpcn::CommandType::GetRoomDataExternalList: reply_get_roomdata_external_list(req_id, data); break; - case rpcn::CommandType::SetRoomDataExternal: reply_set_roomdata_external(req_id, data); break; - case rpcn::CommandType::GetRoomDataInternal: reply_get_roomdata_internal(req_id, data); break; - case rpcn::CommandType::SetRoomDataInternal: reply_set_roomdata_internal(req_id, data); break; - case rpcn::CommandType::GetRoomMemberDataInternal: reply_get_roommemberdata_internal(req_id, data); break; - case rpcn::CommandType::SetRoomMemberDataInternal: reply_set_roommemberdata_internal(req_id, data); break; - case rpcn::CommandType::SetUserInfo: reply_set_userinfo(req_id, data); break; - case rpcn::CommandType::PingRoomOwner: reply_get_ping_info(req_id, data); break; - case rpcn::CommandType::SendRoomMessage: reply_send_room_message(req_id, data); break; - case rpcn::CommandType::RequestSignalingInfos: reply_req_sign_infos(req_id, data); break; - case rpcn::CommandType::RequestTicket: reply_req_ticket(req_id, data); break; - case rpcn::CommandType::GetBoardInfos: reply_get_board_infos(req_id, data); break; - case rpcn::CommandType::RecordScore: reply_record_score(req_id, data); break; - case rpcn::CommandType::RecordScoreData: reply_record_score_data(req_id, data); break; - case rpcn::CommandType::GetScoreData: reply_get_score_data(req_id, data); break; - case rpcn::CommandType::GetScoreRange: reply_get_score_range(req_id, data); break; - case rpcn::CommandType::GetScoreFriends: reply_get_score_friends(req_id, data); break; - case rpcn::CommandType::GetScoreNpid: reply_get_score_npid(req_id, data); break; - case rpcn::CommandType::TusSetMultiSlotVariable: reply_tus_set_multislot_variable(req_id, data); break; - case rpcn::CommandType::TusGetMultiSlotVariable: reply_tus_get_multislot_variable(req_id, data); break; - case rpcn::CommandType::TusGetMultiUserVariable: reply_tus_get_multiuser_variable(req_id, data); break; - case rpcn::CommandType::TusGetFriendsVariable: reply_tus_get_friends_variable(req_id, data); break; - case rpcn::CommandType::TusAddAndGetVariable: reply_tus_add_and_get_variable(req_id, data); break; - case rpcn::CommandType::TusTryAndSetVariable: reply_tus_try_and_set_variable(req_id, data); break; - case rpcn::CommandType::TusDeleteMultiSlotVariable: reply_tus_delete_multislot_variable(req_id, data); break; - case rpcn::CommandType::TusSetData: reply_tus_set_data(req_id, data); break; - case rpcn::CommandType::TusGetData: reply_tus_get_data(req_id, data); break; - case rpcn::CommandType::TusGetMultiSlotDataStatus: reply_tus_get_multislot_data_status(req_id, data); break; - case rpcn::CommandType::TusGetMultiUserDataStatus: reply_tus_get_multiuser_data_status(req_id, data); break; - case rpcn::CommandType::TusGetFriendsDataStatus: reply_tus_get_friends_data_status(req_id, data); break; - case rpcn::CommandType::TusDeleteMultiSlotData: reply_tus_delete_multislot_data(req_id, data); break; - case rpcn::CommandType::CreateRoomGUI: reply_create_room_gui(req_id, data); break; - case rpcn::CommandType::JoinRoomGUI: reply_join_room_gui(req_id, data); break; - case rpcn::CommandType::LeaveRoomGUI: reply_leave_room_gui(req_id, data); break; - case rpcn::CommandType::GetRoomListGUI: reply_get_room_list_gui(req_id, data); break; - case rpcn::CommandType::SetRoomSearchFlagGUI: reply_set_room_search_flag_gui(req_id, data); break; - case rpcn::CommandType::GetRoomSearchFlagGUI: reply_get_room_search_flag_gui(req_id, data); break; - case rpcn::CommandType::SetRoomInfoGUI: reply_set_room_info_gui(req_id, data); break; - case rpcn::CommandType::GetRoomInfoGUI: reply_get_room_info_gui(req_id, data); break; - case rpcn::CommandType::QuickMatchGUI: reply_quickmatch_gui(req_id, data); break; - case rpcn::CommandType::SearchJoinRoomGUI: reply_searchjoin_gui(req_id, data); break; + case rpcn::CommandType::GetWorldList: reply_get_world_list(req_id, error, reply_data); break; + case rpcn::CommandType::CreateRoom: reply_create_join_room(req_id, error, reply_data); break; + case rpcn::CommandType::JoinRoom: reply_join_room(req_id, error, reply_data); break; + case rpcn::CommandType::LeaveRoom: reply_leave_room(req_id, error, reply_data); break; + case rpcn::CommandType::SearchRoom: reply_search_room(req_id, error, reply_data); break; + case rpcn::CommandType::GetRoomDataExternalList: reply_get_roomdata_external_list(req_id, error, reply_data); break; + case rpcn::CommandType::SetRoomDataExternal: reply_set_roomdata_external(req_id, error); break; + case rpcn::CommandType::GetRoomDataInternal: reply_get_roomdata_internal(req_id, error, reply_data); break; + case rpcn::CommandType::SetRoomDataInternal: reply_set_roomdata_internal(req_id, error); break; + case rpcn::CommandType::GetRoomMemberDataInternal: reply_get_roommemberdata_internal(req_id, error, reply_data); break; + case rpcn::CommandType::SetRoomMemberDataInternal: reply_set_roommemberdata_internal(req_id, error); break; + case rpcn::CommandType::SetUserInfo: reply_set_userinfo(req_id, error); break; + case rpcn::CommandType::PingRoomOwner: reply_get_ping_info(req_id, error, reply_data); break; + case rpcn::CommandType::SendRoomMessage: reply_send_room_message(req_id, error); break; + case rpcn::CommandType::RequestSignalingInfos: reply_req_sign_infos(req_id, error, reply_data); break; + case rpcn::CommandType::RequestTicket: reply_req_ticket(req_id, error, reply_data); break; + case rpcn::CommandType::GetBoardInfos: reply_get_board_infos(req_id, error, reply_data); break; + case rpcn::CommandType::RecordScore: reply_record_score(req_id, error, reply_data); break; + case rpcn::CommandType::RecordScoreData: reply_record_score_data(req_id, error); break; + case rpcn::CommandType::GetScoreData: reply_get_score_data(req_id, error, reply_data); break; + case rpcn::CommandType::GetScoreRange: reply_get_score_range(req_id, error, reply_data); break; + case rpcn::CommandType::GetScoreFriends: reply_get_score_friends(req_id, error, reply_data); break; + case rpcn::CommandType::GetScoreNpid: reply_get_score_npid(req_id, error, reply_data); break; + case rpcn::CommandType::TusSetMultiSlotVariable: reply_tus_set_multislot_variable(req_id, error); break; + case rpcn::CommandType::TusGetMultiSlotVariable: reply_tus_get_multislot_variable(req_id, error, reply_data); break; + case rpcn::CommandType::TusGetMultiUserVariable: reply_tus_get_multiuser_variable(req_id, error, reply_data); break; + case rpcn::CommandType::TusGetFriendsVariable: reply_tus_get_friends_variable(req_id, error, reply_data); break; + case rpcn::CommandType::TusAddAndGetVariable: reply_tus_add_and_get_variable(req_id, error, reply_data); break; + case rpcn::CommandType::TusTryAndSetVariable: reply_tus_try_and_set_variable(req_id, error, reply_data); break; + case rpcn::CommandType::TusDeleteMultiSlotVariable: reply_tus_delete_multislot_variable(req_id, error); break; + case rpcn::CommandType::TusSetData: reply_tus_set_data(req_id, error); break; + case rpcn::CommandType::TusGetData: reply_tus_get_data(req_id, error, reply_data); break; + case rpcn::CommandType::TusGetMultiSlotDataStatus: reply_tus_get_multislot_data_status(req_id, error, reply_data); break; + case rpcn::CommandType::TusGetMultiUserDataStatus: reply_tus_get_multiuser_data_status(req_id, error, reply_data); break; + case rpcn::CommandType::TusGetFriendsDataStatus: reply_tus_get_friends_data_status(req_id, error, reply_data); break; + case rpcn::CommandType::TusDeleteMultiSlotData: reply_tus_delete_multislot_data(req_id, error); break; + case rpcn::CommandType::CreateRoomGUI: reply_create_room_gui(req_id, error, reply_data); break; + case rpcn::CommandType::JoinRoomGUI: reply_join_room_gui(req_id, error, reply_data); break; + case rpcn::CommandType::LeaveRoomGUI: reply_leave_room_gui(req_id, error, reply_data); break; + case rpcn::CommandType::GetRoomListGUI: reply_get_room_list_gui(req_id, error, reply_data); break; + case rpcn::CommandType::SetRoomSearchFlagGUI: reply_set_room_search_flag_gui(req_id, error); break; + case rpcn::CommandType::GetRoomSearchFlagGUI: reply_get_room_search_flag_gui(req_id, error, reply_data); break; + case rpcn::CommandType::SetRoomInfoGUI: reply_set_room_info_gui(req_id, error); break; + case rpcn::CommandType::GetRoomInfoGUI: reply_get_room_info_gui(req_id, error, reply_data); break; + case rpcn::CommandType::QuickMatchGUI: reply_quickmatch_gui(req_id, error, reply_data); break; + case rpcn::CommandType::SearchJoinRoomGUI: reply_searchjoin_gui(req_id, error, reply_data); break; default: fmt::throw_exception("Unknown reply(%d) received!", command); break; } } @@ -1142,9 +1164,8 @@ namespace np case rpcn::NotificationType::RoomDestroyed: notif_room_destroyed(notif.second); break; case rpcn::NotificationType::UpdatedRoomDataInternal: notif_updated_room_data_internal(notif.second); break; case rpcn::NotificationType::UpdatedRoomMemberDataInternal: notif_updated_room_member_data_internal(notif.second); break; - case rpcn::NotificationType::SignalP2PConnect: notif_p2p_connect(notif.second); break; case rpcn::NotificationType::RoomMessageReceived: notif_room_message_received(notif.second); break; - case rpcn::NotificationType::SignalingInfo: notif_signaling_info(notif.second); break; + case rpcn::NotificationType::SignalingHelper: notif_signaling_helper(notif.second); break; case rpcn::NotificationType::MemberJoinedRoomGUI: notif_member_joined_room_gui(notif.second); break; case rpcn::NotificationType::MemberLeftRoomGUI: notif_member_left_room_gui(notif.second); break; case rpcn::NotificationType::RoomDisappearedGUI: notif_room_disappeared_gui(notif.second); break; diff --git a/rpcs3/Emu/NP/np_handler.h b/rpcs3/Emu/NP/np_handler.h index e6524ab98a..4e0352c332 100644 --- a/rpcs3/Emu/NP/np_handler.h +++ b/rpcs3/Emu/NP/np_handler.h @@ -10,8 +10,6 @@ #include "Emu/Cell/Modules/cellSysutil.h" #include "Emu/NP/rpcn_client.h" -#include "Emu/NP/generated/np2_structs_generated.h" -#include "Emu/NP/signaling_handler.h" #include "Emu/NP/np_allocator.h" #include "Emu/NP/np_cache.h" #include "Emu/NP/np_gui_cache.h" @@ -300,8 +298,7 @@ namespace np void notif_room_destroyed(std::vector& data); void notif_updated_room_data_internal(std::vector& data); void notif_updated_room_member_data_internal(std::vector& data); - void notif_p2p_connect(std::vector& data); - void notif_signaling_info(std::vector& data); + void notif_signaling_helper(std::vector& data); void notif_room_message_received(std::vector& data); void generic_gui_notification_handler(std::vector& data, std::string_view name, s32 notification_type); @@ -314,60 +311,60 @@ namespace np void notif_quickmatch_complete_gui(std::vector& data); // Reply handlers - bool reply_get_world_list(u32 req_id, std::vector& reply_data); - bool reply_create_join_room(u32 req_id, std::vector& reply_data); - bool reply_join_room(u32 req_id, std::vector& reply_data); - bool reply_leave_room(u32 req_id, std::vector& reply_data); - bool reply_search_room(u32 req_id, std::vector& reply_data); - bool reply_get_roomdata_external_list(u32 req_id, std::vector& reply_data); - bool reply_set_roomdata_external(u32 req_id, std::vector& reply_data); - bool reply_get_roomdata_internal(u32 req_id, std::vector& reply_data); - bool reply_set_roomdata_internal(u32 req_id, std::vector& reply_data); - bool reply_set_roommemberdata_internal(u32 req_id, std::vector& reply_data); - bool reply_get_roommemberdata_internal(u32 req_id, std::vector& reply_data); - bool reply_set_userinfo(u32 req_id, std::vector& reply_data); - bool reply_get_ping_info(u32 req_id, std::vector& reply_data); - bool reply_send_room_message(u32 req_id, std::vector& reply_data); - bool reply_req_sign_infos(u32 req_id, std::vector& reply_data); - bool reply_req_ticket(u32 req_id, std::vector& reply_data); - bool reply_get_board_infos(u32 req_id, std::vector& reply_data); - bool reply_record_score(u32 req_id, std::vector& reply_data); - bool reply_record_score_data(u32 req_id, std::vector& reply_data); - bool reply_get_score_data(u32 req_id, std::vector& reply_data); - bool reply_get_score_range(u32 req_id, std::vector& reply_data); - bool reply_get_score_friends(u32 req_id, std::vector& reply_data); - bool reply_get_score_npid(u32 req_id, std::vector& reply_data); - bool reply_tus_set_multislot_variable(u32 req_id, std::vector& reply_data); - bool reply_tus_get_multislot_variable(u32 req_id, std::vector& reply_data); - bool reply_tus_get_multiuser_variable(u32 req_id, std::vector& reply_data); - bool reply_tus_get_friends_variable(u32 req_id, std::vector& reply_data); - bool reply_tus_add_and_get_variable(u32 req_id, std::vector& reply_data); - bool reply_tus_try_and_set_variable(u32 req_id, std::vector& reply_data); - bool reply_tus_delete_multislot_variable(u32 req_id, std::vector& reply_data); - bool reply_tus_set_data(u32 req_id, std::vector& reply_data); - bool reply_tus_get_data(u32 req_id, std::vector& reply_data); - bool reply_tus_get_multislot_data_status(u32 req_id, std::vector& reply_data); - bool reply_tus_get_multiuser_data_status(u32 req_id, std::vector& reply_data); - bool reply_tus_get_friends_data_status(u32 req_id, std::vector& reply_data); - bool reply_tus_delete_multislot_data(u32 req_id, std::vector& reply_data); - bool reply_create_room_gui(u32 req_id, std::vector& reply_data); - bool reply_join_room_gui(u32 req_id, std::vector& reply_data); - bool reply_leave_room_gui(u32 req_id, std::vector& reply_data); - bool reply_get_room_list_gui(u32 req_id, std::vector& reply_data); - bool reply_set_room_search_flag_gui(u32 req_id, std::vector& reply_data); - bool reply_get_room_search_flag_gui(u32 req_id, std::vector& reply_data); - bool reply_set_room_info_gui(u32 req_id, std::vector& reply_data); - bool reply_get_room_info_gui(u32 req_id, std::vector& reply_data); - bool reply_quickmatch_gui(u32 req_id, std::vector& reply_data); - bool reply_searchjoin_gui(u32 req_id, std::vector& reply_data); + void reply_get_world_list(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_create_join_room(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_join_room(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_leave_room(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_search_room(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_get_roomdata_external_list(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_set_roomdata_external(u32 req_id, rpcn::ErrorType error); + void reply_get_roomdata_internal(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_set_roomdata_internal(u32 req_id, rpcn::ErrorType error); + void reply_set_roommemberdata_internal(u32 req_id, rpcn::ErrorType error); + void reply_get_roommemberdata_internal(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_set_userinfo(u32 req_id, rpcn::ErrorType error); + void reply_get_ping_info(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_send_room_message(u32 req_id, rpcn::ErrorType error); + void reply_req_sign_infos(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_req_ticket(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_get_board_infos(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_record_score(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_record_score_data(u32 req_id, rpcn::ErrorType error); + void reply_get_score_data(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_get_score_range(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_get_score_friends(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_get_score_npid(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_tus_set_multislot_variable(u32 req_id, rpcn::ErrorType error); + void reply_tus_get_multislot_variable(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_tus_get_multiuser_variable(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_tus_get_friends_variable(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_tus_add_and_get_variable(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_tus_try_and_set_variable(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_tus_delete_multislot_variable(u32 req_id, rpcn::ErrorType error); + void reply_tus_set_data(u32 req_id, rpcn::ErrorType error); + void reply_tus_get_data(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_tus_get_multislot_data_status(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_tus_get_multiuser_data_status(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_tus_get_friends_data_status(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_tus_delete_multislot_data(u32 req_id, rpcn::ErrorType error); + void reply_create_room_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_join_room_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_leave_room_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_get_room_list_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_set_room_search_flag_gui(u32 req_id, rpcn::ErrorType error); + void reply_get_room_search_flag_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_set_room_info_gui(u32 req_id, rpcn::ErrorType error); + void reply_get_room_info_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_quickmatch_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void reply_searchjoin_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply); // Helper functions std::pair get_match2_context_options(u32 ctx_id); - bool handle_GetScoreResponse(u32 req_id, std::vector& reply_data, bool simple_result = false); - bool handle_tus_no_data(u32 req_id, std::vector& reply_data); - bool handle_TusVarResponse(u32 req_id, std::vector& reply_data); - bool handle_TusVariable(u32 req_id, std::vector& reply_data); - bool handle_TusDataStatusResponse(u32 req_id, std::vector& reply_data); + void handle_GetScoreResponse(u32 req_id, rpcn::ErrorType error, vec_stream& reply, bool simple_result = false); + void handle_tus_no_data(u32 req_id, rpcn::ErrorType error); + void handle_TusVarResponse(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void handle_TusVariable(u32 req_id, rpcn::ErrorType error, vec_stream& reply); + void handle_TusDataStatusResponse(u32 req_id, rpcn::ErrorType error, vec_stream& reply); struct callback_info { diff --git a/rpcs3/Emu/NP/np_helpers.cpp b/rpcs3/Emu/NP/np_helpers.cpp index 3576d5c683..be2618b5cf 100644 --- a/rpcs3/Emu/NP/np_helpers.cpp +++ b/rpcs3/Emu/NP/np_helpers.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "util/types.hpp" #include "Utilities/StrUtil.h" -#include "np_handler.h" +#include "rpcn_client.h" #ifdef _WIN32 #include diff --git a/rpcs3/Emu/NP/np_helpers.h b/rpcs3/Emu/NP/np_helpers.h index c5375235f3..a90f5d144c 100644 --- a/rpcs3/Emu/NP/np_helpers.h +++ b/rpcs3/Emu/NP/np_helpers.h @@ -2,7 +2,6 @@ #include "util/types.hpp" #include "Emu/Cell/Modules/sceNp.h" -#include "Emu/Cell/Modules/sceNp2.h" #include "rpcn_client.h" namespace np diff --git a/rpcs3/Emu/NP/np_notifications.cpp b/rpcs3/Emu/NP/np_notifications.cpp index e6b4b547df..e051c64d65 100644 --- a/rpcs3/Emu/NP/np_notifications.cpp +++ b/rpcs3/Emu/NP/np_notifications.cpp @@ -1,11 +1,13 @@ #include "stdafx.h" -#include "Emu/Cell/PPUModule.h" +#include "Emu/Cell/PPUCallback.h" #include "Emu/Cell/Modules/cellSysutil.h" #include "Emu/IdManager.h" #include "Emu/NP/np_handler.h" #include "Emu/NP/np_helpers.h" #include "Emu/NP/np_structs_extra.h" #include "Emu/NP/fb_helpers.h" +#include "Emu/NP/signaling_handler.h" +#include "Emu/NP/ip_address.h" LOG_CHANNEL(rpcn_log, "rpcn"); @@ -14,8 +16,7 @@ namespace np void np_handler::notif_user_joined_room(std::vector& data) { vec_stream noti(data); - u64 room_id = noti.get(); - const auto* update_info = noti.get_flatbuffer(); + const auto* notification = noti.get_flatbuffer(); if (noti.is_error()) { @@ -23,20 +24,44 @@ namespace np return; } + ensure(notification->update_info()); + const u32 event_key = get_event_key(); - auto [include_onlinename, include_avatarurl] = get_match2_context_options(room_event_cb_ctx); + const auto [include_onlinename, include_avatarurl] = get_match2_context_options(room_event_cb_ctx); + const auto room_id = notification->room_id(); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMemberUpdateInfo, sizeof(SceNpMatching2RoomMemberUpdateInfo)); auto* notif_data = reinterpret_cast(edata.data()); - RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(edata, update_info, notif_data, include_onlinename, include_avatarurl); + RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(edata, notification->update_info(), notif_data, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); + // Ensures we do not call the callback if the room is not in the cache(ie we left the room already) if (!np_cache.add_member(room_id, notif_data->roomMemberDataInternal.get_ptr())) + { + get_match2_event(event_key, 0, 0); return; + } rpcn_log.notice("Received notification that user %s(%d) joined the room(%d)", notif_data->roomMemberDataInternal->userInfo.npId.handle.data, notif_data->roomMemberDataInternal->memberId, room_id); extra_nps::print_SceNpMatching2RoomMemberDataInternal(notif_data->roomMemberDataInternal.get_ptr()); + // We initiate signaling if necessary + if (const auto* signaling_info = notification->signaling()) + { + const u32 addr_p2p = register_ip(signaling_info->ip()); + const u16 port_p2p = signaling_info->port(); + + const u16 member_id = notif_data->roomMemberDataInternal->memberId; + const SceNpId& npid = notif_data->roomMemberDataInternal->userInfo.npId; + + rpcn_log.notice("Join notification told to connect to member(%d=%s) of room(%d): %s:%d", member_id, reinterpret_cast(npid.handle.data), room_id, ip_to_string(addr_p2p), port_p2p); + + // Attempt Signaling + auto& sigh = g_fxo->get>(); + const u32 conn_id = sigh.init_sig2(npid, room_id, member_id); + sigh.start_sig(conn_id, addr_p2p, port_p2p); + } + if (room_event_cb) { sysutil_register_cb([room_event_cb = this->room_event_cb, room_id, event_key, room_event_cb_ctx = this->room_event_cb_ctx, room_event_cb_arg = this->room_event_cb_arg, size = edata.size()](ppu_thread& cb_ppu) -> s32 @@ -67,8 +92,12 @@ namespace np RoomMemberUpdateInfo_to_SceNpMatching2RoomMemberUpdateInfo(edata, update_info, notif_data, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); + // Ensures we do not call the callback if the room is not in the cache(ie we left the room already) if (!np_cache.del_member(room_id, notif_data->roomMemberDataInternal->memberId)) + { + get_match2_event(event_key, 0, 0); return; + } rpcn_log.notice("Received notification that user %s(%d) left the room(%d)", notif_data->roomMemberDataInternal->userInfo.npId.handle.data, notif_data->roomMemberDataInternal->memberId, room_id); extra_nps::print_SceNpMatching2RoomMemberDataInternal(notif_data->roomMemberDataInternal.get_ptr()); @@ -174,7 +203,10 @@ namespace np np_memory.shrink_allocation(edata.addr(), edata.size()); if (!np_cache.add_member(room_id, notif_data->newRoomMemberDataInternal.get_ptr())) + { + get_match2_event(event_key, 0, 0); return; + } rpcn_log.notice("Received notification that user's %s(%d) room (%d) data was updated", notif_data->newRoomMemberDataInternal->userInfo.npId.handle.data, notif_data->newRoomMemberDataInternal->memberId, room_id); extra_nps::print_SceNpMatching2RoomMemberDataInternal(notif_data->newRoomMemberDataInternal.get_ptr()); @@ -222,33 +254,7 @@ namespace np } } - void np_handler::notif_p2p_connect(std::vector& data) - { - vec_stream noti(data); - const u64 room_id = noti.get(); - const u16 member_id = noti.get(); - const u16 port_p2p = noti.get(); - const u32 addr_p2p = noti.get(); - - if (noti.is_error()) - { - rpcn_log.error("Received faulty SignalP2PConnect notification"); - return; - } - - auto [res, npid] = np_cache.get_npid(room_id, member_id); - if (!npid) - return; - - rpcn_log.notice("Received notification to connect to member(%d=%s) of room(%d): %s:%d", member_id, reinterpret_cast((*npid).handle.data), room_id, ip_to_string(addr_p2p), port_p2p); - - // Attempt Signaling - auto& sigh = g_fxo->get>(); - const u32 conn_id = sigh.init_sig2(*npid, room_id, member_id); - sigh.start_sig(conn_id, addr_p2p, port_p2p); - } - - void np_handler::notif_signaling_info(std::vector& data) + void np_handler::notif_signaling_helper(std::vector& data) { vec_stream noti(data); const u32 addr_p2p = noti.get(); @@ -257,7 +263,7 @@ namespace np if (noti.is_error()) { - rpcn_log.error("Received faulty SignalingInfo notification"); + rpcn_log.error("Received faulty SignalingHelper notification"); return; } diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index ff124ad15d..1fc8a0c1e2 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -1,5 +1,9 @@ +#include "Emu/Cell/Modules/sceNp.h" +#include "Emu/Cell/Modules/sceNp2.h" +#include "Emu/NP/rpcn_types.h" +#include "Utilities/StrFmt.h" #include "stdafx.h" -#include "Emu/Cell/PPUModule.h" +#include "Emu/Cell/PPUCallback.h" #include "Emu/Cell/lv2/sys_sync.h" #include "Emu/system_config.h" #include "Emu/Cell/Modules/cellSysutil.h" @@ -10,6 +14,8 @@ #include "np_helpers.h" #include "np_structs_extra.h" #include "fb_helpers.h" +#include "Emu/NP/signaling_handler.h" +#include "Emu/NP/ip_address.h" LOG_CHANNEL(rpcn_log, "rpcn"); @@ -114,14 +120,14 @@ namespace np return req_id; } - bool np_handler::reply_get_world_list(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_world_list(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; - vec_stream reply(reply_data, 1); + ensure(error == rpcn::ErrorType::NoError, "Unexpected error in GetWorldList reply"); std::vector world_list; u32 num_worlds = reply.get(); @@ -130,10 +136,7 @@ namespace np world_list.push_back(reply.get()); } - if (reply.is_error()) - { - return error_and_disconnect("Malformed reply to GetWorldList command"); - } + ensure(!reply.is_error(), "Malformed reply to GetWorldList command"); const u32 event_key = get_event_key(); @@ -152,8 +155,6 @@ namespace np np_memory.shrink_allocation(edata.addr(), edata.size()); cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); - - return true; } u32 np_handler::create_join_room(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2CreateJoinRoomRequest* req) @@ -174,18 +175,32 @@ namespace np return req_id; } - bool np_handler::reply_create_join_room(u32 req_id, std::vector& reply_data) + void np_handler::reply_create_join_room(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; + + s32 error_code = CELL_OK; + + switch (error) + { + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomGroupMaxSlotMismatch: error_code = SCE_NP_MATCHING2_SERVER_ERROR_MAX_OVER_SLOT_GROUP; break; + case rpcn::ErrorType::RoomPasswordMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_PASSWORD; break; + case rpcn::ErrorType::RoomGroupNoJoinLabel: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_JOIN_GROUP_LABEL; break; + default: fmt::throw_exception("Unexpected error in reply to CreateRoom: %d", static_cast(error)); + } + + if (error_code != CELL_OK) + { + cb_info_opt->queue_callback(req_id, 0, error_code, 0); + return; + } - vec_stream reply(reply_data, 1); const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to CreateRoom command"); + ensure(!reply.is_error(), "Malformed reply to CreateRoom command"); const u32 event_key = get_event_key(); auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); @@ -202,8 +217,6 @@ namespace np extra_nps::print_SceNpMatching2CreateJoinRoomResponse(room_resp); cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); - - return true; } u32 np_handler::join_room(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2JoinRoomRequest* req) @@ -221,55 +234,79 @@ namespace np return req_id; } - bool np_handler::reply_join_room(u32 req_id, std::vector& reply_data) + void np_handler::reply_join_room(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; s32 error_code = 0; - if (rpcn::is_error(static_cast(reply_data[0]))) + switch (error) { - switch (reply_data[0]) - { - case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; - case rpcn::ErrorType::RoomAlreadyJoined: error_code = SCE_NP_MATCHING2_SERVER_ERROR_ALREADY_JOINED; break; - case rpcn::ErrorType::RoomFull: error_code = SCE_NP_MATCHING2_SERVER_ERROR_ROOM_FULL; break; - default: return false; - } + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; + case rpcn::ErrorType::RoomAlreadyJoined: error_code = SCE_NP_MATCHING2_SERVER_ERROR_ALREADY_JOINED; break; + case rpcn::ErrorType::RoomFull: error_code = SCE_NP_MATCHING2_SERVER_ERROR_ROOM_FULL; break; + case rpcn::ErrorType::RoomPasswordMismatch: error_code = SCE_NP_MATCHING2_SERVER_ERROR_PASSWORD_MISMATCH; break; + case rpcn::ErrorType::RoomGroupFull: error_code = SCE_NP_MATCHING2_SERVER_ERROR_GROUP_FULL; break; + case rpcn::ErrorType::RoomGroupJoinLabelNotFound: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_GROUP; break; + default: fmt::throw_exception("Unexpected error in reply to JoinRoom: %d", static_cast(error)); ; } if (error_code != 0) { cb_info_opt->queue_callback(req_id, 0, error_code, 0); - return true; + return; } - vec_stream reply(reply_data, 1); - - const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to JoinRoom command"); + const auto* resp = reply.get_flatbuffer(); + ensure(!reply.is_error(), "Malformed reply to JoinRoom command"); + ensure(resp->room_data()); const u32 event_key = get_event_key(); - auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); + const auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); auto& edata = allocate_req_result(event_key, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_JoinRoom, sizeof(SceNpMatching2JoinRoomResponse)); auto* room_resp = reinterpret_cast(edata.data()); auto* room_info = edata.allocate(sizeof(SceNpMatching2RoomDataInternal), room_resp->roomDataInternal); - RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, resp, room_info, npid, include_onlinename, include_avatarurl); + RoomDataInternal_to_SceNpMatching2RoomDataInternal(edata, resp->room_data(), room_info, npid, include_onlinename, include_avatarurl); np_memory.shrink_allocation(edata.addr(), edata.size()); np_cache.insert_room(room_info); extra_nps::print_SceNpMatching2RoomDataInternal(room_info); - cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); + // We initiate signaling if necessary + if (const auto* signaling_data = resp->signaling_data()) + { + const u64 room_id = resp->room_data()->roomId(); - return true; + for (unsigned int i = 0; i < signaling_data->size(); i++) + { + const auto* signaling_info = signaling_data->Get(i); + ensure(signaling_info->addr()); + + const u32 addr_p2p = register_ip(signaling_info->addr()->ip()); + const u16 port_p2p = signaling_info->addr()->port(); + + const u16 member_id = signaling_info->member_id(); + const auto [npid_res, npid_p2p] = np_cache.get_npid(room_id, member_id); + + if (npid_res != CELL_OK) + continue; + + rpcn_log.notice("JoinRoomResult told to connect to member(%d=%s) of room(%d): %s:%d", member_id, reinterpret_cast(npid_p2p->handle.data), room_id, ip_to_string(addr_p2p), port_p2p); + + // Attempt Signaling + auto& sigh = g_fxo->get>(); + const u32 conn_id = sigh.init_sig2(*npid_p2p, room_id, member_id); + sigh.start_sig(conn_id, addr_p2p, port_p2p); + } + } + + cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); } u32 np_handler::leave_room(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2LeaveRoomRequest* req) @@ -285,24 +322,35 @@ namespace np return req_id; } - bool np_handler::reply_leave_room(u32 req_id, std::vector& reply_data) + void np_handler::reply_leave_room(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; + + s32 error_code = CELL_OK; + + switch (error) + { + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; + default: fmt::throw_exception("Unexpected error in reply to LeaveRoom: %d", static_cast(error)); ; + } + + if (error_code != CELL_OK) + { + cb_info_opt->queue_callback(req_id, 0, error_code, 0); + return; + } - vec_stream reply(reply_data, 1); u64 room_id = reply.get(); - if (reply.is_error()) - return error_and_disconnect("Malformed reply to LeaveRoom command"); + ensure(!reply.is_error(), "Malformed reply to LeaveRoom command"); // Disconnect all users from that room auto& sigh = g_fxo->get>(); sigh.disconnect_sig2_users(room_id); cb_info_opt->queue_callback(req_id, 0, 0, 0); - - return true; } u32 np_handler::search_room(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2SearchRoomRequest* req) @@ -320,18 +368,17 @@ namespace np return req_id; } - bool np_handler::reply_search_room(u32 req_id, std::vector& reply_data) + void np_handler::reply_search_room(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; + + ensure(error == rpcn::ErrorType::NoError, "Unexpected error in SearchRoom reply"); - vec_stream reply(reply_data, 1); const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to SearchRoom command"); + ensure(!reply.is_error(), "Malformed reply to SearchRoom command"); const u32 event_key = get_event_key(); @@ -343,8 +390,6 @@ namespace np extra_nps::print_SceNpMatching2SearchRoomResponse(search_resp); cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); - - return true; } u32 np_handler::get_roomdata_external_list(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2GetRoomDataExternalListRequest* req) @@ -362,18 +407,17 @@ namespace np return req_id; } - bool np_handler::reply_get_roomdata_external_list(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_roomdata_external_list(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; + + ensure(error == rpcn::ErrorType::NoError, "Unexpected error in GetRoomDataExternalList reply"); - vec_stream reply(reply_data, 1); const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to GetRoomDataExternalList command"); + ensure(!reply.is_error(), "Malformed reply to GetRoomDataExternalList command"); const u32 event_key = get_event_key(); auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); @@ -386,8 +430,6 @@ namespace np extra_nps::print_SceNpMatching2GetRoomDataExternalListResponse(sce_get_room_ext_resp); cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); - - return true; } u32 np_handler::set_roomdata_external(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2SetRoomDataExternalRequest* req) @@ -405,16 +447,24 @@ namespace np return req_id; } - bool np_handler::reply_set_roomdata_external(u32 req_id, std::vector& /*reply_data*/) + void np_handler::reply_set_roomdata_external(u32 req_id, rpcn::ErrorType error) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; - cb_info_opt->queue_callback(req_id, 0, 0, 0); + s32 error_code = CELL_OK; - return true; + switch (error) + { + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; + case rpcn::ErrorType::Unauthorized: error_code = SCE_NP_MATCHING2_SERVER_ERROR_FORBIDDEN; break; + default: fmt::throw_exception("Unexpected error in reply to SetRoomDataExternal: %d", static_cast(error)); + } + + cb_info_opt->queue_callback(req_id, 0, error_code, 0); } u32 np_handler::get_roomdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2GetRoomDataInternalRequest* req) @@ -430,19 +480,30 @@ namespace np return req_id; } - bool np_handler::reply_get_roomdata_internal(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_roomdata_internal(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; - vec_stream reply(reply_data, 1); + s32 error_code = CELL_OK; + + switch (error) + { + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; + default: fmt::throw_exception("Unexpected error in reply to GetRoomDataInternal: %d", static_cast(error)); + } + + if (error_code != CELL_OK) + { + cb_info_opt->queue_callback(req_id, 0, error_code, 0); + return; + } const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to GetRoomDataInternal command"); + ensure(!reply.is_error(), "Malformed reply to GetRoomDataInternal command"); const u32 event_key = get_event_key(); auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); @@ -458,8 +519,6 @@ namespace np extra_nps::print_SceNpMatching2RoomDataInternal(room_info); cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); - - return true; } u32 np_handler::set_roomdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2SetRoomDataInternalRequest* req) @@ -477,16 +536,23 @@ namespace np return req_id; } - bool np_handler::reply_set_roomdata_internal(u32 req_id, std::vector& /*reply_data*/) + void np_handler::reply_set_roomdata_internal(u32 req_id, rpcn::ErrorType error) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; - cb_info_opt->queue_callback(req_id, 0, 0, 0); + s32 error_code = CELL_OK; - return true; + switch (error) + { + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; + default: fmt::throw_exception("Unexpected error in reply to GetRoomDataInternal: %d", static_cast(error)); ; + } + + cb_info_opt->queue_callback(req_id, 0, error_code, 0); } u32 np_handler::get_roommemberdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2GetRoomMemberDataInternalRequest* req) @@ -503,34 +569,31 @@ namespace np return req_id; } - bool np_handler::reply_get_roommemberdata_internal(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_roommemberdata_internal(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; - if (rpcn::is_error(static_cast(reply_data[0]))) + s32 error_code = CELL_OK; + + switch (error) { - switch (reply_data[0]) - { - case rpcn::ErrorType::NotFound: - { - rpcn_log.error("GetRoomMemberDataInternal: Room or User wasn't found"); - cb_info_opt->queue_callback(req_id, 0, -1, 0); - return true; - } - default: - return error_and_disconnect(fmt::format("GetRoomMemberDataInternal failed with unknown error(%d)!", reply_data[0])); - } + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; + case rpcn::ErrorType::NotFound: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_USER; break; + default: fmt::throw_exception("Unexpected error in reply to GetRoomMemberDataInternal: %d", static_cast(error)); ; } - vec_stream reply(reply_data, 1); + if (error_code != CELL_OK) + { + cb_info_opt->queue_callback(req_id, 0, error_code, 0); + return; + } const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to GetRoomMemberDataInternal command"); + ensure(!reply.is_error(), "Malformed reply to GetRoomMemberDataInternal command"); const u32 event_key = get_event_key(); auto [include_onlinename, include_avatarurl] = get_match2_context_options(cb_info_opt->ctx_id); @@ -542,7 +605,6 @@ namespace np np_memory.shrink_allocation(edata.addr(), edata.size()); cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); - return true; } u32 np_handler::set_roommemberdata_internal(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2SetRoomMemberDataInternalRequest* req) @@ -560,16 +622,25 @@ namespace np return req_id; } - bool np_handler::reply_set_roommemberdata_internal(u32 req_id, std::vector& /*reply_data*/) + void np_handler::reply_set_roommemberdata_internal(u32 req_id, rpcn::ErrorType error) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; - cb_info_opt->queue_callback(req_id, 0, 0, 0); + s32 error_code = CELL_OK; - return true; + switch (error) + { + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; + case rpcn::ErrorType::NotFound: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_USER; break; + case rpcn::ErrorType::Unauthorized: error_code = SCE_NP_MATCHING2_SERVER_ERROR_FORBIDDEN; break; + default: fmt::throw_exception("Unexpected error in reply to SetRoomMemberDataInternal: %d", static_cast(error)); + } + + cb_info_opt->queue_callback(req_id, 0, error_code, 0); } u32 np_handler::set_userinfo(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2SetUserInfoRequest* req) @@ -585,21 +656,20 @@ namespace np return req_id; } - bool np_handler::reply_set_userinfo(u32 req_id, std::vector& reply_data) + void np_handler::reply_set_userinfo(u32 req_id, rpcn::ErrorType error) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; - if (rpcn::is_error(static_cast(reply_data[0]))) + switch (error) { - return error_and_disconnect(fmt::format("SetUserInfo failed with unknown error(%d)!", reply_data[0])); + case rpcn::ErrorType::NoError: break; + default: fmt::throw_exception("Unexpected error in reply to SetUserInfo: %d", static_cast(error)); } cb_info_opt->queue_callback(req_id, 0, 0, 0); - - return true; } u32 np_handler::get_ping_info(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2SignalingGetPingInfoRequest* req) @@ -615,19 +685,30 @@ namespace np return req_id; } - bool np_handler::reply_get_ping_info(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_ping_info(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; - vec_stream reply(reply_data, 1); + s32 error_code = CELL_OK; + + switch (error) + { + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; + default: fmt::throw_exception("Unexpected error in reply to PingRoomOwner: %d", static_cast(error)); + } + + if (error_code != CELL_OK) + { + cb_info_opt->queue_callback(req_id, 0, error_code, 0); + return; + } const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to PingRoomOwner command"); + ensure(!reply.is_error(), "Malformed reply to PingRoomOwner command"); const u32 event_key = get_event_key(); @@ -636,8 +717,6 @@ namespace np GetPingInfoResponse_to_SceNpMatching2SignalingGetPingInfoResponse(resp, final_ping_resp); np_memory.shrink_allocation(edata.addr(), edata.size()); cb_info_opt->queue_callback(req_id, event_key, 0, edata.size()); - - return true; } u32 np_handler::send_room_message(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2SendRoomMessageRequest* req) @@ -653,16 +732,24 @@ namespace np return req_id; } - bool np_handler::reply_send_room_message(u32 req_id, std::vector& /*reply_data*/) + void np_handler::reply_send_room_message(u32 req_id, rpcn::ErrorType error) { auto cb_info_opt = take_pending_request(req_id); if (!cb_info_opt) - return true; + return; - cb_info_opt->queue_callback(req_id, 0, 0, 0); + s32 error_code = CELL_OK; - return true; + switch (error) + { + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING2_SERVER_ERROR_NO_SUCH_ROOM; break; + case rpcn::ErrorType::Unauthorized: error_code = SCE_NP_MATCHING2_SERVER_ERROR_FORBIDDEN; break; + default: fmt::throw_exception("Unexpected error in reply to SendRoomMessage: %d", static_cast(error)); + } + + cb_info_opt->queue_callback(req_id, 0, error_code, 0); } void np_handler::req_sign_infos(const std::string& npid, u32 conn_id) @@ -680,7 +767,7 @@ namespace np } } - bool np_handler::reply_req_sign_infos(u32 req_id, std::vector& reply_data) + void np_handler::reply_req_sign_infos(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { u32 conn_id; { @@ -689,33 +776,23 @@ namespace np pending_sign_infos_requests.erase(req_id); } - if (rpcn::is_error(static_cast(reply_data[0]))) + switch (error) { - switch (reply_data[0]) - { - case rpcn::ErrorType::NotFound: - { - rpcn_log.error("Signaling information was requested for a user that doesn't exist or is not online"); - return true; - } - case rpcn::ErrorType::Malformed: - return error_and_disconnect("RequestSignalingInfos request was malformed!"); - default: - return error_and_disconnect(fmt::format("RequestSignalingInfos failed with unknown error(%d)!", reply_data[0])); - } + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::NotFound: + { + rpcn_log.error("Signaling information was requested for a user that doesn't exist or is not online"); + return; + } + default: fmt::throw_exception("Unexpected error in reply to RequestSignalingInfos: %d", static_cast(error)); } - vec_stream reply(reply_data, 1); - const u32 addr = reply.get(); - const u16 port = reply.get(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to RequestSignalingInfos command"); + const auto* resp = reply.get_flatbuffer(); + ensure(!reply.is_error() && resp->ip(), "Malformed reply to RequestSignalingInfos command"); + u32 addr = register_ip(resp->ip()); auto& sigh = g_fxo->get>(); - sigh.start_sig(conn_id, addr, port); - - return true; + sigh.start_sig(conn_id, addr, resp->port()); } u32 np_handler::get_lobby_info_list(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2GetLobbyInfoListRequest* req) @@ -779,13 +856,11 @@ namespace np return current_ticket; } - bool np_handler::reply_req_ticket([[maybe_unused]] u32 req_id, std::vector& reply_data) + void np_handler::reply_req_ticket(u32 /* req_id */, rpcn::ErrorType error, vec_stream& reply) { - vec_stream reply(reply_data, 1); + ensure(error == rpcn::ErrorType::NoError, "Unexpected error in reply to RequestTicket"); auto ticket_raw = reply.get_rawdata(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to RequestTicket command"); + ensure(!reply.is_error(), "Malformed reply to RequestTicket command"); current_ticket = ticket(std::move(ticket_raw)); auto ticket_size = static_cast(current_ticket.size()); @@ -798,8 +873,6 @@ namespace np return 0; }); } - - return true; } void np_handler::transaction_async_handler(std::unique_lock lock, const shared_ptr& trans_ctx, u32 req_id, bool async) @@ -853,14 +926,37 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_get_board_infos(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_board_infos(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { - vec_stream reply(reply_data, 1); + std::lock_guard lock_trans(mutex_async_transactions); + if (!async_transactions.count(req_id)) + { + rpcn_log.error("Couldn't find transaction(%d) in trans_id!", req_id); + return; + } + + auto score_trans = idm::get_unlocked(::at32(async_transactions, req_id)->idm_id); + ensure(score_trans); + + s32 error_code = CELL_OK; + + switch (error) + { + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::NotFound: error_code = SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_BOARD_MASTER_NOT_FOUND; break; + default: fmt::throw_exception("Unexpected error in reply to GetBoardInfos: %d", static_cast(error)); + } + + if (error_code != CELL_OK) + { + std::lock_guard lock(score_trans->mutex); + score_trans->result = error_code; + score_trans->wake_cond.notify_one(); + return; + } const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to GetBoardInfos command"); + ensure(!reply.is_error(), "Malformed reply to GetBoardInfos command"); const SceNpScoreBoardInfo board_info{ .rankLimit = resp->rankLimit(), @@ -870,16 +966,6 @@ namespace np .uploadSizeLimit = resp->uploadSizeLimit() }; - std::lock_guard lock_trans(mutex_async_transactions); - if (!async_transactions.count(req_id)) - { - rpcn_log.error("Couldn't find transaction(%d) in trans_id!", req_id); - return false; - } - - auto score_trans = idm::get_unlocked(::at32(async_transactions, req_id)->idm_id); - ensure(score_trans); - std::lock_guard lock(score_trans->mutex); const auto* tdata = std::get_if(&score_trans->tdata); @@ -888,8 +974,6 @@ namespace np memcpy(reinterpret_cast(tdata->boardInfo.get_ptr()), &board_info, sizeof(SceNpScoreBoardInfo)); score_trans->result = CELL_OK; score_trans->wake_cond.notify_one(); - - return true; } void np_handler::record_score(shared_ptr& trans_ctx, SceNpScoreBoardId boardId, SceNpScoreValue score, vm::cptr scoreComment, const u8* data, u32 data_size, vm::ptr tmpRank, bool async) @@ -911,13 +995,13 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_record_score(u32 req_id, std::vector& reply_data) + void np_handler::reply_record_score(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { std::lock_guard lock_trans(mutex_async_transactions); if (!async_transactions.count(req_id)) { rpcn_log.error("Couldn't find transaction(%d) in trans_id!", req_id); - return false; + return; } auto score_trans = idm::get_unlocked(::at32(async_transactions, req_id)->idm_id); @@ -925,28 +1009,20 @@ namespace np std::lock_guard lock(score_trans->mutex); - if (rpcn::is_error(static_cast(reply_data[0]))) + switch (error) { - switch (reply_data[0]) - { - case rpcn::ErrorType::ScoreNotBest: - { - score_trans->result = SCE_NP_COMMUNITY_SERVER_ERROR_NOT_BEST_SCORE; - score_trans->wake_cond.notify_one(); - return true; - } - default: return false; - } + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::ScoreNotBest: + { + score_trans->result = SCE_NP_COMMUNITY_SERVER_ERROR_NOT_BEST_SCORE; + score_trans->wake_cond.notify_one(); + return; + } + default: fmt::throw_exception("Unexpected error in reply_record_score: %d", static_cast(error)); } - vec_stream reply(reply_data, 1); auto tmp_rank = reply.get(); - - if (reply.is_error()) - { - rpcn_log.error("Error parsing response in reply_record_score"); - return false; - } + ensure(!reply.is_error(), "Error parsing response in reply_record_score"); const auto* tdata = std::get_if(&score_trans->tdata); ensure(tdata); @@ -958,7 +1034,6 @@ namespace np score_trans->result = CELL_OK; score_trans->wake_cond.notify_one(); - return true; } void np_handler::record_score_data(shared_ptr& trans_ctx, SceNpScoreBoardId boardId, SceNpScoreValue score, u32 totalSize, u32 sendSize, const u8* score_data, bool async) @@ -988,37 +1063,26 @@ namespace np } } - bool np_handler::reply_record_score_data(u32 req_id, std::vector& reply_data) + void np_handler::reply_record_score_data(u32 req_id, rpcn::ErrorType error) { std::lock_guard lock_trans(mutex_async_transactions); if (!async_transactions.count(req_id)) { rpcn_log.error("Couldn't find transaction(%d) in trans_id!", req_id); - return false; + return; } auto trans = ::at32(async_transactions, req_id); std::lock_guard lock(trans->mutex); - auto set_result_and_wake = [&](error_code err) -> bool + switch (error) { - trans->result = err; - trans->wake_cond.notify_one(); - return true; - }; - - if (rpcn::is_error(static_cast(reply_data[0]))) - { - switch (reply_data[0]) - { - case rpcn::ErrorType::NotFound: return trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_STORE_NOT_FOUND); - case rpcn::ErrorType::ScoreInvalid: return trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_SCORE); - case rpcn::ErrorType::ScoreHasData: return trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_GAME_DATA_ALREADY_EXISTS); - default: return false; - } + case rpcn::ErrorType::NoError: trans->set_result_and_wake(CELL_OK); break; + case rpcn::ErrorType::NotFound: trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_STORE_NOT_FOUND); break; + case rpcn::ErrorType::ScoreInvalid: trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_INVALID_SCORE); break; + case rpcn::ErrorType::ScoreHasData: trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_GAME_DATA_ALREADY_EXISTS); break; + default: fmt::throw_exception("Unexpected error in reply to RecordScoreData: %d", static_cast(error)); ; } - - return set_result_and_wake(CELL_OK); } void np_handler::get_score_data(shared_ptr& trans_ctx, SceNpScoreBoardId boardId, const SceNpId& npId, vm::ptr totalSize, u32 recvSize, vm::ptr score_data, bool async) @@ -1053,40 +1117,31 @@ namespace np trans_ctx->result = not_an_error(to_copy); } - bool np_handler::reply_get_score_data(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_score_data(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { std::lock_guard lock_trans(mutex_async_transactions); if (!async_transactions.count(req_id)) { rpcn_log.error("Couldn't find transaction(%d) in trans_id!", req_id); - return false; + return; } auto score_trans = idm::get_unlocked(::at32(async_transactions, req_id)->idm_id); ensure(score_trans); std::lock_guard lock(score_trans->mutex); - if (rpcn::is_error(static_cast(reply_data[0]))) + switch (error) { - switch (reply_data[0]) - { - case rpcn::ErrorType::NotFound: return score_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_GAME_DATA_MASTER_NOT_FOUND); - default: return false; - } + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::NotFound: score_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_RANKING_GAME_DATA_MASTER_NOT_FOUND); return; + default: fmt::throw_exception("Unexpected error in reply to GetScoreData: %d", static_cast(error)); ; } - vec_stream reply(reply_data, 1); - auto* tdata = std::get_if(&score_trans->tdata); ensure(tdata); tdata->game_data = reply.get_rawdata(); - - if (reply.is_error()) - { - rpcn_log.error("Error parsing response in reply_get_score_data"); - return false; - } + ensure(!reply.is_error(), "Error parsing response in reply_get_score_data"); tdata->game_data_size = ::size32(tdata->game_data); @@ -1095,7 +1150,7 @@ namespace np tdata->game_data.erase(tdata->game_data.begin(), tdata->game_data.begin() + to_copy); *tdata->totalSize = tdata->game_data_size; - return score_trans->set_result_and_wake(not_an_error(to_copy)); + score_trans->set_result_and_wake(not_an_error(to_copy)); } void np_handler::get_score_range(shared_ptr& trans_ctx, SceNpScoreBoardId boardId, SceNpScoreRankNumber startSerialRank, vm::ptr rankArray, u32 rankArraySize, vm::ptr commentArray, [[maybe_unused]] u32 commentArraySize, vm::ptr infoArray, u32 infoArraySize, u32 arrayNum, vm::ptr lastSortDate, vm::ptr totalRecord, bool async, bool deprecated) @@ -1143,32 +1198,27 @@ namespace np cur_rank.recordDate.tick = fb_rankdata->recordDate(); } - bool np_handler::handle_GetScoreResponse(u32 req_id, std::vector& reply_data, bool simple_result) + void np_handler::handle_GetScoreResponse(u32 req_id, rpcn::ErrorType error, vec_stream& reply, bool simple_result) { std::lock_guard lock_trans(mutex_async_transactions); if (!async_transactions.count(req_id)) { rpcn_log.error("Couldn't find transaction(%d) in trans_id!", req_id); - return false; + return; } auto score_trans = idm::get_unlocked(::at32(async_transactions, req_id)->idm_id); ensure(score_trans); std::lock_guard lock(score_trans->mutex); - if (rpcn::is_error(static_cast(reply_data[0]))) + switch (error) { - return false; + case rpcn::ErrorType::NoError: break; + default: fmt::throw_exception("Unexpected error in GetScoreResponse: %d", static_cast(error)); } - vec_stream reply(reply_data, 1); const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - { - rpcn_log.error("Error parsing response in handle_GetScoreResponse"); - return false; - } + ensure(!reply.is_error(), "Error parsing response in handle_GetScoreResponse"); const auto* tdata = std::get_if(&score_trans->tdata); ensure(tdata); @@ -1272,12 +1322,11 @@ namespace np score_trans->result = SCE_NP_COMMUNITY_SERVER_ERROR_GAME_RANKING_NOT_FOUND; score_trans->wake_cond.notify_one(); - return true; } - bool np_handler::reply_get_score_range(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_score_range(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { - return handle_GetScoreResponse(req_id, reply_data); + handle_GetScoreResponse(req_id, error, reply); } void np_handler::get_score_friend(shared_ptr& trans_ctx, SceNpScoreBoardId boardId, bool include_self, vm::ptr rankArray, u32 rankArraySize, vm::ptr commentArray, [[maybe_unused]] u32 commentArraySize, vm::ptr infoArray, u32 infoArraySize, u32 arrayNum, vm::ptr lastSortDate, vm::ptr totalRecord, bool async, bool deprecated) @@ -1304,9 +1353,9 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_get_score_friends(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_score_friends(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { - return handle_GetScoreResponse(req_id, reply_data); + handle_GetScoreResponse(req_id, error, reply); } void np_handler::get_score_npid(shared_ptr& trans_ctx, SceNpScoreBoardId boardId, const std::vector>& npid_vec, vm::ptr rankArray, u32 rankArraySize, vm::ptr commentArray, [[maybe_unused]] u32 commentArraySize, vm::ptr infoArray, u32 infoArraySize, u32 arrayNum, vm::ptr lastSortDate, vm::ptr totalRecord, bool async, bool deprecated) @@ -1333,76 +1382,57 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_get_score_npid(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_score_npid(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { - return handle_GetScoreResponse(req_id, reply_data, true); + handle_GetScoreResponse(req_id, error, reply, true); } - bool np_handler::handle_tus_no_data(u32 req_id, std::vector& reply_data) + void np_handler::handle_tus_no_data(u32 req_id, rpcn::ErrorType error) { std::lock_guard lock_trans(mutex_async_transactions); if (!async_transactions.count(req_id)) { rpcn_log.error("Couldn't find transaction(%d) in trans_id!", req_id); - return false; + return; } auto trans = ::at32(async_transactions, req_id); std::lock_guard lock(trans->mutex); - auto set_result_and_wake = [&](error_code err) -> bool + switch (error) { - trans->result = err; - trans->wake_cond.notify_one(); - return true; - }; - - if (rpcn::is_error(static_cast(reply_data[0]))) - { - switch (reply_data[0]) - { - case rpcn::ErrorType::NotFound: return trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); - case rpcn::ErrorType::Unauthorized: return trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); - case rpcn::ErrorType::CondFail: return trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); - default: return false; - } + case rpcn::ErrorType::NoError: trans->set_result_and_wake(CELL_OK); break; + case rpcn::ErrorType::NotFound: trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); break; + case rpcn::ErrorType::Unauthorized: trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); break; + case rpcn::ErrorType::CondFail: trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); break; + default: fmt::throw_exception("Unexpected error in handle_tus_no_data: %d", static_cast(error)); } - - return set_result_and_wake(CELL_OK); } - bool np_handler::handle_TusVarResponse(u32 req_id, std::vector& reply_data) + void np_handler::handle_TusVarResponse(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { std::lock_guard lock_trans(mutex_async_transactions); if (!async_transactions.count(req_id)) { rpcn_log.error("Couldn't find transaction(%d) in trans_id!", req_id); - return false; + return; } auto tus_trans = idm::get_unlocked(::at32(async_transactions, req_id)->idm_id); ensure(tus_trans); std::lock_guard lock(tus_trans->mutex); - if (rpcn::is_error(static_cast(reply_data[0]))) + switch (error) { - switch (reply_data[0]) - { - case rpcn::ErrorType::NotFound: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); - case rpcn::ErrorType::Unauthorized: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); - case rpcn::ErrorType::CondFail: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); - default: return false; - } + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::NotFound: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); + case rpcn::ErrorType::Unauthorized: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); + case rpcn::ErrorType::CondFail: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); + default: fmt::throw_exception("Unexpected error in handle_TusVarResponse: %d", static_cast(error)); } - vec_stream reply(reply_data, 1); const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - { - rpcn_log.error("Error parsing response in handle_TusVarResponse"); - return false; - } + ensure(!reply.is_error(), "Error parsing response in handle_TusVarResponse"); const auto* tdata = std::get_if(&tus_trans->tdata); ensure(tdata); @@ -1435,42 +1465,32 @@ namespace np tus_trans->result = not_an_error(fb_vars->size()); tus_trans->wake_cond.notify_one(); - - return true; } - bool np_handler::handle_TusVariable(u32 req_id, std::vector& reply_data) + void np_handler::handle_TusVariable(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { std::lock_guard lock_trans(mutex_async_transactions); if (!async_transactions.count(req_id)) { rpcn_log.error("Couldn't find transaction(%d) in trans_id!", req_id); - return false; + return; } auto tus_trans = idm::get_unlocked(::at32(async_transactions, req_id)->idm_id); ensure(tus_trans); std::lock_guard lock(tus_trans->mutex); - if (rpcn::is_error(static_cast(reply_data[0]))) + switch (error) { - switch (reply_data[0]) - { - case rpcn::ErrorType::NotFound: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); - case rpcn::ErrorType::Unauthorized: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); - case rpcn::ErrorType::CondFail: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); - default: return false; - } + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::NotFound: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); + case rpcn::ErrorType::Unauthorized: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); + case rpcn::ErrorType::CondFail: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); + default: fmt::throw_exception("Unexpected error in handle_TusVariable: %d", static_cast(error)); } - vec_stream reply(reply_data, 1); const auto* fb_var = reply.get_flatbuffer(); - - if (reply.is_error()) - { - rpcn_log.error("Error parsing response in handle_TusVariable"); - return false; - } + ensure(!reply.is_error(), "Error parsing response in handle_TusVariable"); const auto* tdata = std::get_if(&tus_trans->tdata); ensure(tdata); @@ -1493,42 +1513,32 @@ namespace np tus_trans->result = CELL_OK; tus_trans->wake_cond.notify_one(); - - return true; } - bool np_handler::handle_TusDataStatusResponse(u32 req_id, std::vector& reply_data) + void np_handler::handle_TusDataStatusResponse(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { std::lock_guard lock_trans(mutex_async_transactions); if (!async_transactions.count(req_id)) { rpcn_log.error("Couldn't find transaction(%d) in trans_id!", req_id); - return false; + return; } auto tus_trans = idm::get_unlocked(::at32(async_transactions, req_id)->idm_id); ensure(tus_trans); std::lock_guard lock(tus_trans->mutex); - if (rpcn::is_error(static_cast(reply_data[0]))) + switch (error) { - switch (reply_data[0]) - { - case rpcn::ErrorType::NotFound: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); - case rpcn::ErrorType::Unauthorized: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); - case rpcn::ErrorType::CondFail: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); - default: return false; - } + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::NotFound: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); + case rpcn::ErrorType::Unauthorized: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); + case rpcn::ErrorType::CondFail: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); + default: fmt::throw_exception("Unexpected error in handle_TusDataStatusResponse: %d", static_cast(error)); } - vec_stream reply(reply_data, 1); const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - { - rpcn_log.error("Error parsing response in handle_TusDataStatusReponse"); - return false; - } + ensure(!reply.is_error(), "Error parsing response in handle_TusDataStatusReponse"); const auto* tdata = std::get_if(&tus_trans->tdata); ensure(tdata); @@ -1564,8 +1574,6 @@ namespace np tus_trans->result = not_an_error(fb_status->size()); tus_trans->wake_cond.notify_one(); - - return true; } void np_handler::tus_set_multislot_variable(shared_ptr& trans_ctx, const SceNpOnlineId& targetNpId, vm::cptr slotIdArray, vm::cptr variableArray, s32 arrayNum, bool vuser, bool async) @@ -1577,9 +1585,9 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_tus_set_multislot_variable(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_set_multislot_variable(u32 req_id, rpcn::ErrorType error) { - return handle_tus_no_data(req_id, reply_data); + return handle_tus_no_data(req_id, error); } void np_handler::tus_get_multislot_variable(shared_ptr& trans_ctx, const SceNpOnlineId& targetNpId, vm::cptr slotIdArray, vm::ptr variableArray, s32 arrayNum, bool vuser, bool async) @@ -1596,9 +1604,9 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_tus_get_multislot_variable(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_get_multislot_variable(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { - return handle_TusVarResponse(req_id, reply_data); + return handle_TusVarResponse(req_id, error, reply); } void np_handler::tus_get_multiuser_variable(shared_ptr& trans_ctx, std::vector targetNpIdArray, SceNpTusSlotId slotId, vm::ptr variableArray, s32 arrayNum, bool vuser, bool async) @@ -1615,9 +1623,9 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_tus_get_multiuser_variable(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_get_multiuser_variable(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { - return handle_TusVarResponse(req_id, reply_data); + return handle_TusVarResponse(req_id, error, reply); } void np_handler::tus_get_friends_variable(shared_ptr& trans_ctx, SceNpTusSlotId slotId, s32 includeSelf, s32 sortType, vm::ptr variableArray,s32 arrayNum, bool async) @@ -1634,9 +1642,9 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_tus_get_friends_variable(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_get_friends_variable(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { - return handle_TusVarResponse(req_id, reply_data); + return handle_TusVarResponse(req_id, error, reply); } void np_handler::tus_add_and_get_variable(shared_ptr& trans_ctx, const SceNpOnlineId& targetNpId, SceNpTusSlotId slotId, s64 inVariable, vm::ptr outVariable, vm::ptr option, bool vuser, bool async) @@ -1652,9 +1660,9 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_tus_add_and_get_variable(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_add_and_get_variable(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { - return handle_TusVariable(req_id, reply_data); + return handle_TusVariable(req_id, error, reply); } void np_handler::tus_try_and_set_variable(shared_ptr& trans_ctx, const SceNpOnlineId& targetNpId, SceNpTusSlotId slotId, s32 opeType, s64 variable, vm::ptr resultVariable, vm::ptr option, bool vuser, bool async) @@ -1670,9 +1678,9 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_tus_try_and_set_variable(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_try_and_set_variable(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { - return handle_TusVariable(req_id, reply_data); + return handle_TusVariable(req_id, error, reply); } void np_handler::tus_delete_multislot_variable(shared_ptr& trans_ctx, const SceNpOnlineId& targetNpId, vm::cptr slotIdArray, s32 arrayNum, bool vuser, bool async) @@ -1684,9 +1692,9 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_tus_delete_multislot_variable(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_delete_multislot_variable(u32 req_id, rpcn::ErrorType error) { - return handle_tus_no_data(req_id, reply_data); + return handle_tus_no_data(req_id, error); } void np_handler::tus_set_data(shared_ptr& trans_ctx, const SceNpOnlineId& targetNpId, SceNpTusSlotId slotId, u32 totalSize, u32 sendSize, vm::cptr data, vm::cptr info, vm::ptr option, bool vuser, bool async) @@ -1718,9 +1726,9 @@ namespace np } } - bool np_handler::reply_tus_set_data(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_set_data(u32 req_id, rpcn::ErrorType error) { - return handle_tus_no_data(req_id, reply_data); + return handle_tus_no_data(req_id, error); } void np_handler::tus_get_data(shared_ptr& trans_ctx, const SceNpOnlineId& targetNpId, SceNpTusSlotId slotId, vm::ptr dataStatus, vm::ptr data, u32 recvSize, bool vuser, bool async) @@ -1753,45 +1761,38 @@ namespace np trans_ctx->result = not_an_error(to_copy); } - bool np_handler::reply_tus_get_data(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_get_data(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { std::lock_guard lock_trans(mutex_async_transactions); if (!async_transactions.count(req_id)) { rpcn_log.error("Couldn't find transaction(%d) in trans_id!", req_id); - return false; + return; } auto tus_trans = idm::get_unlocked(::at32(async_transactions, req_id)->idm_id); ensure(tus_trans); std::lock_guard lock(tus_trans->mutex); - if (rpcn::is_error(static_cast(reply_data[0]))) + switch (error) { - switch (reply_data[0]) - { - case rpcn::ErrorType::NotFound: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); - case rpcn::ErrorType::Unauthorized: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); - case rpcn::ErrorType::CondFail: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); - default: return false; - } + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::NotFound: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_USER_NOT_ASSIGNED); + case rpcn::ErrorType::Unauthorized: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_FORBIDDEN); + case rpcn::ErrorType::CondFail: return tus_trans->set_result_and_wake(SCE_NP_COMMUNITY_SERVER_ERROR_CONDITIONS_NOT_SATISFIED); + default: fmt::throw_exception("Unexpected error in reply to TusGetData: %d", static_cast(error)); } - vec_stream reply(reply_data, 1); const auto* fb_data = reply.get_flatbuffer(); - - if (reply.is_error()) - { - rpcn_log.error("Error parsing response in reply_tus_get_data"); - return false; - } + ensure(!reply.is_error(), "Error parsing response in reply_tus_get_data"); auto* tdata = std::get_if(&tus_trans->tdata); ensure(tdata); const auto* fb_status = fb_data->status(); ensure(fb_status && fb_status->ownerId()); - if (!fb_status) return false; // Sanity check to make compiler happy + if (!fb_status) + return; // Sanity check to make compiler happy auto* data_status = tdata->dataStatus.get_ptr(); auto* data = static_cast(tdata->data.get_ptr()); @@ -1832,7 +1833,6 @@ namespace np } tus_trans->wake_cond.notify_one(); - return true; } void np_handler::tus_get_multislot_data_status(shared_ptr& trans_ctx, const SceNpOnlineId& targetNpId, vm::cptr slotIdArray, vm::ptr statusArray, s32 arrayNum, bool vuser, bool async) @@ -1849,9 +1849,9 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_tus_get_multislot_data_status(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_get_multislot_data_status(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { - return handle_TusDataStatusResponse(req_id, reply_data); + return handle_TusDataStatusResponse(req_id, error, reply); } void np_handler::tus_get_multiuser_data_status(shared_ptr& trans_ctx, std::vector targetNpIdArray, SceNpTusSlotId slotId, vm::ptr statusArray, s32 arrayNum, bool vuser, bool async) @@ -1868,9 +1868,9 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_tus_get_multiuser_data_status(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_get_multiuser_data_status(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { - return handle_TusDataStatusResponse(req_id, reply_data); + return handle_TusDataStatusResponse(req_id, error, reply); } void np_handler::tus_get_friends_data_status(shared_ptr& trans_ctx, SceNpTusSlotId slotId, s32 includeSelf, s32 sortType, vm::ptr statusArray, s32 arrayNum, bool async) @@ -1887,9 +1887,9 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_tus_get_friends_data_status(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_get_friends_data_status(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { - return handle_TusDataStatusResponse(req_id, reply_data); + return handle_TusDataStatusResponse(req_id, error, reply); } void np_handler::tus_delete_multislot_data(shared_ptr& trans_ctx, const SceNpOnlineId& targetNpId, vm::cptr slotIdArray, s32 arrayNum, bool vuser, bool async) @@ -1901,8 +1901,8 @@ namespace np transaction_async_handler(std::move(lock), trans_ctx, req_id, async); } - bool np_handler::reply_tus_delete_multislot_data(u32 req_id, std::vector& reply_data) + void np_handler::reply_tus_delete_multislot_data(u32 req_id, rpcn::ErrorType error) { - return handle_tus_no_data(req_id, reply_data); + return handle_tus_no_data(req_id, error); } } // namespace np diff --git a/rpcs3/Emu/NP/np_requests_gui.cpp b/rpcs3/Emu/NP/np_requests_gui.cpp index f46307b384..7782287053 100644 --- a/rpcs3/Emu/NP/np_requests_gui.cpp +++ b/rpcs3/Emu/NP/np_requests_gui.cpp @@ -1,12 +1,10 @@ +#include "Emu/NP/rpcn_types.h" #include "stdafx.h" -#include "Emu/Cell/PPUModule.h" -#include "Emu/Cell/lv2/sys_sync.h" -#include "Emu/Cell/Modules/cellSysutil.h" +#include "Emu/Cell/PPUCallback.h" #include "Emu/Memory/vm_ptr.h" #include "Emu/IdManager.h" #include "np_handler.h" #include "np_contexts.h" -#include "np_helpers.h" #include "np_structs_extra.h" #include "fb_helpers.h" @@ -159,20 +157,16 @@ namespace np return CELL_OK; } - bool np_handler::reply_create_room_gui(u32 req_id, std::vector& reply_data) + void np_handler::reply_create_room_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto ctx = take_pending_gui_request(req_id); if (!ctx) - return true; + return; - ensure(!rpcn::is_error(static_cast(reply_data[0])), "Unexpected error in CreateRoomGUI reply"); - - vec_stream reply(reply_data, 1); + ensure(error == rpcn::ErrorType::NoError, "Unexpected error in CreateRoomGUI reply"); const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to CreateRoomGUI command"); + ensure(!reply.is_error(), "Malformed reply to CreateRoomGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingJoinedRoomInfo_SIZE), sizeof(SceNpMatchingJoinedRoomInfo), MAX_SceNpMatchingJoinedRoomInfo_SIZE); auto* room_info = reinterpret_cast(edata.data()); @@ -185,8 +179,6 @@ namespace np set_gui_result(SCE_NP_MATCHING_GUI_EVENT_CREATE_ROOM, std::move(edata)); ctx->queue_gui_callback(SCE_NP_MATCHING_GUI_EVENT_CREATE_ROOM, 0); gui_epilog(ctx); - - return true; } error_code np_handler::join_room_gui(u32 ctx_id, vm::ptr roomid, vm::ptr handler, vm::ptr arg) @@ -204,44 +196,42 @@ namespace np return CELL_OK; } - bool np_handler::reply_join_room_gui(u32 req_id, std::vector& reply_data) + void np_handler::reply_join_room_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto ctx = take_pending_gui_request(req_id); if (!ctx) - return true; + return; - if (rpcn::is_error(static_cast(reply_data[0]))) + s32 error_code = CELL_OK; + + switch (error) { - s32 error = -1; - - switch (static_cast(reply_data[0])) - { - case rpcn::ErrorType::RoomMissing: - error = SCE_NP_MATCHING_SERVER_ERROR_NO_SUCH_ROOM; - break; - case rpcn::ErrorType::RoomFull: - // Might also be SCE_NP_MATCHING_SERVER_ERROR_ACCESS_FORBIDDEN or SCE_NP_MATCHING_SERVER_ERROR_NOT_ALLOWED ? - error = SCE_NP_MATCHING_SERVER_ERROR_ROOM_CLOSED; - break; - case rpcn::ErrorType::RoomAlreadyJoined: - error = SCE_NP_MATCHING_SERVER_ERROR_ACCESS_FORBIDDEN; - break; - default: - fmt::throw_exception("Unexpected error in JoinRoomGUI reply: %d", reply_data[0]); - break; - } - - ctx->queue_gui_callback(SCE_NP_MATCHING_GUI_EVENT_JOIN_ROOM, error); - gui_epilog(ctx); - return true; + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: + error_code = SCE_NP_MATCHING_SERVER_ERROR_NO_SUCH_ROOM; + break; + case rpcn::ErrorType::RoomFull: + // Might also be SCE_NP_MATCHING_SERVER_ERROR_ACCESS_FORBIDDEN or SCE_NP_MATCHING_SERVER_ERROR_NOT_ALLOWED ? + error_code = SCE_NP_MATCHING_SERVER_ERROR_ROOM_CLOSED; + break; + case rpcn::ErrorType::RoomAlreadyJoined: + error_code = SCE_NP_MATCHING_SERVER_ERROR_ACCESS_FORBIDDEN; + break; + default: + fmt::throw_exception("Unexpected error in JoinRoomGUI reply: %d", static_cast(error)); + break; } - vec_stream reply(reply_data, 1); - const auto* resp = reply.get_flatbuffer(); + if (error_code != 0) + { + ctx->queue_gui_callback(SCE_NP_MATCHING_GUI_EVENT_JOIN_ROOM, error_code); + gui_epilog(ctx); + return; + } - if (reply.is_error()) - return error_and_disconnect("Malformed reply to JoinRoomGUI command"); + const auto* resp = reply.get_flatbuffer(); + ensure(!reply.is_error(), "Malformed reply to JoinRoomGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingJoinedRoomInfo_SIZE), sizeof(SceNpMatchingJoinedRoomInfo), MAX_SceNpMatchingJoinedRoomInfo_SIZE); auto* room_info = reinterpret_cast(edata.data()); @@ -260,8 +250,6 @@ namespace np set_gui_result(SCE_NP_MATCHING_GUI_EVENT_JOIN_ROOM, std::move(edata)); ctx->queue_gui_callback(SCE_NP_MATCHING_GUI_EVENT_JOIN_ROOM, 0); gui_epilog(ctx); - - return true; } error_code np_handler::leave_room_gui(u32 ctx_id, vm::cptr roomid) @@ -281,36 +269,30 @@ namespace np return not_an_error(req_id); } - bool np_handler::reply_leave_room_gui(u32 req_id, std::vector& reply_data) + void np_handler::reply_leave_room_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto ctx = take_pending_gui_request(req_id); if (!ctx) - return true; + return; - if (rpcn::is_error(static_cast(reply_data[0]))) + s32 error_code = CELL_OK; + + switch (error) { - s32 error = -1; - - switch (static_cast(reply_data[0])) - { - case rpcn::ErrorType::NotFound: - error = SCE_NP_MATCHING_SERVER_ERROR_NO_SUCH_ROOM; - break; - default: - fmt::throw_exception("Unexpected error in LeaveRoomGUI reply: %d", reply_data[0]); - break; - } - - ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_LEAVE_ROOM_DONE, error); - return true; + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING_SERVER_ERROR_NO_SUCH_ROOM; break; + default: fmt::throw_exception("Unexpected error in LeaveRoomGUI reply: %d", static_cast(error)); } - vec_stream reply(reply_data, 1); - const auto* resp = reply.get_flatbuffer(); + if (error_code != CELL_OK) + { + ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_LEAVE_ROOM_DONE, error_code); + return; + } - if (reply.is_error()) - return error_and_disconnect("Malformed reply to LeaveRoomGUI command"); + const auto* resp = reply.get_flatbuffer(); + ensure(!reply.is_error(), "Malformed reply to LeaveRoomGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingRoomStatus_SIZE), sizeof(SceNpMatchingRoomStatus), MAX_SceNpMatchingRoomStatus_SIZE); auto* room_status = reinterpret_cast(edata.data()); @@ -323,7 +305,6 @@ namespace np gui_notifications.list.emplace(std::make_pair(gui_notifications.current_gui_ctx_id, req_id), gui_notification{.event = SCE_NP_MATCHING_EVENT_LEAVE_ROOM_DONE, .edata = std::move(edata)}); ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_LEAVE_ROOM_DONE, 0); - return true; } error_code np_handler::get_room_list_gui(u32 ctx_id, vm::cptr communicationId, vm::ptr range, vm::ptr cond, vm::ptr attr, vm::ptr handler, vm::ptr arg, bool limit) @@ -354,20 +335,16 @@ namespace np return CELL_OK; } - bool np_handler::reply_get_room_list_gui(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_room_list_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto ctx = take_pending_gui_request(req_id); if (!ctx) - return true; + return; - ensure(!rpcn::is_error(static_cast(reply_data[0])), "Unexpected error in GetRoomListGUI reply"); - - vec_stream reply(reply_data, 1); + ensure(error == rpcn::ErrorType::NoError, "Unexpected error in GetRoomListGUI reply"); const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to GetRoomListGUI command"); + ensure(!reply.is_error(), "Malformed reply to GetRoomListGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingRoomList_SIZE), sizeof(SceNpMatchingRoomList), MAX_SceNpMatchingRoomList_SIZE); auto* room_list = reinterpret_cast(edata.data()); @@ -388,7 +365,6 @@ namespace np } gui_epilog(ctx); - return true; } error_code np_handler::set_room_search_flag_gui(u32 ctx_id, vm::ptr /* lobby_id */, vm::ptr room_id, s32 flag) @@ -408,33 +384,24 @@ namespace np return not_an_error(req_id); } - bool np_handler::reply_set_room_search_flag_gui(u32 req_id, std::vector& reply_data) + void np_handler::reply_set_room_search_flag_gui(u32 req_id, rpcn::ErrorType error) { auto ctx = take_pending_gui_request(req_id); if (!ctx) - return true; + return; - s32 error = 0; + s32 error_code = CELL_OK; - if (rpcn::is_error(static_cast(reply_data[0]))) + switch (error) { - switch (static_cast(reply_data[0])) - { - case rpcn::ErrorType::NotFound: - error = SCE_NP_MATCHING_SERVER_ERROR_NO_SUCH_ROOM; - break; - case rpcn::ErrorType::Unauthorized: - error = SCE_NP_MATCHING_SERVER_ERROR_NOT_ALLOWED; - break; - default: - fmt::throw_exception("Unexpected error in SetRoomSearchFlagGUI reply: %d", reply_data[0]); - break; - } + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING_SERVER_ERROR_NO_SUCH_ROOM; break; + case rpcn::ErrorType::Unauthorized: error_code = SCE_NP_MATCHING_SERVER_ERROR_NOT_ALLOWED; break; + default: fmt::throw_exception("Unexpected error in SetRoomSearchFlagGUI reply: %d", static_cast(error)); } - ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_SET_ROOM_SEARCH_FLAG_DONE, error); - return true; + ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_SET_ROOM_SEARCH_FLAG_DONE, error_code); } error_code np_handler::get_room_search_flag_gui(u32 ctx_id, vm::ptr /* lobby_id */, vm::ptr room_id) @@ -454,36 +421,30 @@ namespace np return not_an_error(req_id); } - bool np_handler::reply_get_room_search_flag_gui(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_room_search_flag_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto ctx = take_pending_gui_request(req_id); if (!ctx) - return true; + return; - if (rpcn::is_error(static_cast(reply_data[0]))) + s32 error_code = CELL_OK; + + switch (error) { - s32 error = -1; - - switch (static_cast(reply_data[0])) - { - case rpcn::ErrorType::NotFound: - error = SCE_NP_MATCHING_SERVER_ERROR_NO_SUCH_ROOM; - break; - default: - fmt::throw_exception("Unexpected error in GetRoomSearchFlagGUI reply: %d", reply_data[0]); - break; - } - - ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_GET_ROOM_SEARCH_FLAG_DONE, error); - return true; + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING_SERVER_ERROR_NO_SUCH_ROOM; break; + default: fmt::throw_exception("Unexpected error in GetRoomSearchFlagGUI reply: %d", static_cast(error)); } - vec_stream reply(reply_data, 1); - const auto* resp = reply.get_flatbuffer(); + if (error_code != CELL_OK) + { + ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_GET_ROOM_SEARCH_FLAG_DONE, error_code); + return; + } - if (reply.is_error()) - return error_and_disconnect("Malformed reply to GetRoomSearchFlagGUI command"); + const auto* resp = reply.get_flatbuffer(); + ensure(!reply.is_error(), "Malformed reply to GetRoomSearchFlagGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingRoom_SIZE), sizeof(SceNpMatchingRoom), MAX_SceNpMatchingRoom_SIZE); auto* room_info = reinterpret_cast(edata.data()); @@ -494,7 +455,6 @@ namespace np gui_notifications.list.emplace(std::make_pair(gui_notifications.current_gui_ctx_id, req_id), gui_notification{.event = SCE_NP_MATCHING_EVENT_GET_ROOM_SEARCH_FLAG_DONE, .edata = std::move(edata)}); ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_GET_ROOM_SEARCH_FLAG_DONE, 0); - return true; } error_code np_handler::set_room_info_gui(u32 ctx_id, vm::ptr /* lobby_id */, vm::ptr room_id, vm::ptr attr) @@ -519,33 +479,24 @@ namespace np return not_an_error(req_id); } - bool np_handler::reply_set_room_info_gui(u32 req_id, std::vector& reply_data) + void np_handler::reply_set_room_info_gui(u32 req_id, rpcn::ErrorType error) { auto ctx = take_pending_gui_request(req_id); if (!ctx) - return true; + return; - s32 error = 0; + s32 error_code = CELL_OK; - if (rpcn::is_error(static_cast(reply_data[0]))) + switch (error) { - switch (static_cast(reply_data[0])) - { - case rpcn::ErrorType::NotFound: - error = SCE_NP_MATCHING_SERVER_ERROR_NO_SUCH_ROOM; - break; - case rpcn::ErrorType::Unauthorized: - error = SCE_NP_MATCHING_SERVER_ERROR_NOT_ALLOWED; - break; - default: - fmt::throw_exception("Unexpected error in SetRoomInfoGUI reply: %d", reply_data[0]); - break; - } + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING_SERVER_ERROR_NO_SUCH_ROOM; break; + case rpcn::ErrorType::Unauthorized: error_code = SCE_NP_MATCHING_SERVER_ERROR_NOT_ALLOWED; break; + default: fmt::throw_exception("Unexpected error in SetRoomInfoGUI reply: %d", static_cast(error)); } - ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_SET_ROOM_INFO_DONE, error); - return true; + ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_SET_ROOM_INFO_DONE, error_code); } error_code np_handler::get_room_info_gui(u32 ctx_id, vm::ptr /* lobby_id */, vm::ptr room_id, vm::ptr attr) @@ -565,36 +516,30 @@ namespace np return not_an_error(req_id); } - bool np_handler::reply_get_room_info_gui(u32 req_id, std::vector& reply_data) + void np_handler::reply_get_room_info_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto ctx = take_pending_gui_request(req_id); if (!ctx) - return true; + return; - if (rpcn::is_error(static_cast(reply_data[0]))) + s32 error_code = CELL_OK; + + switch (error) { - s32 error = -1; - - switch (static_cast(reply_data[0])) - { - case rpcn::ErrorType::NotFound: - error = SCE_NP_MATCHING_SERVER_ERROR_NO_SUCH_ROOM; - break; - default: - fmt::throw_exception("Unexpected error in GetRoomInfoGUI reply: %d", reply_data[0]); - break; - } - - ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_GET_ROOM_INFO_DONE, error); - return true; + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::RoomMissing: error_code = SCE_NP_MATCHING_SERVER_ERROR_NO_SUCH_ROOM; break; + default: fmt::throw_exception("Unexpected error in GetRoomInfoGUI reply: %d", static_cast(error)); } - vec_stream reply(reply_data, 1); - const auto* resp = reply.get_flatbuffer(); + if (error_code != CELL_OK) + { + ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_GET_ROOM_INFO_DONE, error_code); + return; + } - if (reply.is_error()) - return error_and_disconnect("Malformed reply to GetRoomInfoGUI command"); + const auto* resp = reply.get_flatbuffer(); + ensure(!reply.is_error(), "Malformed reply to GetRoomInfoGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingRoom_SIZE), sizeof(SceNpMatchingRoom), MAX_SceNpMatchingRoom_SIZE); auto* room_info = reinterpret_cast(edata.data()); @@ -605,7 +550,6 @@ namespace np gui_notifications.list.emplace(std::make_pair(gui_notifications.current_gui_ctx_id, req_id), gui_notification{.event = SCE_NP_MATCHING_EVENT_GET_ROOM_INFO_DONE, .edata = std::move(edata)}); ctx->queue_callback(req_id, SCE_NP_MATCHING_EVENT_GET_ROOM_INFO_DONE, 0); - return true; } error_code np_handler::quickmatch_gui(u32 ctx_id, vm::cptr communicationId, vm::cptr cond, s32 available_num, s32 timeout, vm::ptr handler, vm::ptr arg) @@ -624,20 +568,16 @@ namespace np return CELL_OK; } - bool np_handler::reply_quickmatch_gui(u32 req_id, std::vector& reply_data) + void np_handler::reply_quickmatch_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto ctx = take_pending_gui_request(req_id); if (!ctx) - return true; + return; - ensure(!rpcn::is_error(static_cast(reply_data[0])), "Unexpected error in QuickMatchGUI reply"); - - vec_stream reply(reply_data, 1); + ensure(error == rpcn::ErrorType::NoError, "Unexpected error in QuickMatchGUI reply"); const auto* resp = reply.get_flatbuffer(); - - if (reply.is_error()) - return error_and_disconnect("Malformed reply to QuickMatchGUI command"); + ensure(!reply.is_error(), "Malformed reply to QuickMatchGUI command"); SceNpRoomId room_id{}; ensure(resp->id() && resp->id()->size() == sizeof(SceNpRoomId::opt)); @@ -678,7 +618,6 @@ namespace np ctx->wakey = 0; auto& thread = *ctx->thread; thread(room_id); - return true; } error_code np_handler::searchjoin_gui(u32 ctx_id, vm::cptr communicationId, vm::cptr cond, vm::cptr attr, vm::ptr handler, vm::ptr arg) @@ -695,37 +634,31 @@ namespace np return CELL_OK; } - bool np_handler::reply_searchjoin_gui(u32 req_id, std::vector& reply_data) + void np_handler::reply_searchjoin_gui(u32 req_id, rpcn::ErrorType error, vec_stream& reply) { auto ctx = take_pending_gui_request(req_id); if (!ctx) - return true; + return; - if (rpcn::is_error(static_cast(reply_data[0]))) + s32 error_code = CELL_OK; + + switch (error) { - s32 error = -1; - - switch (static_cast(reply_data[0])) - { - case rpcn::ErrorType::NotFound: - error = SCE_NP_MATCHING_ERROR_SEARCH_JOIN_ROOM_NOT_FOUND; - break; - default: - fmt::throw_exception("Unexpected error in SearchJoinRoomGUI reply: %d", reply_data[0]); - break; - } - - ctx->queue_gui_callback(SCE_NP_MATCHING_GUI_EVENT_SEARCH_JOIN, error); - gui_epilog(ctx); - return true; + case rpcn::ErrorType::NoError: break; + case rpcn::ErrorType::NotFound: error_code = SCE_NP_MATCHING_ERROR_SEARCH_JOIN_ROOM_NOT_FOUND; break; + default: fmt::throw_exception("Unexpected error in SearchJoinRoomGUI reply: %d", static_cast(error)); } - vec_stream reply(reply_data, 1); - const auto* resp = reply.get_flatbuffer(); + if (error_code != CELL_OK) + { + ctx->queue_gui_callback(SCE_NP_MATCHING_GUI_EVENT_SEARCH_JOIN, error_code); + gui_epilog(ctx); + return; + } - if (reply.is_error()) - return error_and_disconnect("Malformed reply to SearchJoinRoomGUI command"); + const auto* resp = reply.get_flatbuffer(); + ensure(!reply.is_error(), "Malformed reply to SearchJoinRoomGUI command"); event_data edata(np_memory.allocate(MAX_SceNpMatchingSearchJoinRoomInfo_SIZE), sizeof(SceNpMatchingSearchJoinRoomInfo), MAX_SceNpMatchingSearchJoinRoomInfo_SIZE); auto* room_info = reinterpret_cast(edata.data()); @@ -744,8 +677,6 @@ namespace np set_gui_result(SCE_NP_MATCHING_GUI_EVENT_SEARCH_JOIN, std::move(edata)); ctx->queue_gui_callback(SCE_NP_MATCHING_GUI_EVENT_SEARCH_JOIN, 0); gui_epilog(ctx); - - return true; } // Local cache requests diff --git a/rpcs3/Emu/NP/np_structs_extra.cpp b/rpcs3/Emu/NP/np_structs_extra.cpp index 66e7a342f7..2acba3d045 100644 --- a/rpcs3/Emu/NP/np_structs_extra.cpp +++ b/rpcs3/Emu/NP/np_structs_extra.cpp @@ -1,5 +1,5 @@ +#include "Utilities/StrUtil.h" #include "stdafx.h" -#include "Emu/System.h" #include #include "np_structs_extra.h" @@ -118,9 +118,13 @@ namespace extra_nps print_SceNpMatching2BinAttr(&req->roomBinAttrExternal[i]); sceNp2.warning("roomPassword: *0x%x", req->roomPassword); + + if (req->roomPassword) + sceNp2.warning("data: %s", fmt::buf_to_hexstring(req->roomPassword->data, sizeof(req->roomPassword->data))); + sceNp2.warning("groupConfig: *0x%x", req->groupConfig); sceNp2.warning("groupConfigNum: %d", req->groupConfigNum); - sceNp2.warning("passwordSlotMask: *0x%x", req->passwordSlotMask); + sceNp2.warning("passwordSlotMask: *0x%x, value: 0x%x", req->passwordSlotMask, req->passwordSlotMask ? static_cast(*req->passwordSlotMask) : 0ull); sceNp2.warning("allowedUser: *0x%x", req->allowedUser); sceNp2.warning("allowedUserNum: %d", req->allowedUserNum); sceNp2.warning("blockedUser: *0x%x", req->blockedUser); diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index dc46881b22..0f0c9d871c 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -1,14 +1,14 @@ +#include "Emu/Cell/lv2/sys_net/sys_net_helpers.h" +#include "Emu/NP/ip_address.h" #include "stdafx.h" #include #include #include #include -#include #include "rpcn_client.h" -#include "np_structs_extra.h" #include "Utilities/StrUtil.h" +#include "Utilities/StrFmt.h" #include "Utilities/Thread.h" -#include "Emu/IdManager.h" #include "Emu/System.h" #include "Emu/NP/rpcn_config.h" #include "Emu/NP/np_helpers.h" @@ -16,8 +16,6 @@ #include "Emu/system_config.h" #include "Emu/RSX/Overlays/overlay_message.h" -#include "util/asm.hpp" - #include "generated/np2_structs_generated.h" #ifdef _WIN32 @@ -28,7 +26,6 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wold-style-cast" #endif -#include #include #include #include @@ -48,6 +45,160 @@ LOG_CHANNEL(rpcn_log, "rpcn"); int get_native_error(); +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](auto value) + { + switch (value) + { + case rpcn::ErrorType::NoError: return "NoError"; + case rpcn::ErrorType::Malformed: return "Malformed"; + case rpcn::ErrorType::Invalid: return "Invalid"; + case rpcn::ErrorType::InvalidInput: return "InvalidInput"; + case rpcn::ErrorType::TooSoon: return "TooSoon"; + case rpcn::ErrorType::LoginError: return "LoginError"; + case rpcn::ErrorType::LoginAlreadyLoggedIn: return "LoginAlreadyLoggedIn"; + case rpcn::ErrorType::LoginInvalidUsername: return "LoginInvalidUsername"; + case rpcn::ErrorType::LoginInvalidPassword: return "LoginInvalidPassword"; + case rpcn::ErrorType::LoginInvalidToken: return "LoginInvalidToken"; + case rpcn::ErrorType::CreationError: return "CreationError"; + case rpcn::ErrorType::CreationExistingUsername: return "CreationExistingUsername"; + case rpcn::ErrorType::CreationBannedEmailProvider: return "CreationBannedEmailProvider"; + case rpcn::ErrorType::CreationExistingEmail: return "CreationExistingEmail"; + case rpcn::ErrorType::RoomMissing: return "RoomMissing"; + case rpcn::ErrorType::RoomAlreadyJoined: return "RoomAlreadyJoined"; + case rpcn::ErrorType::RoomFull: return "RoomFull"; + case rpcn::ErrorType::RoomPasswordMismatch: return "RoomPasswordMismatch"; + case rpcn::ErrorType::RoomPasswordMissing: return "RoomPasswordMissing"; + case rpcn::ErrorType::RoomGroupNoJoinLabel: return "RoomGroupNoJoinLabel"; + case rpcn::ErrorType::RoomGroupFull: return "RoomGroupFull"; + case rpcn::ErrorType::RoomGroupJoinLabelNotFound: return "RoomGroupJoinLabelNotFound"; + case rpcn::ErrorType::RoomGroupMaxSlotMismatch: return "RoomGroupMaxSlotMismatch"; + case rpcn::ErrorType::Unauthorized: return "Unauthorized"; + case rpcn::ErrorType::DbFail: return "DbFail"; + case rpcn::ErrorType::EmailFail: return "EmailFail"; + case rpcn::ErrorType::NotFound: return "NotFound"; + case rpcn::ErrorType::Blocked: return "Blocked"; + case rpcn::ErrorType::AlreadyFriend: return "AlreadyFriend"; + case rpcn::ErrorType::ScoreNotBest: return "ScoreNotBest"; + case rpcn::ErrorType::ScoreInvalid: return "ScoreInvalid"; + case rpcn::ErrorType::ScoreHasData: return "ScoreHasData"; + case rpcn::ErrorType::CondFail: return "CondFail"; + case rpcn::ErrorType::Unsupported: return "Unsupported"; + default: break; + } + + return unknown; + }); +} + +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](auto value) + { + switch (value) + { + case rpcn::CommandType::Login: return "Login"; + case rpcn::CommandType::Terminate: return "Terminate"; + case rpcn::CommandType::Create: return "Create"; + case rpcn::CommandType::SendToken: return "SendToken"; + case rpcn::CommandType::SendResetToken: return "SendResetToken"; + case rpcn::CommandType::ResetPassword: return "ResetPassword"; + case rpcn::CommandType::ResetState: return "ResetState"; + case rpcn::CommandType::AddFriend: return "AddFriend"; + case rpcn::CommandType::RemoveFriend: return "RemoveFriend"; + case rpcn::CommandType::AddBlock: return "AddBlock"; + case rpcn::CommandType::RemoveBlock: return "RemoveBlock"; + case rpcn::CommandType::GetServerList: return "GetServerList"; + case rpcn::CommandType::GetWorldList: return "GetWorldList"; + case rpcn::CommandType::CreateRoom: return "CreateRoom"; + case rpcn::CommandType::JoinRoom: return "JoinRoom"; + case rpcn::CommandType::LeaveRoom: return "LeaveRoom"; + case rpcn::CommandType::SearchRoom: return "SearchRoom"; + case rpcn::CommandType::GetRoomDataExternalList: return "GetRoomDataExternalList"; + case rpcn::CommandType::SetRoomDataExternal: return "SetRoomDataExternal"; + case rpcn::CommandType::GetRoomDataInternal: return "GetRoomDataInternal"; + case rpcn::CommandType::SetRoomDataInternal: return "SetRoomDataInternal"; + case rpcn::CommandType::GetRoomMemberDataInternal: return "GetRoomMemberDataInternal"; + case rpcn::CommandType::SetRoomMemberDataInternal: return "SetRoomMemberDataInternal"; + case rpcn::CommandType::SetUserInfo: return "SetUserInfo"; + case rpcn::CommandType::PingRoomOwner: return "PingRoomOwner"; + case rpcn::CommandType::SendRoomMessage: return "SendRoomMessage"; + case rpcn::CommandType::RequestSignalingInfos: return "RequestSignalingInfos"; + case rpcn::CommandType::RequestTicket: return "RequestTicket"; + case rpcn::CommandType::SendMessage: return "SendMessage"; + case rpcn::CommandType::GetBoardInfos: return "GetBoardInfos"; + case rpcn::CommandType::RecordScore: return "RecordScore"; + case rpcn::CommandType::RecordScoreData: return "RecordScoreData"; + case rpcn::CommandType::GetScoreData: return "GetScoreData"; + case rpcn::CommandType::GetScoreRange: return "GetScoreRange"; + case rpcn::CommandType::GetScoreFriends: return "GetScoreFriends"; + case rpcn::CommandType::GetScoreNpid: return "GetScoreNpid"; + case rpcn::CommandType::GetNetworkTime: return "GetNetworkTime"; + case rpcn::CommandType::TusSetMultiSlotVariable: return "TusSetMultiSlotVariable"; + case rpcn::CommandType::TusGetMultiSlotVariable: return "TusGetMultiSlotVariable"; + case rpcn::CommandType::TusGetMultiUserVariable: return "TusGetMultiUserVariable"; + case rpcn::CommandType::TusGetFriendsVariable: return "TusGetFriendsVariable"; + case rpcn::CommandType::TusAddAndGetVariable: return "TusAddAndGetVariable"; + case rpcn::CommandType::TusTryAndSetVariable: return "TusTryAndSetVariable"; + case rpcn::CommandType::TusDeleteMultiSlotVariable: return "TusDeleteMultiSlotVariable"; + case rpcn::CommandType::TusSetData: return "TusSetData"; + case rpcn::CommandType::TusGetData: return "TusGetData"; + case rpcn::CommandType::TusGetMultiSlotDataStatus: return "TusGetMultiSlotDataStatus"; + case rpcn::CommandType::TusGetMultiUserDataStatus: return "TusGetMultiUserDataStatus"; + case rpcn::CommandType::TusGetFriendsDataStatus: return "TusGetFriendsDataStatus"; + case rpcn::CommandType::TusDeleteMultiSlotData: return "TusDeleteMultiSlotData"; + case rpcn::CommandType::SetPresence: return "SetPresence"; + case rpcn::CommandType::CreateRoomGUI: return "CreateRoomGUI"; + case rpcn::CommandType::JoinRoomGUI: return "JoinRoomGUI"; + case rpcn::CommandType::LeaveRoomGUI: return "LeaveRoomGUI"; + case rpcn::CommandType::GetRoomListGUI: return "GetRoomListGUI"; + case rpcn::CommandType::SetRoomSearchFlagGUI: return "SetRoomSearchFlagGUI"; + case rpcn::CommandType::GetRoomSearchFlagGUI: return "GetRoomSearchFlagGUI"; + case rpcn::CommandType::SetRoomInfoGUI: return "SetRoomInfoGUI"; + case rpcn::CommandType::GetRoomInfoGUI: return "GetRoomInfoGUI"; + case rpcn::CommandType::QuickMatchGUI: return "QuickMatchGUI"; + case rpcn::CommandType::SearchJoinRoomGUI: return "SearchJoinRoomGUI"; + } + + return unknown; + }); +} + +template <> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](auto value) + { + switch (value) + { + case rpcn::NotificationType::UserJoinedRoom: return "UserJoinedRoom"; + case rpcn::NotificationType::UserLeftRoom: return "UserLeftRoom"; + case rpcn::NotificationType::RoomDestroyed: return "RoomDestroyed"; + case rpcn::NotificationType::UpdatedRoomDataInternal: return "UpdatedRoomDataInternal"; + case rpcn::NotificationType::UpdatedRoomMemberDataInternal: return "UpdatedRoomMemberDataInternal"; + case rpcn::NotificationType::FriendQuery: return "FriendQuery"; + case rpcn::NotificationType::FriendNew: return "FriendNew"; + case rpcn::NotificationType::FriendLost: return "FriendLost"; + case rpcn::NotificationType::FriendStatus: return "FriendStatus"; + case rpcn::NotificationType::RoomMessageReceived: return "RoomMessageReceived"; + case rpcn::NotificationType::MessageReceived: return "MessageReceived"; + case rpcn::NotificationType::FriendPresenceChanged: return "FriendPresenceChanged"; + case rpcn::NotificationType::SignalingHelper: return "SignalingHelper"; + case rpcn::NotificationType::MemberJoinedRoomGUI: return "MemberJoinedRoomGUI"; + case rpcn::NotificationType::MemberLeftRoomGUI: return "MemberLeftRoomGUI"; + case rpcn::NotificationType::RoomDisappearedGUI: return "RoomDisappearedGUI"; + case rpcn::NotificationType::RoomOwnerChangedGUI: return "RoomOwnerChangedGUI"; + case rpcn::NotificationType::UserKickedGUI: return "UserKickedGUI"; + case rpcn::NotificationType::QuickMatchCompleteGUI: return "QuickMatchCompleteGUI"; + } + + return unknown; + }); +} + void vec_stream::dump() const { rpcn_log.error("vec_stream dump:\n%s", fmt::buf_to_hexstring(vec.data(), vec.size())); @@ -105,51 +256,64 @@ namespace rpcn rpcn_log.notice("online: %s, pr_com_id: %s, pr_title: %s, pr_status: %s, pr_comment: %s, pr_data: %s", online ? "true" : "false", pr_com_id.data, pr_title, pr_status, pr_comment, fmt::buf_to_hexstring(pr_data.data(), pr_data.size())); } - constexpr u32 RPCN_PROTOCOL_VERSION = 25; - constexpr usz RPCN_HEADER_SIZE = 15; + constexpr u32 RPCN_PROTOCOL_VERSION = 26; + constexpr usz RPCN_HEADER_SIZE = 15; - bool is_error(ErrorType err) + const char* error_to_explanation(rpcn::ErrorType error) { - if (err >= ErrorType::__error_last) + switch (error) { - rpcn_log.error("Invalid error returned!"); - return true; + case rpcn::ErrorType::NoError: return "No error"; + case rpcn::ErrorType::Malformed: return "Sent packet was malformed!"; + case rpcn::ErrorType::Invalid: return "Sent command was invalid!"; + case rpcn::ErrorType::InvalidInput: return "Sent data was invalid!"; + case rpcn::ErrorType::TooSoon: return "Request happened too soon!"; + case rpcn::ErrorType::LoginError: return "Unknown login error!"; + case rpcn::ErrorType::LoginAlreadyLoggedIn: return "User is already logged in!"; + case rpcn::ErrorType::LoginInvalidUsername: return "Login error: invalid username!"; + case rpcn::ErrorType::LoginInvalidPassword: return "Login error: invalid password!"; + case rpcn::ErrorType::LoginInvalidToken: return "Login error: invalid token!"; + case rpcn::ErrorType::CreationError: return "Error creating an account!"; + case rpcn::ErrorType::CreationExistingUsername: return "Error creating an account: existing username!"; + case rpcn::ErrorType::CreationBannedEmailProvider: return "Error creating an account: banned email provider!"; + case rpcn::ErrorType::CreationExistingEmail: return "Error creating an account: an account with that email already exist!"; + case rpcn::ErrorType::RoomMissing: return "User tried to join a non-existent room!"; + case rpcn::ErrorType::RoomAlreadyJoined: return "User has already joined!"; + case rpcn::ErrorType::RoomFull: return "User tried to join a full room!"; + case rpcn::ErrorType::RoomPasswordMismatch: return "Room password used was invalid"; + case rpcn::ErrorType::RoomPasswordMissing: return "Room password was missing during room creation"; + case rpcn::ErrorType::RoomGroupNoJoinLabel: return "Tried to join a group room without a label"; + case rpcn::ErrorType::RoomGroupFull: return "Room group is full"; + case rpcn::ErrorType::RoomGroupJoinLabelNotFound: return "Join label was invalid"; + case rpcn::ErrorType::RoomGroupMaxSlotMismatch: return "Mismatch between max_slot and the listed slots in groups"; + case rpcn::ErrorType::Unauthorized: return "User attempted an unauthorized operation!"; + case rpcn::ErrorType::DbFail: return "A db query failed on the server!"; + case rpcn::ErrorType::EmailFail: return "An email action failed on the server!"; + case rpcn::ErrorType::NotFound: return "A request replied not found!"; + case rpcn::ErrorType::Blocked: return "You're blocked!"; + case rpcn::ErrorType::AlreadyFriend: return "You're already friends!"; + case rpcn::ErrorType::ScoreNotBest: return "Attempted to register a score that is not better!"; + case rpcn::ErrorType::ScoreInvalid: return "Score for player was found but wasn't what was expected!"; + case rpcn::ErrorType::ScoreHasData: return "Score already has game data associated with it!"; + case rpcn::ErrorType::CondFail: return "Condition related to the query failed!"; + case rpcn::ErrorType::Unsupported: return "An unsupported operation was attempted!"; } - switch (err) - { - case NoError: return false; - case Malformed: rpcn_log.error("Sent packet was malformed!"); break; - case Invalid: rpcn_log.error("Sent command was invalid!"); break; - case InvalidInput: rpcn_log.error("Sent data was invalid!"); break; - case TooSoon: rpcn_log.error("Request happened too soon!"); break; - case LoginError: rpcn_log.error("Unknown login error!"); break; - case LoginAlreadyLoggedIn: rpcn_log.error("User is already logged in!"); break; - case LoginInvalidUsername: rpcn_log.error("Login error: invalid username!"); break; - case LoginInvalidPassword: rpcn_log.error("Login error: invalid password!"); break; - case LoginInvalidToken: rpcn_log.error("Login error: invalid token!"); break; - case CreationError: rpcn_log.error("Error creating an account!"); break; - case CreationExistingUsername: rpcn_log.error("Error creating an account: existing username!"); break; - case CreationBannedEmailProvider: rpcn_log.error("Error creating an account: banned email provider!"); break; - case CreationExistingEmail: rpcn_log.error("Error creating an account: an account with that email already exist!"); break; - case RoomMissing: rpcn_log.error("User tried to join a non-existent room!"); break; - case RoomAlreadyJoined: rpcn_log.error("User has already joined!"); break; - case RoomFull: rpcn_log.error("User tried to join a full room!"); break; - case Unauthorized: rpcn_log.error("User attempted an unauthorized operation!"); break; - case DbFail: rpcn_log.error("A db query failed on the server!"); break; - case EmailFail: rpcn_log.error("An email action failed on the server!"); break; - case NotFound: rpcn_log.error("A request replied not found!"); break; - case Blocked: rpcn_log.error("You're blocked!"); break; - case AlreadyFriend: rpcn_log.error("You're already friends!"); break; - case ScoreNotBest: rpcn_log.error("Attempted to register a score that is not better!"); break; - case ScoreInvalid: rpcn_log.error("Score for player was found but wasn't what was expected!"); break; - case ScoreHasData: rpcn_log.error("Score already has game data associated with it!"); break; - case CondFail: rpcn_log.error("Condition related to the query failed!"); break; - case Unsupported: rpcn_log.error("An unsupported operation was attempted!"); break; - default: rpcn_log.fatal("Unhandled ErrorType reached the switch?"); break; - } + fmt::throw_exception("Unknown error returned: %d", static_cast(error)); + } - return true; + void print_error(rpcn::CommandType command, rpcn::ErrorType error) + { + const std::string error_message = fmt::format("command: %s result: %s, explanation: %s", command, error, error_to_explanation(error)); + + if (error == rpcn::ErrorType::NoError) + { + rpcn_log.trace("%s", error_message); + } + else + { + rpcn_log.warning("%s", error_message); + } } // Constructor, destructor & singleton manager @@ -273,6 +437,10 @@ namespace rpcn { thread_base::set_name("RPCN Client"); + // UDP Signaling related + steady_clock::time_point last_ping_time_ipv4{}, last_pong_time_ipv4{}; + steady_clock::time_point last_ping_time_ipv6{}, last_pong_time_ipv6{}; + while (true) { sem_rpcn.acquire(); @@ -327,16 +495,15 @@ namespace rpcn if (authentified && !Emu.IsStopped()) { // Ping the UDP Signaling Server if we're authentified & ingame - auto now = steady_clock::now(); - - auto rpcn_msgs = get_rpcn_msgs(); + const auto now = steady_clock::now(); + const auto rpcn_msgs = get_rpcn_msgs(); for (const auto& msg : rpcn_msgs) { if (msg.size() == 6) { const u32 new_addr_sig = read_from_ptr>(&msg[0]); - const u32 new_port_sig = read_from_ptr>(&msg[4]); + const u16 new_port_sig = read_from_ptr>(&msg[4]); const u32 old_addr_sig = addr_sig; const u32 old_port_sig = port_sig; @@ -358,7 +525,16 @@ namespace rpcn } } - last_pong_time = now; + last_pong_time_ipv4 = now; + } + else if (msg.size() == 18) + { + // We don't really need ipv6 info stored so we just update the pong data + // std::array new_ipv6_addr; + // std::memcpy(new_ipv6_addr.data(), &msg[3], 16); + // const u32 new_ipv6_port = read_from_ptr>(&msg[16]); + + last_pong_time_ipv6 = now; } else { @@ -366,36 +542,64 @@ namespace rpcn } } - // Send a packet every 5 seconds and then every 500 ms until reply is received - if (now - last_pong_time >= 5s && now - last_ping_time > 500ms) + const std::chrono::nanoseconds time_since_last_ipv4_ping = now - last_ping_time_ipv4; + const std::chrono::nanoseconds time_since_last_ipv4_pong = now - last_pong_time_ipv4; + const std::chrono::nanoseconds time_since_last_ipv6_ping = now - last_ping_time_ipv6; + const std::chrono::nanoseconds time_since_last_ipv6_pong = now - last_pong_time_ipv6; + + auto forge_ping_packet = [&]() -> std::vector { std::vector ping(13); - ping[0] = 1; + ping[0] = 1; write_to_ptr>(ping, 1, user_id); write_to_ptr>(ping, 9, +local_addr_sig); - if (send_packet_from_p2p_port(ping, addr_rpcn_udp) == -1) - { - rpcn_log.error("Failed to send ping to RPCN!"); - } - last_ping_time = now; - } - else + return ping; + }; + + // Send a packet every 5 seconds and then every 500 ms until reply is received + if (time_since_last_ipv4_pong >= 5s && time_since_last_ipv4_ping > 500ms) + { + const auto ping = forge_ping_packet(); + + if (!send_packet_from_p2p_port_ipv4(ping, addr_rpcn_udp_ipv4)) + rpcn_log.error("Failed to send IPv4 ping to RPCN!"); + + last_ping_time_ipv4 = now; + continue; + } + + if (np::is_ipv6_supported() && time_since_last_ipv6_pong >= 5s && time_since_last_ipv6_ping > 500ms) + { + const auto ping = forge_ping_packet(); + + if (!send_packet_from_p2p_port_ipv6(ping, addr_rpcn_udp_ipv6)) + rpcn_log.error("Failed to send IPv6 ping to RPCN!"); + + last_ping_time_ipv6 = now; + continue; + } + + auto min_duration_for = [&](const auto last_ping_time, const auto last_pong_time) -> std::chrono::nanoseconds { - std::chrono::nanoseconds duration; if ((now - last_pong_time) < 5s) { - duration = 5s - (now - last_pong_time); + return (5s - (now - last_pong_time)); } else { - duration = 500ms - (now - last_ping_time); + return (500ms - (now - last_ping_time)); } + }; - if (!sem_rpcn.try_acquire_for(duration)) - { - // TODO - } + auto duration = min_duration_for(last_ping_time_ipv4, last_pong_time_ipv4); + + if (np::is_ipv6_supported()) + { + const auto duration_ipv6 = min_duration_for(last_ping_time_ipv6, last_pong_time_ipv6); + duration = std::min(duration, duration_ipv6); } + + sem_rpcn.try_acquire_for(duration); } } } @@ -416,10 +620,10 @@ namespace rpcn case recvn_result::recvn_terminate: return error_and_disconnect_notice("Recvn was forcefully aborted"); } - const u8 packet_type = header[0]; - const u16 command = read_from_ptr>(&header[1]); + const u8 packet_type = header[0]; + const auto command = static_cast(static_cast(read_from_ptr>(&header[1]))); const u32 packet_size = read_from_ptr>(&header[3]); - const u64 packet_id = read_from_ptr>(&header[7]); + const u64 packet_id = read_from_ptr>(&header[7]); if (packet_size < RPCN_HEADER_SIZE) return error_and_disconnect("Invalid packet size"); @@ -441,6 +645,13 @@ namespace rpcn if (data.empty()) return error_and_disconnect("Reply packet without result"); + // Internal commands without feedback + if (command == CommandType::ResetState) + { + ensure(data[0] == static_cast(ErrorType::NoError)); + break; + } + // Those commands are handled synchronously and won't be forwarded to NP Handler if (command == CommandType::Login || command == CommandType::GetServerList || command == CommandType::Create || command == CommandType::AddFriend || command == CommandType::RemoveFriend || @@ -469,7 +680,9 @@ namespace rpcn } case PacketType::Notification: { - switch (command) + auto notif_type = static_cast(command); + + switch (notif_type) { case NotificationType::FriendNew: case NotificationType::FriendLost: @@ -477,7 +690,7 @@ namespace rpcn case NotificationType::FriendStatus: case NotificationType::FriendPresenceChanged: { - handle_friend_notification(command, std::move(data)); + handle_friend_notification(notif_type, std::move(data)); break; } case NotificationType::MessageReceived: @@ -488,7 +701,7 @@ namespace rpcn default: { std::lock_guard lock(mutex_notifs); - notifications.emplace_back(std::make_pair(command, std::move(data))); + notifications.emplace_back(std::make_pair(notif_type, std::move(data))); break; } } @@ -499,7 +712,7 @@ namespace rpcn if (data.size() != 4) return error_and_disconnect("Invalid size of ServerInfo packet"); - received_version = reinterpret_cast&>(data[0]); + received_version = reinterpret_cast&>(data[0]); server_info_received = true; break; } @@ -629,7 +842,7 @@ namespace rpcn bool rpcn_client::send_packet(const std::vector& packet) { u32 num_timeouts = 0; - usz n_sent = 0; + usz n_sent = 0; while (n_sent != packet.size()) { if (terminate) @@ -688,7 +901,7 @@ namespace rpcn // Helper functions - bool rpcn_client::forge_send(u16 command, u64 packet_id, const std::vector& data) + bool rpcn_client::forge_send(rpcn::CommandType command, u64 packet_id, const std::vector& data) { // TODO: add a check for status? @@ -697,7 +910,7 @@ namespace rpcn return true; } - bool rpcn_client::forge_send_reply(u16 command, u64 packet_id, const std::vector& data, std::vector& reply_data) + bool rpcn_client::forge_send_reply(rpcn::CommandType command, u64 packet_id, const std::vector& data, std::vector& reply_data) { if (!forge_send(command, packet_id, data)) return false; @@ -744,8 +957,8 @@ namespace rpcn sockfd = 0; } - connected = false; - authentified = false; + connected = false; + authentified = false; server_info_received = false; } @@ -817,28 +1030,63 @@ namespace rpcn memset(&addr_rpcn, 0, sizeof(addr_rpcn)); - addr_rpcn.sin_port = std::bit_cast>(port); // htons + addr_rpcn.sin_port = std::bit_cast>(port); // htons addr_rpcn.sin_family = AF_INET; -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4996) -#endif - hostent* host_addr = gethostbyname(splithost[0].c_str()); -#ifdef _MSC_VER -#pragma warning(pop) -#endif - if (!host_addr) + addrinfo* addr_info{}; + + if (getaddrinfo(splithost[0].c_str(), nullptr, nullptr, &addr_info)) { - rpcn_log.error("connect: Failed to resolve %s", host); + rpcn_log.error("connect: Failed to getaddrinfo %s", host); state = rpcn_state::failure_resolve; return false; } - addr_rpcn.sin_addr.s_addr = *reinterpret_cast(host_addr->h_addr_list[0]); + bool found_ipv4 = false, found_ipv6 = false; + addrinfo* found = addr_info; - memcpy(&addr_rpcn_udp, &addr_rpcn, sizeof(addr_rpcn_udp)); - addr_rpcn_udp.sin_port = std::bit_cast>(3657); // htons + while (found != nullptr) + { + switch (found->ai_family) + { + case AF_INET: + { + addr_rpcn.sin_addr = reinterpret_cast(found->ai_addr)->sin_addr; + found_ipv4 = true; + break; + } + case AF_INET6: + { + if (np::is_ipv6_supported()) + { + addr_rpcn_udp_ipv6.sin6_family = AF_INET6; + addr_rpcn_udp_ipv6.sin6_port = std::bit_cast>(3657); + addr_rpcn_udp_ipv6.sin6_addr = reinterpret_cast(found->ai_addr)->sin6_addr; + found_ipv6 = true; + } + break; + } + default: break; + } + + found = found->ai_next; + } + + if (!found_ipv4) + { + rpcn_log.error("connect: Failed to find IPv4 for %s", host); + state = rpcn_state::failure_resolve; + return false; + } + + if (np::is_ipv6_supported() && !found_ipv6) + { + rpcn_log.warning("IPv6 seems supported but no IPv6 could be found for the RPCN server, IPv6 is disabled!"); + is_ipv6_supported(np::IPV6_SUPPORT::IPV6_UNSUPPORTED); + } + + memcpy(&addr_rpcn_udp_ipv4, &addr_rpcn, sizeof(addr_rpcn_udp_ipv4)); + addr_rpcn_udp_ipv4.sin_port = std::bit_cast>(3657); // htons sockfd = socket(AF_INET, SOCK_STREAM, 0); #ifdef _WIN32 @@ -932,10 +1180,6 @@ namespace rpcn } rpcn_log.notice("connect: Protocol version matches"); - - last_ping_time = steady_clock::now() - 5s; - last_pong_time = last_ping_time; - return true; } @@ -974,10 +1218,10 @@ namespace rpcn } vec_stream reply(packet_data); - auto error = static_cast(reply.get()); + auto error = static_cast(reply.get()); online_name = reply.get_string(false); - avatar_url = reply.get_string(false); - user_id = reply.get(); + avatar_url = reply.get_string(false); + user_id = reply.get(); auto get_usernames_and_status = [](vec_stream& stream, std::map& friends) { @@ -1022,15 +1266,15 @@ namespace rpcn get_usernames(reply, friend_infos.blocked); } - if (is_error(error)) + if (error != rpcn::ErrorType::NoError) { switch (error) { - case LoginError: state = rpcn_state::failure_id; break; - case LoginAlreadyLoggedIn: state = rpcn_state::failure_id_already_logged_in; break; - case LoginInvalidUsername: state = rpcn_state::failure_id_username; break; - case LoginInvalidPassword: state = rpcn_state::failure_id_password; break; - case LoginInvalidToken: state = rpcn_state::failure_id_token; break; + case rpcn::ErrorType::LoginError: state = rpcn_state::failure_id; break; + case rpcn::ErrorType::LoginAlreadyLoggedIn: state = rpcn_state::failure_id_already_logged_in; break; + case rpcn::ErrorType::LoginInvalidUsername: state = rpcn_state::failure_id_username; break; + case rpcn::ErrorType::LoginInvalidPassword: state = rpcn_state::failure_id_password; break; + case rpcn::ErrorType::LoginInvalidToken: state = rpcn_state::failure_id_token; break; default: state = rpcn_state::failure_id; break; } @@ -1062,6 +1306,15 @@ namespace rpcn return true; } + void rpcn_client::reset_state() + { + if (!connected || !authentified) + return; + + std::vector data; + forge_send(CommandType::ResetState, rpcn_request_counter.fetch_add(1), data); + } + ErrorType rpcn_client::create_user(std::string_view npid, std::string_view password, std::string_view online_name, std::string_view avatar_url, std::string_view email) { std::vector data; @@ -1088,14 +1341,12 @@ namespace rpcn vec_stream reply(packet_data); auto error = static_cast(reply.get()); - if (is_error(error)) + if (error == rpcn::ErrorType::NoError) { - return error; + rpcn_log.success("You have successfully created a RPCN account(%s | %s)!", npid, online_name); } - rpcn_log.success("You have successfully created a RPCN account(%s | %s)!", npid, online_name); - - return ErrorType::NoError; + return error; } ErrorType rpcn_client::resend_token(const std::string& npid, const std::string& password) @@ -1123,14 +1374,12 @@ namespace rpcn vec_stream reply(packet_data); auto error = static_cast(reply.get()); - if (is_error(error)) + if (error == rpcn::ErrorType::NoError) { - return error; + rpcn_log.success("Token has successfully been resent!"); } - rpcn_log.success("Token has successfully been resent!"); - - return ErrorType::NoError; + return error; } ErrorType rpcn_client::send_reset_token(std::string_view npid, std::string_view email) @@ -1158,14 +1407,12 @@ namespace rpcn vec_stream reply(packet_data); auto error = static_cast(reply.get()); - if (is_error(error)) + if (error == rpcn::ErrorType::NoError) { - return error; + rpcn_log.success("Password reset token has successfully been sent!"); } - rpcn_log.success("Password reset token has successfully been sent!"); - - return ErrorType::NoError; + return error; } ErrorType rpcn_client::reset_password(std::string_view npid, std::string_view token, std::string_view password) @@ -1195,14 +1442,12 @@ namespace rpcn vec_stream reply(packet_data); auto error = static_cast(reply.get()); - if (is_error(error)) + if (error == rpcn::ErrorType::NoError) { - return error; + rpcn_log.success("Password has successfully been reset!"); } - rpcn_log.success("Password has successfully been reset!"); - - return ErrorType::NoError; + return error; } bool rpcn_client::add_friend(const std::string& friend_username) @@ -1222,7 +1467,7 @@ namespace rpcn vec_stream reply(packet_data); auto error = static_cast(reply.get()); - if (is_error(error)) + if (error != rpcn::ErrorType::NoError) { return false; } @@ -1248,7 +1493,7 @@ namespace rpcn vec_stream reply(packet_data); auto error = static_cast(reply.get()); - if (is_error(error)) + if (error != rpcn::ErrorType::NoError) { return false; } @@ -1257,18 +1502,18 @@ namespace rpcn return true; } - std::vector>> rpcn_client::get_notifications() + std::vector>> rpcn_client::get_notifications() { std::lock_guard lock(mutex_notifs); - std::vector>> notifs = std::move(notifications); + auto notifs = std::move(notifications); notifications.clear(); return notifs; } - std::unordered_map>> rpcn_client::get_replies() + std::unordered_map>> rpcn_client::get_replies() { std::lock_guard lock(mutex_replies); - std::unordered_map>> ret_replies = std::move(replies); + auto ret_replies = std::move(replies); replies.clear(); return ret_replies; } @@ -1337,7 +1582,7 @@ namespace rpcn vec_stream reply(reply_data); auto error = static_cast(reply.get()); - if (is_error(error)) + if (error != rpcn::ErrorType::NoError) { return false; } @@ -1370,7 +1615,7 @@ namespace rpcn vec_stream reply(reply_data); auto error = static_cast(reply.get()); - if (is_error(error)) + if (error != rpcn::ErrorType::NoError) { return 0; } @@ -1386,7 +1631,6 @@ namespace rpcn return network_time; } - bool rpcn_client::get_world_list(u32 req_id, const SceNpCommunicationId& communication_id, u16 server_id) { std::vector data(COMMUNICATION_ID_SIZE + sizeof(u16)); @@ -1453,7 +1697,7 @@ namespace rpcn std::vector> davec; for (u32 i = 0; i < req->groupConfigNum; i++) { - auto bin = CreateGroupConfig(builder, req->groupConfig[i].slotNum, req->groupConfig[i].withLabel, builder.CreateVector(req->groupConfig[i].label.data, 8), req->groupConfig[i].withPassword); + auto bin = CreateGroupConfig(builder, req->groupConfig[i].slotNum, req->groupConfig[i].withLabel ? builder.CreateVector(req->groupConfig[i].label.data, 8) : 0, req->groupConfig[i].withPassword); davec.push_back(bin); } final_groupconfigs_vec = builder.CreateVector(davec); @@ -1555,7 +1799,7 @@ namespace rpcn { flatbuffers::FlatBufferBuilder builder(1024); flatbuffers::Offset final_optdata = CreatePresenceOptionData(builder, builder.CreateVector(req->optData.data, 16), req->optData.length); - auto req_finished = CreateLeaveRoomRequest(builder, req->roomId, final_optdata); + auto req_finished = CreateLeaveRoomRequest(builder, req->roomId, final_optdata); builder.Finish(req_finished); return forge_request_with_com_id(builder, communication_id, CommandType::LeaveRoom, req_id); @@ -1571,7 +1815,7 @@ namespace rpcn for (u32 i = 0; i < req->intFilterNum; i++) { auto int_attr = CreateIntAttr(builder, req->intFilter[i].attr.id, req->intFilter[i].attr.num); - auto bin = CreateIntSearchFilter(builder, req->intFilter[i].searchOperator, int_attr); + auto bin = CreateIntSearchFilter(builder, req->intFilter[i].searchOperator, int_attr); davec.push_back(bin); } final_intfilter_vec = builder.CreateVector(davec); @@ -1583,7 +1827,7 @@ namespace rpcn for (u32 i = 0; i < req->binFilterNum; i++) { auto bin_attr = CreateBinAttr(builder, req->binFilter[i].attr.id, builder.CreateVector(req->binFilter[i].attr.ptr.get_ptr(), req->binFilter[i].attr.size)); - auto bin = CreateBinSearchFilter(builder, req->binFilter[i].searchOperator, bin_attr); + auto bin = CreateBinSearchFilter(builder, req->binFilter[i].searchOperator, bin_attr); davec.push_back(bin); } final_binfilter_vec = builder.CreateVector(davec); @@ -1898,7 +2142,7 @@ namespace rpcn auto fb_sendmessage = CreateSendMessageRequest(builder, nested_flatbuffer_vector, npids_vector); builder.Finish(fb_sendmessage); - const u8* buf = builder.GetBufferPointer(); + const u8* buf = builder.GetBufferPointer(); const usz bufsize = builder.GetSize(); std::vector data(bufsize + sizeof(u32)); @@ -1969,7 +2213,7 @@ namespace rpcn auto req_finished = CreateRecordScoreGameDataRequest(builder, board_id, pc_id, score); builder.Finish(req_finished); - const u8* buf = builder.GetBufferPointer(); + const u8* buf = builder.GetBufferPointer(); const usz bufsize = builder.GetSize(); std::vector data(COMMUNICATION_ID_SIZE + sizeof(u32) + bufsize + sizeof(u32) + score_data.size()); @@ -2391,11 +2635,7 @@ namespace rpcn num = cur_attr->value.num; break; } - default: - { - fmt::throw_exception("Invalid attr type reached set_room_info_gui"); - break; - } + default: fmt::throw_exception("Invalid attr type reached set_room_info_gui"); } auto fb_attr = CreateMatchingAttr(builder, cur_attr->type, cur_attr->id, num, fb_vec_data); @@ -2474,7 +2714,7 @@ namespace rpcn bool rpcn_client::forge_request_with_com_id(const flatbuffers::FlatBufferBuilder& builder, const SceNpCommunicationId& com_id, CommandType command, u64 packet_id) { - const u8* buf = builder.GetBufferPointer(); + const u8* buf = builder.GetBufferPointer(); const usz bufsize = builder.GetSize(); std::vector data(COMMUNICATION_ID_SIZE + sizeof(u32) + bufsize); @@ -2498,13 +2738,13 @@ namespace rpcn return forge_send(command, packet_id, data); } - std::vector rpcn_client::forge_request(u16 command, u64 packet_id, const std::vector& data) const + std::vector rpcn_client::forge_request(rpcn::CommandType command, u64 packet_id, const std::vector& data) const { const usz packet_size = data.size() + RPCN_HEADER_SIZE; std::vector packet(packet_size); - packet[0] = PacketType::Request; - reinterpret_cast&>(packet[1]) = command; + packet[0] = static_cast(PacketType::Request); + reinterpret_cast&>(packet[1]) = static_cast(command); reinterpret_cast&>(packet[3]) = ::narrow(packet_size); reinterpret_cast&>(packet[7]) = packet_id; @@ -2607,11 +2847,10 @@ namespace rpcn } } - void rpcn_client::handle_friend_notification(u16 command, std::vector data) + void rpcn_client::handle_friend_notification(rpcn::NotificationType ntype, std::vector data) { std::lock_guard lock(mutex_friends); - NotificationType ntype = static_cast(command); vec_stream vdata(data); const auto call_callbacks = [&](NotificationType ntype, const std::string& username, bool status) @@ -2672,7 +2911,7 @@ namespace rpcn case NotificationType::FriendStatus: // Set status of friend to Offline or Online { const bool online = !!vdata.get(); - const u64 timestamp = vdata.get(); + const u64 timestamp = vdata.get(); const std::string username = vdata.get_string(false); if (vdata.is_error()) { @@ -2746,7 +2985,7 @@ namespace rpcn // Unserialize the message vec_stream sdata(data); std::string sender = sdata.get_string(false); - auto* fb_mdata = sdata.get_flatbuffer(); + auto* fb_mdata = sdata.get_flatbuffer(); if (sdata.is_error()) { @@ -2761,12 +3000,12 @@ namespace rpcn } message_data mdata = { - .msgId = message_counter, - .mainType = fb_mdata->mainType(), - .subType = fb_mdata->subType(), + .msgId = message_counter, + .mainType = fb_mdata->mainType(), + .subType = fb_mdata->subType(), .msgFeatures = fb_mdata->msgFeatures(), - .subject = fb_mdata->subject()->str(), - .body = fb_mdata->body()->str()}; + .subject = fb_mdata->subject()->str(), + .body = fb_mdata->body()->str()}; strcpy_trunc(mdata.commId.data, fb_mdata->communicationId()->str()); mdata.data.assign(fb_mdata->data()->Data(), fb_mdata->data()->Data() + fb_mdata->data()->size()); @@ -2775,7 +3014,7 @@ namespace rpcn { std::lock_guard lock(mutex_messages); const u64 msg_id = message_counter++; - auto id_and_msg = stx::make_shared>(std::make_pair(std::move(sender), std::move(mdata))); + auto id_and_msg = stx::make_shared>(std::make_pair(std::move(sender), std::move(mdata))); messages.emplace(msg_id, id_and_msg); new_messages.push_back(msg_id); active_messages.insert(msg_id); @@ -2811,7 +3050,7 @@ namespace rpcn for (auto id : active_messages) { const auto& entry = ::at32(messages, id); - const auto& msg = entry->second; + const auto& msg = entry->second; if (msg.mainType == type_filter && (include_bootable || !(msg.msgFeatures & SCE_NP_BASIC_MESSAGE_FEATURES_BOOTABLE))) { vec_messages.push_back(std::make_pair(id, entry)); @@ -2819,9 +3058,9 @@ namespace rpcn } message_cbs.insert(message_cb_t{ - .cb_func = cb_func, - .cb_param = cb_param, - .type_filter = type_filter, + .cb_func = cb_func, + .cb_param = cb_param, + .type_filter = type_filter, .inc_bootable = include_bootable, }); } diff --git a/rpcs3/Emu/NP/rpcn_client.h b/rpcs3/Emu/NP/rpcn_client.h index fb8921076a..2ada34b581 100644 --- a/rpcs3/Emu/NP/rpcn_client.h +++ b/rpcs3/Emu/NP/rpcn_client.h @@ -5,9 +5,7 @@ #include #include #include "Utilities/mutex.h" -#include "Emu/localized_string.h" - -#include "util/asm.hpp" +#include "Emu/localized_string_id.h" #ifdef _WIN32 #include @@ -27,18 +25,20 @@ #include "Emu/Cell/Modules/sceNp.h" #include "Emu/Cell/Modules/sceNp2.h" #include "Emu/Cell/Modules/sceNpTus.h" - -#include "generated/np2_structs_generated.h" +#include #ifdef __clang__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wold-style-cast" +#pragma GCC diagnostic ignored "-Wextern-c-compat" #endif #include #ifdef __clang__ #pragma GCC diagnostic pop #endif +#include "rpcn_types.h" + // COMID is sent as 9 chars - + '_' + 2 digits constexpr usz COMMUNICATION_ID_COMID_COMPONENT_SIZE = 9; constexpr usz COMMUNICATION_ID_SUBID_COMPONENT_SIZE = 2; @@ -183,153 +183,6 @@ protected: namespace rpcn { - enum CommandType : u16 - { - Login, - Terminate, - Create, - SendToken, - SendResetToken, - ResetPassword, - AddFriend, - RemoveFriend, - AddBlock, - RemoveBlock, - GetServerList, - GetWorldList, - CreateRoom, - JoinRoom, - LeaveRoom, - SearchRoom, - GetRoomDataExternalList, - SetRoomDataExternal, - GetRoomDataInternal, - SetRoomDataInternal, - GetRoomMemberDataInternal, - SetRoomMemberDataInternal, - SetUserInfo, - PingRoomOwner, - SendRoomMessage, - RequestSignalingInfos, - RequestTicket, - SendMessage, - GetBoardInfos, - RecordScore, - RecordScoreData, - GetScoreData, - GetScoreRange, - GetScoreFriends, - GetScoreNpid, - GetNetworkTime, - TusSetMultiSlotVariable, - TusGetMultiSlotVariable, - TusGetMultiUserVariable, - TusGetFriendsVariable, - TusAddAndGetVariable, - TusTryAndSetVariable, - TusDeleteMultiSlotVariable, - TusSetData, - TusGetData, - TusGetMultiSlotDataStatus, - TusGetMultiUserDataStatus, - TusGetFriendsDataStatus, - TusDeleteMultiSlotData, - ClearPresence, - SetPresence, - CreateRoomGUI, - JoinRoomGUI, - LeaveRoomGUI, - GetRoomListGUI, - SetRoomSearchFlagGUI, - GetRoomSearchFlagGUI, - SetRoomInfoGUI, - GetRoomInfoGUI, - QuickMatchGUI, - SearchJoinRoomGUI, - }; - - enum NotificationType : u16 - { - UserJoinedRoom, - UserLeftRoom, - RoomDestroyed, - UpdatedRoomDataInternal, - UpdatedRoomMemberDataInternal, - SignalP2PConnect, - _SignalP2PDisconnect, - FriendQuery, // Other user sent a friend request - FriendNew, // Add a friend to the friendlist(either accepted a friend request or friend accepted it) - FriendLost, // Remove friend from the friendlist(user removed friend or friend removed friend) - FriendStatus, // Set status of friend to Offline or Online - RoomMessageReceived, - MessageReceived, - FriendPresenceChanged, - SignalingInfo, - MemberJoinedRoomGUI, - MemberLeftRoomGUI, - RoomDisappearedGUI, - RoomOwnerChangedGUI, - UserKickedGUI, - QuickMatchCompleteGUI, - }; - - enum class rpcn_state - { - failure_no_failure, - failure_input, - failure_wolfssl, - failure_resolve, - failure_connect, - failure_id, - failure_id_already_logged_in, - failure_id_username, - failure_id_password, - failure_id_token, - failure_protocol, - failure_other, - }; - - enum PacketType : u8 - { - Request, - Reply, - Notification, - ServerInfo, - }; - - enum ErrorType : u8 - { - NoError, // No error - Malformed, // Query was malformed, critical error that should close the connection - Invalid, // The request type is invalid(wrong stage?) - InvalidInput, // The Input doesn't fit the constraints of the request - TooSoon, // Time limited operation attempted too soon - LoginError, // An error happened related to login - LoginAlreadyLoggedIn, // Can't log in because you're already logged in - LoginInvalidUsername, // Invalid username - LoginInvalidPassword, // Invalid password - LoginInvalidToken, // Invalid token - CreationError, // An error happened related to account creation - CreationExistingUsername, // Specific to Account Creation: username exists already - CreationBannedEmailProvider, // Specific to Account Creation: the email provider is banned - CreationExistingEmail, // Specific to Account Creation: that email is already registered to an account - RoomMissing, // User tried to join a non existing room - RoomAlreadyJoined, // User tried to join a room he's already part of - RoomFull, // User tried to join a full room - Unauthorized, // User attempted an unauthorized operation - DbFail, // Generic failure on db side - EmailFail, // Generic failure related to email - NotFound, // Object of the query was not found(room, user, etc) - Blocked, // The operation can't complete because you've been blocked - AlreadyFriend, // Can't add friend because already friend - ScoreNotBest, // A better score is already registered for that user/character_id - ScoreInvalid, // Score for player was found but wasn't what was expected - ScoreHasData, // Score already has data - CondFail, // Condition related to query failed - Unsupported, - __error_last - }; - using friend_cb_func = void (*)(void* param, NotificationType ntype, const std::string& username, bool status); using message_cb_func = void (*)(void* param, const shared_ptr> new_msg, u64 msg_id); @@ -362,7 +215,7 @@ namespace rpcn localized_string_id rpcn_state_to_localized_string_id(rpcn::rpcn_state state); std::string rpcn_state_to_string(rpcn::rpcn_state state); - bool is_error(ErrorType err); + void print_error(rpcn::CommandType command, rpcn::ErrorType error); class rpcn_client { @@ -395,7 +248,7 @@ namespace rpcn std::set> friend_cbs; friend_data friend_infos; - void handle_friend_notification(u16 command, std::vector data); + void handle_friend_notification(rpcn::NotificationType ntype, std::vector data); void handle_message(std::vector data); @@ -438,6 +291,7 @@ namespace rpcn rpcn_state wait_for_connection(); rpcn_state wait_for_authentified(); bool terminate_connection(); + void reset_state(); void get_friends(friend_data& friend_infos); void get_friends_and_register_cb(friend_data& friend_infos, friend_cb_func cb_func, void* cb_param); @@ -457,8 +311,8 @@ namespace rpcn std::optional> get_friend_presence_by_index(u32 index); std::optional> get_friend_presence_by_npid(const std::string& npid); - std::vector>> get_notifications(); - std::unordered_map>> get_replies(); + std::vector>> get_notifications(); + std::unordered_map>> get_replies(); std::unordered_map get_presence_updates(); std::map get_presence_states(); @@ -540,11 +394,11 @@ namespace rpcn static void write_communication_id(const SceNpCommunicationId& com_id, std::vector& data); - std::vector forge_request(u16 command, u64 packet_id, const std::vector& data) const; - bool forge_send(u16 command, u64 packet_id, const std::vector& data); + std::vector forge_request(rpcn::CommandType command, u64 packet_id, const std::vector& data) const; + bool forge_send(rpcn::CommandType command, u64 packet_id, const std::vector& data); bool forge_request_with_com_id(const flatbuffers::FlatBufferBuilder& builder, const SceNpCommunicationId& com_id, CommandType command, u64 packet_id); bool forge_request_with_data(const flatbuffers::FlatBufferBuilder& builder, CommandType command, u64 packet_id); - bool forge_send_reply(u16 command, u64 packet_id, const std::vector& data, std::vector& reply_data); + bool forge_send_reply(rpcn::CommandType command, u64 packet_id, const std::vector& data, std::vector& reply_data); bool error_and_disconnect(const std::string& error_mgs); bool error_and_disconnect_notice(const std::string& error_msg); @@ -559,11 +413,9 @@ namespace rpcn atomic_t server_info_received = false; u32 received_version = 0; - // UDP Signaling related - steady_clock::time_point last_ping_time{}, last_pong_time{}; - sockaddr_in addr_rpcn{}; - sockaddr_in addr_rpcn_udp{}; + sockaddr_in addr_rpcn_udp_ipv4{}; + sockaddr_in6 addr_rpcn_udp_ipv6{}; #ifdef _WIN32 SOCKET sockfd = 0; #else @@ -573,10 +425,10 @@ namespace rpcn atomic_t rpcn_request_counter = 0x100000001; // Counter used for commands whose result is not forwarded to NP handler(login, create, sendmessage, etc) shared_mutex mutex_notifs, mutex_replies, mutex_replies_sync, mutex_presence_updates; - std::vector>> notifications; // notif type / data - std::unordered_map>> replies; // req id / (command / data) - std::unordered_map>> replies_sync; // same but for sync replies(see handle_input()) - std::unordered_map presence_updates; // npid / presence data + std::vector>> notifications; // notif type / data + std::unordered_map>> replies; // req id / (command / data) + std::unordered_map>> replies_sync; // same but for sync replies(see handle_input()) + std::unordered_map presence_updates; // npid / presence data // Messages struct message_cb_t diff --git a/rpcs3/Emu/NP/rpcn_config.cpp b/rpcs3/Emu/NP/rpcn_config.cpp index 1f52d60a05..a112084da7 100644 --- a/rpcs3/Emu/NP/rpcn_config.cpp +++ b/rpcs3/Emu/NP/rpcn_config.cpp @@ -124,6 +124,11 @@ std::string cfg_rpcn::get_token() const return token.to_string(); } +bool cfg_rpcn::get_ipv6_support() const +{ + return ipv6_support.get(); +} + void cfg_rpcn::set_host(std::string_view host) { this->host.from_string(host); @@ -144,6 +149,11 @@ void cfg_rpcn::set_token(std::string_view token) this->token.from_string(token); } +void cfg_rpcn::set_ipv6_support(bool ipv6_support) +{ + this->ipv6_support.set(ipv6_support); +} + void cfg_rpcn::set_hosts(const std::vector>& vec_hosts) { std::string final_string; diff --git a/rpcs3/Emu/NP/rpcn_config.h b/rpcs3/Emu/NP/rpcn_config.h index b03bdd3acb..7c1317fbe0 100644 --- a/rpcs3/Emu/NP/rpcn_config.h +++ b/rpcs3/Emu/NP/rpcn_config.h @@ -10,6 +10,7 @@ struct cfg_rpcn : cfg::node cfg::string password{this, "Password", ""}; cfg::string token{this, "Token", ""}; cfg::string hosts{this, "Hosts", "Official RPCN Server|np.rpcs3.net|||RPCN Test Server|test-np.rpcs3.net"}; + cfg::_bool ipv6_support{this, "IPv6 support", true}; void load(); void save() const; @@ -18,12 +19,14 @@ struct cfg_rpcn : cfg::node std::string get_npid(); // not const because it can save if npid is requested and it has never been set std::string get_password() const; std::string get_token() const; + bool get_ipv6_support() const; std::vector> get_hosts(); // saves default if no valid server in the list void set_host(std::string_view host); void set_npid(std::string_view npid); void set_password(std::string_view password); void set_token(std::string_view token); + void set_ipv6_support(bool ipv6_support); bool add_host(std::string_view description, std::string_view host); bool del_host(std::string_view description, std::string_view host); diff --git a/rpcs3/Emu/NP/rpcn_countries.h b/rpcs3/Emu/NP/rpcn_countries.h index 2551ced9c1..5c7e00fb4d 100644 --- a/rpcs3/Emu/NP/rpcn_countries.h +++ b/rpcs3/Emu/NP/rpcn_countries.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include namespace countries { diff --git a/rpcs3/Emu/NP/rpcn_types.h b/rpcs3/Emu/NP/rpcn_types.h new file mode 100644 index 0000000000..1e9fb9acf4 --- /dev/null +++ b/rpcs3/Emu/NP/rpcn_types.h @@ -0,0 +1,156 @@ +#pragma once + +#include "util/types.hpp" + +namespace rpcn +{ + enum class CommandType : u16 + { + Login, + Terminate, + Create, + SendToken, + SendResetToken, + ResetPassword, + ResetState, + AddFriend, + RemoveFriend, + AddBlock, + RemoveBlock, + GetServerList, + GetWorldList, + CreateRoom, + JoinRoom, + LeaveRoom, + SearchRoom, + GetRoomDataExternalList, + SetRoomDataExternal, + GetRoomDataInternal, + SetRoomDataInternal, + GetRoomMemberDataInternal, + SetRoomMemberDataInternal, + SetUserInfo, + PingRoomOwner, + SendRoomMessage, + RequestSignalingInfos, + RequestTicket, + SendMessage, + GetBoardInfos, + RecordScore, + RecordScoreData, + GetScoreData, + GetScoreRange, + GetScoreFriends, + GetScoreNpid, + GetNetworkTime, + TusSetMultiSlotVariable, + TusGetMultiSlotVariable, + TusGetMultiUserVariable, + TusGetFriendsVariable, + TusAddAndGetVariable, + TusTryAndSetVariable, + TusDeleteMultiSlotVariable, + TusSetData, + TusGetData, + TusGetMultiSlotDataStatus, + TusGetMultiUserDataStatus, + TusGetFriendsDataStatus, + TusDeleteMultiSlotData, + SetPresence, + CreateRoomGUI, + JoinRoomGUI, + LeaveRoomGUI, + GetRoomListGUI, + SetRoomSearchFlagGUI, + GetRoomSearchFlagGUI, + SetRoomInfoGUI, + GetRoomInfoGUI, + QuickMatchGUI, + SearchJoinRoomGUI, + }; + + enum class NotificationType : u16 + { + UserJoinedRoom, + UserLeftRoom, + RoomDestroyed, + UpdatedRoomDataInternal, + UpdatedRoomMemberDataInternal, + FriendQuery, // Other user sent a friend request + FriendNew, // Add a friend to the friendlist(either accepted a friend request or friend accepted it) + FriendLost, // Remove friend from the friendlist(user removed friend or friend removed friend) + FriendStatus, // Set status of friend to Offline or Online + RoomMessageReceived, + MessageReceived, + FriendPresenceChanged, + SignalingHelper, + MemberJoinedRoomGUI, + MemberLeftRoomGUI, + RoomDisappearedGUI, + RoomOwnerChangedGUI, + UserKickedGUI, + QuickMatchCompleteGUI, + }; + + enum class rpcn_state + { + failure_no_failure, + failure_input, + failure_wolfssl, + failure_resolve, + failure_connect, + failure_id, + failure_id_already_logged_in, + failure_id_username, + failure_id_password, + failure_id_token, + failure_protocol, + failure_other, + }; + + enum class PacketType : u8 + { + Request, + Reply, + Notification, + ServerInfo, + }; + + enum class ErrorType : u8 + { + NoError, // No error + Malformed, // Query was malformed, critical error that should close the connection + Invalid, // The request type is invalid(wrong stage?) + InvalidInput, // The Input doesn't fit the constraints of the request + TooSoon, // Time limited operation attempted too soon + LoginError, // An error happened related to login + LoginAlreadyLoggedIn, // Can't log in because you're already logged in + LoginInvalidUsername, // Invalid username + LoginInvalidPassword, // Invalid password + LoginInvalidToken, // Invalid token + CreationError, // An error happened related to account creation + CreationExistingUsername, // Specific to Account Creation: username exists already + CreationBannedEmailProvider, // Specific to Account Creation: the email provider is banned + CreationExistingEmail, // Specific to Account Creation: that email is already registered to an account + RoomMissing, // User tried to interact with a non existing room + RoomAlreadyJoined, // User tried to join a room he's already part of + RoomFull, // User tried to join a full room + RoomPasswordMismatch, // Room password didn't match + RoomPasswordMissing, // A password was missing during room creation + RoomGroupNoJoinLabel, // Tried to join a group room without a label + RoomGroupFull, // Room group is full + RoomGroupJoinLabelNotFound, // Join label was invalid in some way + RoomGroupMaxSlotMismatch, // Mismatch between max_slot and the listed slots in groups + Unauthorized, // User attempted an unauthorized operation + DbFail, // Generic failure on db side + EmailFail, // Generic failure related to email + NotFound, // Object of the query was not found(user, etc), use RoomMissing for rooms instead + Blocked, // The operation can't complete because you've been blocked + AlreadyFriend, // Can't add friend because already friend + ScoreNotBest, // A better score is already registered for that user/character_id + ScoreInvalid, // Score for player was found but wasn't what was expected + ScoreHasData, // Score already has data + CondFail, // Condition related to query failed + Unsupported, + }; +} // namespace rpcn diff --git a/rpcs3/Emu/NP/signaling_handler.cpp b/rpcs3/Emu/NP/signaling_handler.cpp index d463b15676..2e4ac5df56 100644 --- a/rpcs3/Emu/NP/signaling_handler.cpp +++ b/rpcs3/Emu/NP/signaling_handler.cpp @@ -1,5 +1,6 @@ +#include "Emu/NP/ip_address.h" #include "stdafx.h" -#include "Emu/Cell/PPUModule.h" +#include "Emu/Cell/PPUCallback.h" #include "signaling_handler.h" #include "Emu/IdManager.h" #include "Emu/Cell/Modules/cellSysutil.h" @@ -547,6 +548,13 @@ void signaling_handler::update_si_mapped_addr(std::shared_ptr& s { ensure(si); + // If the address given to us by op is a translation IP, just replace it with our public ip(v4) + if (np::is_ipv6_supported() && np::ip_address_translator::is_ipv6(new_addr)) + { + auto& nph = g_fxo->get>(); + new_addr = nph.get_public_ip_addr(); + } + if (si->mapped_addr != new_addr || si->mapped_port != new_port) { if (sign_log.trace) @@ -640,7 +648,15 @@ void signaling_handler::send_signaling_packet(signaling_packet& sp, u32 addr, u1 sign_log.trace("Sending %s packet to %s:%d", sp.command, ip_str, port); - if (send_packet_from_p2p_port(packet, dest) == -1) + if (np::is_ipv6_supported() && np::ip_address_translator::is_ipv6(dest.sin_addr.s_addr)) + { + auto& translator = g_fxo->get(); + const auto addr6 = translator.get_ipv6_sockaddr(dest.sin_addr.s_addr, dest.sin_port); + + if (!send_packet_from_p2p_port_ipv6(packet, addr6)) + sign_log.error("Failed to send signaling packet to %s:%d", ip_str, port); + } + else if (!send_packet_from_p2p_port_ipv4(packet, dest)) { sign_log.error("Failed to send signaling packet to %s:%d", ip_str, port); } diff --git a/rpcs3/Emu/NP/signaling_handler.h b/rpcs3/Emu/NP/signaling_handler.h index 209daa9cac..b4ec8229b8 100644 --- a/rpcs3/Emu/NP/signaling_handler.h +++ b/rpcs3/Emu/NP/signaling_handler.h @@ -1,9 +1,8 @@ #pragma once -#include "Emu/Memory/vm.h" -#include "Emu/Memory/vm_ptr.h" #include "Emu/Cell/Modules/sceNp.h" #include "Emu/Cell/Modules/sceNp2.h" #include "Utilities/Thread.h" +#include "Utilities/mutex.h" #include #include #include diff --git a/rpcs3/Emu/NP/vport0.h b/rpcs3/Emu/NP/vport0.h index a3ca3bbdf3..927e1a5390 100644 --- a/rpcs3/Emu/NP/vport0.h +++ b/rpcs3/Emu/NP/vport0.h @@ -10,7 +10,8 @@ #include "Emu/Cell/lv2/sys_net/nt_p2p_port.h" -s32 send_packet_from_p2p_port(const std::vector& data, const sockaddr_in& addr); +bool send_packet_from_p2p_port_ipv4(const std::vector& data, const sockaddr_in& addr); +bool send_packet_from_p2p_port_ipv6(const std::vector& data, const sockaddr_in6& addr); std::vector get_sign_msgs(); std::vector> get_rpcn_msgs(); diff --git a/rpcs3/Emu/RSX/Capture/rsx_capture.cpp b/rpcs3/Emu/RSX/Capture/rsx_capture.cpp index 0eeea99db9..bfd47df73d 100644 --- a/rpcs3/Emu/RSX/Capture/rsx_capture.cpp +++ b/rpcs3/Emu/RSX/Capture/rsx_capture.cpp @@ -2,7 +2,6 @@ #include "rsx_capture.h" #include "Emu/RSX/Common/BufferUtils.h" #include "Emu/RSX/Common/TextureUtils.h" -#include "Emu/RSX/Common/surface_store.h" #include "Emu/RSX/GCM.h" #include "Emu/RSX/RSXThread.h" #include "Emu/Memory/vm.h" diff --git a/rpcs3/Emu/RSX/Capture/rsx_replay.cpp b/rpcs3/Emu/RSX/Capture/rsx_replay.cpp index 1e9a35601c..88bd6f9028 100644 --- a/rpcs3/Emu/RSX/Capture/rsx_replay.cpp +++ b/rpcs3/Emu/RSX/Capture/rsx_replay.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "rsx_replay.h" +#include "Emu/System.h" #include "Emu/Cell/ErrorCodes.h" #include "Emu/Cell/lv2/sys_rsx.h" #include "Emu/Cell/lv2/sys_memory.h" @@ -8,6 +9,8 @@ #include "util/asm.hpp" +#include + namespace rsx { be_t rsx_replay_thread::allocate_context() diff --git a/rpcs3/Emu/RSX/Common/BufferUtils.cpp b/rpcs3/Emu/RSX/Common/BufferUtils.cpp index ba19fdb461..0250daead2 100644 --- a/rpcs3/Emu/RSX/Common/BufferUtils.cpp +++ b/rpcs3/Emu/RSX/Common/BufferUtils.cpp @@ -1,12 +1,8 @@ #include "stdafx.h" #include "BufferUtils.h" -#include "../rsx_methods.h" -#include "../RSXThread.h" - #include "util/to_endian.hpp" #include "util/sysinfo.hpp" #include "Utilities/JIT.h" -#include "util/asm.hpp" #include "util/v128.hpp" #include "util/simd.hpp" diff --git a/rpcs3/Emu/RSX/Common/TextureUtils.h b/rpcs3/Emu/RSX/Common/TextureUtils.h index 243240bce1..f03667042c 100644 --- a/rpcs3/Emu/RSX/Common/TextureUtils.h +++ b/rpcs3/Emu/RSX/Common/TextureUtils.h @@ -4,7 +4,6 @@ #include "../color_utils.h" #include "../RSXTexture.h" -#include #include #include diff --git a/rpcs3/Emu/RSX/Common/bitfield.hpp b/rpcs3/Emu/RSX/Common/bitfield.hpp index 35906909d2..af02792fc7 100644 --- a/rpcs3/Emu/RSX/Common/bitfield.hpp +++ b/rpcs3/Emu/RSX/Common/bitfield.hpp @@ -1,5 +1,6 @@ #pragma once +#include "util/atomic.hpp" #include #include diff --git a/rpcs3/Emu/RSX/Common/buffer_stream.hpp b/rpcs3/Emu/RSX/Common/buffer_stream.hpp index c978ccca0a..ff68d6008d 100644 --- a/rpcs3/Emu/RSX/Common/buffer_stream.hpp +++ b/rpcs3/Emu/RSX/Common/buffer_stream.hpp @@ -1,7 +1,6 @@ #pragma once #include "util/types.hpp" -#include "util/asm.hpp" #if defined(ARCH_X64) #include "emmintrin.h" diff --git a/rpcs3/Emu/RSX/Common/io_buffer.h b/rpcs3/Emu/RSX/Common/io_buffer.h index 88e30f0972..29397d1136 100644 --- a/rpcs3/Emu/RSX/Common/io_buffer.h +++ b/rpcs3/Emu/RSX/Common/io_buffer.h @@ -2,7 +2,6 @@ #include #include #include -#include #include namespace rsx diff --git a/rpcs3/Emu/RSX/Common/profiling_timer.hpp b/rpcs3/Emu/RSX/Common/profiling_timer.hpp index 88851626cc..f5ecacb4eb 100644 --- a/rpcs3/Emu/RSX/Common/profiling_timer.hpp +++ b/rpcs3/Emu/RSX/Common/profiling_timer.hpp @@ -1,7 +1,7 @@ #pragma once #include -#include "time.hpp" +#include "Emu/Cell/timers.hpp" namespace rsx { diff --git a/rpcs3/Emu/RSX/Common/surface_store.h b/rpcs3/Emu/RSX/Common/surface_store.h index e4d3f2d3fb..35813965e0 100644 --- a/rpcs3/Emu/RSX/Common/surface_store.h +++ b/rpcs3/Emu/RSX/Common/surface_store.h @@ -10,8 +10,6 @@ #include "util/asm.hpp" -#include - namespace rsx { namespace utility diff --git a/rpcs3/Emu/RSX/Common/surface_utils.h b/rpcs3/Emu/RSX/Common/surface_utils.h index bcecfb8db8..2fb55810e4 100644 --- a/rpcs3/Emu/RSX/Common/surface_utils.h +++ b/rpcs3/Emu/RSX/Common/surface_utils.h @@ -2,7 +2,6 @@ #include "util/types.hpp" #include "Utilities/geometry.h" -#include "Utilities/address_range.h" #include "TextureUtils.h" #include "../rsx_utils.h" #include "Emu/Memory/vm.h" diff --git a/rpcs3/Emu/RSX/Common/texture_cache.h b/rpcs3/Emu/RSX/Common/texture_cache.h index 2b426e05b6..e367d46e6f 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache.h +++ b/rpcs3/Emu/RSX/Common/texture_cache.h @@ -9,8 +9,6 @@ #include -#include "Emu/Cell/timers.hpp" - #define RSX_GCM_FORMAT_IGNORED 0 namespace rsx diff --git a/rpcs3/Emu/RSX/Common/texture_cache_checker.h b/rpcs3/Emu/RSX/Common/texture_cache_checker.h index 0325dda596..094220ac33 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache_checker.h +++ b/rpcs3/Emu/RSX/Common/texture_cache_checker.h @@ -1,8 +1,9 @@ #pragma once +#ifdef TEXTURE_CACHE_DEBUG + #include "../rsx_utils.h" -#ifdef TEXTURE_CACHE_DEBUG namespace rsx { class tex_cache_checker_t { diff --git a/rpcs3/Emu/RSX/Common/texture_cache_predictor.h b/rpcs3/Emu/RSX/Common/texture_cache_predictor.h index 7b5421481d..a18fc93c76 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache_predictor.h +++ b/rpcs3/Emu/RSX/Common/texture_cache_predictor.h @@ -1,6 +1,5 @@ #pragma once -#include "../rsx_cache.h" #include "../rsx_utils.h" #include "TextureUtils.h" diff --git a/rpcs3/Emu/RSX/Common/texture_cache_utils.h b/rpcs3/Emu/RSX/Common/texture_cache_utils.h index d01660775e..3a87deceb7 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache_utils.h +++ b/rpcs3/Emu/RSX/Common/texture_cache_utils.h @@ -1,5 +1,6 @@ #pragma once +#include "Emu/System.h" #include "texture_cache_types.h" #include "texture_cache_predictor.h" #include "TextureUtils.h" diff --git a/rpcs3/Emu/RSX/Common/time.hpp b/rpcs3/Emu/RSX/Common/time.hpp index ad3aa56067..db176fb4cc 100644 --- a/rpcs3/Emu/RSX/Common/time.hpp +++ b/rpcs3/Emu/RSX/Common/time.hpp @@ -2,5 +2,3 @@ #include #include - -#include "Emu/Cell/timers.hpp" diff --git a/rpcs3/Emu/RSX/GCM.h b/rpcs3/Emu/RSX/GCM.h index 695b0a7611..c61e9907a4 100644 --- a/rpcs3/Emu/RSX/GCM.h +++ b/rpcs3/Emu/RSX/GCM.h @@ -1,9 +1,6 @@ #pragma once #include "Emu/Memory/vm_ptr.h" -#include "gcm_enums.h" -#include "util/atomic.hpp" - struct CellGcmControl { diff --git a/rpcs3/Emu/RSX/GL/GLDMA.cpp b/rpcs3/Emu/RSX/GL/GLDMA.cpp index 6f1e7f7fbe..758205214e 100644 --- a/rpcs3/Emu/RSX/GL/GLDMA.cpp +++ b/rpcs3/Emu/RSX/GL/GLDMA.cpp @@ -2,6 +2,7 @@ #include "GLDMA.h" #include "Emu/Memory/vm.h" +#include "Emu/RSX/GL/glutils/common.h" namespace gl { diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index f6d5d2f3b4..1731772911 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -3,7 +3,6 @@ #include "Emu/system_config.h" #include "GLCommonDecompiler.h" -#include "../GCM.h" #include "../Program/GLSLCommon.h" #include "../RSXThread.h" diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.h b/rpcs3/Emu/RSX/GL/GLFragmentProgram.h index fa955f22eb..c6b5244389 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.h +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.h @@ -1,7 +1,6 @@ #pragma once #include "../Program/FragmentProgramDecompiler.h" #include "../Program/GLSLTypes.h" -#include "GLHelpers.h" #include "glutils/program.h" namespace glsl diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h index d28898c052..1c84233934 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.h +++ b/rpcs3/Emu/RSX/GL/GLGSRender.h @@ -1,15 +1,15 @@ #pragma once #include "Emu/RSX/GSRender.h" -#include "GLHelpers.h" -#include "GLTexture.h" #include "GLTextureCache.h" #include "GLRenderTargets.h" #include "GLProgramBuffer.h" #include "GLOverlays.h" #include "GLShaderInterpreter.h" +#include "Emu/RSX/rsx_cache.h" #include #include +#include #include "glutils/ring_buffer.h" #include "upscalers/upscaling.h" diff --git a/rpcs3/Emu/RSX/GL/GLHelpers.cpp b/rpcs3/Emu/RSX/GL/GLHelpers.cpp index 37ec98f188..da95960f40 100644 --- a/rpcs3/Emu/RSX/GL/GLHelpers.cpp +++ b/rpcs3/Emu/RSX/GL/GLHelpers.cpp @@ -1,10 +1,7 @@ #include "stdafx.h" #include "GLHelpers.h" -#include "GLTexture.h" #include "GLCompute.h" #include "util/logs.hpp" - -#include "../Common/simple_array.hpp" #include namespace gl diff --git a/rpcs3/Emu/RSX/GL/GLOverlays.cpp b/rpcs3/Emu/RSX/GL/GLOverlays.cpp index 44fbe3dd3c..b9ea62f2f9 100644 --- a/rpcs3/Emu/RSX/GL/GLOverlays.cpp +++ b/rpcs3/Emu/RSX/GL/GLOverlays.cpp @@ -1,8 +1,8 @@ #include "GLOverlays.h" -#include "Emu/system_config.h" -#include "../rsx_utils.h" +#include "Utilities/StrUtil.h" #include "../Program/RSXOverlay.h" +#include "Emu/Cell/timers.hpp" namespace gl { diff --git a/rpcs3/Emu/RSX/GL/GLOverlays.h b/rpcs3/Emu/RSX/GL/GLOverlays.h index 5ad7065fd0..f70e885d2e 100644 --- a/rpcs3/Emu/RSX/GL/GLOverlays.h +++ b/rpcs3/Emu/RSX/GL/GLOverlays.h @@ -1,6 +1,7 @@ #pragma once #include "Emu/system_config_types.h" +#include "Emu/IdManager.h" #include "util/types.hpp" #include "../Common/simple_array.hpp" #include "../Overlays/overlays.h" diff --git a/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp b/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp index 445841b44b..bdf03c6fff 100644 --- a/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp +++ b/rpcs3/Emu/RSX/GL/GLPipelineCompiler.cpp @@ -1,9 +1,6 @@ #include "stdafx.h" #include "GLPipelineCompiler.h" #include "Utilities/Thread.h" - -#include - #include "util/sysinfo.hpp" namespace gl diff --git a/rpcs3/Emu/RSX/GL/GLProgramBuffer.h b/rpcs3/Emu/RSX/GL/GLProgramBuffer.h index fafb7d6f64..2d6f19f271 100644 --- a/rpcs3/Emu/RSX/GL/GLProgramBuffer.h +++ b/rpcs3/Emu/RSX/GL/GLProgramBuffer.h @@ -1,7 +1,6 @@ #pragma once #include "GLVertexProgram.h" #include "GLFragmentProgram.h" -#include "GLHelpers.h" #include "GLPipelineCompiler.h" #include "../Program/ProgramStateCache.h" #include "../rsx_utils.h" diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.h b/rpcs3/Emu/RSX/GL/GLRenderTargets.h index 3d573db52c..9b01746a87 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.h +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.h @@ -1,6 +1,5 @@ #pragma once #include "../Common/surface_store.h" -#include "GLHelpers.h" #include "../rsx_utils.h" #include "glutils/fbo.h" diff --git a/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp b/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp index 0687798efd..5d30ae5ab3 100644 --- a/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp +++ b/rpcs3/Emu/RSX/GL/GLShaderInterpreter.cpp @@ -1,6 +1,6 @@ #include "stdafx.h" #include "GLShaderInterpreter.h" -#include "GLGSRender.h" +#include "GLTextureCache.h" #include "GLVertexProgram.h" #include "GLFragmentProgram.h" #include "../rsx_methods.h" diff --git a/rpcs3/Emu/RSX/GL/GLShaderInterpreter.h b/rpcs3/Emu/RSX/GL/GLShaderInterpreter.h index 2c15010192..551fa9a8cf 100644 --- a/rpcs3/Emu/RSX/GL/GLShaderInterpreter.h +++ b/rpcs3/Emu/RSX/GL/GLShaderInterpreter.h @@ -1,5 +1,4 @@ #pragma once -#include "GLHelpers.h" #include "glutils/program.h" #include "../Program/ProgramStateCache.h" #include "../Common/TextureUtils.h" diff --git a/rpcs3/Emu/RSX/GL/GLTexture.cpp b/rpcs3/Emu/RSX/GL/GLTexture.cpp index 0bc4e3cb97..74ffd7bf7b 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.cpp +++ b/rpcs3/Emu/RSX/GL/GLTexture.cpp @@ -1,16 +1,13 @@ #include "stdafx.h" #include "GLTexture.h" #include "GLCompute.h" -#include "GLRenderTargets.h" #include "GLOverlays.h" #include "GLGSRender.h" #include "glutils/blitter.h" #include "glutils/ring_buffer.h" -#include "../GCM.h" #include "../RSXThread.h" -#include "../RSXTexture.h" #include "util/asm.hpp" diff --git a/rpcs3/Emu/RSX/GL/GLTexture.h b/rpcs3/Emu/RSX/GL/GLTexture.h index bcf52f21fa..dc6d90098a 100644 --- a/rpcs3/Emu/RSX/GL/GLTexture.h +++ b/rpcs3/Emu/RSX/GL/GLTexture.h @@ -1,12 +1,9 @@ #pragma once #include "OpenGL.h" -#include "../GCM.h" #include "../Common/TextureUtils.h" #include "GLHelpers.h" -#include - namespace rsx { class vertex_texture; diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.cpp b/rpcs3/Emu/RSX/GL/GLTextureCache.cpp index a3a06de4f5..f3103dac5c 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.cpp +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.cpp @@ -1,5 +1,4 @@ #include "stdafx.h" -#include "Emu/RSX/RSXThread.h" #include "GLTexture.h" #include "GLTextureCache.h" #include "../Common/BufferUtils.h" diff --git a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp index 23156c87e8..79286bd69d 100644 --- a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp @@ -1,14 +1,11 @@ #include "stdafx.h" #include "GLVertexProgram.h" -#include "Emu/System.h" #include "Emu/system_config.h" #include "GLCommonDecompiler.h" #include "../Program/GLSLCommon.h" -#include - std::string GLVertexDecompilerThread::getFloatTypeName(usz elementCount) { return glsl::getFloatTypeNameImpl(elementCount); diff --git a/rpcs3/Emu/RSX/GL/GLVertexProgram.h b/rpcs3/Emu/RSX/GL/GLVertexProgram.h index 7a630d0cd3..631b6ac245 100644 --- a/rpcs3/Emu/RSX/GL/GLVertexProgram.h +++ b/rpcs3/Emu/RSX/GL/GLVertexProgram.h @@ -1,6 +1,5 @@ #pragma once #include "../Program/VertexProgramDecompiler.h" -#include "GLHelpers.h" #include "glutils/program.h" #include diff --git a/rpcs3/Emu/RSX/GL/glutils/blitter.cpp b/rpcs3/Emu/RSX/GL/glutils/blitter.cpp index e7ca554e0e..57998b761d 100644 --- a/rpcs3/Emu/RSX/GL/glutils/blitter.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/blitter.cpp @@ -3,7 +3,6 @@ #include "state_tracker.hpp" #include "../GLTexture.h" // TODO: This system also needs to be refactored -#include "../GLOverlays.h" namespace gl { diff --git a/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp b/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp index 284014f613..d049359b84 100644 --- a/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "buffer_object.h" +#include "common.h" namespace gl { diff --git a/rpcs3/Emu/RSX/GL/glutils/buffer_object.h b/rpcs3/Emu/RSX/GL/glutils/buffer_object.h index e559318be9..dccb2a314e 100644 --- a/rpcs3/Emu/RSX/GL/glutils/buffer_object.h +++ b/rpcs3/Emu/RSX/GL/glutils/buffer_object.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "Emu/RSX/GL/OpenGL.h" namespace gl { diff --git a/rpcs3/Emu/RSX/GL/glutils/sampler.cpp b/rpcs3/Emu/RSX/GL/glutils/sampler.cpp index 144aab97d4..580caf0dc2 100644 --- a/rpcs3/Emu/RSX/GL/glutils/sampler.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/sampler.cpp @@ -2,7 +2,6 @@ #include "sampler.h" #include "Emu/RSX/gcm_enums.h" -#include "Emu/RSX/rsx_utils.h" #include "Emu/RSX/Common/TextureUtils.h" //GLenum wrap_mode(rsx::texture_wrap_mode wrap); diff --git a/rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp b/rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp index 940de27d89..cfd7b1cc08 100644 --- a/rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp +++ b/rpcs3/Emu/RSX/GL/upscalers/fsr1/fsr_pass.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" +#include "../../glutils/fbo.h" #include "../fsr_pass.h" #if defined(__GNUC__) diff --git a/rpcs3/Emu/RSX/GL/upscalers/upscaling.h b/rpcs3/Emu/RSX/GL/upscalers/upscaling.h index 4c90536668..9c8eec6439 100644 --- a/rpcs3/Emu/RSX/GL/upscalers/upscaling.h +++ b/rpcs3/Emu/RSX/GL/upscalers/upscaling.h @@ -1,8 +1,5 @@ #pragma once -#include "util/types.hpp" - -#include "../glutils/fbo.h" #include "../glutils/image.h" #include "../glutils/state_tracker.hpp" diff --git a/rpcs3/Emu/RSX/GSFrameBase.h b/rpcs3/Emu/RSX/GSFrameBase.h index fd91244ffe..1f426f9ef1 100644 --- a/rpcs3/Emu/RSX/GSFrameBase.h +++ b/rpcs3/Emu/RSX/GSFrameBase.h @@ -1,7 +1,6 @@ #pragma once #include "util/types.hpp" -#include "util/atomic.hpp" #include #include "display.h" diff --git a/rpcs3/Emu/RSX/GSRender.cpp b/rpcs3/Emu/RSX/GSRender.cpp index 2025842dab..e9e859952e 100644 --- a/rpcs3/Emu/RSX/GSRender.cpp +++ b/rpcs3/Emu/RSX/GSRender.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" +#include "Emu/System.h" #include "GSRender.h" GSRender::GSRender(utils::serial* ar) noexcept : rsx::thread(ar) diff --git a/rpcs3/Emu/RSX/NV47/FW/GRAPH_backend.h b/rpcs3/Emu/RSX/NV47/FW/GRAPH_backend.h index ab8a02984f..21c78cdaa5 100644 --- a/rpcs3/Emu/RSX/NV47/FW/GRAPH_backend.h +++ b/rpcs3/Emu/RSX/NV47/FW/GRAPH_backend.h @@ -2,8 +2,6 @@ #include "../HW/context.h" -#include - namespace rsx { // GRAPH backend class. Wraps RSX acceleration capabilities for the host. diff --git a/rpcs3/Emu/RSX/NV47/HW/nv406e.cpp b/rpcs3/Emu/RSX/NV47/HW/nv406e.cpp index 3c6d6de4e2..ced6c3f386 100644 --- a/rpcs3/Emu/RSX/NV47/HW/nv406e.cpp +++ b/rpcs3/Emu/RSX/NV47/HW/nv406e.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "nv406e.h" -#include "common.h" #include "nv47_sync.hpp" #include "Emu/RSX/RSXThread.h" diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h index f4495d8ae4..862baf5062 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_page.h @@ -1,6 +1,5 @@ #pragma once -#include "Emu/RSX/Overlays/overlays.h" #include "Emu/RSX/Overlays/overlay_list_view.hpp" #include "Emu/RSX/Overlays/HomeMenu/overlay_home_menu_components.h" #include "Emu/RSX/Overlays/HomeMenu/overlay_home_menu_message_box.h" diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp index fe82f81253..daaf5cc8ee 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "overlay_home_menu_settings.h" -#include "overlay_home_menu_components.h" #include "Emu/system_config.h" namespace rsx diff --git a/rpcs3/Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.cpp b/rpcs3/Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.cpp index 12ccdc0b27..69c3c41678 100644 --- a/rpcs3/Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/Network/overlay_recvmessage_dialog.cpp @@ -3,7 +3,6 @@ #include "overlay_recvmessage_dialog.h" #include "Emu/System.h" #include "Emu/NP/rpcn_client.h" -#include "Utilities/Thread.h" namespace rsx { diff --git a/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.cpp b/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.cpp index 4c2ca52e42..aed778e6da 100644 --- a/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.cpp @@ -7,7 +7,6 @@ #include "Emu/Cell/PPUThread.h" // for vm_var #include "Emu/Memory/vm_var.h" #include "Emu/Io/interception.h" -#include "Utilities/Thread.h" namespace rsx { @@ -384,7 +383,7 @@ namespace rsx } } - void sendmessage_dialog::callback_handler(u16 ntype, const std::string& username, bool status) + void sendmessage_dialog::callback_handler(rpcn::NotificationType ntype, const std::string& username, bool status) { std::lock_guard lock(m_mutex); diff --git a/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.h b/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.h index 2e4b09422e..508d296fc4 100644 --- a/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/Network/overlay_sendmessage_dialog.h @@ -40,7 +40,7 @@ namespace rsx compiled_resource get_compiled() override; error_code Exec(message_data& msg_data, std::set& npids) override; - void callback_handler(u16 ntype, const std::string& username, bool status) override; + void callback_handler(rpcn::NotificationType ntype, const std::string& username, bool status) override; }; } } diff --git a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.cpp b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.cpp index 3546592cfc..d3e522df2d 100644 --- a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.cpp +++ b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.cpp @@ -3,6 +3,7 @@ #include "../overlay_manager.h" #include "../overlay_message_dialog.h" #include "../../GSRender.h" +#include "Emu/System.h" #include "Emu/Cell/ErrorCodes.h" namespace rsx diff --git a/rpcs3/Emu/RSX/Overlays/overlay_animated_icon.cpp b/rpcs3/Emu/RSX/Overlays/overlay_animated_icon.cpp index d1af06bab2..3177a76a98 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_animated_icon.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_animated_icon.cpp @@ -2,7 +2,8 @@ #include "overlay_animated_icon.h" #include "Utilities/File.h" -#include "../Common/time.hpp" + +#include "Emu/Cell/timers.hpp" namespace rsx { diff --git a/rpcs3/Emu/RSX/Overlays/overlay_animated_icon.h b/rpcs3/Emu/RSX/Overlays/overlay_animated_icon.h index 71add8e9ce..b4a864d047 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_animated_icon.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_animated_icon.h @@ -1,6 +1,6 @@ #pragma once -#include "overlays.h" +#include "Emu/RSX/Overlays/overlay_controls.h" namespace rsx { diff --git a/rpcs3/Emu/RSX/Overlays/overlay_animation.cpp b/rpcs3/Emu/RSX/Overlays/overlay_animation.cpp index 3bab8b6bcc..0d5d8f3baa 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_animation.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_animation.cpp @@ -1,7 +1,6 @@ #include "stdafx.h" #include "overlay_animation.h" #include "overlay_controls.h" -#include "Emu/system_config.h" namespace rsx { diff --git a/rpcs3/Emu/RSX/Overlays/overlay_compile_notification.cpp b/rpcs3/Emu/RSX/Overlays/overlay_compile_notification.cpp index da7f58e6d7..434226bfa5 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_compile_notification.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_compile_notification.cpp @@ -1,5 +1,4 @@ #include "stdafx.h" -#include "overlays.h" #include "overlay_message.h" #include "overlay_loading_icon.hpp" diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp b/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp index 480967c0c0..cf6e18adca 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp @@ -5,6 +5,7 @@ #include "util/logs.hpp" #include "Utilities/geometry.h" #include "Utilities/File.h" +#include "Emu/Cell/timers.hpp" #ifndef _WIN32 #include diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.h b/rpcs3/Emu/RSX/Overlays/overlay_controls.h index f6d36ceaad..45a3fde222 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.h @@ -3,7 +3,6 @@ #include "overlay_fonts.h" #include "Emu/localized_string.h" -#include "Emu/Cell/timers.hpp" #include diff --git a/rpcs3/Emu/RSX/Overlays/overlay_cursor.cpp b/rpcs3/Emu/RSX/Overlays/overlay_cursor.cpp index 589bcabbcd..e20074d1b8 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_cursor.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_cursor.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "overlay_cursor.h" #include "overlay_manager.h" +#include "Emu/Cell/timers.hpp" namespace rsx { diff --git a/rpcs3/Emu/RSX/Overlays/overlay_cursor.h b/rpcs3/Emu/RSX/Overlays/overlay_cursor.h index 079346f649..d464c509fe 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_cursor.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_cursor.h @@ -1,6 +1,7 @@ #pragma once #include "overlays.h" +#include "Utilities/mutex.h" #include namespace rsx diff --git a/rpcs3/Emu/RSX/Overlays/overlay_fonts.cpp b/rpcs3/Emu/RSX/Overlays/overlay_fonts.cpp index 6de7440e5e..8f3c7173b4 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_fonts.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_fonts.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "overlay_controls.h" +#include "overlay_fonts.h" #include "Emu/System.h" #include "Emu/vfs_config.h" diff --git a/rpcs3/Emu/RSX/Overlays/overlay_manager.h b/rpcs3/Emu/RSX/Overlays/overlay_manager.h index d7a10988c1..7146be3dda 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_manager.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_manager.h @@ -5,10 +5,7 @@ #include "Emu/IdManager.h" #include "Utilities/mutex.h" #include "Utilities/Thread.h" -#include "Utilities/Timer.h" - -#include -#include +#include "Utilities/lockless.h" namespace rsx { diff --git a/rpcs3/Emu/RSX/Overlays/overlay_message.cpp b/rpcs3/Emu/RSX/Overlays/overlay_message.cpp index f7a7a8ed7c..b00f0cc5b3 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_message.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_message.cpp @@ -1,6 +1,6 @@ #include "stdafx.h" #include "overlay_message.h" -#include "Emu/RSX/Common/time.hpp" +#include "Emu/Cell/timers.hpp" namespace rsx { diff --git a/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp b/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp index c47b5687c0..4bf189e354 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_osk.cpp @@ -2,10 +2,10 @@ #include "overlay_manager.h" #include "overlay_osk.h" #include "Emu/Cell/Modules/cellSysutil.h" -#include "Emu/Cell/Modules/cellMsgDialog.h" -#include "Emu/Cell/Modules/cellKb.h" +#include "Emu/Io/Keyboard.h" #include "Emu/System.h" #include "Emu/system_config.h" +#include "Emu/Cell/timers.hpp" LOG_CHANNEL(osk, "OSK"); diff --git a/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp b/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp index 0bc954b0dc..0c4b9becac 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp @@ -7,7 +7,6 @@ #include #include -#include #include "util/cpu_stats.hpp" diff --git a/rpcs3/Emu/RSX/Overlays/overlay_user_list_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_user_list_dialog.cpp index b65f2bdb9b..a796d62de3 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_user_list_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_user_list_dialog.cpp @@ -4,8 +4,6 @@ #include "Emu/vfs_config.h" #include "Emu/system_utils.hpp" #include "Emu/System.h" -#include "Utilities/StrUtil.h" -#include "Utilities/Thread.h" namespace rsx { diff --git a/rpcs3/Emu/RSX/Overlays/overlays.cpp b/rpcs3/Emu/RSX/Overlays/overlays.cpp index a1fe40d8ce..47e7ee3f87 100644 --- a/rpcs3/Emu/RSX/Overlays/overlays.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlays.cpp @@ -1,12 +1,11 @@ #include "stdafx.h" #include "overlays.h" #include "overlay_manager.h" -#include "overlay_message_dialog.h" #include "Input/pad_thread.h" #include "Emu/Io/interception.h" #include "Emu/Io/KeyboardHandler.h" #include "Emu/RSX/RSXThread.h" -#include "Emu/RSX/Common/time.hpp" +#include "Emu/System.h" LOG_CHANNEL(overlays); diff --git a/rpcs3/Emu/RSX/Overlays/overlays.h b/rpcs3/Emu/RSX/Overlays/overlays.h index d706a6e3f6..254a47cb7b 100644 --- a/rpcs3/Emu/RSX/Overlays/overlays.h +++ b/rpcs3/Emu/RSX/Overlays/overlays.h @@ -2,10 +2,8 @@ #include "overlay_animation.h" #include "overlay_controls.h" -#include "Emu/IdManager.h" #include "Emu/Io/pad_types.h" -#include "Utilities/mutex.h" #include "Utilities/Timer.h" #include "../Common/bitfield.hpp" diff --git a/rpcs3/Emu/RSX/Program/CgBinaryProgram.h b/rpcs3/Emu/RSX/Program/CgBinaryProgram.h index 9e567952bc..f63e2adc1b 100644 --- a/rpcs3/Emu/RSX/Program/CgBinaryProgram.h +++ b/rpcs3/Emu/RSX/Program/CgBinaryProgram.h @@ -1,6 +1,6 @@ #pragma once -#include "Emu/Memory/vm.h" +#include "util/endian.hpp" #include "Emu/RSX/GL/GLVertexProgram.h" #include "Emu/RSX/GL/GLFragmentProgram.h" #include "Emu/RSX/Program/ProgramStateCache.h" diff --git a/rpcs3/Emu/RSX/Program/CgBinaryVertexProgram.cpp b/rpcs3/Emu/RSX/Program/CgBinaryVertexProgram.cpp index 00b1ca7204..c37fcd5a59 100644 --- a/rpcs3/Emu/RSX/Program/CgBinaryVertexProgram.cpp +++ b/rpcs3/Emu/RSX/Program/CgBinaryVertexProgram.cpp @@ -1,7 +1,5 @@ #include "stdafx.h" #include "CgBinaryProgram.h" - -#include "Emu/System.h" #include "RSXVertexProgram.h" void CgBinaryDisasm::AddScaCodeDisasm(const std::string& code) diff --git a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp index 4a2215d9f9..43e4d866a5 100644 --- a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp @@ -1,6 +1,4 @@ #include "stdafx.h" -#include "Emu/System.h" -#include "../rsx_methods.h" #include "FragmentProgramDecompiler.h" #include diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index 3f72a3b4a7..0a1005eb46 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -3,7 +3,6 @@ #include "GLSLCommon.h" #include "RSXFragmentProgram.h" -#include "Emu/system_config.h" #include "Emu/RSX/gcm_enums.h" #include "Utilities/StrFmt.h" diff --git a/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp b/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp index 6a1bcffc7a..b6c2fba452 100644 --- a/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp +++ b/rpcs3/Emu/RSX/Program/ProgramStateCache.cpp @@ -4,8 +4,6 @@ #include #include "util/v128.hpp" -#include "util/asm.hpp" - #if defined(ARCH_X64) #include "emmintrin.h" diff --git a/rpcs3/Emu/RSX/Program/SPIRVCommon.cpp b/rpcs3/Emu/RSX/Program/SPIRVCommon.cpp index e1aac0bd33..f40ff06161 100644 --- a/rpcs3/Emu/RSX/Program/SPIRVCommon.cpp +++ b/rpcs3/Emu/RSX/Program/SPIRVCommon.cpp @@ -20,7 +20,7 @@ #endif #include "SPIRVCommon.h" -#include "GLSLCommon.h" +#include "Emu/RSX/Program/GLSLTypes.h" namespace spirv { diff --git a/rpcs3/Emu/RSX/Program/VertexProgramDecompiler.cpp b/rpcs3/Emu/RSX/Program/VertexProgramDecompiler.cpp index 1511902300..dc9a034995 100644 --- a/rpcs3/Emu/RSX/Program/VertexProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Program/VertexProgramDecompiler.cpp @@ -1,6 +1,4 @@ #include "stdafx.h" -#include "Emu/System.h" - #include "VertexProgramDecompiler.h" #include diff --git a/rpcs3/Emu/RSX/RSXDisAsm.h b/rpcs3/Emu/RSX/RSXDisAsm.h index 08143cbfbf..445e5290bf 100644 --- a/rpcs3/Emu/RSX/RSXDisAsm.h +++ b/rpcs3/Emu/RSX/RSXDisAsm.h @@ -1,6 +1,6 @@ #pragma once -#include "Emu/Cell/PPCDisAsm.h" +#include "Emu/CPU/CPUDisAsm.h" class RSXDisAsm final : public CPUDisAsm { diff --git a/rpcs3/Emu/RSX/RSXFIFO.cpp b/rpcs3/Emu/RSX/RSXFIFO.cpp index 839144a754..3f6889bdaa 100644 --- a/rpcs3/Emu/RSX/RSXFIFO.cpp +++ b/rpcs3/Emu/RSX/RSXFIFO.cpp @@ -1,9 +1,9 @@ #include "stdafx.h" +#include "Emu/System.h" #include "RSXFIFO.h" #include "RSXThread.h" #include "Capture/rsx_capture.h" -#include "Common/time.hpp" #include "Core/RSXReservationLock.hpp" #include "Emu/Memory/vm_reservation.h" #include "Emu/Cell/lv2/sys_rsx.h" @@ -11,6 +11,7 @@ #include "util/asm.hpp" +#include #include using spu_rdata_t = std::byte[128]; diff --git a/rpcs3/Emu/RSX/RSXOffload.cpp b/rpcs3/Emu/RSX/RSXOffload.cpp index 97a27ae0ee..5f8737543e 100644 --- a/rpcs3/Emu/RSX/RSXOffload.cpp +++ b/rpcs3/Emu/RSX/RSXOffload.cpp @@ -6,6 +6,8 @@ #include "RSXOffload.h" #include "RSXThread.h" +#include "Utilities/lockless.h" + #include #include "util/asm.hpp" diff --git a/rpcs3/Emu/RSX/RSXTexture.cpp b/rpcs3/Emu/RSX/RSXTexture.cpp index 5951f368e9..9b8f4bfb2e 100644 --- a/rpcs3/Emu/RSX/RSXTexture.cpp +++ b/rpcs3/Emu/RSX/RSXTexture.cpp @@ -1,7 +1,6 @@ #include "stdafx.h" #include "RSXTexture.h" -#include "rsx_methods.h" #include "rsx_utils.h" #include "Emu/system_config.h" diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index e128203957..420aa6eb8e 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2,11 +2,7 @@ #include "RSXThread.h" #include "Capture/rsx_capture.h" -#include "Common/BufferUtils.h" -#include "Common/buffer_stream.hpp" -#include "Common/texture_cache.h" #include "Common/surface_store.h" -#include "Common/time.hpp" #include "Core/RSXReservationLock.hpp" #include "Core/RSXEngLock.hpp" #include "Host/MM.h" @@ -18,8 +14,8 @@ #include "gcm_printing.h" #include "RSXDisAsm.h" -#include "Emu/Cell/PPUCallback.h" -#include "Emu/Cell/SPUThread.h" +#include "Emu/System.h" +#include "Emu/Cell/PPUThread.h" #include "Emu/Cell/timers.hpp" #include "Emu/Cell/lv2/sys_event.h" #include "Emu/Cell/lv2/sys_time.h" @@ -27,19 +23,15 @@ #include "util/serialization_ext.hpp" #include "Overlays/overlay_perf_metrics.h" #include "Overlays/overlay_debug_overlay.h" -#include "Overlays/overlay_message.h" +#include "Overlays/overlay_manager.h" #include "Utilities/date_time.h" -#include "Utilities/StrUtil.h" -#include "Crypto/unzip.h" #include "util/asm.hpp" #include -#include #include #include -#include class GSRender; @@ -1638,7 +1630,10 @@ namespace rsx layout.aa_factors[1] = aa_factor_v; // Log this to frame stats - m_frame_stats.framebuffer_stats.add(layout.width, layout.height, aa_mode); + if (layout.target != rsx::surface_target::none) + { + m_frame_stats.framebuffer_stats.add(layout.width, layout.height, aa_mode); + } // Check if anything has changed bool really_changed = false; diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 4da43908c0..8b5f2af10d 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -1,14 +1,8 @@ #pragma once -#include #include #include -#include -#include -#include -#include "GCM.h" -#include "rsx_cache.h" #include "RSXFIFO.h" #include "RSXOffload.h" #include "RSXZCULL.h" @@ -32,7 +26,6 @@ #include "Core/RSXDriverState.h" #include "Core/RSXFrameBuffer.h" #include "Core/RSXContext.h" -#include "Core/RSXIOMap.hpp" #include "Core/RSXVertexTypes.h" #include "NV47/FW/GRAPH_backend.h" diff --git a/rpcs3/Emu/RSX/RSXZCULL.h b/rpcs3/Emu/RSX/RSXZCULL.h index cb072561fa..4627fa2ca5 100644 --- a/rpcs3/Emu/RSX/RSXZCULL.h +++ b/rpcs3/Emu/RSX/RSXZCULL.h @@ -4,6 +4,8 @@ #include #include +#include "Utilities/mutex.h" + #include "rsx_utils.h" #include diff --git a/rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp b/rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp index 7211d50e1e..fd4e667ef9 100644 --- a/rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp +++ b/rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp @@ -1,10 +1,5 @@ #include "VKAsyncScheduler.h" #include "VKHelpers.h" -#include "VKResourceManager.h" - -#include "Emu/IdManager.h" -#include "Utilities/lockless.h" -#include "Utilities/mutex.h" #include diff --git a/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h b/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h index 4613a122d2..0b00830804 100644 --- a/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h +++ b/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h @@ -2,8 +2,7 @@ #include "vkutils/commands.h" #include "vkutils/sync.h" - -#include "Utilities/Thread.h" +#include "Utilities/mutex.h" #define VK_MAX_ASYNC_COMPUTE_QUEUES 256 diff --git a/rpcs3/Emu/RSX/VK/VKCompute.cpp b/rpcs3/Emu/RSX/VK/VKCompute.cpp index e7cfb617ba..7cda0a8ff9 100644 --- a/rpcs3/Emu/RSX/VK/VKCompute.cpp +++ b/rpcs3/Emu/RSX/VK/VKCompute.cpp @@ -2,6 +2,7 @@ #include "VKHelpers.h" #include "VKRenderPass.h" #include "vkutils/buffer_object.h" +#include "VKPipelineCompiler.h" #define VK_MAX_COMPUTE_TASKS 8192 // Max number of jobs per frame diff --git a/rpcs3/Emu/RSX/VK/VKCompute.h b/rpcs3/Emu/RSX/VK/VKCompute.h index faadecfc18..4f9a3f2a3a 100644 --- a/rpcs3/Emu/RSX/VK/VKCompute.h +++ b/rpcs3/Emu/RSX/VK/VKCompute.h @@ -1,5 +1,5 @@ #pragma once -#include "VKPipelineCompiler.h" +#include "Emu/RSX/VK/VKProgramPipeline.h" #include "vkutils/descriptors.h" #include "vkutils/buffer_object.h" diff --git a/rpcs3/Emu/RSX/VK/VKDMA.h b/rpcs3/Emu/RSX/VK/VKDMA.h index 44ad623825..e718733649 100644 --- a/rpcs3/Emu/RSX/VK/VKDMA.h +++ b/rpcs3/Emu/RSX/VK/VKDMA.h @@ -1,6 +1,5 @@ #pragma once #include "vkutils/buffer_object.h" -#include "vkutils/commands.h" namespace vk { diff --git a/rpcs3/Emu/RSX/VK/VKFormats.h b/rpcs3/Emu/RSX/VK/VKFormats.h index 65aaab44ce..85b52ca56b 100644 --- a/rpcs3/Emu/RSX/VK/VKFormats.h +++ b/rpcs3/Emu/RSX/VK/VKFormats.h @@ -1,7 +1,6 @@ #pragma once #include "VulkanAPI.h" #include "../gcm_enums.h" -#include namespace vk { diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index eb57d11f7a..dd654a6736 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -5,7 +5,6 @@ #include "vkutils/device.h" #include "Emu/system_config.h" #include "../Program/GLSLCommon.h" -#include "../GCM.h" std::string VKFragmentDecompilerThread::getFloatTypeName(usz elementCount) { diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 2305e515e4..d37f6d62d0 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -4,7 +4,6 @@ #include "VKAsyncScheduler.h" #include "VKCommandStream.h" -#include "VKCommonDecompiler.h" #include "VKCommonPipelineLayout.h" #include "VKCompute.h" #include "VKGSRender.h" diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index c245a2677f..028aa6b178 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -17,15 +17,10 @@ #include "VKFramebuffer.h" #include "VKShaderInterpreter.h" #include "VKQueryPool.h" -#include "util/asm.hpp" -#include "Emu/RSX/GCM.h" #include "Emu/RSX/GSRender.h" #include "Emu/RSX/Host/RSXDMAWriter.h" -#include -#include - using namespace vk::vmm_allocation_pool_; // clang workaround. using namespace vk::upscaling_flags_; // ditto diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.cpp b/rpcs3/Emu/RSX/VK/VKHelpers.cpp index 45e5e1476f..a0d0b643d1 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.cpp +++ b/rpcs3/Emu/RSX/VK/VKHelpers.cpp @@ -7,12 +7,10 @@ #include "VKResolveHelper.h" #include "VKResourceManager.h" #include "VKDMA.h" -#include "VKCommandStream.h" #include "VKRenderPass.h" #include "vkutils/scratch.h" #include "vkutils/device.h" -#include "Emu/RSX/rsx_methods.h" #include namespace vk diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.h b/rpcs3/Emu/RSX/VK/VKHelpers.h index 281aab5f1b..302abfb805 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.h +++ b/rpcs3/Emu/RSX/VK/VKHelpers.h @@ -1,17 +1,9 @@ #pragma once #include "util/types.hpp" -#include -#include #include -#include -#include -#include -#include -#include #include "VulkanAPI.h" -#include "vkutils/chip_class.h" #include "Utilities/geometry.h" #include "Emu/RSX/Common/TextureUtils.h" #include "Emu/RSX/rsx_utils.h" diff --git a/rpcs3/Emu/RSX/VK/VKOverlays.cpp b/rpcs3/Emu/RSX/VK/VKOverlays.cpp index 3785b18efe..8f862cb6e3 100644 --- a/rpcs3/Emu/RSX/VK/VKOverlays.cpp +++ b/rpcs3/Emu/RSX/VK/VKOverlays.cpp @@ -15,6 +15,8 @@ #include "util/fnv_hash.hpp" +#include "Emu/Cell/timers.hpp" + namespace vk { overlay_pass::overlay_pass() diff --git a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp index 930210f19d..52742e1241 100644 --- a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp +++ b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp @@ -4,8 +4,6 @@ #include "vkutils/device.h" #include "Utilities/Thread.h" -#include - #include "util/sysinfo.hpp" namespace vk diff --git a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.h b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.h index 5ed3c7b07f..836bc5f14f 100644 --- a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.h +++ b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.h @@ -1,5 +1,4 @@ #pragma once -#include "../rsx_utils.h" #include "Utilities/lockless.h" #include "VKProgramPipeline.h" #include "vkutils/graphics_pipeline_state.hpp" diff --git a/rpcs3/Emu/RSX/VK/VKPresent.cpp b/rpcs3/Emu/RSX/VK/VKPresent.cpp index f1bcc214f9..e8f182c897 100644 --- a/rpcs3/Emu/RSX/VK/VKPresent.cpp +++ b/rpcs3/Emu/RSX/VK/VKPresent.cpp @@ -2,7 +2,6 @@ #include "VKGSRender.h" #include "vkutils/buffer_object.h" #include "Emu/RSX/Overlays/overlay_manager.h" -#include "Emu/RSX/Overlays/overlays.h" #include "Emu/RSX/Overlays/overlay_debug_overlay.h" #include "Emu/Cell/Modules/cellVideoOut.h" diff --git a/rpcs3/Emu/RSX/VK/VKProgramBuffer.h b/rpcs3/Emu/RSX/VK/VKProgramBuffer.h index 975364c726..63db151ab3 100644 --- a/rpcs3/Emu/RSX/VK/VKProgramBuffer.h +++ b/rpcs3/Emu/RSX/VK/VKProgramBuffer.h @@ -1,12 +1,9 @@ #pragma once #include "VKVertexProgram.h" #include "VKFragmentProgram.h" -#include "VKRenderPass.h" #include "VKPipelineCompiler.h" #include "../Program/ProgramStateCache.h" -#include "util/fnv_hash.hpp" - namespace vk { struct VKTraits diff --git a/rpcs3/Emu/RSX/VK/VKProgramPipeline.h b/rpcs3/Emu/RSX/VK/VKProgramPipeline.h index 4b7cdd9092..06dbaf877f 100644 --- a/rpcs3/Emu/RSX/VK/VKProgramPipeline.h +++ b/rpcs3/Emu/RSX/VK/VKProgramPipeline.h @@ -1,7 +1,7 @@ #pragma once #include "VulkanAPI.h" -#include "VKCommonDecompiler.h" +#include "Emu/RSX/Program/GLSLTypes.h" #include "vkutils/descriptors.h" diff --git a/rpcs3/Emu/RSX/VK/VKQueryPool.cpp b/rpcs3/Emu/RSX/VK/VKQueryPool.cpp index 3fd80a8d67..28cb2c2272 100644 --- a/rpcs3/Emu/RSX/VK/VKQueryPool.cpp +++ b/rpcs3/Emu/RSX/VK/VKQueryPool.cpp @@ -1,9 +1,11 @@ #include "stdafx.h" +#include "vkutils/query_pool.hpp" #include "VKHelpers.h" #include "VKQueryPool.h" #include "VKRenderPass.h" #include "VKResourceManager.h" #include "util/asm.hpp" +#include "VKGSRender.h" namespace vk { diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp b/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp index d09e248f6c..11e7747f2f 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp @@ -1,5 +1,4 @@ -#include "VKCompute.h" -#include "VKDMA.h" +#include "vkutils/data_heap.h" #include "VKRenderTargets.h" #include "VKResourceManager.h" #include "Emu/RSX/rsx_methods.h" diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.h b/rpcs3/Emu/RSX/VK/VKRenderTargets.h index 19c9f04f63..e7df9325c1 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.h +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.h @@ -7,13 +7,10 @@ #include "VKHelpers.h" #include "vkutils/barriers.h" #include "vkutils/buffer_object.h" -#include "vkutils/data_heap.h" #include "vkutils/device.h" #include "vkutils/image.h" #include "vkutils/scratch.h" -#include - namespace vk { namespace surface_cache_utils diff --git a/rpcs3/Emu/RSX/VK/VKResourceManager.h b/rpcs3/Emu/RSX/VK/VKResourceManager.h index 5a7e53896c..11e6558018 100644 --- a/rpcs3/Emu/RSX/VK/VKResourceManager.h +++ b/rpcs3/Emu/RSX/VK/VKResourceManager.h @@ -1,12 +1,11 @@ #pragma once -#include "vkutils/image.h" +#include "Emu/RSX/VK/vkutils/sync.h" #include "vkutils/garbage_collector.h" #include "vkutils/query_pool.hpp" #include "vkutils/sampler.h" #include "Utilities/mutex.h" -#include #include #include diff --git a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp index f32cbfdf3d..b31e8121e4 100644 --- a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp +++ b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp @@ -1,13 +1,14 @@ #include "stdafx.h" + #include "VKShaderInterpreter.h" #include "VKCommonPipelineLayout.h" #include "VKVertexProgram.h" #include "VKFragmentProgram.h" -#include "VKGSRender.h" - #include "../Program/GLSLCommon.h" #include "../Program/ShaderInterpreter.h" #include "../rsx_methods.h" +#include "VKHelpers.h" +#include "VKRenderPass.h" namespace vk { diff --git a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.h b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.h index 9dcd109402..0820f7f020 100644 --- a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.h +++ b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.h @@ -1,5 +1,7 @@ #pragma once -#include "VKProgramBuffer.h" +#include "Emu/RSX/VK/VKProgramPipeline.h" +#include "Emu/RSX/Program/ProgramStateCache.h" +#include "Emu/RSX/VK/VKPipelineCompiler.h" #include "vkutils/descriptors.h" #include diff --git a/rpcs3/Emu/RSX/VK/VKTexture.cpp b/rpcs3/Emu/RSX/VK/VKTexture.cpp index c44df5764d..1f6be63c78 100644 --- a/rpcs3/Emu/RSX/VK/VKTexture.cpp +++ b/rpcs3/Emu/RSX/VK/VKTexture.cpp @@ -5,7 +5,6 @@ #include "VKHelpers.h" #include "VKFormats.h" #include "VKRenderPass.h" -#include "VKRenderTargets.h" #include "vkutils/data_heap.h" #include "vkutils/image_helpers.h" diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp index 503474e6ac..7107e1f32b 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp @@ -1,7 +1,8 @@ #include "stdafx.h" -#include "VKGSRender.h" +#include "Emu/RSX/VK/VKGSRenderTypes.hpp" #include "VKTextureCache.h" #include "VKCompute.h" +#include "VKAsyncScheduler.h" #include "util/asm.hpp" diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.h b/rpcs3/Emu/RSX/VK/VKTextureCache.h index 4696062c70..d7d3f81e8d 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.h +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.h @@ -1,6 +1,5 @@ #pragma once -#include "VKAsyncScheduler.h" #include "VKDMA.h" #include "VKRenderTargets.h" #include "VKResourceManager.h" @@ -10,8 +9,6 @@ #include "../Common/texture_cache.h" #include "../Common/tiled_dma_copy.hpp" -#include "Emu/Cell/timers.hpp" - #include #include diff --git a/rpcs3/Emu/RSX/VK/VKVertexProgram.h b/rpcs3/Emu/RSX/VK/VKVertexProgram.h index 940272d069..1bb6dfd91c 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexProgram.h +++ b/rpcs3/Emu/RSX/VK/VKVertexProgram.h @@ -1,7 +1,5 @@ #pragma once #include "../Program/VertexProgramDecompiler.h" -#include "Utilities/Thread.h" -#include "VulkanAPI.h" #include "VKProgramPipeline.h" #include "vkutils/pipeline_binding_table.h" diff --git a/rpcs3/Emu/RSX/VK/upscalers/upscaling.h b/rpcs3/Emu/RSX/VK/upscalers/upscaling.h index 3f51558687..e9ebe31931 100644 --- a/rpcs3/Emu/RSX/VK/upscalers/upscaling.h +++ b/rpcs3/Emu/RSX/VK/upscalers/upscaling.h @@ -1,7 +1,5 @@ #pragma once -#include "util/types.hpp" - #include "../vkutils/commands.h" #include "../vkutils/image.h" diff --git a/rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp b/rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp index fdebf35f37..e8d8bc9c0d 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/image_helpers.cpp @@ -1,10 +1,8 @@ #include "stdafx.h" #include "image_helpers.h" #include "image.h" -#include "util/logs.hpp" #include "../VKRenderPass.h" #include "../../color_utils.h" -#include "../../gcm_enums.h" namespace vk { diff --git a/rpcs3/Emu/RSX/VK/vkutils/query_pool.hpp b/rpcs3/Emu/RSX/VK/vkutils/query_pool.hpp index 3cf0146c0b..0e480c2d0a 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/query_pool.hpp +++ b/rpcs3/Emu/RSX/VK/vkutils/query_pool.hpp @@ -2,6 +2,7 @@ #include "../VulkanAPI.h" #include "../../rsx_utils.h" +#include "shared.h" namespace vk { diff --git a/rpcs3/Emu/RSX/VK/vkutils/scratch.cpp b/rpcs3/Emu/RSX/VK/vkutils/scratch.cpp index a34c90091b..041067bea6 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/scratch.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/scratch.cpp @@ -1,10 +1,8 @@ #include "barriers.h" #include "buffer_object.h" #include "image.h" -#include "sampler.h" #include "../VKResourceManager.h" -#include "Utilities/address_range.h" #include diff --git a/rpcs3/Emu/RSX/color_utils.h b/rpcs3/Emu/RSX/color_utils.h index 1f78a18202..7d315c66ad 100644 --- a/rpcs3/Emu/RSX/color_utils.h +++ b/rpcs3/Emu/RSX/color_utils.h @@ -3,6 +3,7 @@ #include #include #include "gcm_enums.h" +#include "Utilities/StrFmt.h" namespace rsx { diff --git a/rpcs3/Emu/RSX/gcm_enums.cpp b/rpcs3/Emu/RSX/gcm_enums.cpp index b6a0292fd9..5c7d88c875 100644 --- a/rpcs3/Emu/RSX/gcm_enums.cpp +++ b/rpcs3/Emu/RSX/gcm_enums.cpp @@ -1,8 +1,6 @@ #include "gcm_enums.h" #include "Utilities/StrFmt.h" -#include "Utilities/Thread.h" - using namespace rsx; template <> diff --git a/rpcs3/Emu/RSX/gcm_enums.h b/rpcs3/Emu/RSX/gcm_enums.h index dcf8b51b28..eaa182171e 100644 --- a/rpcs3/Emu/RSX/gcm_enums.h +++ b/rpcs3/Emu/RSX/gcm_enums.h @@ -2,7 +2,6 @@ #include "util/types.hpp" #include "Common/expected.hpp" -#include "Utilities/StrFmt.h" namespace gcm { diff --git a/rpcs3/Emu/RSX/gcm_printing.h b/rpcs3/Emu/RSX/gcm_printing.h index 46c1b7ea1a..0542349644 100644 --- a/rpcs3/Emu/RSX/gcm_printing.h +++ b/rpcs3/Emu/RSX/gcm_printing.h @@ -2,7 +2,6 @@ #include "util/types.hpp" #include -#include namespace rsx { diff --git a/rpcs3/Emu/RSX/rsx_cache.h b/rpcs3/Emu/RSX/rsx_cache.h index f5eca2c85b..4bbec32d99 100644 --- a/rpcs3/Emu/RSX/rsx_cache.h +++ b/rpcs3/Emu/RSX/rsx_cache.h @@ -1,4 +1,5 @@ #pragma once +#include "../system_config.h" #include "Utilities/File.h" #include "Utilities/lockless.h" #include "Utilities/Thread.h" @@ -6,8 +7,8 @@ #include "Common/unordered_map.hpp" #include "Emu/System.h" #include "Emu/cache_utils.hpp" -#include "Program/ProgramStateCache.h" -#include "Common/texture_cache_checker.h" +#include "Emu/RSX/Program/RSXVertexProgram.h" +#include "Emu/RSX/Program/RSXFragmentProgram.h" #include "Overlays/Shaders/shader_loading_dialog.h" #include diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index a54a743996..ac5d92eef2 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -1,13 +1,11 @@ #include "stdafx.h" #include "rsx_methods.h" #include "RSXThread.h" -#include "rsx_utils.h" -#include "rsx_decode.h" -#include "Common/time.hpp" -#include "Emu/Cell/PPUCallback.h" +#include "Emu/Cell/PPUThread.h" #include "Emu/Cell/lv2/sys_rsx.h" -#include "Emu/RSX/Common/BufferUtils.h" + +#include "Emu/System.h" #include "Emu/RSX/NV47/HW/nv47.h" #include "Emu/RSX/NV47/HW/nv47_sync.hpp" #include "Emu/RSX/NV47/HW/context_accessors.define.h" // TODO: Context objects belong in FW not HW diff --git a/rpcs3/Emu/RSX/rsx_methods.h b/rpcs3/Emu/RSX/rsx_methods.h index d245a443e3..dbcb8bb15d 100644 --- a/rpcs3/Emu/RSX/rsx_methods.h +++ b/rpcs3/Emu/RSX/rsx_methods.h @@ -6,8 +6,6 @@ #include "rsx_decode.h" #include "RSXTexture.h" #include "rsx_vertex_data.h" -#include "Common/simple_array.hpp" -#include "Emu/Cell/timers.hpp" #include "Program/program_util.h" #include "NV47/FW/draw_call.hpp" diff --git a/rpcs3/Emu/RSX/rsx_utils.cpp b/rpcs3/Emu/RSX/rsx_utils.cpp index 03197d5ac1..7ca410a657 100644 --- a/rpcs3/Emu/RSX/rsx_utils.cpp +++ b/rpcs3/Emu/RSX/rsx_utils.cpp @@ -1,9 +1,7 @@ #include "stdafx.h" #include "rsx_utils.h" #include "rsx_methods.h" -#include "Emu/RSX/GCM.h" #include "Emu/Cell/Modules/cellVideoOut.h" -#include "Overlays/overlays.h" #ifdef _MSC_VER #pragma warning(push, 0) diff --git a/rpcs3/Emu/RSX/rsx_utils.h b/rpcs3/Emu/RSX/rsx_utils.h index 513d3c1bb8..c5ce6de16d 100644 --- a/rpcs3/Emu/RSX/rsx_utils.h +++ b/rpcs3/Emu/RSX/rsx_utils.h @@ -5,10 +5,6 @@ #include "Utilities/geometry.h" #include "gcm_enums.h" -#include -#include -#include - extern "C" { #include diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 7d60f57cdc..7cb2c444aa 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -10,6 +10,7 @@ #include "Emu/vfs_config.h" #include "Emu/IPC_config.h" #include "Emu/savestate_utils.hpp" +#include "Emu/cache_utils.hpp" #include "Emu/Cell/ErrorCodes.h" #include "Emu/Cell/PPUThread.h" @@ -41,14 +42,12 @@ #include "Utilities/StrUtil.h" #include "../Crypto/unself.h" -#include "../Crypto/unzip.h" #include "util/logs.hpp" #include "util/init_mutex.hpp" +#include "util/sysinfo.hpp" -#include #include #include -#include #include "Utilities/JIT.h" diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index f9d0546024..83a889af94 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -12,8 +12,6 @@ #include #include -#include "Emu/Cell/timers.hpp" - void init_fxo_for_exec(utils::serial*, bool); enum class localized_string_id; diff --git a/rpcs3/Emu/perf_meter.cpp b/rpcs3/Emu/perf_meter.cpp index 70cfa6b63e..adaed4cf47 100644 --- a/rpcs3/Emu/perf_meter.cpp +++ b/rpcs3/Emu/perf_meter.cpp @@ -5,6 +5,7 @@ #include "util/fence.hpp" #include "util/tsc.hpp" #include "Utilities/Thread.h" +#include "Utilities/mutex.h" #include #include diff --git a/rpcs3/Emu/perf_monitor.cpp b/rpcs3/Emu/perf_monitor.cpp index 5f0c6ad84b..15cdcf498f 100644 --- a/rpcs3/Emu/perf_monitor.cpp +++ b/rpcs3/Emu/perf_monitor.cpp @@ -2,6 +2,7 @@ #include "perf_monitor.hpp" #include "Emu/System.h" +#include "Emu/Cell/timers.hpp" #include "util/cpu_stats.hpp" #include "Utilities/Thread.h" diff --git a/rpcs3/Emu/perf_monitor.hpp b/rpcs3/Emu/perf_monitor.hpp index 634e891c83..a37b14fd9a 100644 --- a/rpcs3/Emu/perf_monitor.hpp +++ b/rpcs3/Emu/perf_monitor.hpp @@ -1,6 +1,7 @@ #pragma once -#include "util/types.hpp" +#include +using namespace std::literals; struct perf_monitor { diff --git a/rpcs3/Emu/savestate_utils.cpp b/rpcs3/Emu/savestate_utils.cpp index c1b5c953fb..31b24eba5f 100644 --- a/rpcs3/Emu/savestate_utils.cpp +++ b/rpcs3/Emu/savestate_utils.cpp @@ -1,7 +1,6 @@ #include "stdafx.h" #include "util/types.hpp" #include "util/logs.hpp" -#include "util/asm.hpp" #include "util/v128.hpp" #include "util/simd.hpp" #include "Utilities/File.h" @@ -12,7 +11,6 @@ #include "System.h" #include -#include #include LOG_CHANNEL(sys_log, "SYS"); diff --git a/rpcs3/Emu/system_config.h b/rpcs3/Emu/system_config.h index 0ede707dfc..993294fc92 100644 --- a/rpcs3/Emu/system_config.h +++ b/rpcs3/Emu/system_config.h @@ -1,6 +1,5 @@ #pragma once -#include "config_mode.h" #include "system_config_types.h" #include "Utilities/Config.h" diff --git a/rpcs3/Emu/system_config_types.h b/rpcs3/Emu/system_config_types.h index f3e3b31f42..9459ba698d 100644 --- a/rpcs3/Emu/system_config_types.h +++ b/rpcs3/Emu/system_config_types.h @@ -267,7 +267,7 @@ enum class np_internet_status enabled, }; -enum np_psn_status +enum class np_psn_status { disabled, psn_fake, diff --git a/rpcs3/Emu/system_utils.cpp b/rpcs3/Emu/system_utils.cpp index 49439dc3fc..2ccb15bd3f 100644 --- a/rpcs3/Emu/system_utils.cpp +++ b/rpcs3/Emu/system_utils.cpp @@ -6,7 +6,6 @@ #include "Emu/System.h" #include "util/sysinfo.hpp" #include "Utilities/File.h" -#include "Utilities/StrUtil.h" #include "Utilities/Thread.h" #include "Crypto/unpkg.h" #include "Crypto/unself.h" diff --git a/rpcs3/Emu/vfs_config.cpp b/rpcs3/Emu/vfs_config.cpp index 0d7508a284..bd292f9a25 100644 --- a/rpcs3/Emu/vfs_config.cpp +++ b/rpcs3/Emu/vfs_config.cpp @@ -1,7 +1,6 @@ #include "stdafx.h" #include "vfs_config.h" #include "Utilities/StrUtil.h" -#include "Utilities/StrFmt.h" LOG_CHANNEL(vfs_log, "VFS"); diff --git a/rpcs3/Input/ds3_pad_handler.cpp b/rpcs3/Input/ds3_pad_handler.cpp index 0ea5aad19f..c2cf89afec 100644 --- a/rpcs3/Input/ds3_pad_handler.cpp +++ b/rpcs3/Input/ds3_pad_handler.cpp @@ -2,8 +2,6 @@ #include "ds3_pad_handler.h" #include "Emu/Io/pad_config.h" -#include "util/asm.hpp" - LOG_CHANNEL(ds3_log, "DS3"); using namespace reports; diff --git a/rpcs3/Input/evdev_gun_handler.h b/rpcs3/Input/evdev_gun_handler.h index e5d83c391e..342fff40df 100644 --- a/rpcs3/Input/evdev_gun_handler.h +++ b/rpcs3/Input/evdev_gun_handler.h @@ -1,7 +1,6 @@ #pragma once #ifdef HAVE_LIBEVDEV -#include #include #include "Utilities/mutex.h" diff --git a/rpcs3/Input/evdev_joystick_handler.cpp b/rpcs3/Input/evdev_joystick_handler.cpp index d101d74173..989e95929d 100644 --- a/rpcs3/Input/evdev_joystick_handler.cpp +++ b/rpcs3/Input/evdev_joystick_handler.cpp @@ -8,7 +8,6 @@ #include "evdev_joystick_handler.h" #include "util/logs.hpp" -#include #include #include #include diff --git a/rpcs3/Input/evdev_joystick_handler.h b/rpcs3/Input/evdev_joystick_handler.h index f90fe12038..abf6f00988 100644 --- a/rpcs3/Input/evdev_joystick_handler.h +++ b/rpcs3/Input/evdev_joystick_handler.h @@ -9,7 +9,6 @@ #include #include #include -#include #include struct positive_axis : cfg::node diff --git a/rpcs3/Input/gui_pad_thread.cpp b/rpcs3/Input/gui_pad_thread.cpp index 7b69b24209..08d6b4e9ee 100644 --- a/rpcs3/Input/gui_pad_thread.cpp +++ b/rpcs3/Input/gui_pad_thread.cpp @@ -14,7 +14,6 @@ #include "sdl_pad_handler.h" #endif #include "Emu/Io/PadHandler.h" -#include "Emu/System.h" #include "Emu/system_config.h" #include "Utilities/Thread.h" #include "rpcs3qt/gui_settings.h" diff --git a/rpcs3/Input/hid_pad_handler.h b/rpcs3/Input/hid_pad_handler.h index e0e14a0a27..50e7d59e20 100644 --- a/rpcs3/Input/hid_pad_handler.h +++ b/rpcs3/Input/hid_pad_handler.h @@ -6,6 +6,8 @@ #include "hidapi.h" +#include + struct CalibData { s16 bias = 0; diff --git a/rpcs3/Input/pad_thread.cpp b/rpcs3/Input/pad_thread.cpp index f6e4026873..a2b91dd109 100644 --- a/rpcs3/Input/pad_thread.cpp +++ b/rpcs3/Input/pad_thread.cpp @@ -26,6 +26,7 @@ #include "Emu/RSX/Overlays/overlay_message.h" #include "Emu/Cell/lv2/sys_usbd.h" #include "Emu/Cell/Modules/cellGem.h" +#include "Emu/Cell/timers.hpp" #include "Utilities/Thread.h" #include "util/atomic.hpp" diff --git a/rpcs3/Input/product_info.cpp b/rpcs3/Input/product_info.cpp index 9ce26e7878..825b50d0c1 100644 --- a/rpcs3/Input/product_info.cpp +++ b/rpcs3/Input/product_info.cpp @@ -1,5 +1,9 @@ #include "Input/product_info.h" +#include + +#include "Emu/Io/pad_types.h" + namespace input { static const std::map input_products = { diff --git a/rpcs3/Input/product_info.h b/rpcs3/Input/product_info.h index da95fb4c59..82f397d2b6 100644 --- a/rpcs3/Input/product_info.h +++ b/rpcs3/Input/product_info.h @@ -1,7 +1,7 @@ #pragma once #include -#include "Emu/Io/pad_types.h" +#include "util/types.hpp" namespace input { diff --git a/rpcs3/Input/ps_move_handler.cpp b/rpcs3/Input/ps_move_handler.cpp index 4acf46cf5f..3b5aaec2f7 100644 --- a/rpcs3/Input/ps_move_handler.cpp +++ b/rpcs3/Input/ps_move_handler.cpp @@ -2,10 +2,7 @@ #include "ps_move_handler.h" #include "ps_move_calibration.h" #include "Emu/Io/pad_config.h" -#include "Emu/System.h" -#include "Emu/system_config.h" #include "Emu/Cell/Modules/cellGem.h" -#include "Input/ps_move_config.h" LOG_CHANNEL(move_log, "Move"); diff --git a/rpcs3/Input/ps_move_handler.h b/rpcs3/Input/ps_move_handler.h index d8efc463c7..9b1da1d58b 100644 --- a/rpcs3/Input/ps_move_handler.h +++ b/rpcs3/Input/ps_move_handler.h @@ -2,15 +2,6 @@ #include "hid_pad_handler.h" -#ifndef _MSC_VER -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wold-style-cast" -#endif -#include "3rdparty/fusion/fusion/Fusion/Fusion.h" -#ifndef _MSC_VER -#pragma GCC diagnostic pop -#endif - #include namespace reports diff --git a/rpcs3/Input/ps_move_tracker.h b/rpcs3/Input/ps_move_tracker.h index 5c9b9df9c7..a1fa0e8936 100644 --- a/rpcs3/Input/ps_move_tracker.h +++ b/rpcs3/Input/ps_move_tracker.h @@ -1,5 +1,7 @@ #pragma once +#include "Emu/Cell/Modules/cellGem.h" + #ifdef HAVE_OPENCV constexpr bool g_ps_move_tracking_supported = true; #else diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 07ca501ff3..9a916678ae 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -175,6 +175,7 @@ + @@ -618,6 +619,7 @@ + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index cf3626a7f5..de42637d4c 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -1029,6 +1029,9 @@ Emu\NP + + Emu\NP + Emu\NP @@ -2683,6 +2686,9 @@ Emu\NP + + Emu\NP + Emu\GPU\RSX\Core diff --git a/rpcs3/headless_application.cpp b/rpcs3/headless_application.cpp index e82bcc12dc..098b84532f 100644 --- a/rpcs3/headless_application.cpp +++ b/rpcs3/headless_application.cpp @@ -1,5 +1,6 @@ #include "headless_application.h" +#include "Emu/System.h" #include "Emu/RSX/Null/NullGSRender.h" #include "Emu/Cell/Modules/cellMsgDialog.h" #include "Emu/Cell/Modules/cellOskDialog.h" diff --git a/rpcs3/rpcs3qt/basic_mouse_settings_dialog.h b/rpcs3/rpcs3qt/basic_mouse_settings_dialog.h index c432143185..3de5029978 100644 --- a/rpcs3/rpcs3qt/basic_mouse_settings_dialog.h +++ b/rpcs3/rpcs3qt/basic_mouse_settings_dialog.h @@ -1,7 +1,5 @@ #pragma once -#include "Emu/Io/MouseHandler.h" - #include #include #include diff --git a/rpcs3/rpcs3qt/cg_disasm_window.h b/rpcs3/rpcs3qt/cg_disasm_window.h index f1df84e507..dc0a963c84 100644 --- a/rpcs3/rpcs3qt/cg_disasm_window.h +++ b/rpcs3/rpcs3qt/cg_disasm_window.h @@ -1,7 +1,5 @@ #pragma once -#include "util/types.hpp" - #include #include diff --git a/rpcs3/rpcs3qt/cheat_manager.cpp b/rpcs3/rpcs3qt/cheat_manager.cpp index d5af8a1a2f..cd7fe67804 100644 --- a/rpcs3/rpcs3qt/cheat_manager.cpp +++ b/rpcs3/rpcs3qt/cheat_manager.cpp @@ -14,11 +14,12 @@ #include "Emu/IdManager.h" #include "Emu/Cell/PPUAnalyser.h" -#include "Emu/Cell/PPUFunction.h" +#include "Emu/Cell/PPUInterpreter.h" #include "Emu/Cell/lv2/sys_sync.h" #include "util/yaml.hpp" #include "util/asm.hpp" +#include "util/logs.hpp" #include "util/to_endian.hpp" #include "Utilities/File.h" #include "Utilities/StrUtil.h" diff --git a/rpcs3/rpcs3qt/curl_handle.cpp b/rpcs3/rpcs3qt/curl_handle.cpp index ff40004dec..cb91311d26 100644 --- a/rpcs3/rpcs3qt/curl_handle.cpp +++ b/rpcs3/rpcs3qt/curl_handle.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "curl_handle.h" -#include "Emu/system_utils.hpp" #include "util/logs.hpp" #ifdef _WIN32 diff --git a/rpcs3/rpcs3qt/debugger_list.cpp b/rpcs3/rpcs3qt/debugger_list.cpp index 9123df3907..d1e0f97677 100644 --- a/rpcs3/rpcs3qt/debugger_list.cpp +++ b/rpcs3/rpcs3qt/debugger_list.cpp @@ -4,13 +4,14 @@ #include "breakpoint_handler.h" #include "Emu/Cell/SPUThread.h" -#include "Emu/Cell/PPUThread.h" #include "Emu/CPU/CPUDisAsm.h" #include "Emu/CPU/CPUThread.h" #include "Emu/RSX/RSXDisAsm.h" #include "Emu/RSX/RSXThread.h" #include "Emu/System.h" +#include "util/asm.hpp" + #include #include #include diff --git a/rpcs3/rpcs3qt/dimensions_dialog.cpp b/rpcs3/rpcs3qt/dimensions_dialog.cpp index 596d94ae25..378f887f22 100644 --- a/rpcs3/rpcs3qt/dimensions_dialog.cpp +++ b/rpcs3/rpcs3qt/dimensions_dialog.cpp @@ -3,10 +3,6 @@ #include "dimensions_dialog.h" #include "Emu/Io/Dimensions.h" -#include "util/asm.hpp" - -#include - #include #include #include diff --git a/rpcs3/rpcs3qt/elf_memory_dumping_dialog.cpp b/rpcs3/rpcs3qt/elf_memory_dumping_dialog.cpp index b96699197a..c191b878de 100644 --- a/rpcs3/rpcs3qt/elf_memory_dumping_dialog.cpp +++ b/rpcs3/rpcs3qt/elf_memory_dumping_dialog.cpp @@ -1,6 +1,4 @@ #include "elf_memory_dumping_dialog.h" -#include "Utilities/Config.h" - #include "Emu/Cell/SPUThread.h" #include "qt_utils.h" diff --git a/rpcs3/rpcs3qt/emu_settings.cpp b/rpcs3/rpcs3qt/emu_settings.cpp index eb6439243a..a8a11d3985 100644 --- a/rpcs3/rpcs3qt/emu_settings.cpp +++ b/rpcs3/rpcs3qt/emu_settings.cpp @@ -8,7 +8,6 @@ #include "Emu/System.h" #include "Emu/system_config.h" -#include "Emu/vfs_config.h" #include "Emu/system_utils.hpp" #include "Emu/Cell/Modules/cellSysutil.h" #include "Emu/Io/Keyboard.h" diff --git a/rpcs3/rpcs3qt/emulated_pad_settings_dialog.h b/rpcs3/rpcs3qt/emulated_pad_settings_dialog.h index ad1b863d7e..490dee3ae7 100644 --- a/rpcs3/rpcs3qt/emulated_pad_settings_dialog.h +++ b/rpcs3/rpcs3qt/emulated_pad_settings_dialog.h @@ -1,7 +1,5 @@ #pragma once -#include "Emu/Io/pad_types.h" - #include #include #include diff --git a/rpcs3/rpcs3qt/game_list.h b/rpcs3/rpcs3qt/game_list.h index 1a5ce6b921..3007ee62d7 100644 --- a/rpcs3/rpcs3qt/game_list.h +++ b/rpcs3/rpcs3qt/game_list.h @@ -7,7 +7,6 @@ #include #include "game_list_base.h" -#include "util/atomic.hpp" #include diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 150724deea..2df8852718 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -2,28 +2,23 @@ #include "qt_utils.h" #include "settings_dialog.h" #include "pad_settings_dialog.h" -#include "custom_table_widget_item.h" #include "input_dialog.h" #include "localized.h" #include "progress_dialog.h" #include "persistent_settings.h" #include "emu_settings.h" #include "gui_settings.h" -#include "game_list_delegate.h" #include "game_list_table.h" #include "game_list_grid.h" #include "game_list_grid_item.h" #include "patch_manager_dialog.h" -#include "Emu/Memory/vm.h" #include "Emu/System.h" #include "Emu/vfs_config.h" #include "Emu/system_utils.hpp" #include "Loader/PSF.h" #include "util/types.hpp" #include "Utilities/File.h" -#include "Utilities/mutex.h" -#include "util/yaml.hpp" #include "util/sysinfo.hpp" #include "Input/pad_thread.h" diff --git a/rpcs3/rpcs3qt/game_list_frame.h b/rpcs3/rpcs3qt/game_list_frame.h index 60c4e0daee..bbef37e377 100644 --- a/rpcs3/rpcs3qt/game_list_frame.h +++ b/rpcs3/rpcs3qt/game_list_frame.h @@ -2,7 +2,6 @@ #include "game_list.h" #include "custom_dock_widget.h" -#include "gui_save.h" #include "shortcut_utils.h" #include "Utilities/lockless.h" #include "Utilities/mutex.h" diff --git a/rpcs3/rpcs3qt/game_list_grid.cpp b/rpcs3/rpcs3qt/game_list_grid.cpp index fd8301a297..5b6e4c3410 100644 --- a/rpcs3/rpcs3qt/game_list_grid.cpp +++ b/rpcs3/rpcs3qt/game_list_grid.cpp @@ -1,7 +1,6 @@ #include "stdafx.h" #include "game_list_grid.h" #include "game_list_grid_item.h" -#include "movie_item.h" #include "gui_settings.h" #include "qt_utils.h" #include "Utilities/File.h" diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index 75f04e3395..b24ce33fc3 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -12,7 +12,6 @@ #include "Emu/IdManager.h" #include "Emu/Audio/audio_utils.h" #include "Emu/Cell/Modules/cellScreenshot.h" -#include "Emu/Cell/Modules/cellVideoOut.h" #include "Emu/Cell/Modules/cellAudio.h" #include "Emu/Cell/lv2/sys_rsxaudio.h" #include "Emu/RSX/rsx_utils.h" diff --git a/rpcs3/rpcs3qt/gui_application.cpp b/rpcs3/rpcs3qt/gui_application.cpp index 7c01333540..b0a5d53812 100644 --- a/rpcs3/rpcs3qt/gui_application.cpp +++ b/rpcs3/rpcs3qt/gui_application.cpp @@ -21,7 +21,6 @@ #include "Emu/Audio/audio_utils.h" #include "Emu/Io/Null/null_camera_handler.h" #include "Emu/Io/Null/null_music_handler.h" -#include "Emu/Cell/lv2/sys_usbd.h" #include "Emu/vfs_config.h" #include "util/init_mutex.hpp" #include "util/console.h" @@ -57,6 +56,8 @@ #ifdef _WIN32 #include #include + +#include "Emu/Cell/lv2/sys_usbd.h" #endif LOG_CHANNEL(gui_log, "GUI"); diff --git a/rpcs3/rpcs3qt/gui_settings.cpp b/rpcs3/rpcs3qt/gui_settings.cpp index cb258fb5f0..8f42a14dd7 100644 --- a/rpcs3/rpcs3qt/gui_settings.cpp +++ b/rpcs3/rpcs3qt/gui_settings.cpp @@ -1,7 +1,7 @@ #include "gui_settings.h" #include "qt_utils.h" -#include "localized.h" +#include "category.h" #include "Emu/System.h" @@ -9,8 +9,6 @@ #include #include -#include - LOG_CHANNEL(cfg_log, "CFG"); extern void qt_events_aware_op(int repeat_duration_ms, std::function wrapped_op); diff --git a/rpcs3/rpcs3qt/infinity_dialog.cpp b/rpcs3/rpcs3qt/infinity_dialog.cpp index 18d1cfe241..b172ddad22 100644 --- a/rpcs3/rpcs3qt/infinity_dialog.cpp +++ b/rpcs3/rpcs3qt/infinity_dialog.cpp @@ -1,15 +1,10 @@ #include "stdafx.h" #include "Utilities/File.h" -#include "Crypto/md5.h" #include "Crypto/aes.h" #include "Crypto/sha1.h" #include "infinity_dialog.h" #include "Emu/Io/Infinity.h" -#include "util/asm.hpp" - -#include - #include #include #include diff --git a/rpcs3/rpcs3qt/kernel_explorer.cpp b/rpcs3/rpcs3qt/kernel_explorer.cpp index e30fdff643..3b50f9ea97 100644 --- a/rpcs3/rpcs3qt/kernel_explorer.cpp +++ b/rpcs3/rpcs3qt/kernel_explorer.cpp @@ -7,6 +7,7 @@ #include #include "Emu/IdManager.h" +#include "Emu/System.h" #include "Emu/Cell/PPUThread.h" #include "Emu/Cell/SPUThread.h" #include "Emu/Cell/lv2/sys_lwmutex.h" diff --git a/rpcs3/rpcs3qt/log_frame.cpp b/rpcs3/rpcs3qt/log_frame.cpp index a318a9c03d..d01bd1bf4f 100644 --- a/rpcs3/rpcs3qt/log_frame.cpp +++ b/rpcs3/rpcs3qt/log_frame.cpp @@ -2,8 +2,6 @@ #include "qt_utils.h" #include "gui_settings.h" -#include "rpcs3_version.h" -#include "Utilities/mutex.h" #include "Utilities/lockless.h" #include "util/asm.hpp" @@ -14,7 +12,6 @@ #include #include -#include #include #include diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index a67af2cc6e..1f7eceba0a 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -39,12 +39,10 @@ #include "system_cmd_dialog.h" #include "emulated_pad_settings_dialog.h" #include "basic_mouse_settings_dialog.h" -#include "raw_mouse_settings_dialog.h" #include "vfs_tool_dialog.h" #include "welcome_dialog.h" #include -#include #include #include @@ -65,6 +63,7 @@ #include "Emu/system_utils.hpp" #include "Emu/system_config.h" #include "Emu/savestate_utils.hpp" +#include "Emu/Cell/timers.hpp" #include "Crypto/unpkg.h" #include "Crypto/unself.h" @@ -92,6 +91,10 @@ #include #endif +#ifdef _WIN32 +#include "raw_mouse_settings_dialog.h" +#endif + LOG_CHANNEL(gui_log, "GUI"); extern atomic_t g_user_asked_for_frame_capture; diff --git a/rpcs3/rpcs3qt/memory_string_searcher.cpp b/rpcs3/rpcs3qt/memory_string_searcher.cpp index fc56509a12..c55cb8144d 100644 --- a/rpcs3/rpcs3qt/memory_string_searcher.cpp +++ b/rpcs3/rpcs3qt/memory_string_searcher.cpp @@ -1,9 +1,9 @@ #include "memory_viewer_panel.h" #include "Emu/Memory/vm.h" + #include "Emu/Memory/vm_reservation.h" #include "Emu/CPU/CPUDisAsm.h" #include "Emu/Cell/SPUDisAsm.h" -#include "Emu/IdManager.h" #include "Utilities/Thread.h" #include "Utilities/StrUtil.h" @@ -11,7 +11,6 @@ #include #include -#include #include #include "util/logs.hpp" diff --git a/rpcs3/rpcs3qt/memory_viewer_panel.cpp b/rpcs3/rpcs3qt/memory_viewer_panel.cpp index f9f246fbda..c1ae7a0a0e 100644 --- a/rpcs3/rpcs3qt/memory_viewer_panel.cpp +++ b/rpcs3/rpcs3qt/memory_viewer_panel.cpp @@ -1,4 +1,3 @@ -#include "Utilities/mutex.h" #include "Emu/Memory/vm_locking.h" #include "Emu/Memory/vm.h" @@ -6,7 +5,6 @@ #include "Emu/Cell/SPUThread.h" #include "Emu/CPU/CPUDisAsm.h" -#include "Emu/Cell/SPUDisAsm.h" #include "Emu/RSX/RSXThread.h" #include "Emu/RSX/rsx_utils.h" #include "Emu/IdManager.h" @@ -26,7 +24,6 @@ #include "util/logs.hpp" #include "util/asm.hpp" -#include "util/vm.hpp" LOG_CHANNEL(gui_log, "GUI"); diff --git a/rpcs3/rpcs3qt/microphone_creator.cpp b/rpcs3/rpcs3qt/microphone_creator.cpp index 8f56bcae4e..daf9116eff 100644 --- a/rpcs3/rpcs3qt/microphone_creator.cpp +++ b/rpcs3/rpcs3qt/microphone_creator.cpp @@ -1,10 +1,10 @@ #include "stdafx.h" #include "microphone_creator.h" -#include "Utilities/StrFmt.h" #include "Utilities/StrUtil.h" -#include "3rdparty/OpenAL/openal-soft/include/AL/alext.h" +#include "3rdparty/OpenAL/openal-soft/include/AL/al.h" +#include "3rdparty/OpenAL/openal-soft/include/AL/alc.h" LOG_CHANNEL(cfg_log, "CFG"); diff --git a/rpcs3/rpcs3qt/osk_dialog_frame.cpp b/rpcs3/rpcs3qt/osk_dialog_frame.cpp index 8e9b385278..4e4c89318c 100644 --- a/rpcs3/rpcs3qt/osk_dialog_frame.cpp +++ b/rpcs3/rpcs3qt/osk_dialog_frame.cpp @@ -1,8 +1,7 @@ #include "osk_dialog_frame.h" #include "custom_dialog.h" -#include "Emu/Cell/Modules/cellMsgDialog.h" -#include "util/asm.hpp" +#include "util/bless.hpp" #include #include diff --git a/rpcs3/rpcs3qt/pad_motion_settings_dialog.h b/rpcs3/rpcs3qt/pad_motion_settings_dialog.h index eeb413453b..f2c7713c6f 100644 --- a/rpcs3/rpcs3qt/pad_motion_settings_dialog.h +++ b/rpcs3/rpcs3qt/pad_motion_settings_dialog.h @@ -13,6 +13,7 @@ #include #include +#include namespace Ui { diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.cpp b/rpcs3/rpcs3qt/pad_settings_dialog.cpp index 9591514dc3..c20510c929 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/pad_settings_dialog.cpp @@ -16,8 +16,6 @@ #include "Emu/System.h" #include "Emu/system_utils.hpp" -#include "Emu/Io/Null/NullPadHandler.h" -#include "Utilities/File.h" #include "Input/pad_thread.h" #include "Input/gui_pad_thread.h" diff --git a/rpcs3/rpcs3qt/patch_manager_dialog.cpp b/rpcs3/rpcs3qt/patch_manager_dialog.cpp index a504e5790f..47cc299160 100644 --- a/rpcs3/rpcs3qt/patch_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/patch_manager_dialog.cpp @@ -14,7 +14,6 @@ #include "ui_patch_manager_dialog.h" #include "patch_manager_dialog.h" -#include "table_item_delegate.h" #include "gui_settings.h" #include "downloader.h" #include "qt_utils.h" diff --git a/rpcs3/rpcs3qt/ps_move_tracker_dialog.h b/rpcs3/rpcs3qt/ps_move_tracker_dialog.h index c7a8641e7e..fe3b043b26 100644 --- a/rpcs3/rpcs3qt/ps_move_tracker_dialog.h +++ b/rpcs3/rpcs3qt/ps_move_tracker_dialog.h @@ -1,9 +1,7 @@ #pragma once -#include "Utilities/mutex.h" #include "Utilities/Thread.h" #include "Input/pad_thread.h" -#include "Emu/Cell/Modules/cellGem.h" #include #include diff --git a/rpcs3/rpcs3qt/qt_camera_video_sink.h b/rpcs3/rpcs3qt/qt_camera_video_sink.h index 94946c177d..e3f405b55c 100644 --- a/rpcs3/rpcs3qt/qt_camera_video_sink.h +++ b/rpcs3/rpcs3qt/qt_camera_video_sink.h @@ -7,6 +7,7 @@ #include #include +#include class qt_camera_video_sink final : public QVideoSink { diff --git a/rpcs3/rpcs3qt/recvmessage_dialog_frame.cpp b/rpcs3/rpcs3qt/recvmessage_dialog_frame.cpp index b617d74d95..7a805a5723 100644 --- a/rpcs3/rpcs3qt/recvmessage_dialog_frame.cpp +++ b/rpcs3/rpcs3qt/recvmessage_dialog_frame.cpp @@ -7,6 +7,7 @@ #include "recvmessage_dialog_frame.h" #include "Emu/IdManager.h" #include "Emu/System.h" +#include "Emu/NP/rpcn_client.h" #include "util/logs.hpp" diff --git a/rpcs3/rpcs3qt/recvmessage_dialog_frame.h b/rpcs3/rpcs3qt/recvmessage_dialog_frame.h index 28255253dd..10b9bd87e9 100644 --- a/rpcs3/rpcs3qt/recvmessage_dialog_frame.h +++ b/rpcs3/rpcs3qt/recvmessage_dialog_frame.h @@ -4,8 +4,9 @@ #include #include "util/types.hpp" +#include "util/shared_ptr.hpp" #include "custom_dialog.h" -#include "Emu/NP/rpcn_client.h" +#include "Emu/Cell/Modules/sceNp.h" struct recvmessage_signal_struct { diff --git a/rpcs3/rpcs3qt/register_editor_dialog.h b/rpcs3/rpcs3qt/register_editor_dialog.h index 814d64cf39..c5ac750d8d 100644 --- a/rpcs3/rpcs3qt/register_editor_dialog.h +++ b/rpcs3/rpcs3qt/register_editor_dialog.h @@ -1,7 +1,5 @@ #pragma once -#include "util/types.hpp" - #include #include #include diff --git a/rpcs3/rpcs3qt/render_creator.cpp b/rpcs3/rpcs3qt/render_creator.cpp index 8e16e66d95..b85336bf8b 100644 --- a/rpcs3/rpcs3qt/render_creator.cpp +++ b/rpcs3/rpcs3qt/render_creator.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include LOG_CHANNEL(cfg_log, "CFG"); diff --git a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp index 499e1e2cc1..673dc53c52 100644 --- a/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/rpcn_settings_dialog.cpp @@ -7,14 +7,14 @@ #include #include #include - -#include +#include #include "qt_utils.h" #include "rpcn_settings_dialog.h" #include "Emu/System.h" #include "Emu/NP/rpcn_config.h" +#include "Emu/NP/ip_address.h" #include #include @@ -162,6 +162,9 @@ rpcn_account_dialog::rpcn_account_dialog(QWidget* parent) QPushButton* btn_test = new QPushButton(tr("Test Account")); QLabel* label_npid = new QLabel(); + QCheckBox* checkbox_disable_ipv6 = new QCheckBox("Disable IPv6"); + checkbox_disable_ipv6->setCheckState(g_cfg_rpcn.get_ipv6_support() ? Qt::Unchecked : Qt::Checked); + const auto update_npid_label = [label_npid]() { const std::string npid = g_cfg_rpcn.get_npid(); @@ -180,6 +183,7 @@ rpcn_account_dialog::rpcn_account_dialog(QWidget* parent) grp_buttons->setLayout(vbox_buttons); vbox_global->addWidget(grp_buttons); + vbox_global->addWidget(checkbox_disable_ipv6); setLayout(vbox_global); @@ -195,6 +199,10 @@ rpcn_account_dialog::rpcn_account_dialog(QWidget* parent) g_cfg_rpcn.set_host(host.toString().toStdString()); g_cfg_rpcn.save(); + + // Resets the state in case the support was limited by the RPCN server + if (!np::is_ipv6_supported()) + np::is_ipv6_supported(np::IPV6_SUPPORT::IPV6_UNKNOWN); }); connect(btn_add_server, &QAbstractButton::clicked, this, [this]() @@ -335,6 +343,12 @@ rpcn_account_dialog::rpcn_account_dialog(QWidget* parent) QMessageBox::information(this, tr("RPCN Account Valid!"), tr("Your account is valid!"), QMessageBox::Ok); }); + + connect(checkbox_disable_ipv6, &QCheckBox::checkStateChanged, this, [this](Qt::CheckState state) + { + g_cfg_rpcn.set_ipv6_support(state == Qt::Unchecked); + g_cfg_rpcn.save(); + }); } void rpcn_account_dialog::refresh_combobox() @@ -870,6 +884,8 @@ void rpcn_account_edit_dialog::change_password() return; } + g_cfg_rpcn.set_password(*password); + g_cfg_rpcn.save(); QMessageBox::information(this, tr("Password Successfully Changed!"), tr("Your password has been successfully changed!"), QMessageBox::Ok); } break; diff --git a/rpcs3/rpcs3qt/rsx_debugger.cpp b/rpcs3/rpcs3qt/rsx_debugger.cpp index e8d8bec3ea..809ce37525 100644 --- a/rpcs3/rpcs3qt/rsx_debugger.cpp +++ b/rpcs3/rpcs3qt/rsx_debugger.cpp @@ -4,7 +4,7 @@ #include "table_item_delegate.h" #include "Emu/RSX/RSXThread.h" #include "Emu/RSX/gcm_printing.h" -#include "util/asm.hpp" +#include "Utilities/File.h" #include #include diff --git a/rpcs3/rpcs3qt/save_data_dialog.cpp b/rpcs3/rpcs3qt/save_data_dialog.cpp index 20e9f78cfe..105fd7d27c 100644 --- a/rpcs3/rpcs3qt/save_data_dialog.cpp +++ b/rpcs3/rpcs3qt/save_data_dialog.cpp @@ -8,7 +8,6 @@ #include "Emu/RSX/Overlays/overlay_save_dialog.h" #include "Emu/Cell/Modules/cellSysutil.h" -#include "Utilities/Thread.h" #include "util/logs.hpp" LOG_CHANNEL(cellSaveData); diff --git a/rpcs3/rpcs3qt/save_data_dialog.h b/rpcs3/rpcs3qt/save_data_dialog.h index fa31b1533b..b33b16b77f 100644 --- a/rpcs3/rpcs3qt/save_data_dialog.h +++ b/rpcs3/rpcs3qt/save_data_dialog.h @@ -1,7 +1,6 @@ #pragma once #include "util/types.hpp" -#include "Emu/Memory/vm.h" #include "Emu/Cell/Modules/cellSaveData.h" class save_data_dialog : public SaveDialogBase diff --git a/rpcs3/rpcs3qt/save_data_list_dialog.h b/rpcs3/rpcs3qt/save_data_list_dialog.h index 334b45ca4b..13052ebbcb 100644 --- a/rpcs3/rpcs3qt/save_data_list_dialog.h +++ b/rpcs3/rpcs3qt/save_data_list_dialog.h @@ -1,7 +1,6 @@ #pragma once #include "util/types.hpp" -#include "Emu/Memory/vm.h" #include "Emu/Cell/Modules/cellSaveData.h" #include "Emu/RSX/Overlays/overlays.h" diff --git a/rpcs3/rpcs3qt/screenshot_manager_dialog.cpp b/rpcs3/rpcs3qt/screenshot_manager_dialog.cpp index b93f9398ad..3825dfd747 100644 --- a/rpcs3/rpcs3qt/screenshot_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/screenshot_manager_dialog.cpp @@ -5,7 +5,6 @@ #include "flow_widget.h" #include "qt_utils.h" #include "Utilities/File.h" -#include "Emu/VFS.h" #include "Emu/system_utils.hpp" #include diff --git a/rpcs3/rpcs3qt/sendmessage_dialog_frame.cpp b/rpcs3/rpcs3qt/sendmessage_dialog_frame.cpp index ce8f50003b..7f794b67f2 100644 --- a/rpcs3/rpcs3qt/sendmessage_dialog_frame.cpp +++ b/rpcs3/rpcs3qt/sendmessage_dialog_frame.cpp @@ -6,6 +6,7 @@ #include "sendmessage_dialog_frame.h" #include "Emu/IdManager.h" +#include "Emu/NP/rpcn_client.h" #include "Emu/System.h" #include "util/logs.hpp" @@ -155,7 +156,7 @@ void sendmessage_dialog_frame::slot_remove_friend(QString name) remove_friend(m_lst_friends, name); } -void sendmessage_dialog_frame::callback_handler(u16 ntype, const std::string& username, bool status) +void sendmessage_dialog_frame::callback_handler(rpcn::NotificationType ntype, const std::string& username, bool status) { QString qtr_username = QString::fromStdString(username); switch (ntype) diff --git a/rpcs3/rpcs3qt/sendmessage_dialog_frame.h b/rpcs3/rpcs3qt/sendmessage_dialog_frame.h index 1a74eddba8..d4aad5cd5d 100644 --- a/rpcs3/rpcs3qt/sendmessage_dialog_frame.h +++ b/rpcs3/rpcs3qt/sendmessage_dialog_frame.h @@ -5,7 +5,8 @@ #include "util/types.hpp" #include "custom_dialog.h" -#include "Emu/NP/rpcn_client.h" + +#include "Emu/Cell/Modules/sceNp.h" class sendmessage_dialog_frame : public QObject, public SendMessageDialogBase { @@ -15,7 +16,7 @@ public: sendmessage_dialog_frame() = default; ~sendmessage_dialog_frame(); error_code Exec(message_data& msg_data, std::set& npids) override; - void callback_handler(u16 ntype, const std::string& username, bool status) override; + void callback_handler(rpcn::NotificationType ntype, const std::string& username, bool status) override; private: void add_friend(QListWidget* list, const QString& name); diff --git a/rpcs3/rpcs3qt/settings.cpp b/rpcs3/rpcs3qt/settings.cpp index 74901561c2..c87918d468 100644 --- a/rpcs3/rpcs3qt/settings.cpp +++ b/rpcs3/rpcs3qt/settings.cpp @@ -1,7 +1,5 @@ #include "settings.h" -#include "qt_utils.h" - #include "Utilities/File.h" settings::settings(QObject* parent) : QObject(parent), diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index 02bc57a3aa..9dabd04cc9 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -36,8 +36,6 @@ #include "Loader/PSF.h" #include -#include -#include #include "util/sysinfo.hpp" #include "util/asm.hpp" diff --git a/rpcs3/rpcs3qt/shortcut_handler.cpp b/rpcs3/rpcs3qt/shortcut_handler.cpp index 9d70aa0262..9eb8fa3ea4 100644 --- a/rpcs3/rpcs3qt/shortcut_handler.cpp +++ b/rpcs3/rpcs3qt/shortcut_handler.cpp @@ -1,6 +1,5 @@ #include "stdafx.h" #include "shortcut_handler.h" -#include "Emu/System.h" LOG_CHANNEL(shortcut_log, "Shortcuts"); diff --git a/rpcs3/rpcs3qt/shortcut_utils.cpp b/rpcs3/rpcs3qt/shortcut_utils.cpp index 1c9a3d759f..6c16cdff04 100644 --- a/rpcs3/rpcs3qt/shortcut_utils.cpp +++ b/rpcs3/rpcs3qt/shortcut_utils.cpp @@ -1,9 +1,7 @@ #include "stdafx.h" #include "shortcut_utils.h" #include "qt_utils.h" -#include "Emu/system_utils.hpp" #include "Emu/VFS.h" -#include "Emu/vfs_config.h" #include "Utilities/File.h" #include "Utilities/StrUtil.h" @@ -16,6 +14,8 @@ #include #include #include + +#include "Emu/system_utils.hpp" #else #include #include diff --git a/rpcs3/rpcs3qt/skylander_dialog.cpp b/rpcs3/rpcs3qt/skylander_dialog.cpp index 7ed79d740e..beebb8a965 100644 --- a/rpcs3/rpcs3qt/skylander_dialog.cpp +++ b/rpcs3/rpcs3qt/skylander_dialog.cpp @@ -1,12 +1,8 @@ #include "stdafx.h" #include "Utilities/File.h" -#include "Crypto/md5.h" -#include "Crypto/aes.h" #include "skylander_dialog.h" #include "Emu/Io/Skylander.h" -#include "util/asm.hpp" - #include #include #include diff --git a/rpcs3/rpcs3qt/update_manager.cpp b/rpcs3/rpcs3qt/update_manager.cpp index 9c4e2104d1..92c5416d81 100644 --- a/rpcs3/rpcs3qt/update_manager.cpp +++ b/rpcs3/rpcs3qt/update_manager.cpp @@ -4,10 +4,8 @@ #include "rpcs3_version.h" #include "downloader.h" #include "gui_settings.h" -#include "Utilities/StrUtil.h" #include "Utilities/File.h" #include "Emu/System.h" -#include "Emu/system_utils.hpp" #include "Crypto/utils.h" #include "util/logs.hpp" #include "util/types.hpp" @@ -41,6 +39,7 @@ #define PATH_MAX MAX_PATH #endif +#include "Utilities/StrUtil.h" #else #include #include diff --git a/rpcs3/rpcs3qt/user_manager_dialog.cpp b/rpcs3/rpcs3qt/user_manager_dialog.cpp index 24336bd089..b8ccebdf43 100644 --- a/rpcs3/rpcs3qt/user_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/user_manager_dialog.cpp @@ -22,7 +22,6 @@ #include "Emu/System.h" #include "Emu/system_utils.hpp" -#include "Utilities/StrUtil.h" #include "Utilities/File.h" #include "util/logs.hpp" diff --git a/rpcs3/rpcs3qt/vfs_dialog_path_widget.cpp b/rpcs3/rpcs3qt/vfs_dialog_path_widget.cpp index 878fb0476d..090e97ee69 100644 --- a/rpcs3/rpcs3qt/vfs_dialog_path_widget.cpp +++ b/rpcs3/rpcs3qt/vfs_dialog_path_widget.cpp @@ -1,5 +1,4 @@ #include "vfs_dialog_path_widget.h" -#include "Utilities/Config.h" #include #include diff --git a/rpcs3/rpcs3qt/vfs_dialog_path_widget.h b/rpcs3/rpcs3qt/vfs_dialog_path_widget.h index ea09a6e67c..a90a43d378 100644 --- a/rpcs3/rpcs3qt/vfs_dialog_path_widget.h +++ b/rpcs3/rpcs3qt/vfs_dialog_path_widget.h @@ -1,6 +1,5 @@ #pragma once -#include "util/types.hpp" #include "gui_settings.h" #include diff --git a/rpcs3/rpcs3qt/vfs_dialog_usb_tab.h b/rpcs3/rpcs3qt/vfs_dialog_usb_tab.h index 65cea0a2c3..02d7a25c83 100644 --- a/rpcs3/rpcs3qt/vfs_dialog_usb_tab.h +++ b/rpcs3/rpcs3qt/vfs_dialog_usb_tab.h @@ -1,7 +1,5 @@ #pragma once -#include "util/types.hpp" - #include "gui_settings.h" #include diff --git a/rpcs3/util/atomic.hpp b/rpcs3/util/atomic.hpp index 2d4946a04a..4c3ab8959c 100644 --- a/rpcs3/util/atomic.hpp +++ b/rpcs3/util/atomic.hpp @@ -2,7 +2,6 @@ #include "util/types.hpp" #include -#include #ifndef _MSC_VER #pragma GCC diagnostic push diff --git a/rpcs3/util/cpu_stats.cpp b/rpcs3/util/cpu_stats.cpp index 6e69f645d2..de1d3b133c 100644 --- a/rpcs3/util/cpu_stats.cpp +++ b/rpcs3/util/cpu_stats.cpp @@ -2,12 +2,12 @@ #include "util/cpu_stats.hpp" #include "util/sysinfo.hpp" #include "util/logs.hpp" -#include "util/asm.hpp" #include "Utilities/StrUtil.h" #include #ifdef _WIN32 +#include "util/asm.hpp" #include "windows.h" #include "tlhelp32.h" #ifdef _MSC_VER @@ -18,8 +18,6 @@ #include "sstream" #include "stdlib.h" #include "sys/times.h" -#include "sys/types.h" -#include "unistd.h" #endif #ifdef __APPLE__ diff --git a/rpcs3/util/media_utils.cpp b/rpcs3/util/media_utils.cpp index 4ba78cb750..73bc86ef46 100644 --- a/rpcs3/util/media_utils.cpp +++ b/rpcs3/util/media_utils.cpp @@ -3,6 +3,7 @@ #include "Emu/System.h" #include +#include #ifdef _MSC_VER #pragma warning(push, 0) diff --git a/rpcs3/util/media_utils.h b/rpcs3/util/media_utils.h index 9666e53d86..471bda63ae 100644 --- a/rpcs3/util/media_utils.h +++ b/rpcs3/util/media_utils.h @@ -2,13 +2,11 @@ #include "Utilities/StrUtil.h" #include "Utilities/Thread.h" -#include "util/video_provider.h" +#include "util/video_sink.h" #include "Emu/Cell/Modules/cellMusic.h" #include #include -#include -#include namespace utils { diff --git a/rpcs3/util/serialization_ext.cpp b/rpcs3/util/serialization_ext.cpp index 62874d9b76..508cd79168 100644 --- a/rpcs3/util/serialization_ext.cpp +++ b/rpcs3/util/serialization_ext.cpp @@ -1,9 +1,8 @@ #include "util/types.hpp" #include "util/logs.hpp" #include "util/asm.hpp" -#include "util/simd.hpp" +#include "util/sysinfo.hpp" #include "util/endian.hpp" - #include "Utilities/lockless.h" #include "Utilities/File.h" #include "Utilities/StrFmt.h" diff --git a/rpcs3/util/shared_ptr.hpp b/rpcs3/util/shared_ptr.hpp index e9bdf83b3b..29e4150c21 100644 --- a/rpcs3/util/shared_ptr.hpp +++ b/rpcs3/util/shared_ptr.hpp @@ -1,6 +1,5 @@ #pragma once // No BOM and only basic ASCII in this header, or a neko will die -#include #include #include #include "atomic.hpp" diff --git a/rpcs3/util/simd.hpp b/rpcs3/util/simd.hpp index 750bb97fd1..ff4e0eed78 100644 --- a/rpcs3/util/simd.hpp +++ b/rpcs3/util/simd.hpp @@ -24,7 +24,6 @@ #include #include #include -#include #if defined(__clang__) #pragma clang diagnostic push diff --git a/rpcs3/util/typeindices.hpp b/rpcs3/util/typeindices.hpp index cb9b3b2748..c6f6190ba7 100644 --- a/rpcs3/util/typeindices.hpp +++ b/rpcs3/util/typeindices.hpp @@ -1,9 +1,6 @@ #pragma once #include "util/types.hpp" -#include "util/shared_ptr.hpp" - -#include #ifndef _MSC_VER #define ATTR_PURE __attribute__((pure)) diff --git a/rpcs3/util/video_provider.cpp b/rpcs3/util/video_provider.cpp index 1e5b747d5c..70888447f4 100644 --- a/rpcs3/util/video_provider.cpp +++ b/rpcs3/util/video_provider.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "video_provider.h" #include "Emu/RSX/Overlays/overlay_message.h" +#include "Emu/Cell/timers.hpp" extern "C" { diff --git a/rpcs3/util/vm_native.cpp b/rpcs3/util/vm_native.cpp index b1ffc726f2..1aac9c1026 100644 --- a/rpcs3/util/vm_native.cpp +++ b/rpcs3/util/vm_native.cpp @@ -1,5 +1,4 @@ #include "stdafx.h" -#include "util/logs.hpp" #include "util/vm.hpp" #include "util/asm.hpp" #ifdef _WIN32