From b0503d71f78ec55cafd337b3c0ada8ee0f6ca3d6 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sat, 13 Mar 2021 13:35:25 +0700 Subject: [PATCH 01/22] Fix Teenage Mutant Ninja Turtles Multiplayer. Alternatively, changing NET_SHUTDOWN_DELAY_US to 501000 usec or more will also works. --- Core/Dialog/PSPNetconfDialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/Dialog/PSPNetconfDialog.cpp b/Core/Dialog/PSPNetconfDialog.cpp index 4202f905af..0528be972b 100644 --- a/Core/Dialog/PSPNetconfDialog.cpp +++ b/Core/Dialog/PSPNetconfDialog.cpp @@ -243,7 +243,7 @@ void PSPNetconfDialog::DisplayMessage(std::string text1, std::string text2a, std } int PSPNetconfDialog::Update(int animSpeed) { - if (GetStatus() != SCE_UTILITY_STATUS_RUNNING) { + if (ReadStatus() != SCE_UTILITY_STATUS_RUNNING) { return SCE_ERROR_UTILITY_INVALID_STATUS; } @@ -464,7 +464,7 @@ int PSPNetconfDialog::Update(int animSpeed) { EndDraw(); } - if (GetStatus() == SCE_UTILITY_STATUS_FINISHED || pendingStatus == SCE_UTILITY_STATUS_FINISHED) + if (ReadStatus() == SCE_UTILITY_STATUS_FINISHED || pendingStatus == SCE_UTILITY_STATUS_FINISHED) Memory::Memcpy(requestAddr, &request, request.common.size, "NetConfDialogParam"); return 0; From 5dea4ecfdfe9ae33f4f992f8256f7fe49d624ccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 13 Mar 2021 15:49:25 +0100 Subject: [PATCH 02/22] Android: Add a dependency on the AndroidX appcompat library. It's apache licensed so it's ok, and I need it for some Storage Access Framework work for #11997. --- android/AndroidManifest.xml | 6 +++++- android/build.gradle | 8 ++++++++ android/gradle.properties | 2 ++ build.gradle | 2 +- gradle.properties | 3 +++ gradle/wrapper/gradle-wrapper.properties | 2 ++ 6 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 gradle.properties diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index cc8739cf29..f9314abf7b 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -1,5 +1,6 @@ - + + + Date: Sat, 13 Mar 2021 16:27:07 +0100 Subject: [PATCH 03/22] Indentation fixes --- android/AndroidManifest.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index f9314abf7b..5466ddb024 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -29,10 +29,10 @@ - - + + - Date: Sat, 13 Mar 2021 17:05:28 +0100 Subject: [PATCH 04/22] Additional indentation fix (forgot to save file) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3d059bcdce..c8274d0b58 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:4.1.2' - } + } } allprojects { From 797cc41a1c2cf4847d1556efaff74b125102a8cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 13 Mar 2021 17:12:30 +0100 Subject: [PATCH 05/22] Remove std::string from memblockinfo --- Core/Debugger/MemBlockInfo.cpp | 46 ++++++++++++++++++++-------------- Core/Debugger/MemBlockInfo.h | 14 +++++++++-- Core/MemMap.cpp | 4 +-- Core/MemMapHelpers.h | 21 ++++++++++------ 4 files changed, 54 insertions(+), 31 deletions(-) diff --git a/Core/Debugger/MemBlockInfo.cpp b/Core/Debugger/MemBlockInfo.cpp index ef3f1ec239..c7af17f9db 100644 --- a/Core/Debugger/MemBlockInfo.cpp +++ b/Core/Debugger/MemBlockInfo.cpp @@ -16,6 +16,7 @@ // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. #include + #include "Common/Log.h" #include "Common/Serialize/Serializer.h" #include "Common/Serialize/SerializeFuncs.h" @@ -23,13 +24,14 @@ #include "Core/Debugger/Breakpoints.h" #include "Core/Debugger/MemBlockInfo.h" #include "Core/MIPS/MIPS.h" +#include "Common/StringUtils.h" class MemSlabMap { public: MemSlabMap(); ~MemSlabMap(); - bool Mark(uint32_t addr, uint32_t size, uint64_t ticks, uint32_t pc, bool allocated, const std::string &tag); + bool Mark(uint32_t addr, uint32_t size, uint64_t ticks, uint32_t pc, bool allocated, const char *tag); bool Find(MemBlockFlags flags, uint32_t addr, uint32_t size, std::vector &results); void Reset(); void DoState(PointerWrap &p); @@ -41,7 +43,7 @@ private: uint64_t ticks = 0; uint32_t pc = 0; bool allocated = false; - std::string tag; + char tag[32]{}; Slab *prev = nullptr; Slab *next = nullptr; @@ -72,8 +74,9 @@ struct PendingNotifyMem { uint32_t size; uint64_t ticks; uint32_t pc; - std::string tag; + char tag[32]; }; +static_assert(sizeof(PendingNotifyMem) == 64, "..."); static constexpr size_t MAX_PENDING_NOTIFIES = 512; static MemSlabMap allocMap; @@ -91,7 +94,7 @@ MemSlabMap::~MemSlabMap() { Clear(); } -bool MemSlabMap::Mark(uint32_t addr, uint32_t size, uint64_t ticks, uint32_t pc, bool allocated, const std::string &tag) { +bool MemSlabMap::Mark(uint32_t addr, uint32_t size, uint64_t ticks, uint32_t pc, bool allocated, const char *tag) { uint32_t end = addr + size; Slab *slab = FindSlab(addr); Slab *firstMatch = nullptr; @@ -108,8 +111,8 @@ bool MemSlabMap::Mark(uint32_t addr, uint32_t size, uint64_t ticks, uint32_t pc, slab->ticks = ticks; slab->pc = pc; } - if (!tag.empty()) - slab->tag = tag; + if (tag) + truncate_cpy(slab->tag, tag); // Move on to the next one. if (firstMatch == nullptr) @@ -130,7 +133,7 @@ bool MemSlabMap::Find(MemBlockFlags flags, uint32_t addr, uint32_t size, std::ve Slab *slab = FindSlab(addr); bool found = false; while (slab != nullptr && slab->start < end) { - if (slab->pc != 0 || !slab->tag.empty()) { + if (slab->pc != 0 || strlen(slab->tag)) { results.push_back({ flags, slab->start, slab->end - slab->start, slab->ticks, slab->pc, slab->tag, slab->allocated }); found = true; } @@ -242,7 +245,7 @@ MemSlabMap::Slab *MemSlabMap::Split(Slab *slab, uint32_t size) { next->ticks = slab->ticks; next->pc = slab->pc; next->allocated = slab->allocated; - next->tag = slab->tag; + truncate_cpy(next->tag, slab->tag); next->prev = slab; next->next = slab->next; @@ -330,14 +333,14 @@ void FlushPendingMemInfo() { allocMap.Mark(info.start, info.size, info.ticks, info.pc, true, info.tag); } else if (info.flags & MemBlockFlags::FREE) { // Maintain the previous allocation tag for debugging. - allocMap.Mark(info.start, info.size, info.ticks, 0, false, ""); - suballocMap.Mark(info.start, info.size, info.ticks, 0, false, ""); + allocMap.Mark(info.start, info.size, info.ticks, 0, false, nullptr); + suballocMap.Mark(info.start, info.size, info.ticks, 0, false, nullptr); } if (info.flags & MemBlockFlags::SUB_ALLOC) { suballocMap.Mark(info.start, info.size, info.ticks, info.pc, true, info.tag); } else if (info.flags & MemBlockFlags::SUB_FREE) { // Maintain the previous allocation tag for debugging. - suballocMap.Mark(info.start, info.size, info.ticks, 0, false, ""); + suballocMap.Mark(info.start, info.size, info.ticks, 0, false, nullptr); } if (info.flags & MemBlockFlags::TEXTURE) { textureMap.Mark(info.start, info.size, info.ticks, info.pc, true, info.tag); @@ -349,11 +352,7 @@ void FlushPendingMemInfo() { pendingNotifies.clear(); } -void NotifyMemInfo(MemBlockFlags flags, uint32_t start, uint32_t size, const std::string &tag) { - NotifyMemInfoPC(flags, start, size, currentMIPS->pc, tag); -} - -void NotifyMemInfoPC(MemBlockFlags flags, uint32_t start, uint32_t size, uint32_t pc, const std::string &tag) { +void NotifyMemInfoPC(MemBlockFlags flags, uint32_t start, uint32_t size, uint32_t pc, const char *tagStr, size_t strLength) { if (size == 0) { return; } @@ -363,7 +362,12 @@ void NotifyMemInfoPC(MemBlockFlags flags, uint32_t start, uint32_t size, uint32_ PendingNotifyMem info{ flags, start, size }; info.ticks = CoreTiming::GetTicks(); info.pc = pc; - info.tag = tag; + size_t copyLength = strLength; + if (copyLength >= sizeof(info.tag)) { + copyLength = sizeof(info.tag) - 1; + } + memcpy(info.tag, tagStr, copyLength); + info.tag[copyLength] = 0; bool needFlush = false; { @@ -377,12 +381,16 @@ void NotifyMemInfoPC(MemBlockFlags flags, uint32_t start, uint32_t size, uint32_ } if (flags & MemBlockFlags::WRITE) { - CBreakPoints::ExecMemCheck(start, true, size, pc, tag.c_str()); + CBreakPoints::ExecMemCheck(start, true, size, pc, tagStr); } else if (flags & MemBlockFlags::READ) { - CBreakPoints::ExecMemCheck(start, false, size, pc, tag.c_str()); + CBreakPoints::ExecMemCheck(start, false, size, pc, tagStr); } } +void NotifyMemInfo(MemBlockFlags flags, uint32_t start, uint32_t size, const char *str, size_t strLength) { + NotifyMemInfoPC(flags, start, size, currentMIPS->pc, str, strLength); +} + std::vector FindMemInfo(uint32_t start, uint32_t size) { FlushPendingMemInfo(); start &= ~0xC0000000; diff --git a/Core/Debugger/MemBlockInfo.h b/Core/Debugger/MemBlockInfo.h index fa851ffdfe..066d33113f 100644 --- a/Core/Debugger/MemBlockInfo.h +++ b/Core/Debugger/MemBlockInfo.h @@ -46,8 +46,18 @@ struct MemBlockInfo { bool allocated; }; -void NotifyMemInfo(MemBlockFlags flags, uint32_t start, uint32_t size, const std::string &tag); -void NotifyMemInfoPC(MemBlockFlags flags, uint32_t start, uint32_t size, uint32_t pc, const std::string &tag); +void NotifyMemInfo(MemBlockFlags flags, uint32_t start, uint32_t size, const char *str, size_t strLength); + +// This lets us avoid calling strlen on string constants, instead the string length (including null) +// is computed at compile time. +template +inline void NotifyMemInfo(MemBlockFlags flags, uint32_t start, uint32_t size, const char(&str)[count]) { + NotifyMemInfo(flags, start, size, str, count); +} + +inline void NotifyMemInfo(MemBlockFlags flags, uint32_t start, uint32_t size, const std::string &str) { + NotifyMemInfo(flags, start, size, str.c_str(), str.size() + 1); +} std::vector FindMemInfo(uint32_t start, uint32_t size); std::vector FindMemInfoByFlag(MemBlockFlags flags, uint32_t start, uint32_t size); diff --git a/Core/MemMap.cpp b/Core/MemMap.cpp index f69a46db6e..521c241e3c 100644 --- a/Core/MemMap.cpp +++ b/Core/MemMap.cpp @@ -459,7 +459,7 @@ void Write_Opcode_JIT(const u32 _Address, const Opcode& _Value) Memory::WriteUnchecked_U32(_Value.encoding, _Address); } -void Memset(const u32 _Address, const u8 _iValue, const u32 _iLength, const std::string &tag) { +void Memset(const u32 _Address, const u8 _iValue, const u32 _iLength, const char *tag) { if (IsValidRange(_Address, _iLength)) { uint8_t *ptr = GetPointerUnchecked(_Address); memset(ptr, _iValue, _iLength); @@ -468,7 +468,7 @@ void Memset(const u32 _Address, const u8 _iValue, const u32 _iLength, const std: Write_U8(_iValue, (u32)(_Address + i)); } - NotifyMemInfo(MemBlockFlags::WRITE, _Address, _iLength, tag); + NotifyMemInfo(MemBlockFlags::WRITE, _Address, _iLength, tag, strlen(tag)); } } // namespace diff --git a/Core/MemMapHelpers.h b/Core/MemMapHelpers.h index 0983abdf9b..f67ab9aa86 100644 --- a/Core/MemMapHelpers.h +++ b/Core/MemMapHelpers.h @@ -17,6 +17,8 @@ #pragma once +#include + #include "Common/CommonTypes.h" #include "Core/Debugger/MemBlockInfo.h" #include "Core/MemMap.h" @@ -28,31 +30,34 @@ extern MIPSState *currentMIPS; namespace Memory { -inline void Memcpy(const u32 to_address, const void *from_data, const u32 len, const std::string &tag = "Memcpy") { +inline void Memcpy(const u32 to_address, const void *from_data, const u32 len, const char *tag = "Memcpy") { u8 *to = GetPointer(to_address); if (to) { memcpy(to, from_data, len); - NotifyMemInfo(MemBlockFlags::WRITE, to_address, len, tag); + size_t tagLen = strlen(tag); + NotifyMemInfo(MemBlockFlags::WRITE, to_address, len, tag, tagLen); } // if not, GetPointer will log. } -inline void Memcpy(void *to_data, const u32 from_address, const u32 len, const std::string &tag = "Memcpy") { +inline void Memcpy(void *to_data, const u32 from_address, const u32 len, const char *tag = "Memcpy") { const u8 *from = GetPointer(from_address); if (from) { memcpy(to_data, from, len); - NotifyMemInfo(MemBlockFlags::READ, from_address, len, tag); + size_t tagLen = strlen(tag); + NotifyMemInfo(MemBlockFlags::READ, from_address, len, tag, tagLen); } // if not, GetPointer will log. } -inline void Memcpy(const u32 to_address, const u32 from_address, const u32 len, const std::string &tag = "Memcpy") { +inline void Memcpy(const u32 to_address, const u32 from_address, const u32 len, const char *tag = "Memcpy") { Memcpy(GetPointer(to_address), from_address, len); - NotifyMemInfo(MemBlockFlags::READ, from_address, len, tag); - NotifyMemInfo(MemBlockFlags::WRITE, to_address, len, tag); + size_t tagLen = strlen(tag); + NotifyMemInfo(MemBlockFlags::READ, from_address, len, tag, tagLen); + NotifyMemInfo(MemBlockFlags::WRITE, to_address, len, tag, tagLen); } -void Memset(const u32 _Address, const u8 _Data, const u32 _iLength, const std::string &tag = "Memset"); +void Memset(const u32 _Address, const u8 _Data, const u32 _iLength, const char *tag = "Memset"); template void ReadStruct(u32 address, T *ptr) From 3c211a6b996d42ca6d42613a57ee608049ab822a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 13 Mar 2021 17:28:47 +0100 Subject: [PATCH 06/22] Buildfix --- Core/Debugger/MemBlockInfo.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Core/Debugger/MemBlockInfo.cpp b/Core/Debugger/MemBlockInfo.cpp index c7af17f9db..80b40ba1e7 100644 --- a/Core/Debugger/MemBlockInfo.cpp +++ b/Core/Debugger/MemBlockInfo.cpp @@ -17,6 +17,8 @@ #include +#include + #include "Common/Log.h" #include "Common/Serialize/Serializer.h" #include "Common/Serialize/SerializeFuncs.h" From 0780976fe72c7d0dd7f9fea71ce9449eeca463a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 13 Mar 2021 17:36:10 +0100 Subject: [PATCH 07/22] Remove static assert on struct size, we don't really care that much. Caused problems on 32-bit. --- Core/Debugger/MemBlockInfo.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Core/Debugger/MemBlockInfo.cpp b/Core/Debugger/MemBlockInfo.cpp index 80b40ba1e7..2c5e34c146 100644 --- a/Core/Debugger/MemBlockInfo.cpp +++ b/Core/Debugger/MemBlockInfo.cpp @@ -78,7 +78,6 @@ struct PendingNotifyMem { uint32_t pc; char tag[32]; }; -static_assert(sizeof(PendingNotifyMem) == 64, "..."); static constexpr size_t MAX_PENDING_NOTIFIES = 512; static MemSlabMap allocMap; From 4e1bc2b3e0bc352f40845b5ba7b7ffb0034ced11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 13 Mar 2021 17:51:40 +0100 Subject: [PATCH 08/22] Further std::string removal --- Core/Debugger/MemBlockInfo.h | 10 +++++----- GPU/Common/FramebufferManagerCommon.cpp | 10 ++++++---- GPU/Common/TextureCacheCommon.cpp | 4 +++- GPU/Vulkan/TextureCacheVulkan.cpp | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Core/Debugger/MemBlockInfo.h b/Core/Debugger/MemBlockInfo.h index 066d33113f..8a36179258 100644 --- a/Core/Debugger/MemBlockInfo.h +++ b/Core/Debugger/MemBlockInfo.h @@ -48,15 +48,15 @@ struct MemBlockInfo { void NotifyMemInfo(MemBlockFlags flags, uint32_t start, uint32_t size, const char *str, size_t strLength); -// This lets us avoid calling strlen on string constants, instead the string length (including null) -// is computed at compile time. +// This lets us avoid calling strlen on string constants, instead the string length (including null, +// so we have to subtract 1) is computed at compile time. template inline void NotifyMemInfo(MemBlockFlags flags, uint32_t start, uint32_t size, const char(&str)[count]) { - NotifyMemInfo(flags, start, size, str, count); + NotifyMemInfo(flags, start, size, str, count - 1); } -inline void NotifyMemInfo(MemBlockFlags flags, uint32_t start, uint32_t size, const std::string &str) { - NotifyMemInfo(flags, start, size, str.c_str(), str.size() + 1); +inline void NotifyMemInfo(MemBlockFlags flags, uint32_t start, uint32_t size, const char *str) { + NotifyMemInfo(flags, start, size, str, strlen(str)); } std::vector FindMemInfo(uint32_t start, uint32_t size); diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 2647e44427..685a9f0934 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1294,14 +1294,16 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, int w, } shaderManager_->DirtyLastShader(); - char tag[256]; - snprintf(tag, sizeof(tag), "FB_%08x_%08x_%dx%d_%s", vfb->fb_address, vfb->z_address, w, h, GeBufferFormatToString(vfb->format)); + char tag[128]; + size_t len = snprintf(tag, sizeof(tag), "FB_%08x_%08x_%dx%d_%s", vfb->fb_address, vfb->z_address, w, h, GeBufferFormatToString(vfb->format)); vfb->fbo = draw_->CreateFramebuffer({ vfb->renderWidth, vfb->renderHeight, 1, 1, true, tag }); if (Memory::IsVRAMAddress(vfb->fb_address) && vfb->fb_stride != 0) { - NotifyMemInfo(MemBlockFlags::ALLOC, vfb->fb_address, ColorBufferByteSize(vfb), tag); + NotifyMemInfo(MemBlockFlags::ALLOC, vfb->fb_address, ColorBufferByteSize(vfb), tag, len); } if (Memory::IsVRAMAddress(vfb->z_address) && vfb->z_stride != 0) { - NotifyMemInfo(MemBlockFlags::ALLOC, vfb->z_address, vfb->fb_stride * vfb->height * sizeof(uint16_t), std::string("Z_") + tag); + char buf[128]; + size_t len = snprintf(buf, sizeof(buf), "Z_%s", tag); + NotifyMemInfo(MemBlockFlags::ALLOC, vfb->z_address, vfb->fb_stride * vfb->height * sizeof(uint16_t), buf, len); } if (old.fbo) { INFO_LOG(FRAMEBUF, "Resizing FBO for %08x : %dx%dx%s", vfb->fb_address, w, h, GeBufferFormatToString(vfb->format)); diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index 949c08c92e..b54820473b 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -1323,7 +1323,9 @@ void TextureCacheCommon::DecodeTextureLevel(u8 *out, int outPitch, GETextureForm const u8 *texptr = Memory::GetPointer(texaddr); const uint32_t byteSize = (textureBitsPerPixel[format] * bufw * h) / 8; - NotifyMemInfo(MemBlockFlags::TEXTURE, texaddr, byteSize, StringFromFormat("Texture_%08x_%dx%d_%s", texaddr, w, h, GeTextureFormatToString(format, clutformat))); + char buf[128]; + size_t len = snprintf(buf, sizeof(buf), "Tex_%08x_%dx%d_%s", texaddr, w, h, GeTextureFormatToString(format, clutformat)); + NotifyMemInfo(MemBlockFlags::TEXTURE, texaddr, byteSize, buf, len); switch (format) { case GE_TFMT_CLUT4: diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 31ea90b565..a108395022 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -862,7 +862,7 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { } char texName[128]{}; - snprintf(texName, sizeof(texName), "texture_%08x_%s", entry->addr, GeTextureFormatToString((GETextureFormat)entry->format, gstate.getClutPaletteFormat())); + snprintf(texName, sizeof(texName), "tex_%08x_%s", entry->addr, GeTextureFormatToString((GETextureFormat)entry->format, gstate.getClutPaletteFormat())); image->SetTag(texName); bool allocSuccess = image->CreateDirect(cmdInit, allocator_, w * scaleFactor, h * scaleFactor, maxLevelToGenerate + 1, actualFmt, imageLayout, usage, mapping); From 06995d756953c56c9ac7ad970f0741a82bd6728f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 13 Mar 2021 09:21:45 -0800 Subject: [PATCH 09/22] Debugger: Add header for strlen. --- Core/Debugger/MemBlockInfo.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/Debugger/MemBlockInfo.h b/Core/Debugger/MemBlockInfo.h index 8a36179258..e46bea8c87 100644 --- a/Core/Debugger/MemBlockInfo.h +++ b/Core/Debugger/MemBlockInfo.h @@ -18,6 +18,7 @@ #pragma once #include +#include #include #include #include "Common/Common.h" From 8d6c1c6d9bd14586b9a5137c288d2fafa17994f9 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 13 Mar 2021 10:03:02 -0800 Subject: [PATCH 10/22] Debugger: Fix save state compat for slab info. --- Core/Debugger/MemBlockInfo.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Core/Debugger/MemBlockInfo.cpp b/Core/Debugger/MemBlockInfo.cpp index 2c5e34c146..4f4a5f909f 100644 --- a/Core/Debugger/MemBlockInfo.cpp +++ b/Core/Debugger/MemBlockInfo.cpp @@ -198,7 +198,7 @@ void MemSlabMap::DoState(PointerWrap &p) { } void MemSlabMap::Slab::DoState(PointerWrap &p) { - auto s = p.Section("MemSlabMapSlab", 1); + auto s = p.Section("MemSlabMapSlab", 1, 2); if (!s) return; @@ -207,7 +207,13 @@ void MemSlabMap::Slab::DoState(PointerWrap &p) { Do(p, ticks); Do(p, pc); Do(p, allocated); - Do(p, tag); + if (s >= 2) { + Do(p, tag); + } else { + std::string stringTag; + Do(p, stringTag); + truncate_cpy(tag, stringTag.c_str()); + } } void MemSlabMap::Clear() { From b7309559e8f0566bda88220d0987f4e5b43e1e1d Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sun, 14 Mar 2021 03:50:20 +0700 Subject: [PATCH 11/22] Fix FlatOut Head On multiplayer. --- Core/HLE/sceNetAdhoc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index c224b8f7be..c88a11dd60 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -1629,7 +1629,7 @@ static int sceNetAdhocPdpRecv(int id, void *addr, void * port, void *buf, void * socket->nonblocking = flag; // Valid Arguments - if (saddr != NULL && port != NULL && buf != NULL && len != NULL && *len > 0) { + if (saddr != NULL && port != NULL && buf != NULL && len != NULL) { #ifndef PDP_DIRTY_MAGIC // Schedule Timeout Removal //if (flag == 1) timeout = 0; @@ -1686,7 +1686,7 @@ static int sceNetAdhocPdpRecv(int id, void *addr, void * port, void *buf, void * memcpy(buf, dummyPeekBuf64k, std::min(received, *len)); if (received != SOCKET_ERROR && *len < received) { - WARN_LOG(SCENET, "sceNetAdhocPdpRecv[%i:%u]: Peeked %u/%u bytes from %s:%u\n", id, getLocalPort(pdpsocket.id), received, *len, ip2str(sin.sin_addr).c_str(), ntohs(sin.sin_port)); + INFO_LOG(SCENET, "sceNetAdhocPdpRecv[%i:%u]: Peeked %u/%u bytes from %s:%u\n", id, getLocalPort(pdpsocket.id), received, *len, ip2str(sin.sin_addr).c_str(), ntohs(sin.sin_port)); *len = received; // Peer MAC From 5087cb668995ae4fa3c089cccd19079e69259ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 14 Mar 2021 11:24:00 +0100 Subject: [PATCH 12/22] Android: Fix "Load..." to allow all file types. Change backported from PR #14232 --- android/src/org/ppsspp/ppsspp/NativeActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index 4e22771325..c859faf7c8 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -1292,7 +1292,7 @@ public abstract class NativeActivity extends Activity { try { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.setType("application/octet-stream"); + intent.setType("*/*"); intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); //intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri); startActivityForResult(intent, RESULT_BROWSE_FILE); From a384b62247f1971555fb68f796c01df8fb8f984a Mon Sep 17 00:00:00 2001 From: nassau-tk Date: Sun, 14 Mar 2021 19:35:31 +0900 Subject: [PATCH 13/22] Fix character's Side Space ltn0.pgf/ltn4.pgf --- assets/flash0/font/ltn0.pgf | Bin 38028 -> 38236 bytes assets/flash0/font/ltn4.pgf | Bin 39300 -> 39484 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/flash0/font/ltn0.pgf b/assets/flash0/font/ltn0.pgf index a7ff949905e0f0ca62f48a46681f662ebfaaef87..1f3d907ac717270a005c2e8a00e05c385d718d22 100644 GIT binary patch delta 10427 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 delta 10128 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 diff --git a/assets/flash0/font/ltn4.pgf b/assets/flash0/font/ltn4.pgf index 7910be8e8111d9e0d5803868e99505ca66932c57..320555dcc6ac524661cfabe0fbf6bbd8c232da07 100644 GIT binary patch delta 10346 zcmbt)d0bOh_W0Y97YGSqM_Ce9*$JB8ec>_V{662`_mA)QkGym5+3vaLo_o%{ z?`8LC?7cTJJ&xklg?Y3esye6^o^C<+@=-l~m+Yd<2!af_0Z>CIgHXctS%`4`Aux$Y zI4I%p>M1%0jS$K>c`bxW*f&C`<>)OOoyE%_e#i|d&wx`5c1X}e0?Wu6z%qIaf&;Sx z)`>}|=J0CHAU*7}bQy$l2w8n>e`>&~zJ!xALb(A*FLzUu1C(=$%p8M~>&qZy6_s;% zIfSr_Own0`SOZzQ5<)e{uZMjZ>>D{bJ*Q93K`jTZ6vx0?4*3xyr?3SwurnFp=yr(L zvwet{L5M&+3#SZ3IDS?!i=UDo;_&4hUJW56BN9&D+YTEo5MgxFZm;QSGT3B!hagl# zk`+QF><_Sg2$c}BHbH>s-Sk55{9uonkR*X9Gc=R!+uf%Rc#orAN*pc*0TJ{;pAbq0 zTWrscO~MwAD&t@|hcD;)R<3X4`VtPR(MfqV*Ozg8dJYb8csVzoWRjmk^iu?m(L4n? zg<6ho=U@wmAL97592}U!!^mAOzZmfz1nA&b)0zPyQaVOT(_6je|fn_QTF?sv#-44{IveZH9P*K zb5$E$M}gSNYus6+_x`+S(JJrlzhpN)3d&>tI{!pM@U0gbtM*FL%~MCN zbgt=qRl`d=zx9m2>uOu=!R>8z&0qcF-36}S*Z*|-nJ&8-xdw5fPi(mcuhBIP(?UL}v0q}w0hKwRe;EZYFc;pwfaUqJLquQ4k}am4Po!%A^}-&B2$%k@SgKay4s7gc3z%Q0(OL ztSpbp8I}*FD{bo>?|0Z)dXRE0vKX3MR24EqT={Fj*e&BXhEegoAY>;J3h}e^6UD+u zgPBku?%Z>)>q@>d+GECie>9lR&X-fGmAD5nEu4=M`AsXOa(x5X9{er3U1cGuUX_X8zM)ZytY8g+7W;(pQGD~s zO-0s!I0rEmbM{^4DP*DyOJ~p#17R4!q`X@;Qg~O#54&gLZ+07stmhdGFW)^}q5lPR z8t-Yybmo&H7t^Qi>I)vksvpoR?)m)b3>PzJ=iy;ykU!h4<5L<&!yjZ+e8uR6`Nm5> zI#i@Mo{|{H%SfS1MGEeg9URLT8nek6+eJsQWQ#2spH{U#5FfpeQO$ufE!!VebR+GSl%hj0$D&#XvLymTB*$L*E|*I4Fh9A)v!* zfJnyN`jIKa3QKIIJjL2F97mS^hpVUmk?CT#YL77KWHIQ~n?bA5sUw9GQnD6wPj&}M zN_b!DA?rcAkuiDZ;?uEy$ST>uDPsc@n|9>sTw-wSZ`cs?`bp-B1VrFxKn_@=OAxs z=fWshkk&om8eDTo#Vakf)nf|g>}O03a!-Y=0%AKTf%CSTh`k;c+$qyT7nCt2a))Jf zHgege!1JmD@4*R&}A*8td zSKM`9yknwQZtuG-gv~Ywng`H1#)naMfa$ESyR!E8nKi<}VI(`T( zcioBnwI<*%AAxQoGYpqvlm1swWlsbv_2afGy~EOA9Mh1#8Km&UX7X9kYrH#1rgUW? zZN|wwLHMFRyyU7_GUCSQ?M2pWE_aId7qB=h;RF!q?`mf2>h6lI?p{harWi5YsgM3f z_k)Ttx$_3bzSItLyFKnPEA>Wf5qBrmO1ZhTWiqV*}D%X;1M^IYrB(f8+DUl@h0HyteV5TP4g>a2LE{rBc2S+a~fDRnSLfsUq z{RVgqjA)2Zce)*H)!r#{43bN*QHsQBL6^+v8007PpdNxAsCa(|Xe`J!-W|qt%uio1 zKWA8fgL`Xs(@dhg3Rw%iMzOVqoQ@K{IrEoCwyA70UC#ahDkQ{|Ya`KDC`Z3!Xq;`n zM)^~cfqTKARclmPRb(i@?(NXt6)V9oZy!j|-m~=_y$R-6&$(_dhdJYTt6o-B3B9(Q z^O{!(N{ZV8E@Rsi(m3jkLMKI{&|;WECtJPWqTAAkNvGxQlQ>74B6Y!r<}o2C#d|Nl}-t6{g^0sjod`yG|vdi0jp+m&<7fn69!87`c_GcV=Eg((CyG0)A`XP z+FxSZLPYjiOi}uY;TY|QK&TxV_<_h!JcIE%)XV1JmUUy9ft3$iW!tb8-djgVTL_Is8X^tR~Bnxb<+LnhL zhCjdR&UZOqb=bc99^`|zfq?_ERwc4fIk`oj2p4!mheVOQeU=WnJqfhS^dEsfrExr+ z#0$VSr37@cKe^GVBC(}zX?vMPxJ_Y-kiB#2cpRKTEjt4^flYB}(0@!|m}ze=f>pLv zW={ca68kJ$A-M)T&6M#HfvAPi5I=%wdmKnG-lNKhGUgQ-*a$brOam#nL|tu_m@js= zAWF{4jtJEI-^yXJZX2Os8T_Aq8j{$WsMb#Agz#WAmXn9E-JA)!-wKkaf*v`nvZW-2 z6{gyzlh`10yF;eG4Ep58yA~2HOoc^M%Uo!)US=p#oM1~KBU3^5MYMf#hqTt*#cGgP z&+MO#^yZ1T%?q%1z{Ow}B$Jx<8CK31NFv{DX_F6K1f?WlV4zhxW{@N_EM=*OatTnS zBp#V;AzI-X2g;JI#XrJQ123h@N$a1>MFV&#^V=oX8>7dItQTFkv$XeZkH35aq#?mz zm3C|xxj#&91PEx?+soh}~Q8HlO0`zy@ubrKLG z0S(%TFs+T$!2BXEutk#S6F*KPk$g(o=<(81ktCc*Rl5=1X&`_JJg=YY>%x5BNhiDV_&Yh;5K~`8nhlldXn~gk^@}N4)JA zB+-p-9r9Z+kN5@nnoigk;);~xv~bQkkazRWdRi*&wol+6O8 z=_GMW1-BXu+}Gicg+G;%_-uf7wLT4e+R7|MTRJ=fEh#h_DSy$1JH>J0~_;WZcA`tZUU+bo>TxV&`7tpsv5 zSVQ9dFjpZ+^8@=>6i5<@;PsiLc&+J)KqCCfEvDy!c?Iv3f=;tCA1pHOt{pB>UU6Qj zL1m*~F0Qa=nf3>f$Lmbb1@Xe4tg}3~)>v`HLGcS-nls3k?A~H{o$}ji+7}2N(>%e4HoGxycOD-~9l7VY8L9fwS9&m8*~piDQ25Qe~sTp z$t7sbe+*b|W_pzHeAOnmr-E&4T82lscv~uorKN)6u?l-HSOI@C;RRx_C{v1Qm_S(;y%HxO`1rE* zafHtKDW(UJk5Aa-z=XdH@aprszkr*p+d?Gkdfx)sBL=)1%m)cWS3w|i%H}9hyY3K@ zra$3p`A}aeGMTyF5TXL#l~pBjms8xX(qWyCf?=v-qzo^y@m^QqTMfMDH0<+r4PIyC z{Zs}^+$^I@N?4d*7z0lMXPbEC_6}H?E40u+7y!%Sh%`K9{&MRFj-O-gZ8|~^p6DL8 z$ZRTn38*yjK39#c9vWY7;+@otrV}H1RvTaYfejhEBQk>-+B-t4j-Zn8mNqpsa`KD~ zm7bEI7+Fva6Z&tX8otV<;oSf|f413(0+4BRC|Co(g2oPej5YCI)5t!&qnSTa3O977 z%Zau&Ru%a!;XL@UkPzUrp$F?r4arEn?$rqkauY;r?@|s^)-tfnHA4Lyt2vtlmf53> z6Dn-F+b72ITC#zZm)M$#n3Rl1qr zMN_W8A#(L->)P<=HTNY;vBNhWMd891@ z@1sn3*nJJ&m(F{g!b`VVbCD?Jq=jG1M#V5%Bjm2pTNy5A9X!{31ruyv$ymvu676n} zYi9)$i0{gZ$WE!WQ)-K6wr!3AZD!|oqk5PWIyEc&Tq9eDT=)55nqWUj7~SC^jFrq3 zw@WSj?ZX;`+H)iw2Hz|;U|{gUEr&^`6b=WwO&yz2cQ>pLMzw+T8SB+6!NzaVev_u$ zHO`kbjlmOoe6ey;Ha~(u@s#T2*2|8cW9;oZ+z7UJ-?PZ!Zm0q4;BL^k*xg{^eWr3y z_$q+i*KL1?0zTq)c-Vk4mBz|Ad4$l_462EV3xXz^^3{D+?>AO#OUR5mRbQQo!!EM@R{l@YBTziu( z4ZmUQ`NU?xia{o&bxDyi1MhnkGPYVf&M!By${k=~plR_sm*ZzReri{{3PBQ)hdmye zlSjz^<#IzjsDnqJKGv;1u3n=okMyO=N6NYFR|p5j(&EOltfxE~EF5Mq6j<{8nq_=}D{E|e{cMTV$ zb77D|dHvY&MtiR1c((N~V{hb`pDcw{Di=^Q%!f-Y@oNmniJ6vtS&(5zruDM(rzKeG zJ5CLca!}Zu??<;BtT(MukG_$^DzRpeDB{U*a8@4U+9Vgpss^rgf?W6-Cr0Nz0MZ1P zz)!HUT2DC)Je5O3P);3NVXx^7Y7mYlOq97+>&F*#TB%$((}fQNU1XcwI5wL^Vb!cM zzH{F3DX)AY(t6tEF0j4`Z|;$^;3=7MyfN4M8*`!39%ri~x7grmWfyxeDB#w8UNRvR zcYeo*4wXI082DSj7QNF_p?BIU^rN=r_83sf{`6NtY0wqHHiJ#ld7YQe)y?D>uSj~J zJT)xUE4l3Gk^L{YT&;&Mq>oo>@K97tOR9p!GGwjtglB-6L^zMmu4=&JV}0mj zRZ-K#a&Oh2U)bqlEF^14GXnYGN~MtWr7BHWCYqF+Ti8n32D`fY2^gIi$_`iUO@`C8 z)rr35!N-))^oJzUvAXrRDP1|B{74RS`{2;nwa%f+T zSG*55D4cN zWJFN*G+394CW{{CT~OQ#cuQdx?3ck8?kv7O9ZjL{tcbvg@HjejWgRZ?^`*O4*5G1a zZ~E(%rQ(xdgZ7$d!l{YA(`fmsCfrNFr;n|wfIk0Yl?Fc3)=Z~6YN}!D^O|<}EL^=E zKL5I!ZKti#;Dmrj53Q*YL3270c%6b%T~E^d+AU&ZgIc=|8-R!nf_z_ETMNg>eQ9fL zr3h){C?PCHS=Zp9oTzKU)9_H*r#=Ud!Bgq^^|Nq3E}^ycMR+tGL4OD#fd*NjqEp1_{IQQ3z33A+@G#pSA(%lkdUa#^xNH&x@jE56uvn*TaZmKPc@I1d(*rLrpl&!|3-Os>c1i1$5w+ z1`q7!;Eya62x#S2I0sTdzYJlZuRkqmo*}xy#vZ#h_OhDhH#gzlJU{xi<|1FcTU=tC z9N&+{-ES`O(26zlL9Ve2|kUK8iP1718no!!>tSHg zAB;Fk`2w;R;tu-9c+rR3qeA4NGjy){F8A)U<|O0;4?m5EVf2^nkyMf*z^L`GAC`)w zq4=F$rT`oXMV|NIo=i^(6#TI6{e3TwI?wtXMcL0>5~%t}P-ZK3{vy$y!3}-PD~yjNXQ7$!js8Y@Q^#&x zX`fEpJ6chUUc1czpV6Hg(7E*Eoe{!?IohbT?Ai{_qyN&G;uH4C9OPOCyQD+&=|4IZ zkU6QV5DR76s3#k{Ks-3w(T+2j`tr^`m8=SMT7|N$5VW?H6?Iy*Zhr49qdRrW5{p9--}ba^A=d*O{rytgG|$s(U0O%**e>LbE*F`* zoXzF$me7CbQsAd=cv@M`4*J(pI(i@-M)2|h)}W{16Q!@hX8@gauog0ILUwulZxGRk z4n72l?t{6a0#H(*#pbf*^IRD{_t0##obErAi&oHYACf*aZDx)%cg`W##Pr-k7;k~v z2G5u4kD_uDq%rV-mYkIysGR(ooyqqL_6-(qvc)fy{oB;O~|ei6PQkv+DQMT%f; zqetJTnSL{AB^~ro^sET#`ujaLpAcyn@(aSw^Yb7Pj%|7h{ea11dI23JsUA5sMa$xe z@X)8DupN>?=XwPqXIMeZ2252T>ol8KjdUW~6M#D0FI7}qTgLQ&+c8_NQyp^N`59_stQ;!8aP|1T85xcS$AEB3)}Eo`8eE9v*2d;;eONa*4t@XP|? z-Xlq3Npl(W4$E+f&zI1~BlASadgZU4quJ#gK`t#hx>^jKs=SJ@Okev8yy)(uak#&i z7d>=zW;__3n&r1av4N|eItupRwd~#q$6uw4#n{UEU4mFf-#=Q7=gg7ORmbLu?8yk` zd4Y9>k44cZjwRxWfh27{mJi374PU0PLO<|>By{LgY2p@q7BY#-;|E32RZpejijiag E1)#XW>i_@% delta 10185 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

J!TM$Jmx8~0|8)IfcOVrH;r zwxP9l^jVp0fN-`D*BLq^WcvEmDh*5-N+~Y$iq+l!IQ3{(@l+?bwCnYfD}lDV}h)&p4!1-x z?_R2Q!qm;<@CXN8+?m16&;rt(sj98P-8@~GYqd}k7jazhcXE6UFG7mSzUUD84|rcvZUuyWw&{ z$k-HkIns??Gxn+I{xF3(BsId|162%HoJBfez1Jj>9?XK~a4IS=T4k?nb--QGMC41S z3&JiX-gjX18++gB?M3=;y7#>@`bq-n{;@EV4qwH^MRx|Xu{9As3rD)fK{z&!e4 zIHyN^HuK)Df1~xxk=@m>(!lOgUK{9OD6DMH3a9HX?b!giVK1)~Q3c5EG;XzZ!Oc%QX9oZAw;=gBPJw-i!8+NXeS zm2(Xt84?`(GTa5+q<6j=zK=1vor^@j%;VdA;Ln`soDXIGt5Xikm{;b)Cbh3jh2?v% zK>69cpcFB~zLE{86Zdm^wCv}4dBKE)FZL(8%Z3W!XmZ_Z#LV#iBKR0O@4#wQ%v?Ay z7k&>M;9AZ&m@J0RT}9J)1uptC9S6H$*Zzm5L6P}9S>VZ39^!O)`%t!rdQ3W(_XO1A zS4j6{CcRn$xqDxo3+3NfI>~^|ZD`w^$-UOL{KAg=B<}@0c!7ZkrE12QK zQ_(yoi^)c3Ftv=7^2y4OW=}tC9}CLP{X&cS($&uQ=l>Iw9Vd;1yR(G!6kq;LdXkG* zh^N1JgE?l7^naz%<8RkrhkAv1286Yn6X(kP=`~Jy*J8Xv0|LD4cE`5nM;Y)r9@a&m zgQ#ypbHb>{SKH0*0n%XPXM{8SdVmLxZ8(m8$xdds0w!EiiXty~>8>7lU?=J0qrH(5 z**y&@jWYRgJQ-}4?izu|bqWbT?f25??nFsxl;y)H-MCEeKo38x{W$tBHtpAAAkyL; zrM`I2dkS;lh!}?~=H!u}EU)l5@hPce_eTBj}6scP+9$(H4WT zW{YexTx7Tr$&`pan5RcFaSlcuogM5t6%UM1gO`VttNo$lV|BZcd{|E}3kYZS9F3-2 z-SPa^!(i`ForF8tb6Jsl3dH_D(HH)|b`0mo@Bc<|kRHEpHq2yNUO#}l__#4d7u@PV zsOXv~mf=OvJ6yQ^=puAu+PY?XB(GIGa_;7C#=B%P*SeOA!OS?t1B9#eH;Ib}lX@%~ zm$-T`<;SvO&i?L|e*{GNlppT`hlY%M*2DhG6;T+s?EceB9Kl>VR*J_@k6_%7!=*I= z!JKD?+b&onQ*k^V_w^MsoyVt$Y3o#Y>B2R-*~yeO(SRPMYlE7sETnQH(5 From 25ddcbf683fb5a7e0b1c9760a0f93ed980f78b51 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 14 Mar 2021 10:12:29 -0700 Subject: [PATCH 14/22] GitHub: Add multiple issue templates w/checklists. To ask better questions upfront. --- .github/ISSUE_TEMPLATE | 14 --------- .github/ISSUE_TEMPLATE/bug.md | 34 +++++++++++++++++++++ .github/ISSUE_TEMPLATE/build.md | 28 +++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 11 +++++++ .github/ISSUE_TEMPLATE/feature.md | 30 +++++++++++++++++++ .github/ISSUE_TEMPLATE/graphics.md | 43 +++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/performance.md | 42 ++++++++++++++++++++++++++ .github/issue_template.md | 29 ++++++++++++++++++ 8 files changed, 217 insertions(+), 14 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE create mode 100644 .github/ISSUE_TEMPLATE/bug.md create mode 100644 .github/ISSUE_TEMPLATE/build.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature.md create mode 100644 .github/ISSUE_TEMPLATE/graphics.md create mode 100644 .github/ISSUE_TEMPLATE/performance.md create mode 100644 .github/issue_template.md diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE deleted file mode 100644 index a3083633a5..0000000000 --- a/.github/ISSUE_TEMPLATE +++ /dev/null @@ -1,14 +0,0 @@ - - - -### What happens? - - -### What *should* happen? - - -### What hardware, operating system, and PPSSPP version? On desktop and mobile phone, GPU matters for graphical issues. -### Please test newest version in https://buildbot.orphis.net/ppsspp/ - diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 0000000000..837cb61c75 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,34 @@ +--- +name: Bug, crash, or compatibility issue +about: Choose this if something doesn't work and no other template applies. +labels: needs triage +--- + + + +### What happens? + + +### What *should* happen? + + +### What are you using? +#### What hardware / device and operating system? + +#### What graphics card (GPU) or mobile phone model? + +#### What PPSSPP version (standalone/official), and did it work before? + +#### Which game or games? + + + +#### Checklist + + - [ ] Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed. + - [ ] [Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue. + - [ ] Try resetting settings or older versions and include if the issue is related. + - [ ] Include logs or screenshots of issue. diff --git a/.github/ISSUE_TEMPLATE/build.md b/.github/ISSUE_TEMPLATE/build.md new file mode 100644 index 0000000000..6c565b95d6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/build.md @@ -0,0 +1,28 @@ +--- +name: Building or contributing +about: Choose for issues building PPSSPP on certain platforms or with certain toolsets. +labels: needs triage +--- + + +### What platform, compiler, and build tools? + + +### What happens (don't forget logs)? + + +### What are you using? +#### What hardware / device and operating system? + +#### What PPSSPP version (standalone/official), and did it work before? + + +#### Checklist + + - [ ] Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed. + - [ ] Don't forget `git submodule update --init --recursive`. + - [ ] [Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue. + - [ ] Try deleting the build directory and starting fresh. + - [ ] Include logs and help us reproduce. + - [ ] Check GitHub Actions, which builds every merge and PR. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..6f478bb9da --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: true +contact_links: + - name: Forums for questions and help + url: https://forums.ppsspp.org/ + about: 'Please ask questions here or on Discord. Includes multiplayer resources, texture packs, cheats, and performance tips.' + - name: Compatibility list + url: http://report.ppsspp.org/games + about: Look here for user reports on best settings and compatibility. + - name: Translations + url: https://github.com/hrydgard/ppsspp-lang + about: Look here to contribute translations to PPSSPP. diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md new file mode 100644 index 0000000000..6a82a5f328 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.md @@ -0,0 +1,30 @@ +--- +name: New feature or behavior change +about: Choose when something isn't broken, but you want it to be better. +labels: needs triage +--- + + + +### What should happen? + + +### Who would benefit from it? + + +### What's it specific to (remove if not)? +#### Hardware, device, or operating system? + +#### Specific games? + + +### Does anything else have a similar feature? + + +#### Checklist + + - [ ] Check the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already implemented. + - [ ] [Search for other requests](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same feature. diff --git a/.github/ISSUE_TEMPLATE/graphics.md b/.github/ISSUE_TEMPLATE/graphics.md new file mode 100644 index 0000000000..9de08270e0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/graphics.md @@ -0,0 +1,43 @@ +--- +name: Graphics or rendering issue +about: Choose when something is drawing wrong. +labels: needs triage +--- + + + +### What happens? + + + +### What *should* happen? + + +### Include a GE frame capture + + + +### What are you using? +#### What hardware / device and operating system? + +#### What graphics card (GPU) or mobile phone model? + +#### What PPSSPP version (standalone/official), and did it work before? + +#### Which game or games? + + +#### Graphics backend (Vulkan, OpenGL, etc.)? + + +#### Checklist + + - [ ] Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed. + - [ ] [Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue. + - [ ] Try resetting settings or older versions and include if the issue is related. + - [ ] Try changing graphics settings to determine if one causes the bug. + - [ ] Include logs or screenshots of issue. diff --git a/.github/ISSUE_TEMPLATE/performance.md b/.github/ISSUE_TEMPLATE/performance.md new file mode 100644 index 0000000000..569e37c68a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/performance.md @@ -0,0 +1,42 @@ +--- +name: Slowdown or performance problem +about: Choose when things got slower from a previous version or a specific scene runs really poorly. +labels: needs triage +--- + + + +### What games and where in them does it happen? + + + +### What speed are you getting with PPSSPP speed display enabled? + + +### Include a GE frame capture and debug stats + + + +### What are you using? +#### What hardware / device and operating system? + +#### What graphics card (GPU) or mobile phone model? + +#### What PPSSPP version (standalone/official), and did it work before? + +#### Graphics backend (Vulkan, OpenGL, etc.)? + + +#### Checklist + + - [ ] Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed. + - [ ] [Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue. + - [ ] Try resetting settings or older versions and include if the issue is related. + - [ ] Try changing graphics settings to determine if one causes the slowdown. + - [ ] Include logs of screenshots of issue. diff --git a/.github/issue_template.md b/.github/issue_template.md new file mode 100644 index 0000000000..d8eb6547cc --- /dev/null +++ b/.github/issue_template.md @@ -0,0 +1,29 @@ + + + +### What happens? + + +### What *should* happen? + + +### What are you using? +#### What hardware / device and operating system? + +#### What graphics card (GPU) or mobile phone model? + +#### What PPSSPP version (standalone/official), and did it work before? + +#### Which game or games? + + + +#### Checklist + + - [ ] Test in the [latest git build](https://buildbot.orphis.net/ppsspp/) in case it's already fixed. + - [ ] [Search for other reports](https://github.com/hrydgard/ppsspp/search?q=my+issue&type=issues) of the same issue. + - [ ] Try resetting settings or older versions and include if the issue is related. + - [ ] Include logs or screenshots of issue. From 63a94ceebb5f82c2aa5015c6bd514df191755ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 14 Mar 2021 21:27:20 +0100 Subject: [PATCH 15/22] Fix performance regression from failing to optimize the new mem tracker.. --- Core/Debugger/MemBlockInfo.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Core/Debugger/MemBlockInfo.cpp b/Core/Debugger/MemBlockInfo.cpp index 4f4a5f909f..820f29b88b 100644 --- a/Core/Debugger/MemBlockInfo.cpp +++ b/Core/Debugger/MemBlockInfo.cpp @@ -61,7 +61,7 @@ private: // Returns the new slab after size. Slab *Split(Slab *slab, uint32_t size); void MergeAdjacent(Slab *slab); - bool Same(const Slab *a, const Slab *b) const; + static inline bool Same(const Slab *a, const Slab *b); void Merge(Slab *a, Slab *b); void FillHeads(Slab *slab); @@ -267,6 +267,16 @@ MemSlabMap::Slab *MemSlabMap::Split(Slab *slab, uint32_t size) { return next; } +bool MemSlabMap::Same(const Slab *a, const Slab *b) { + if (a->allocated != b->allocated) + return false; + if (a->pc != b->pc) + return false; + if (strcmp(a->tag, b->tag)) + return false; + return true; +} + void MemSlabMap::MergeAdjacent(Slab *slab) { while (slab->next != nullptr && Same(slab, slab->next)) { Merge(slab, slab->next); @@ -276,16 +286,6 @@ void MemSlabMap::MergeAdjacent(Slab *slab) { } } -bool MemSlabMap::Same(const Slab *a, const Slab *b) const { - if (a->allocated != b->allocated) - return false; - if (a->pc != b->pc) - return false; - if (a->tag != b->tag) - return false; - return true; -} - void MemSlabMap::Merge(Slab *a, Slab *b) { if (a->next == b) { _assert_(a->end == b->start); From b93e02ad7360aefcf6da35791e8f9f59ca4061aa Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 14 Mar 2021 15:10:35 -0700 Subject: [PATCH 16/22] Debugger: Ignore small memory info by default. The ini can be updated to enable higher resolution data. Allocations are always at least 0x100, so this is still pretty useful. --- Core/Config.cpp | 1 + Core/Config.h | 1 + Core/Debugger/MemBlockInfo.cpp | 25 ++++++++++++++----------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 08bd436f48..16a75c3a41 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1053,6 +1053,7 @@ static ConfigSetting debuggerSettings[] = { ConfigSetting("ShowGpuProfile", &g_Config.bShowGpuProfile, false, false), ConfigSetting("SkipDeadbeefFilling", &g_Config.bSkipDeadbeefFilling, false), ConfigSetting("FuncHashMap", &g_Config.bFuncHashMap, false), + ConfigSetting("MemInfoDetailed", &g_Config.bDebugMemInfoDetailed, false), ConfigSetting("DrawFrameGraph", &g_Config.bDrawFrameGraph, false), ConfigSetting(false), diff --git a/Core/Config.h b/Core/Config.h index ef3dc7c7e9..061b90f241 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -467,6 +467,7 @@ public: // Double edged sword: much easier debugging, but not accurate. bool bSkipDeadbeefFilling; bool bFuncHashMap; + bool bDebugMemInfoDetailed; bool bDrawFrameGraph; // Volatile development settings diff --git a/Core/Debugger/MemBlockInfo.cpp b/Core/Debugger/MemBlockInfo.cpp index 4f4a5f909f..e60f209edd 100644 --- a/Core/Debugger/MemBlockInfo.cpp +++ b/Core/Debugger/MemBlockInfo.cpp @@ -22,6 +22,7 @@ #include "Common/Log.h" #include "Common/Serialize/Serializer.h" #include "Common/Serialize/SerializeFuncs.h" +#include "Core/Config.h" #include "Core/CoreTiming.h" #include "Core/Debugger/Breakpoints.h" #include "Core/Debugger/MemBlockInfo.h" @@ -366,18 +367,20 @@ void NotifyMemInfoPC(MemBlockFlags flags, uint32_t start, uint32_t size, uint32_ // Clear the uncached and kernel bits. start &= ~0xC0000000; - PendingNotifyMem info{ flags, start, size }; - info.ticks = CoreTiming::GetTicks(); - info.pc = pc; - size_t copyLength = strLength; - if (copyLength >= sizeof(info.tag)) { - copyLength = sizeof(info.tag) - 1; - } - memcpy(info.tag, tagStr, copyLength); - info.tag[copyLength] = 0; - bool needFlush = false; - { + // When the setting is off, we skip smaller info to keep things fast. + if (g_Config.bDebugMemInfoDetailed || size >= 0x100) { + PendingNotifyMem info{ flags, start, size }; + info.ticks = CoreTiming::GetTicks(); + info.pc = pc; + + size_t copyLength = strLength; + if (copyLength >= sizeof(info.tag)) { + copyLength = sizeof(info.tag) - 1; + } + memcpy(info.tag, tagStr, copyLength); + info.tag[copyLength] = 0; + std::lock_guard guard(pendingMutex); pendingNotifies.push_back(info); needFlush = pendingNotifies.size() > MAX_PENDING_NOTIFIES; From f6ad90fab8e577bbb9dbb443c61f7a26a55b957f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 14 Mar 2021 16:52:48 -0700 Subject: [PATCH 17/22] Module: Correctly handle modules with -1 entry. It should not try to run, options or not. --- Core/ELF/ElfReader.cpp | 3 ++- Core/HLE/sceKernelModule.cpp | 14 +++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/Core/ELF/ElfReader.cpp b/Core/ELF/ElfReader.cpp index 917bcb48f1..69328d49e2 100644 --- a/Core/ELF/ElfReader.cpp +++ b/Core/ELF/ElfReader.cpp @@ -445,7 +445,8 @@ int ElfReader::LoadInto(u32 loadAddress, bool fromTop) if (bRelocate) { DEBUG_LOG(LOADER,"Relocatable module"); - entryPoint += vaddr; + if (entryPoint != (u32)-1) + entryPoint += vaddr; } else { DEBUG_LOG(LOADER,"Prerelocated executable"); } diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index cd98ce0b00..b6b270d916 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -2085,16 +2085,6 @@ int KernelStartModule(SceUID moduleId, u32 argsize, u32 argAddr, u32 returnValue entryAddr = module->nm.module_start_func; if (module->nm.module_start_thread_attr != 0) attribute = module->nm.module_start_thread_attr; - } else if (entryAddr == (u32)-1 || entryAddr == module->memoryBlockAddr - 1) { - if (smoption) { - // TODO: Does sceKernelStartModule() really give an error when no entry only if you pass options? - attribute = smoption->attribute; - } else { - // TODO: Why are we just returning the module ID in this case? - WARN_LOG(SCEMODULE, "sceKernelStartModule(): module has no start or entry func"); - module->nm.status = MODULE_STATUS_STARTED; - return moduleId; - } } if (Memory::IsValidAddress(entryAddr)) { @@ -2110,6 +2100,8 @@ int KernelStartModule(SceUID moduleId, u32 argsize, u32 argAddr, u32 returnValue stacksize = module->nm.module_start_thread_stacksize; } + // TODO: Why do we skip smoption->attribute here? + SceUID threadID = __KernelCreateThread(module->nm.name, moduleId, entryAddr, priority, stacksize, attribute, 0, (module->nm.attribute & 0x1000) != 0); __KernelStartThreadValidate(threadID, argsize, argAddr); __KernelSetThreadRA(threadID, NID_MODULERETURN); @@ -2117,7 +2109,7 @@ int KernelStartModule(SceUID moduleId, u32 argsize, u32 argAddr, u32 returnValue if (needsWait) { *needsWait = true; } - } else if (entryAddr == 0) { + } else if (entryAddr == 0 || entryAddr == (u32)-1) { INFO_LOG(SCEMODULE, "sceKernelStartModule(%d,asize=%08x,aptr=%08x,retptr=%08x): no entry address", moduleId, argsize, argAddr, returnValueAddr); module->nm.status = MODULE_STATUS_STARTED; } else { From 2cdafd97eacd31b32dd27a5069eed7ec2c8c5aae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 16 Mar 2021 21:35:12 +0100 Subject: [PATCH 18/22] Disable range culling in Asphalt 2. See #14299 --- assets/compat.ini | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/assets/compat.ini b/assets/compat.ini index 358561e8df..91792cf9c0 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -219,6 +219,10 @@ ULES00645 = true ULES00281 = true ULUS10070 = true +# Asphalt 2 (#14299) +ULES00719 = true +# No US release, it seems + [ClearToRAM] # SOCOM Navy Seals games require this. See issue #8973. # Navy Seals : Tactical Strike From 38ea5b3c601fdf06c2393b68e90093127043c03d Mon Sep 17 00:00:00 2001 From: Paul Cercueil Date: Wed, 17 Mar 2021 14:33:03 +0000 Subject: [PATCH 19/22] CMake: Don't include X11 headers when compiling for FBDEV When compiling for FBDEV, we don't need/want the X11 headers. These are included by default by ; compile with the EGL_NO_X11 macro set to prevent that. Signed-off-by: Paul Cercueil --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index db6760b140..88bc9cf0c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -219,7 +219,7 @@ if(USING_EGL) add_definitions(-DUSING_EGL) endif() if(USING_FBDEV) - add_definitions(-DUSING_FBDEV) + add_definitions(-DUSING_FBDEV -DEGL_NO_X11) endif() if(USING_GLES2) add_definitions(-DUSING_GLES2) From 0b5e528bc420bc6f36883ff5f1451e16d694443a Mon Sep 17 00:00:00 2001 From: Paul Cercueil Date: Wed, 17 Mar 2021 15:23:38 +0000 Subject: [PATCH 20/22] CMake: Fix build when ENABLE_SPVREMAPPER=OFF It previously tried to link inconditionally to SPVRemapper. Signed-off-by: Paul Cercueil --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index db6760b140..91132eb192 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1831,7 +1831,11 @@ set(CoreExtraLibs ${CoreExtraLibs} armips) # target_link_libraries(native X11-xcb X11) #endif() -set(GlslangLibs glslang OGLCompiler OSDependent SPIRV SPVRemapper spirv-cross-glsl) +set(GlslangLibs glslang OGLCompiler OSDependent SPIRV spirv-cross-glsl) + +if (ENABLE_SPVREMAPPER) + list(APPEND GlslangLibs SPVRemapper) +endif() if(WIN32) set(GlslangLibs ${GlslangLibs} spirv-cross-hlsl) From ce0af0743cc05abfe974ae180761e4e4c9adc640 Mon Sep 17 00:00:00 2001 From: Paul Cercueil Date: Wed, 17 Mar 2021 14:31:45 +0000 Subject: [PATCH 21/22] VertexDecoderFake: Fix build Fix build of VertexDecoderFake. Tested on MIPS. Signed-off-by: Paul Cercueil --- GPU/Common/VertexDecoderFake.cpp | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/GPU/Common/VertexDecoderFake.cpp b/GPU/Common/VertexDecoderFake.cpp index 6e170f93b9..709d0647e8 100644 --- a/GPU/Common/VertexDecoderFake.cpp +++ b/GPU/Common/VertexDecoderFake.cpp @@ -15,11 +15,11 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. -//TODO: Doesn't build, FIXME! -#if 0 - #include "ppsspp_config.h" #include "Common/CPUDetect.h" +#if !PPSSPP_ARCH(MIPS) +#include "Common/FakeEmitter.h" +#endif #include "Core/Config.h" #include "Core/Reporting.h" #include "GPU/GPUState.h" @@ -44,18 +44,16 @@ static const JitLookup jitLookup[] = { {&VertexDecoder::Step_WeightsU16Skin, &VertexDecoderJitCache::Jit_WeightsU16Skin}, {&VertexDecoder::Step_WeightsFloatSkin, &VertexDecoderJitCache::Jit_WeightsFloatSkin}, - {&VertexDecoder::Step_TcU8, &VertexDecoderJitCache::Jit_TcU8}, - {&VertexDecoder::Step_TcU16, &VertexDecoderJitCache::Jit_TcU16}, + {&VertexDecoder::Step_TcU8ToFloat, &VertexDecoderJitCache::Jit_TcU8ToFloat}, + {&VertexDecoder::Step_TcU16ToFloat, &VertexDecoderJitCache::Jit_TcU16ToFloat}, {&VertexDecoder::Step_TcFloat, &VertexDecoderJitCache::Jit_TcFloat}, - {&VertexDecoder::Step_TcU16Double, &VertexDecoderJitCache::Jit_TcU16Double}, {&VertexDecoder::Step_TcU8Prescale, &VertexDecoderJitCache::Jit_TcU8Prescale}, {&VertexDecoder::Step_TcU16Prescale, &VertexDecoderJitCache::Jit_TcU16Prescale}, {&VertexDecoder::Step_TcFloatPrescale, &VertexDecoderJitCache::Jit_TcFloatPrescale}, - {&VertexDecoder::Step_TcU16Through, &VertexDecoderJitCache::Jit_TcU16Through}, + {&VertexDecoder::Step_TcU16ThroughToFloat, &VertexDecoderJitCache::Jit_TcU16ThroughToFloat}, {&VertexDecoder::Step_TcFloatThrough, &VertexDecoderJitCache::Jit_TcFloatThrough}, - {&VertexDecoder::Step_TcU16ThroughDouble, &VertexDecoderJitCache::Jit_TcU16ThroughDouble}, {&VertexDecoder::Step_NormalS8, &VertexDecoderJitCache::Jit_NormalS8}, {&VertexDecoder::Step_NormalS16, &VertexDecoderJitCache::Jit_NormalS16}, @@ -127,27 +125,21 @@ void VertexDecoderJitCache::Jit_WeightsU16Skin() { void VertexDecoderJitCache::Jit_WeightsFloatSkin() { } -void VertexDecoderJitCache::Jit_TcU8() { +void VertexDecoderJitCache::Jit_TcU8ToFloat() { } -void VertexDecoderJitCache::Jit_TcU16() { +void VertexDecoderJitCache::Jit_TcU16ToFloat() { } void VertexDecoderJitCache::Jit_TcFloat() { } -void VertexDecoderJitCache::Jit_TcU16Through() { +void VertexDecoderJitCache::Jit_TcU16ThroughToFloat() { } void VertexDecoderJitCache::Jit_TcFloatThrough() { } -void VertexDecoderJitCache::Jit_TcU16Double() { -} - -void VertexDecoderJitCache::Jit_TcU16ThroughDouble() { -} - void VertexDecoderJitCache::Jit_TcU8Prescale() { } @@ -272,5 +264,3 @@ void VertexDecoderJitCache::Jit_NormalFloatMorph() { bool VertexDecoderJitCache::CompileStep(const VertexDecoder &dec, int step) { return false; } - -#endif From 08e60c27d74d73dfcd8da3656db4193cdd9f0a12 Mon Sep 17 00:00:00 2001 From: Paul Cercueil Date: Fri, 19 Mar 2021 12:48:23 +0000 Subject: [PATCH 22/22] Fix build with USE_MINIUPNPC=OFF Instead of adding platform-specific dirty workarounds, why not try to handle things *properly*? With this commit, the PortManager will compile UPnP specific code only if USE_MINIUPNPC is set. Signed-off-by: Paul Cercueil --- CMakeLists.txt | 2 +- Core/Util/PortManager.cpp | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e24eeb5126..598107a6b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1886,7 +1886,7 @@ if(USE_MINIUPNPC) add_definitions(-fPIC) endif() - add_definitions(-DMINIUPNP_STATICLIB) + add_definitions(-DWITH_UPNP -DMINIUPNP_STATICLIB) set(MINIUPNP_DIR "ext/miniupnp/miniupnpc") include_directories(${CMAKE_CURRENT_BINARY_DIR}) configure_file(${MINIUPNP_DIR}/miniupnpcstrings.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/miniupnpcstrings.h) # by default miniupnp repo doesn't contains miniupnpcstrings.h and need to be generated diff --git a/Core/Util/PortManager.cpp b/Core/Util/PortManager.cpp index a8ef97e034..06e1968716 100644 --- a/Core/Util/PortManager.cpp +++ b/Core/Util/PortManager.cpp @@ -68,7 +68,7 @@ PortManager::~PortManager() { void PortManager::Terminate() { VERBOSE_LOG(SCENET, "PortManager::Terminate()"); if (urls) { -#if !PPSSPP_PLATFORM(SWITCH) +#ifdef WITH_UPNP FreeUPNPUrls(urls); #endif free(urls); @@ -88,7 +88,7 @@ void PortManager::Terminate() { } bool PortManager::Initialize(const unsigned int timeout) { -#if !PPSSPP_PLATFORM(SWITCH) +#ifdef WITH_UPNP // Windows: Assuming WSAStartup already called beforehand struct UPNPDev* devlist; struct UPNPDev* dev; @@ -184,7 +184,7 @@ bool PortManager::Initialize(const unsigned int timeout) { auto n = GetI18NCategory("Networking"); host->NotifyUserMessage(n->T("Unable to find UPnP device"), 2.0f, 0x0000ff); m_InitState = UPNP_INITSTATE_NONE; -#endif // !PPSSPP_PLATFORM(SWITCH) +#endif // WITH_UPNP return false; } @@ -193,7 +193,7 @@ int PortManager::GetInitState() { } bool PortManager::Add(const char* protocol, unsigned short port, unsigned short intport) { -#if !PPSSPP_PLATFORM(SWITCH) +#ifdef WITH_UPNP char port_str[16]; char intport_str[16]; int r; @@ -242,11 +242,11 @@ bool PortManager::Add(const char* protocol, unsigned short port, unsigned short return true; #else return false; -#endif // !PPSSPP_PLATFORM(SWITCH) +#endif // WITH_UPNP } bool PortManager::Remove(const char* protocol, unsigned short port) { -#if !PPSSPP_PLATFORM(SWITCH) +#ifdef WITH_UPNP char port_str[16]; INFO_LOG(SCENET, "PortManager::Remove(%s, %d)", protocol, port); @@ -273,11 +273,11 @@ bool PortManager::Remove(const char* protocol, unsigned short port) { return true; #else return false; -#endif // !PPSSPP_PLATFORM(SWITCH) +#endif // WITH_UPNP } bool PortManager::Restore() { -#if !PPSSPP_PLATFORM(SWITCH) +#ifdef WITH_UPNP int r; VERBOSE_LOG(SCENET, "PortManager::Restore()"); if (urls == NULL || urls->controlURL == NULL || urls->controlURL[0] == '\0') @@ -319,11 +319,11 @@ bool PortManager::Restore() { return true; #else return false; -#endif // !PPSSPP_PLATFORM(SWITCH) +#endif // WITH_UPNP } bool PortManager::Clear() { -#if !PPSSPP_PLATFORM(SWITCH) +#ifdef WITH_UPNP int r; int i = 0; char index[6]; @@ -377,11 +377,11 @@ bool PortManager::Clear() { return true; #else return false; -#endif // !PPSSPP_PLATFORM(SWITCH) +#endif // WITH_UPNP } bool PortManager::RefreshPortList() { -#if !PPSSPP_PLATFORM(SWITCH) +#ifdef WITH_UPNP int r; int i = 0; char index[6]; @@ -434,7 +434,7 @@ bool PortManager::RefreshPortList() { return true; #else return false; -#endif // !PPSSPP_PLATFORM(SWITCH) +#endif // WITH_UPNP } int upnpService(const unsigned int timeout)