From 39cf5b5c30883e34040e6780d710fc380e4c8f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 24 Jan 2024 09:46:55 +0100 Subject: [PATCH 1/4] Add more asserts to check the state of the render manager --- Common/GPU/Vulkan/VulkanRenderManager.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index a425e46c7f21..0b8f24bce426 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -348,6 +348,11 @@ bool VulkanRenderManager::CreateBackbuffers() { } void VulkanRenderManager::StartThreads() { + { + std::unique_lock lock(compileMutex_); + _assert_(compileQueue_.empty()); + } + runCompileThread_ = true; // For controlling the compiler thread's exit if (useRenderThread_) { @@ -403,6 +408,11 @@ void VulkanRenderManager::StopThreads() { INFO_LOG(G3D, "Vulkan compiler thread joined. Now wait for any straggling compile tasks."); CreateMultiPipelinesTask::WaitForAll(); + + { + std::unique_lock lock(compileMutex_); + _assert_(compileQueue_.empty()); + } } void VulkanRenderManager::DestroyBackbuffers() { From 157f262cd2e8503b59ddfee7608989d5e8c296e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 24 Jan 2024 09:50:26 +0100 Subject: [PATCH 2/4] Make some timeouts a bit more visible in the code. Some should be re-evaluated. --- Core/FileLoaders/HTTPFileLoader.cpp | 13 +++++++------ Core/FileLoaders/HTTPFileLoader.h | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Core/FileLoaders/HTTPFileLoader.cpp b/Core/FileLoaders/HTTPFileLoader.cpp index 2f75ba294a71..1aba90848412 100644 --- a/Core/FileLoaders/HTTPFileLoader.cpp +++ b/Core/FileLoaders/HTTPFileLoader.cpp @@ -128,8 +128,10 @@ int HTTPFileLoader::SendHEAD(const Url &url, std::vector &responseH return -400; } - client_.SetDataTimeout(20.0); - Connect(); + double timeout = 20.0; + + client_.SetDataTimeout(timeout); + Connect(10.0); if (!connected_) { ERROR_LOG(LOADER, "HTTP request failed, failed to connect: %s port %d (resource: '%s')", url.Host().c_str(), url.Port(), url.Resource().c_str()); latestError_ = "Could not connect (refused to connect)"; @@ -186,7 +188,7 @@ size_t HTTPFileLoader::ReadAt(s64 absolutePos, size_t bytes, void *data, Flags f return 0; } - Connect(); + Connect(10.0); if (!connected_) { return 0; } @@ -258,10 +260,9 @@ size_t HTTPFileLoader::ReadAt(s64 absolutePos, size_t bytes, void *data, Flags f return readBytes; } -void HTTPFileLoader::Connect() { +void HTTPFileLoader::Connect(double timeout) { if (!connected_) { cancel_ = false; - // Latency is important here, so reduce the timeout. - connected_ = client_.Connect(3, 10.0, &cancel_); + connected_ = client_.Connect(3, timeout, &cancel_); } } diff --git a/Core/FileLoaders/HTTPFileLoader.h b/Core/FileLoaders/HTTPFileLoader.h index e4bf8ee9be66..303271467d1c 100644 --- a/Core/FileLoaders/HTTPFileLoader.h +++ b/Core/FileLoaders/HTTPFileLoader.h @@ -58,7 +58,7 @@ class HTTPFileLoader : public FileLoader { void Prepare(); int SendHEAD(const Url &url, std::vector &responseHeaders); - void Connect(); + void Connect(double timeout); void Disconnect() { if (connected_) { From 179776460c6b0e4799c679b6f1f922f4b791eb20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 24 Jan 2024 10:01:52 +0100 Subject: [PATCH 3/4] PauseScreen: Put the run-in-background button next to Continue Fixes #18544 --- UI/PauseScreen.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index 5169d2c1fb02..e8d69b7b6472 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -348,7 +348,6 @@ void GamePauseScreen::CreateViews() { leftColumn->Add(leftColumnItems); leftColumnItems->SetSpacing(5.0f); - leftColumnItems->Add(new Spacer(0.0f)); if (Achievements::IsActive()) { leftColumnItems->Add(new GameAchievementSummaryView()); @@ -379,6 +378,9 @@ void GamePauseScreen::CreateViews() { leftColumnItems->Add(new NoticeView(NoticeLevel::INFO, notAvailable, "")); } + ViewGroup *middleColumn = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(64, FILL_PARENT, Margins(0, 10, 0, 15))); + root_->Add(middleColumn); + ViewGroup *rightColumnHolder = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(vertical ? 200 : 300, FILL_PARENT, actionMenuMargins)); ViewGroup *rightColumn = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(1.0f)); @@ -443,15 +445,14 @@ void GamePauseScreen::CreateViews() { } if (!Core_MustRunBehind()) { - ViewGroup *playControls = rightColumnHolder->Add(new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT))); - playControls->SetTag("debug"); - playControls->Add(new Spacer(new LinearLayoutParams(1.0f))); - playButton_ = playControls->Add(new Button("", g_Config.bRunBehindPauseMenu ? ImageID("I_PAUSE") : ImageID("I_PLAY"), new LinearLayoutParams(0.0f, G_RIGHT))); - playButton_->OnClick.Add([=](UI::EventParams &e) { - g_Config.bRunBehindPauseMenu = !g_Config.bRunBehindPauseMenu; - playButton_->SetImageID(g_Config.bRunBehindPauseMenu ? ImageID("I_PAUSE") : ImageID("I_PLAY")); - return UI::EVENT_DONE; - }); + if (middleColumn) { + playButton_ = middleColumn->Add(new Button("", g_Config.bRunBehindPauseMenu ? ImageID("I_PAUSE") : ImageID("I_PLAY"), new LinearLayoutParams(64, 64))); + playButton_->OnClick.Add([=](UI::EventParams &e) { + g_Config.bRunBehindPauseMenu = !g_Config.bRunBehindPauseMenu; + playButton_->SetImageID(g_Config.bRunBehindPauseMenu ? ImageID("I_PAUSE") : ImageID("I_PLAY")); + return UI::EVENT_DONE; + }); + } } else { auto nw = GetI18NCategory(I18NCat::NETWORKING); rightColumnHolder->Add(new TextView(nw->T("Network connected"))); From 22e91c98db986d80850322769f0419a8874d6f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 24 Jan 2024 11:36:25 +0100 Subject: [PATCH 4/4] More asserts --- Common/GPU/Vulkan/VulkanRenderManager.cpp | 8 ++++++++ Common/GPU/Vulkan/VulkanRenderManager.h | 4 ++-- GPU/Vulkan/GPU_Vulkan.cpp | 1 + android/src/org/ppsspp/ppsspp/NativeActivity.java | 1 + 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index 0b8f24bce426..32abff3143ec 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -422,6 +422,14 @@ void VulkanRenderManager::DestroyBackbuffers() { queueRunner_.DestroyBackBuffers(); } +void VulkanRenderManager::CheckNothingPending() { + _assert_(pipelinesToCheck_.empty()); + { + std::unique_lock lock(compileMutex_); + _assert_(compileQueue_.empty()); + } +} + VulkanRenderManager::~VulkanRenderManager() { INFO_LOG(G3D, "VulkanRenderManager destructor"); diff --git a/Common/GPU/Vulkan/VulkanRenderManager.h b/Common/GPU/Vulkan/VulkanRenderManager.h index bd28e36a582d..62def09f9585 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.h +++ b/Common/GPU/Vulkan/VulkanRenderManager.h @@ -115,13 +115,12 @@ class VKRGraphicsPipelineDesc : public Draw::RefCountedObject { RPKey rpKey{}; }; -// Wrapped pipeline. Doesn't own desc. +// Wrapped pipeline. Does own desc! struct VKRGraphicsPipeline { VKRGraphicsPipeline(PipelineFlags flags, const char *tag) : flags_(flags), tag_(tag) {} ~VKRGraphicsPipeline(); bool Create(VulkanContext *vulkan, VkRenderPass compatibleRenderPass, RenderPassType rpType, VkSampleCountFlagBits sampleCount, double scheduleTime, int countToCompile); - void DestroyVariants(VulkanContext *vulkan, bool msaaOnly); // This deletes the whole VKRGraphicsPipeline, you must remove your last pointer to it when doing this. @@ -237,6 +236,7 @@ class VulkanRenderManager { // These can run on a different thread! void Finish(); void Present(); + void CheckNothingPending(); void SetInvalidationCallback(InvalidationCallback callback) { invalidationCallback_ = callback; diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index 4b2211c5f18f..3442e118e61b 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -169,6 +169,7 @@ GPU_Vulkan::~GPU_Vulkan() { VulkanRenderManager *rm = (VulkanRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); // This now also does a hard sync with the render thread, so that we can safely delete our pipeline layout below. rm->StopThreads(); + rm->CheckNothingPending(); } SaveCache(shaderCachePath_); diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index 22662e20c6a3..9f68f904d121 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -820,6 +820,7 @@ protected void onDestroy() { if (isVRDevice()) { System.exit(0); } + Log.i(TAG, "onDestroy"); } @Override