diff --git a/Core/Config.cpp b/Core/Config.cpp index d787359d69..525467bf4a 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -775,7 +775,7 @@ static ConfigSetting graphicsSettings[] = { ConfigSetting("GfxDebugSplitSubmit", &g_Config.bGfxDebugSplitSubmit, false, false, false), ConfigSetting("LogFrameDrops", &g_Config.bLogFrameDrops, false, true, false), - ConfigSetting("InflightFrames", &g_Config.iInflightFrames, 3, true, true), + ConfigSetting("InflightFrames", &g_Config.iInflightFrames, 3, true, false), ConfigSetting(false), }; diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index c823bb6e3a..0291364a59 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -97,9 +97,6 @@ GPU_GLES::GPU_GLES(GraphicsContext *gfxCtx, Draw::DrawContext *draw) textureCacheGL_->NotifyConfigChanged(); - GLRenderManager *rm = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); - rm->SetInflightFrames(g_Config.iInflightFrames); - // Load shader cache. std::string discID = g_paramSFO.GetDiscID(); if (discID.size()) { @@ -358,9 +355,6 @@ void GPU_GLES::BeginHostFrame() { GPUCommon::BeginHostFrame(); UpdateCmdInfo(); if (resized_) { - GLRenderManager *rm = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); - rm->SetInflightFrames(g_Config.iInflightFrames); - CheckGPUFeatures(); framebufferManager_->Resized(); drawEngine_.Resized(); diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index 22c42cc355..026a0c045e 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -97,8 +97,6 @@ GPU_Vulkan::GPU_Vulkan(GraphicsContext *gfxCtx, Draw::DrawContext *draw) if (vulkan_->GetDeviceFeatures().enabled.wideLines) { drawEngine_.SetLineWidth(PSP_CoreParameter().renderWidth / 480.0f); } - VulkanRenderManager *rm = (VulkanRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); - rm->SetInflightFrames(g_Config.iInflightFrames); // Load shader cache. std::string discID = g_paramSFO.GetDiscID(); @@ -284,9 +282,6 @@ void GPU_Vulkan::BeginHostFrame() { UpdateCmdInfo(); if (resized_) { - VulkanRenderManager *rm = (VulkanRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); - rm->SetInflightFrames(g_Config.iInflightFrames); - CheckGPUFeatures(); // In case the GPU changed. BuildReportingInfo(); diff --git a/Qt/QtMain.h b/Qt/QtMain.h index 7391a59f54..93bf5ccb75 100644 --- a/Qt/QtMain.h +++ b/Qt/QtMain.h @@ -53,6 +53,7 @@ public: draw_ = Draw::T3DCreateGLContext(); SetGPUBackend(GPUBackend::OPENGL); renderManager_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); + renderManager_->SetInflightFrames(g_Config.iInflightFrames); bool success = draw_->CreatePresets(); _assert_msg_(G3D, success, "Failed to compile preset shaders"); } diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index f49c4fcf25..dc45451ded 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -74,6 +74,7 @@ GameSettingsScreen::GameSettingsScreen(std::string gamePath, std::string gameID, bool editThenRestore) : UIDialogScreenWithGameBackground(gamePath), gameID_(gameID), enableReports_(false), editThenRestore_(editThenRestore) { lastVertical_ = UseVerticalLayout(); + prevInflightFrames_ = g_Config.iInflightFrames; } bool GameSettingsScreen::UseVerticalLayout() const { @@ -352,10 +353,7 @@ void GameSettingsScreen::CreateViews() { if (GetGPUBackend() == GPUBackend::VULKAN || GetGPUBackend() == GPUBackend::OPENGL) { static const char *bufferOptions[] = { "No buffer", "Up to 1", "Up to 2" }; PopupMultiChoice *inflightChoice = graphicsSettings->Add(new PopupMultiChoice(&g_Config.iInflightFrames, gr->T("Buffer graphics commands (faster, input lag)"), bufferOptions, 0, ARRAY_SIZE(bufferOptions), gr->GetName(), screenManager())); - inflightChoice->OnChoice.Add([=](EventParams &e) { - NativeMessageReceived("gpu_resized", ""); - return UI::EVENT_CONTINUE; - }); + inflightChoice->OnChoice.Handle(this, &GameSettingsScreen::OnInflightFramesChoice); } CheckBox *hwTransform = graphicsSettings->Add(new CheckBox(&g_Config.bHardwareTransform, gr->T("Hardware Transform"))); @@ -1180,6 +1178,15 @@ void GameSettingsScreen::CallbackRenderingDevice(bool yes) { } } +void GameSettingsScreen::CallbackInflightFrames(bool yes) { + if (yes) { + g_Config.Save("GameSettingsScreen::InflightFramesYes"); + System_SendMessage("graphics_restart", ""); + } else { + g_Config.iInflightFrames = prevInflightFrames_; + } +} + UI::EventReturn GameSettingsScreen::OnRenderingBackend(UI::EventParams &e) { auto di = GetI18NCategory("Dialog"); @@ -1203,6 +1210,15 @@ UI::EventReturn GameSettingsScreen::OnRenderingDevice(UI::EventParams &e) { return UI::EVENT_DONE; } +UI::EventReturn GameSettingsScreen::OnInflightFramesChoice(UI::EventParams &e) { + auto di = GetI18NCategory("Dialog"); + if (g_Config.iInflightFrames != prevInflightFrames_) { + screenManager()->push(new PromptScreen(di->T("ChangingInflightFrames", "Changing graphics command buffering requires PPSSPP to restart. Restart now?"), di->T("Yes"), di->T("No"), + std::bind(&GameSettingsScreen::CallbackInflightFrames, this, std::placeholders::_1))); + } + return UI::EVENT_DONE; +} + UI::EventReturn GameSettingsScreen::OnCameraDeviceChange(UI::EventParams& e) { Camera::onCameraDeviceChange(); return UI::EVENT_DONE; diff --git a/UI/GameSettingsScreen.h b/UI/GameSettingsScreen.h index 0761f9b21d..7e364cc776 100644 --- a/UI/GameSettingsScreen.h +++ b/UI/GameSettingsScreen.h @@ -42,6 +42,7 @@ protected: void CallbackRestoreDefaults(bool yes); void CallbackRenderingBackend(bool yes); void CallbackRenderingDevice(bool yes); + void CallbackInflightFrames(bool yes); #if PPSSPP_PLATFORM(ANDROID) void CallbackMemstickFolder(bool yes); #endif @@ -94,6 +95,7 @@ private: UI::EventReturn OnRenderingMode(UI::EventParams &e); UI::EventReturn OnRenderingBackend(UI::EventParams &e); UI::EventReturn OnRenderingDevice(UI::EventParams &e); + UI::EventReturn OnInflightFramesChoice(UI::EventParams &e); UI::EventReturn OnCameraDeviceChange(UI::EventParams& e); UI::EventReturn OnAudioDevice(UI::EventParams &e); UI::EventReturn OnJitAffectingSetting(UI::EventParams &e); @@ -129,6 +131,7 @@ private: bool resolutionEnable_; bool bloomHackEnable_; bool tessHWEnable_; + int prevInflightFrames_; #if PPSSPP_PLATFORM(ANDROID) std::string pendingMemstickFolder_; diff --git a/Windows/GPU/WindowsGLContext.cpp b/Windows/GPU/WindowsGLContext.cpp index 0c8c3bd685..f0aa0ba45a 100644 --- a/Windows/GPU/WindowsGLContext.cpp +++ b/Windows/GPU/WindowsGLContext.cpp @@ -403,6 +403,7 @@ bool WindowsGLContext::InitFromRenderThread(std::string *error_message) { CheckGLExtensions(); draw_ = Draw::T3DCreateGLContext(); renderManager_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); + renderManager_->SetInflightFrames(g_Config.iInflightFrames); SetGPUBackend(GPUBackend::OPENGL); bool success = draw_->CreatePresets(); // if we get this far, there will always be a GLSL compiler capable of compiling these. _assert_msg_(G3D, success, "Failed to compile preset shaders"); diff --git a/Windows/GPU/WindowsVulkanContext.cpp b/Windows/GPU/WindowsVulkanContext.cpp index 772d037989..c747026e38 100644 --- a/Windows/GPU/WindowsVulkanContext.cpp +++ b/Windows/GPU/WindowsVulkanContext.cpp @@ -159,6 +159,7 @@ bool WindowsVulkanContext::Init(HINSTANCE hInst, HWND hWnd, std::string *error_m draw_->HandleEvent(Draw::Event::GOT_BACKBUFFER, g_Vulkan->GetBackbufferWidth(), g_Vulkan->GetBackbufferHeight()); VulkanRenderManager *renderManager = (VulkanRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); + renderManager->SetInflightFrames(g_Config.iInflightFrames); if (!renderManager->HasBackbuffers()) { Shutdown(); return false; diff --git a/android/jni/AndroidEGLContext.cpp b/android/jni/AndroidEGLContext.cpp index 163c123fa7..5e7604a0c0 100644 --- a/android/jni/AndroidEGLContext.cpp +++ b/android/jni/AndroidEGLContext.cpp @@ -51,6 +51,7 @@ bool AndroidEGLGraphicsContext::InitFromRenderThread(ANativeWindow *wnd, int des draw_ = Draw::T3DCreateGLContext(); SetGPUBackend(GPUBackend::OPENGL); renderManager_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); + renderManager_->SetInflightFrames(g_Config.iInflightFrames); bool success = draw_->CreatePresets(); // There will always be a GLSL compiler capable of compiling these. _assert_msg_(G3D, success, "Failed to compile preset shaders"); return true; diff --git a/android/jni/AndroidJavaGLContext.cpp b/android/jni/AndroidJavaGLContext.cpp index f03c5b864d..b60f87cfb4 100644 --- a/android/jni/AndroidJavaGLContext.cpp +++ b/android/jni/AndroidJavaGLContext.cpp @@ -19,6 +19,7 @@ bool AndroidJavaEGLGraphicsContext::InitFromRenderThread(ANativeWindow *wnd, int g_display_rot_matrix.setIdentity(); draw_ = Draw::T3DCreateGLContext(); renderManager_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); + renderManager_->SetInflightFrames(g_Config.iInflightFrames); bool success = draw_->CreatePresets(); _assert_msg_(G3D, success, "Failed to compile preset shaders"); return success; diff --git a/android/jni/AndroidVulkanContext.cpp b/android/jni/AndroidVulkanContext.cpp index 1ff51b5f67..5a5b67b2f8 100644 --- a/android/jni/AndroidVulkanContext.cpp +++ b/android/jni/AndroidVulkanContext.cpp @@ -174,6 +174,7 @@ bool AndroidVulkanContext::InitFromRenderThread(ANativeWindow *wnd, int desiredB draw_->HandleEvent(Draw::Event::GOT_BACKBUFFER, g_Vulkan->GetBackbufferWidth(), g_Vulkan->GetBackbufferHeight()); VulkanRenderManager *renderManager = (VulkanRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); + renderManager->SetInflightFrames(g_Config.iInflightFrames); success = renderManager->HasBackbuffers(); } else { success = false; diff --git a/ext/native/thin3d/GLRenderManager.cpp b/ext/native/thin3d/GLRenderManager.cpp index e34168111d..670021cf93 100644 --- a/ext/native/thin3d/GLRenderManager.cpp +++ b/ext/native/thin3d/GLRenderManager.cpp @@ -95,6 +95,12 @@ void GLRenderManager::ThreadStart(Draw::DrawContext *draw) { threadFrame_ = threadInitFrame_; renderThreadId = std::this_thread::get_id(); + if (newInflightFrames_ != -1) { + ILOG("Updating inflight frames to %d", newInflightFrames_); + inflightFrames_ = newInflightFrames_; + newInflightFrames_ = -1; + } + // Don't save draw, we don't want any thread safety confusion. bool mapBuffers = draw->GetBugs().Has(Draw::Bugs::ANY_MAP_BUFFER_RANGE_SLOW); bool hasBufferStorage = gl_extensions.ARB_buffer_storage || gl_extensions.EXT_buffer_storage; @@ -449,10 +455,6 @@ void GLRenderManager::Finish() { frameData.pull_condVar.notify_all(); curFrame_++; - if (newInflightFrames_ != -1) { - inflightFrames_ = newInflightFrames_; - newInflightFrames_ = -1; - } if (curFrame_ >= inflightFrames_) curFrame_ = 0; diff --git a/ext/native/thin3d/VulkanRenderManager.cpp b/ext/native/thin3d/VulkanRenderManager.cpp index 21dd931fb8..ab8680a594 100644 --- a/ext/native/thin3d/VulkanRenderManager.cpp +++ b/ext/native/thin3d/VulkanRenderManager.cpp @@ -202,6 +202,12 @@ void VulkanRenderManager::CreateBackbuffers() { VLOG("Backbuffers Created"); } + if (newInflightFrames_ != -1) { + ILOG("Updating inflight frames to %d", newInflightFrames_); + vulkan_->UpdateInflightFrames(newInflightFrames_); + newInflightFrames_ = -1; + } + // Start the thread. if (useThread_ && HasBackbuffers()) { run_ = true; @@ -914,10 +920,6 @@ void VulkanRenderManager::Finish() { frameData.pull_condVar.notify_all(); } vulkan_->EndFrame(); - if (newInflightFrames_ != -1) { - vulkan_->UpdateInflightFrames(newInflightFrames_); - newInflightFrames_ = -1; - } insideFrame_ = false; } diff --git a/headless/SDLHeadlessHost.cpp b/headless/SDLHeadlessHost.cpp index ac04878237..d0e5757fff 100644 --- a/headless/SDLHeadlessHost.cpp +++ b/headless/SDLHeadlessHost.cpp @@ -150,6 +150,7 @@ bool GLDummyGraphicsContext::InitFromRenderThread(std::string *errorMessage) { CheckGLExtensions(); draw_ = Draw::T3DCreateGLContext(); renderManager_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); + renderManager_->SetInflightFrames(g_Config.iInflightFrames); SetGPUBackend(GPUBackend::OPENGL); bool success = draw_->CreatePresets(); assert(success); diff --git a/ios/ViewController.mm b/ios/ViewController.mm index 65549221ba..276076fdc1 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -44,6 +44,7 @@ public: CheckGLExtensions(); draw_ = Draw::T3DCreateGLContext(); renderManager_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); + renderManager_->SetInflightFrames(g_Config.iInflightFrames); SetGPUBackend(GPUBackend::OPENGL); bool success = draw_->CreatePresets(); _assert_msg_(G3D, success, "Failed to compile preset shaders");