From 47dbde8a49695c72cbb749d8b05682f6a3fbfda6 Mon Sep 17 00:00:00 2001 From: Maximilian Seidler Date: Thu, 16 Apr 2026 20:37:24 +0200 Subject: [PATCH] core: don't register dmabuf when screencopy is not required --- src/core/hyprlock.cpp | 33 +++++++++++++++++++++++++-- src/core/hyprlock.hpp | 3 ++- src/renderer/AsyncResourceManager.cpp | 18 --------------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/core/hyprlock.cpp b/src/core/hyprlock.cpp index e6e7a71..3b25667 100644 --- a/src/core/hyprlock.cpp +++ b/src/core/hyprlock.cpp @@ -35,7 +35,27 @@ static void setMallocThreshold() { #endif } -CHyprlock::CHyprlock(std::string_view wlDisplay, const bool immediateRender, const int graceSeconds) { +static bool screencopyRequired() { + static const auto ANIMATIONSENABLED = g_pConfigManager->getValue("animations:enabled"); + + const auto FADEINCFG = g_pConfigManager->m_AnimationTree.getConfig("fadeIn"); + const auto FADEOUTCFG = g_pConfigManager->m_AnimationTree.getConfig("fadeOut"); + + const bool FADENEEDSSC = *ANIMATIONSENABLED && + ((FADEINCFG->pValues && FADEINCFG->pValues->internalEnabled) || // fadeIn or fadeOut enabled + (FADEOUTCFG->pValues && FADEOUTCFG->pValues->internalEnabled)); + + if (FADENEEDSSC) + return true; + + const auto BGSCREENSHOT = std::ranges::any_of(g_pConfigManager->getWidgetConfigs(), [](const auto& w) { // + return w.type == "background" && std::string{std::any_cast(w.values.at("path"))} == "screenshot"; + }); + + return BGSCREENSHOT; +} + +CHyprlock::CHyprlock(std::string_view wlDisplay, const bool immediateRender, const int graceSeconds) : m_screencopyRequired(screencopyRequired()) { setMallocThreshold(); m_sWaylandState.display = wl_display_connect(wlDisplay.empty() ? nullptr : std::string{wlDisplay}.c_str()); @@ -134,6 +154,9 @@ gbm_device* CHyprlock::createGBMDevice(drmDevice* dev) { } void CHyprlock::addDmabufListener() { + if (!dma.linuxDmabuf || !dma.linuxDmabufFeedback) + return; + dma.linuxDmabufFeedback->setTrancheDone([this](CCZwpLinuxDmabufFeedbackV1* r) { Log::logger->log(Log::TRACE, "[core] dmabufFeedbackTrancheDone"); @@ -256,6 +279,9 @@ void CHyprlock::run() { Log::logger->log(Log::INFO, " | got iface: {} v{}", IFACE, version); if (IFACE == zwp_linux_dmabuf_v1_interface.name) { + if (!m_screencopyRequired) + return; + if (version < 4) { Log::logger->log(Log::ERR, "cannot use linux_dmabuf with ver < 4"); return; @@ -329,7 +355,10 @@ void CHyprlock::run() { Log::logger->log(Log::INFO, "Running on {}", m_sCurrentDesktop); g_asyncResourceManager->enqueueStaticAssets(); - g_asyncResourceManager->enqueueScreencopyFrames(); + if (m_screencopyRequired) + g_asyncResourceManager->enqueueScreencopyFrames(); + else + Log::logger->log(Log::INFO, "Skipping screencopy"); if (!g_pHyprlock->m_bImmediateRender) // Gather background resources and screencopy frames before locking the screen. diff --git a/src/core/hyprlock.hpp b/src/core/hyprlock.hpp index a938e9e..db25aec 100644 --- a/src/core/hyprlock.hpp +++ b/src/core/hyprlock.hpp @@ -86,7 +86,8 @@ class CHyprlock { bool m_bNumLock = false; bool m_bCtrl = false; - bool m_bImmediateRender = false; + bool m_bImmediateRender = false; + bool m_screencopyRequired = false; std::string m_sCurrentDesktop = ""; diff --git a/src/renderer/AsyncResourceManager.cpp b/src/renderer/AsyncResourceManager.cpp index 7f40b08..d982f35 100644 --- a/src/renderer/AsyncResourceManager.cpp +++ b/src/renderer/AsyncResourceManager.cpp @@ -113,24 +113,6 @@ void CAsyncResourceManager::enqueueScreencopyFrames() { if (g_pHyprlock->m_vOutputs.empty()) return; - static const auto ANIMATIONSENABLED = g_pConfigManager->getValue("animations:enabled"); - - const auto FADEINCFG = g_pConfigManager->m_AnimationTree.getConfig("fadeIn"); - const auto FADEOUTCFG = g_pConfigManager->m_AnimationTree.getConfig("fadeOut"); - - const bool FADENEEDSSC = *ANIMATIONSENABLED && - ((FADEINCFG->pValues && FADEINCFG->pValues->internalEnabled) || // fadeIn or fadeOut enabled - (FADEOUTCFG->pValues && FADEOUTCFG->pValues->internalEnabled)); - - const auto BGSCREENSHOT = std::ranges::any_of(g_pConfigManager->getWidgetConfigs(), [](const auto& w) { // - return w.type == "background" && std::string{std::any_cast(w.values.at("path"))} == "screenshot"; - }); - - if (!BGSCREENSHOT && !FADENEEDSSC) { - Log::logger->log(Log::INFO, "Skipping screencopy"); - return; - } - for (const auto& MON : g_pHyprlock->m_vOutputs) { m_scFrames.emplace_back(makeUnique()); auto* frame = m_scFrames.back().get();