From 7d24fca4e22bec969f3fd5d05f186c91a9f7af48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 25 Oct 2024 12:00:28 +0200 Subject: [PATCH 1/9] Crashfix when switching buffered/non-buffered with the game running --- Common/GPU/Vulkan/VulkanRenderManager.cpp | 12 ++++++++---- Core/System.cpp | 1 - GPU/Common/FramebufferManagerCommon.cpp | 6 ++++++ UI/EmuScreen.cpp | 7 +++++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index b774d4123d86..259cac7dcc50 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -370,8 +370,10 @@ void VulkanRenderManager::StartThreads() { // Called from main thread. void VulkanRenderManager::StopThreads() { - // Make sure we don't have an open render pass. - EndCurRenderStep(); + // Make sure we don't have an open non-backbuffer render pass + if (curRenderStep_ && curRenderStep_->render.framebuffer != nullptr) { + EndCurRenderStep(); + } // Not sure this is a sensible check - should be ok even if not. // _dbg_assert_(steps_.empty()); @@ -1140,6 +1142,8 @@ void VulkanRenderManager::CopyImageToMemorySync(VkImage image, int mipLevel, int // Need to call this after FlushSync so the pixels are guaranteed to be ready in CPU-accessible VRAM. queueRunner_.CopyReadbackBuffer(frameData_[vulkan_->GetCurFrame()], nullptr, w, h, destFormat, destFormat, pixelStride, pixels); + + _dbg_assert_(steps_.empty()); } static void RemoveDrawCommands(FastVec *cmds) { @@ -1338,8 +1342,6 @@ void VulkanRenderManager::BlitFramebuffer(VKRFramebuffer *src, VkRect2D srcRect, } } - EndCurRenderStep(); - // Sanity check. Added an assert to try to gather more info. // Got this assert in NPJH50443 FINAL FANTASY TYPE-0, but pretty rare. Moving back to debug assert. if (aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) { @@ -1352,6 +1354,8 @@ void VulkanRenderManager::BlitFramebuffer(VKRFramebuffer *src, VkRect2D srcRect, } } + EndCurRenderStep(); + VKRStep *step = new VKRStep{ VKRStepType::BLIT }; step->blit.aspectMask = aspectMask; step->blit.src = src; diff --git a/Core/System.cpp b/Core/System.cpp index 9bca1c1705c8..b8cb8f21825a 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -594,7 +594,6 @@ bool PSP_Reboot(std::string *error_string) { } void PSP_BeginHostFrame() { - // Reapply the graphics state of the PSP if (gpu) { gpu->BeginHostFrame(); } diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 6b6de5288f62..305aff0bf41a 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -89,6 +89,7 @@ void FramebufferManagerCommon::Init(int msaaLevel) { NotifyRenderResized(msaaLevel); } +// Returns true if we need to stop the render thread bool FramebufferManagerCommon::UpdateRenderSize(int msaaLevel) { const bool newRender = renderWidth_ != (float)PSP_CoreParameter().renderWidth || renderHeight_ != (float)PSP_CoreParameter().renderHeight || msaaLevel_ != msaaLevel; @@ -111,6 +112,11 @@ bool FramebufferManagerCommon::UpdateRenderSize(int msaaLevel) { useBufferedRendering_ = newBuffered; presentation_->UpdateRenderSize(renderWidth_, renderHeight_); + + // If just switching TO buffered rendering, no need to pause the threads. In fact this causes problems due to the open backbuffer renderpass. + if (!useBufferedRendering_ && newBuffered) { + return false; + } return newRender || newSettings; } diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index d01bcdf73bcf..496ebf105057 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -1395,6 +1395,10 @@ ScreenRenderFlags EmuScreen::render(ScreenRenderMode mode) { if (!framebufferBound) { draw->BindFramebufferAsRenderTarget(nullptr, { RPAction::CLEAR, RPAction::CLEAR, RPAction::CLEAR, }, "EmuScreen_Behind"); } + + Draw::BackendState state = draw->GetCurrentBackendState(); + _assert_msg_(!state.valid || state.passes >= 1, "skipB: %d sw: %d mode: %d back: %d tag: %s", (int)skipBufferEffects, (int)g_Config.bSoftwareRendering, (int)mode, (int)g_Config.iGPUBackend, screenManager()->topScreen()->tag()); + // Need to make sure the UI texture is available, for "darken". screenManager()->getUIContext()->BeginFrame(); draw->SetViewport(viewport); @@ -1515,13 +1519,12 @@ ScreenRenderFlags EmuScreen::render(ScreenRenderMode mode) { draw->BindFramebufferAsRenderTarget(nullptr, { RPAction::CLEAR, RPAction::CLEAR, RPAction::CLEAR, clearColor }, "EmuScreen_NoFrame"); draw->SetViewport(viewport); draw->SetScissorRect(0, 0, g_display.pixel_xres, g_display.pixel_yres); - framebufferBound = true; } Draw::BackendState state = draw->GetCurrentBackendState(); // We allow if !state.valid, that means it's not the Vulkan backend. - _assert_msg_(!state.valid || state.passes >= 1, "skipB: %d sw: %d mode: %d back: %d", (int)skipBufferEffects, (int)g_Config.bSoftwareRendering, (int)mode, (int)g_Config.iGPUBackend); + _assert_msg_(!state.valid || state.passes >= 1, "skipB: %d sw: %d mode: %d back: %d bound: %d", (int)skipBufferEffects, (int)g_Config.bSoftwareRendering, (int)mode, (int)g_Config.iGPUBackend, (int)framebufferBound); screenManager()->getUIContext()->BeginFrame(); From bd8905aa44fe9d1fecc191ff619f8b93e992e064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 25 Oct 2024 15:19:44 +0200 Subject: [PATCH 2/9] Avoid crashing on PSX EBOOTs renamed to ISO (people try strange things...) --- Core/FileSystems/BlockDevices.cpp | 11 +++++++++++ UI/MainScreen.cpp | 1 + Windows/main.cpp | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Core/FileSystems/BlockDevices.cpp b/Core/FileSystems/BlockDevices.cpp index 1e7dd8402ca9..c5e2add3fdd1 100644 --- a/Core/FileSystems/BlockDevices.cpp +++ b/Core/FileSystems/BlockDevices.cpp @@ -395,6 +395,17 @@ NPDRMDemoBlockDevice::NPDRMDemoBlockDevice(FileLoader *fileLoader) ERROR_LOG(Log::Loader, "Invalid NPUMDIMG header!"); } + u32 psar_id; + fileLoader->ReadAt(psarOffset, 4, 1, &psar_id); + + INFO_LOG(Log::Loader, "NPDRM: PSAR ID: %08x"); + // PS1 PSAR begins with "PSISOIMG0000" + if (psar_id == 'SISP') { + lbaSize_ = 0; // Mark invalid + ERROR_LOG(Log::Loader, "PSX not supported! Should have been caught earlier."); + return; + } + kirk_init(); // getkey diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 40a35588690f..411e5f59c194 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -1072,6 +1072,7 @@ UI::EventReturn GameBrowser::GridSettingsClick(UI::EventParams &e) { } UI::EventReturn GameBrowser::OnRecentClear(UI::EventParams &e) { + _assert_(screenManager_); screenManager_->RecreateAllViews(); System_Notify(SystemNotification::UI); return UI::EVENT_DONE; diff --git a/Windows/main.cpp b/Windows/main.cpp index 57e13bb7de37..01f6b1dfb3da 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -121,7 +121,7 @@ static double g_lastActivity = 0.0; static double g_lastKeepAwake = 0.0; // Time until we stop considering the core active without user input. // Should this be configurable? 2 hours currently. -static const double ACTIVITY_IDLE_TIMEOUT = 2.0 * 3600.0; +static constexpr double ACTIVITY_IDLE_TIMEOUT = 2.0 * 3600.0; void System_LaunchUrl(LaunchUrlType urlType, const char *url) { ShellExecute(NULL, L"open", ConvertUTF8ToWString(url).c_str(), NULL, NULL, SW_SHOWNORMAL); From 26f01174217183b38b564c4f063d9404bfa2e4c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 25 Oct 2024 21:07:23 +0200 Subject: [PATCH 3/9] Replace mentions of Twitter with X --- Tools/langtool/Cargo.lock | 36 ++++++++++++++++++------------------ UI/MainScreen.cpp | 1 - UI/MiscScreens.cpp | 5 +++-- UI/MiscScreens.h | 2 +- assets/lang/ar_AE.ini | 2 +- assets/lang/az_AZ.ini | 2 +- assets/lang/bg_BG.ini | 2 +- assets/lang/ca_ES.ini | 2 +- assets/lang/cz_CZ.ini | 2 +- assets/lang/da_DK.ini | 2 +- assets/lang/de_DE.ini | 2 +- assets/lang/dr_ID.ini | 2 +- assets/lang/en_US.ini | 2 +- assets/lang/es_ES.ini | 2 +- assets/lang/es_LA.ini | 2 +- assets/lang/fa_IR.ini | 2 +- assets/lang/fi_FI.ini | 2 +- assets/lang/fr_FR.ini | 2 +- assets/lang/gl_ES.ini | 2 +- assets/lang/gr_EL.ini | 2 +- assets/lang/he_IL.ini | 2 +- assets/lang/he_IL_invert.ini | 2 +- assets/lang/hr_HR.ini | 2 +- assets/lang/hu_HU.ini | 2 +- assets/lang/id_ID.ini | 2 +- assets/lang/it_IT.ini | 2 +- assets/lang/ja_JP.ini | 2 +- assets/lang/jv_ID.ini | 2 +- assets/lang/ko_KR.ini | 2 +- assets/lang/ku_SO.ini | 2 +- assets/lang/lo_LA.ini | 2 +- assets/lang/lt-LT.ini | 2 +- assets/lang/ms_MY.ini | 2 +- assets/lang/nl_NL.ini | 2 +- assets/lang/no_NO.ini | 2 +- assets/lang/pl_PL.ini | 6 +++--- assets/lang/pt_BR.ini | 2 +- assets/lang/pt_PT.ini | 2 +- assets/lang/ro_RO.ini | 2 +- assets/lang/ru_RU.ini | 2 +- assets/lang/sv_SE.ini | 2 +- assets/lang/tg_PH.ini | 2 +- assets/lang/th_TH.ini | 2 +- assets/lang/tr_TR.ini | 2 +- assets/lang/uk_UA.ini | 2 +- assets/lang/vi_VN.ini | 2 +- assets/lang/zh_CN.ini | 2 +- assets/lang/zh_TW.ini | 2 +- 48 files changed, 68 insertions(+), 68 deletions(-) diff --git a/Tools/langtool/Cargo.lock b/Tools/langtool/Cargo.lock index 6717cf54fbad..1e7cff194b2f 100644 --- a/Tools/langtool/Cargo.lock +++ b/Tools/langtool/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" dependencies = [ "anstyle", "anstyle-parse", @@ -19,33 +19,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", "windows-sys", @@ -93,9 +93,9 @@ checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "heck" @@ -118,9 +118,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.87" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -142,9 +142,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.79" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", @@ -165,9 +165,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "windows-sys" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets", ] diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 411e5f59c194..40a35588690f 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -1072,7 +1072,6 @@ UI::EventReturn GameBrowser::GridSettingsClick(UI::EventParams &e) { } UI::EventReturn GameBrowser::OnRecentClear(UI::EventParams &e) { - _assert_(screenManager_); screenManager_->RecreateAllViews(); System_Notify(SystemNotification::UI); return UI::EVENT_DONE; diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index 1e4e43e61b3e..564c61b02a9d 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -813,7 +813,7 @@ void CreditsScreen::CreateViews() { root_->Add(new Button(cr->T("Discord"), new AnchorLayoutParams(260, 64, 10, NONE, NONE, 232, false)))->OnClick.Handle(this, &CreditsScreen::OnDiscord); root_->Add(new Button("www.ppsspp.org", new AnchorLayoutParams(260, 64, 10, NONE, NONE, 10, false)))->OnClick.Handle(this, &CreditsScreen::OnPPSSPPOrg); root_->Add(new Button(cr->T("Privacy Policy"), new AnchorLayoutParams(260, 64, 10, NONE, NONE, 84, false)))->OnClick.Handle(this, &CreditsScreen::OnPrivacy); - root_->Add(new Button(cr->T("Twitter @PPSSPP_emu"), new AnchorLayoutParams(260, 64, NONE, NONE, 10, rightYOffset + 84, false)))->OnClick.Handle(this, &CreditsScreen::OnTwitter); + root_->Add(new Button(cr->T("X @PPSSPP_emu"), new AnchorLayoutParams(260, 64, NONE, NONE, 10, rightYOffset + 84, false)))->OnClick.Handle(this, &CreditsScreen::OnX); #if PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(IOS) root_->Add(new Button(cr->T("Share PPSSPP"), new AnchorLayoutParams(260, 64, NONE, NONE, 10, rightYOffset + 158, false)))->OnClick.Handle(this, &CreditsScreen::OnShare); @@ -834,7 +834,8 @@ UI::EventReturn CreditsScreen::OnSupport(UI::EventParams &e) { return UI::EVENT_DONE; } -UI::EventReturn CreditsScreen::OnTwitter(UI::EventParams &e) { +UI::EventReturn CreditsScreen::OnX(UI::EventParams &e) { + // Not sure we should change to x.com here, given various platform URL handlers etc. We can probably change it soon. System_LaunchUrl(LaunchUrlType::BROWSER_URL, "https://twitter.com/PPSSPP_emu"); return UI::EVENT_DONE; } diff --git a/UI/MiscScreens.h b/UI/MiscScreens.h index 1f03df3a7cd5..30a33bbdbbc9 100644 --- a/UI/MiscScreens.h +++ b/UI/MiscScreens.h @@ -176,7 +176,7 @@ class CreditsScreen : public UIDialogScreenWithBackground { UI::EventReturn OnForums(UI::EventParams &e); UI::EventReturn OnDiscord(UI::EventParams &e); UI::EventReturn OnShare(UI::EventParams &e); - UI::EventReturn OnTwitter(UI::EventParams &e); + UI::EventReturn OnX(UI::EventParams &e); double startTime_ = 0.0; }; diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index d2282c00615c..8f96c569576e 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -1070,9 +1070,9 @@ translators3 =ma1feesm translators4 =عمر أنور عجلان translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = ‎الموقع الألكتروني written = ‎مكتوب في لغة C++ من أجل السرعة والمتانة +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = ‎تصفح الألعاب diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index d8b8f13ff824..5ab0cb18d0a0 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Check out the website: written = Written in C++ for speed and portability +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index 2000a84615b2..8c17b876f2aa 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Хвърлете едно око на уеб сайта ни: written = Написано в C++ за бързина и съвместимост +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 35648aae08ef..d981027f8da6 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Check out the website: written = Written in C++ for speed and portability +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index 9cd406629daa..775f87146835 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Navštivte naši stránku: written = Vytvořeno v jazyce C++ pro rychlost a přenosnost +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index 4d558e076ad0..cbc147ce3fa2 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Mere info på webside: written = Skrevet i C++ for hastighed og portabilitet +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index 212b8ee31da8..c36ec4af8864 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Mehr Infos auf der Webseite: written = Programmiert in C++ für Geschwindigkeit und Portabilität +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Spiele durchsuchen diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index e125ccb0ffbd..1a1c9197f19a 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Ollongngi todai situsna mane: written = Pake C++ digaraka yamo na malassi +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index 7842715f81a8..65128449b9d1 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -1037,9 +1037,9 @@ translators3 = The Dax, wuspring, hrydgard, adrian17 translators4 = papel translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Check out the website: written = Written in C++ for speed and portability +X @PPSSPP_emu = X @PPSSPP_emu [MemStick] Already contains PSP data = Already contains PSP data diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index a03efffb100d..6be71482d248 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -1063,9 +1063,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Sitio web oficial: written = Escrito en lenguaje C++ para una mejor portabilidad y velocidad +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Buscar juegos diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 064a827e9fb9..b7f779747523 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Sitio web oficial written = Escrito en lenguaje C++ para una mejor portabilidad y velocidad +X @PPSSPP_emu = X @PPSSPP_emu [PSPSettings] diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index 65067df21a25..022db5ad1b9c 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = توییتر @PPSSPP_emu website = ‎:سری به وبسایت بزنید written = ‎نوشته شده است C++ برای سریع و پرتابل بودن، نرم افزار با زبان برنامه نویسی +X @PPSSPP_emu = توییتر @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index a92fd4001b86..5b730d7ded91 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Tutustu verkkosivustoon: written = Kirjoitettu C++:ssa nopeutta ja siirrettävyyttä varten +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Selaa pelejä diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index 380e6862e851..df4702219094 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -1053,9 +1053,9 @@ testing = tests this translation by = Traduction française : vnctdj title = Un émulateur de PSP rapide et portable tools = Outils libres utilisés : -Twitter @PPSSPP_emu = Twitter de PPSSPP website = Visitez notre site : written = Écrit en C++ pour la vitesse et la portabilité +X @PPSSPP_emu = X de PPSSPP [RemoteISO] Browse Games = Parcourir les jeux diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index d8b11029bf2d..270cdbbb4c16 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Sitio web oficial: written = Escrito en linguaxe C++ para unha mellor portabilidade e velocidade +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index 238e12b59b25..c6bb5f6a844e 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Επισκεφθείτε την ιστοσελίδα: written = Γραμμένο σε C++ για ταχύτητα και φορητότητα +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Περιήγηση παιχνιδιών diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini index 81a5b744de71..efa6ba413bd8 100644 --- a/assets/lang/he_IL.ini +++ b/assets/lang/he_IL.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = :כנסו אל האתר written = למהירות וניידות C++ נכתב ב +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini index cb2b4b6922d0..6d96c3272dff 100644 --- a/assets/lang/he_IL_invert.ini +++ b/assets/lang/he_IL_invert.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = רתאה לא וסנכ: written = ב בתכנ ++C תודיינו תוריהמל +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index 49553198afd1..8fd869fac57f 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -1062,9 +1062,9 @@ translators3 = The Dax, wuspring, hrydgard, adrian17 translators4 = HiImBrala, Carlson translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Pogledaj stranicu: written = Napisan u C++ za brzinu i za pokretnost +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Pretraži igre diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index b563fb55acc3..b3c208507a05 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -1062,9 +1062,9 @@ translators3 = NABN00B translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = X @PPSSPP_emu website = Nézd meg a honlapot: written = C++ban írva a sebességért és portolhatóságért +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Játékok tallózása diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index 0bd17f5eb033..f91fedb53be7 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -1062,9 +1062,9 @@ translators3 = niznet translators4 = mupralsh translators5 = eerdfz translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Kunjungi situs: written = Ditulis dalam bahasa C++ demi kecepatan dan portabilitas +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Telusuri permainan diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index a3226b75257f..d2b44b6d301e 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -1031,9 +1031,9 @@ translators3 = The Dax, wuspring, hrydgard, adrian17 translators4 = papel translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter website = Da' un'occhiata al sito web: written = Scritto in C++ per velocità e portabilità +X @PPSSPP_emu = X @PPSSPP_emu [MemStick] Already contains PSP data = Contiene già dati PSP diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index 0aa1f5b8b2d4..072615df0567 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -1030,9 +1030,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = ウェブサイトはこちら: written = 速度と移植性を保つためにC++で書かれています +X @PPSSPP_emu = X @PPSSPP_emu [MemStick] Already contains PSP data = 既にPSPデータが存在しています。 diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index 2ee72d92fff2..dd00e23f175a 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Ngunjungi situs web kita: written = Ditulis dalam C++ Kanggo kacepetan lan portabilitas +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index 32b5fc507045..11cddf3fe7ef 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -1013,9 +1013,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = 트위터 @PPSSPP_emu website = 웹사이트를 확인하세요: written = 속도와 이식성을 위해 C++로 작성되었습니다. +X @PPSSPP_emu = 트위터 @PPSSPP_emu [MemStick] Already contains PSP data = 이미 PSP 데이터가 포함되어 있습니다. diff --git a/assets/lang/ku_SO.ini b/assets/lang/ku_SO.ini index 9d14b59054e5..ba96389354cb 100644 --- a/assets/lang/ku_SO.ini +++ b/assets/lang/ku_SO.ini @@ -1027,9 +1027,9 @@ translators3 = The Dax, wuspring, hrydgard, adrian17 translators4 = papel, Mhamad99 translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Check out the website: written = Written in C++ for speed and portability +X @PPSSPP_emu = X @PPSSPP_emu [MemStick] Already contains PSP data = Already contains PSP data diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index 4f2f190d4186..0875a76082a3 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = ກວດສອບຂໍ້ມູນທີ່ເວັບໄຊ: written = ຂຽນໂດຍພາສາ C++ ເພື່ອປະສິດທິພາບ, ຄວາມໄວ ແລະຄວາມສະຖຽນ +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index ea0ba754d2b6..cd195f9faa8c 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -1062,9 +1062,9 @@ translators3 = vnctdj translators4 = SViper translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Check out the website: written = Parašyta C++ kalboje dėl greičio ir portabilumo +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index 59acbe0cad40..cb39dcfec6ba 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -1062,9 +1062,9 @@ translators3 = The Dax, wuspring, hrydgard, adrian17 translators4 = papel, AG Richard, Zie Nozie, translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Lihat laman web: written = Ditulis dengan C++ untuk kelajuan dan mudah alih +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index 6bce0096b3ba..c1c17457a23c 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Bezoek de website: written = Geschreven in C++ voor snelheid en draagbaarheid +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Games bladeren... diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index a080cb4d1b1b..b512e4f4e178 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -1062,9 +1062,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Check out the website: written = Written in C++ for speed and portability +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index e0fc4b68216f..afc3c820d74a 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -10,7 +10,7 @@ Achievements = Osiągnięcia Achievements are disabled = Osiągnięcia są wyłączone Achievements enabled = Osiągnięcia włączone Achievements with active challenges = Osiągnięcia z aktywnymi wyzwaniami -Allow Save State in Hardcore Mode (but not Load State) = Pozwól na zapis stanu w Trybie Wyzwania (bez wczytywania zapisów) +Allow Save State in Hardcore Mode (but not Load State) = Pozwól na zapis stanu w Trybie Wyzwania (bez wczytywania zapisów) Almost completed achievements = Prawie ukończone osiągnięcia Around me = Wokół mnie Can't log in to RetroAchievements right now = W tym momencie nie można zalogować do RetroAchievements @@ -62,7 +62,7 @@ Unsupported achievements = Niewspierane osiągnięcia Alternate speed volume = Alternatywna prędkość emulacji Audio backend = Sterownik dźwięku (wymagany restart) Audio Error = Błąd Audio -Audio file format not supported. Must be WAV or MP3. = Niewspierany format pliku dźwiękowego. Plik musi być w formacie WAV lub MP3. +Audio file format not supported. Must be WAV or MP3. = Niewspierany format pliku dźwiękowego. Plik musi być w formacie WAV lub MP3. AudioBufferingForBluetooth = Bufory dźwięku dost. do Bluetooth (wolniejsze) Auto = Automatyczny Device = Urządzenie @@ -1067,9 +1067,9 @@ translators3 = Poprzednią edycję tłumaczenia stworzyli: translators4 = hrydgard, The Dax, mikusp, adrian17 translators5 = translators6 = -Twitter @PPSSPP_emu = X (Twitter): @PPSSPP_emu website = Zajrzyj na stronę: written = Napisano w C++ dla wydajności i mobilności +X @PPSSPP_emu = X: @PPSSPP_emu [RemoteISO] Browse Games = Przeglądaj gry diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index 9264ec2d911b..2c2e67df204c 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -1037,9 +1037,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Verifique o site da web: written = Escrito em C++ pela velocidade e portabilidade +X @PPSSPP_emu = X @PPSSPP_emu [MemStick] Already contains PSP data = Já contém dados do PSP diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index 41c0748c0277..d9bb38e67379 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -1056,9 +1056,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter/X @PPSSPP_emu website = Verifica o website: written = PPSSPP foi escrito em C++ pela sua velocidade e portabilidade +X @PPSSPP_emu = X @PPSSPP_emu [MemStick] Already contains PSP data = Já contém dados da PSP diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index 6f31a7f1df3c..c47ad51a2fd6 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -1063,9 +1063,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Uitați-vă la site: written = Scris in C++ pt. viteză si portabilitate +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Browse games diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index fabc235cede0..87d750a6f050 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -1030,9 +1030,9 @@ translators3 = Hasster translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Посетите наш веб-сайт: written = Написан на C++ для скорости и портируемости +X @PPSSPP_emu = X @PPSSPP_emu [MemStick] Already contains PSP data = Уже содержит данные PSP diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index ed20fb76a494..b70129c46a42 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -1014,9 +1014,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Kolla in webbsidan: written = Skriven i C++ - prestanda och portabilitet +X @PPSSPP_emu = X @PPSSPP_emu [PSPSettings] Auto = Auto diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index 938153b7f5c3..85390006f607 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -1063,9 +1063,9 @@ translators3 = Adriane Justine Tan translators4 = John Cyrill Corsanes (@jcchikikomori) translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Puntahan ang Website: written = Nakasulat sa C++ para sa bilis at portability +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = I-browse ang mga laro diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index 6dc81147cb97..ce71885190a1 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -1079,9 +1079,9 @@ translators3 = Benjamin B. Gates translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = ไปที่ Twitter website = เพิ่มเติมข้อมูลได้ที่เว็บไซต์: written = เขียนโดยใช้ภาษา C++ เพื่อความรวดเร็ว และความเสถียร +X @PPSSPP_emu = ไปที่ X [RemoteISO] Browse Games = ค้นหาไปยังเกม diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index 096ae20aace2..6c47c061445a 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -1063,9 +1063,9 @@ translators3 = mygizli04 translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = X @PPSSPP_emu website = PPSSPP.org written = Hız ve Taşınabilirlik için C++ ile Yazıldı +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Oyunlara bak... diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index eb845709dc89..57540d3ca590 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -1062,9 +1062,9 @@ translators3 = Якщо у вас є пропозиції щодо перекл translators4 = або знайшли помилки, напишіть мені: translators5 = ser.gutsalyuk@gmail.com translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Відвідайте наш веб-сайт : written = Написаний на C++ для швидкості \nта підтримці декількох платформ. +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Перегляд ігор diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index 512906ef8bc4..de6c09a06b4e 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -1062,9 +1062,9 @@ translators3 = The Dax, wuspring, hrydgard, adrian17 translators4 = papel, chinhodado, xsacha , zminhquanz translators5 = Huy Song Tử, translators6 = -Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Xem trên website: written = Được viết bằng C++ cho tốc độ và portability +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = Duyệt games diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index 1cb5e762b186..14f6ca14d6dd 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -1063,9 +1063,9 @@ translators3 = xzapk、Arthur200000、Playhi、PeaceShi translators4 = Nargacuga、driver1998、xujibbs、Croden1999 translators5 = translators6 = -Twitter @PPSSPP_emu = X (Twitter) website = 请查阅官方网站 written = 使用C++编写以保证速度与移植性 +X @PPSSPP_emu = X @PPSSPP_emu [RemoteISO] Browse Games = 浏览游戏 diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index 6246f567d92b..0b1d15a43c61 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -1030,9 +1030,9 @@ translators3 = translators4 = translators5 = translators6 = -Twitter @PPSSPP_emu = Twitter website = 歡迎造訪我們的網站: written = 使用 C++ 編寫,以保證建置速度和相容性 +X @PPSSPP_emu = X @PPSSPP_emu [MemStick] Already contains PSP data = 已包含 PSP 資料 From 7e6ef060c63715e5df235f7364368713821c4bd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 25 Oct 2024 21:08:01 +0200 Subject: [PATCH 4/9] Small UI event processing optimization. Helps debugging more than performance. --- Common/UI/View.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Common/UI/View.cpp b/Common/UI/View.cpp index ab39d45bd629..f7e8959a9372 100644 --- a/Common/UI/View.cpp +++ b/Common/UI/View.cpp @@ -72,6 +72,9 @@ void Event::Add(std::function func) { // Call this from input thread or whatever, it doesn't matter void Event::Trigger(EventParams &e) { + if (handlers_.empty()) { + return; + } EventTriggered(this, e); } From 8991329de4640baff15702d43b3b3bec6c3ea74d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 25 Oct 2024 21:13:45 +0200 Subject: [PATCH 5/9] GPUCommon::PerformMemoryCopy: Add a debug assert --- GPU/GPUCommon.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index a48ab68f7cca..4305917502b7 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -1867,6 +1867,18 @@ void GPUCommon::DoBlockTransfer(u32 skipDrawReason) { } bool GPUCommon::PerformMemoryCopy(u32 dest, u32 src, int size, GPUCopyFlag flags) { + /* + // TODO: Should add this. But let's do it after the 1.18 release. + if (dest == 0 || src == 0) { + _dbg_assert_msg_(false, "Bad PerformMemoryCopy: %08x -> %08x, size %d (flag: %d)", src, dest, size, (int)flags); + return false; + } + */ + if (size == 0) { + _dbg_assert_msg_(false, "Zero-sized PerformMemoryCopy: %08x -> %08x, size %d (flag: %d)", src, dest, size, (int)flags); + // Let's not ignore this yet but if we hit this, we should investigate. + } + // Track stray copies of a framebuffer in RAM. MotoGP does this. if (framebufferManager_->MayIntersectFramebufferColor(src) || framebufferManager_->MayIntersectFramebufferColor(dest)) { if (!framebufferManager_->NotifyFramebufferCopy(src, dest, size, flags, gstate_c.skipDrawReason)) { From f29dbbee29031be3d75ef1f7f9770555b6fc86e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 25 Oct 2024 21:15:25 +0200 Subject: [PATCH 6/9] Workaround crash when clearing recents --- UI/MainScreen.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 40a35588690f..29f34ea8d1e2 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -1765,5 +1765,6 @@ UI::EventReturn GridSettingsPopupScreen::GridMinusClick(UI::EventParams &e) { UI::EventReturn GridSettingsPopupScreen::OnRecentClearClick(UI::EventParams &e) { g_Config.ClearRecentIsos(); OnRecentChanged.Trigger(e); + TriggerFinish(DR_OK); return UI::EVENT_DONE; } From b23fe6ff45d114789c8e6fa5e9a3ad0d5efa8cd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 25 Oct 2024 21:15:48 +0200 Subject: [PATCH 7/9] Reformat UIScreen::DoRecreateViews for readability --- Common/UI/UIScreen.cpp | 50 ++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/Common/UI/UIScreen.cpp b/Common/UI/UIScreen.cpp index 8e9a793a1f77..364153b6bf23 100644 --- a/Common/UI/UIScreen.cpp +++ b/Common/UI/UIScreen.cpp @@ -30,34 +30,36 @@ bool UIScreen::UseVerticalLayout() const { } void UIScreen::DoRecreateViews() { - if (recreateViews_) { - std::lock_guard guard(screenManager()->inputLock_); + if (!recreateViews_) { + return; + } - UI::PersistMap persisted; - bool persisting = root_ != nullptr; - if (persisting) { - root_->PersistData(UI::PERSIST_SAVE, "root", persisted); - } + std::lock_guard guard(screenManager()->inputLock_); - delete root_; - root_ = nullptr; - CreateViews(); - UI::View *defaultView = root_ ? root_->GetDefaultFocusView() : nullptr; - if (defaultView && defaultView->GetVisibility() == UI::V_VISIBLE) { - defaultView->SetFocus(); - } - recreateViews_ = false; + UI::PersistMap persisted; + bool persisting = root_ != nullptr; + if (persisting) { + root_->PersistData(UI::PERSIST_SAVE, "root", persisted); + } - if (persisting && root_ != nullptr) { - root_->PersistData(UI::PERSIST_RESTORE, "root", persisted); + delete root_; + root_ = nullptr; + CreateViews(); + UI::View *defaultView = root_ ? root_->GetDefaultFocusView() : nullptr; + if (defaultView && defaultView->GetVisibility() == UI::V_VISIBLE) { + defaultView->SetFocus(); + } + recreateViews_ = false; - // Update layout and refocus so things scroll into view. - // This is for resizing down, when focused on something now offscreen. - UI::LayoutViewHierarchy(*screenManager()->getUIContext(), root_, ignoreInsets_); - UI::View *focused = UI::GetFocusedView(); - if (focused) { - root_->SubviewFocused(focused); - } + if (persisting && root_ != nullptr) { + root_->PersistData(UI::PERSIST_RESTORE, "root", persisted); + + // Update layout and refocus so things scroll into view. + // This is for resizing down, when focused on something now offscreen. + UI::LayoutViewHierarchy(*screenManager()->getUIContext(), root_, ignoreInsets_); + UI::View *focused = UI::GetFocusedView(); + if (focused) { + root_->SubviewFocused(focused); } } } From c8f7f84627cd51428059c3a73ef12d5f2d0122e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 25 Oct 2024 21:36:05 +0200 Subject: [PATCH 8/9] Add an assert in intr handler --- Core/HLE/sceKernelInterrupt.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceKernelInterrupt.cpp b/Core/HLE/sceKernelInterrupt.cpp index f20d183048ac..598161a06764 100644 --- a/Core/HLE/sceKernelInterrupt.cpp +++ b/Core/HLE/sceKernelInterrupt.cpp @@ -413,7 +413,11 @@ void __KernelReturnFromInterrupt() PendingInterrupt pend = pendingInterrupts.front(); pendingInterrupts.pop_front(); - intrHandlers[pend.intr]->handleResult(pend); + if (pend.intr >= 0 && pend.intr < ARRAY_SIZE(intrHandlers)) { + intrHandlers[pend.intr]->handleResult(pend); + } else { + _assert_msg_(false, "Bad pend.intr: %d", pend.intr); + } inInterrupt = false; // Restore context after running the interrupt. From 1b769b61b1f2f16fd4fce83e0caaeb627c64bf59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 25 Oct 2024 21:50:03 +0200 Subject: [PATCH 9/9] Fragment shader: Don't error on bad blend eqs, instead use default eq (add) --- GPU/Common/FragmentShaderGenerator.cpp | 2 +- GPU/Common/GPUStateUtils.cpp | 7 +++++-- GPU/Common/ShaderId.cpp | 9 ++++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 0a182f675a7c..757cb4d291ab 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -1118,7 +1118,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " v.rgb = abs(v.rgb - destColor.rgb);\n"); break; default: - *errorString = "Bad replace blend eq"; + *errorString = StringFromFormat("Bad replace blend eq: %d", (int)replaceBlendEq); return false; } } diff --git a/GPU/Common/GPUStateUtils.cpp b/GPU/Common/GPUStateUtils.cpp index 4097d5cce7c4..f4a7abba97d8 100644 --- a/GPU/Common/GPUStateUtils.cpp +++ b/GPU/Common/GPUStateUtils.cpp @@ -293,11 +293,10 @@ ReplaceBlendType ReplaceBlendWithShader(GEBufferFormat bufferFormat) { case GE_BLENDMODE_MUL_AND_ADD: case GE_BLENDMODE_MUL_AND_SUBTRACT: case GE_BLENDMODE_MUL_AND_SUBTRACT_REVERSE: - // Handled below. + // Other blend equations simply don't blend on hardware. break; default: - // Other blend equations simply don't blend on hardware. return REPLACE_BLEND_NO; } @@ -849,6 +848,8 @@ static const BlendEq eqLookupNoMinMax[] = { BlendEq::ADD, // GE_BLENDMODE_MIN BlendEq::ADD, // GE_BLENDMODE_MAX BlendEq::ADD, // GE_BLENDMODE_ABSDIFF + BlendEq::ADD, + BlendEq::ADD, }; static const BlendEq eqLookup[] = { @@ -858,6 +859,8 @@ static const BlendEq eqLookup[] = { BlendEq::MIN, // GE_BLENDMODE_MIN BlendEq::MAX, // GE_BLENDMODE_MAX BlendEq::MAX, // GE_BLENDMODE_ABSDIFF + BlendEq::ADD, + BlendEq::ADD, }; static BlendFactor toDualSource(BlendFactor blendfunc) { diff --git a/GPU/Common/ShaderId.cpp b/GPU/Common/ShaderId.cpp index 71efcfa68351..67f6a687c713 100644 --- a/GPU/Common/ShaderId.cpp +++ b/GPU/Common/ShaderId.cpp @@ -277,6 +277,13 @@ bool FragmentIdNeedsFramebufferRead(const FShaderID &id) { (ReplaceBlendType)id.Bits(FS_BIT_REPLACE_BLEND, 3) == REPLACE_BLEND_READ_FRAMEBUFFER; } +inline u32 SanitizeBlendMode(GEBlendMode mode) { + if (mode > GE_BLENDMODE_ABSDIFF) + return GE_BLENDMODE_MUL_AND_ADD; // Not sure what the undefined modes are. + else + return mode; +} + // Here we must take all the bits of the gstate that determine what the fragment shader will // look like, and concatenate them together into an ID. void ComputeFragmentShaderID(FShaderID *id_out, const ComputedPipelineState &pipelineState, const Draw::Bugs &bugs) { @@ -371,7 +378,7 @@ void ComputeFragmentShaderID(FShaderID *id_out, const ComputedPipelineState &pip // 3 bits. id.SetBits(FS_BIT_REPLACE_BLEND, 3, replaceBlend); // 11 bits total. - id.SetBits(FS_BIT_BLENDEQ, 3, gstate.getBlendEq()); + id.SetBits(FS_BIT_BLENDEQ, 3, SanitizeBlendMode(gstate.getBlendEq())); id.SetBits(FS_BIT_BLENDFUNC_A, 4, gstate.getBlendFuncA()); id.SetBits(FS_BIT_BLENDFUNC_B, 4, gstate.getBlendFuncB()); }