From 5bfe6dc703f678e6f8197ea587d798681fa21816 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Wed, 16 Jul 2025 11:02:20 +0200 Subject: [PATCH] config: disable hw on mgpu nvidia by default (#11018) --- src/config/ConfigDescriptions.hpp | 2 +- src/config/ConfigManager.cpp | 2 +- src/render/Renderer.cpp | 7 +++++++ src/render/Renderer.hpp | 2 ++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index 927d67de1..ae1f51e4e 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -1495,7 +1495,7 @@ inline static const std::vector CONFIG_OPTIONS = { SConfigOptionDescription{ .value = "cursor:no_hardware_cursors", - .description = "disables hardware cursors. Auto = disable when tearing", + .description = "disables hardware cursors. Auto = disable when multi-gpu on nvidia", .type = CONFIG_OPTION_CHOICE, .data = SConfigOptionDescription::SChoiceData{0, "Disabled,Enabled,Auto"}, }, diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index bc198fac4..ceaa09797 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -3134,7 +3134,7 @@ bool CConfigManager::shouldUseSoftwareCursors(PHLMONITOR pMonitor) { switch (*PNOHW) { case 0: return false; case 1: return true; - case 2: return pMonitor->m_tearingState.activelyTearing; + case 2: return g_pHyprRenderer->isNvidia() && g_pHyprRenderer->isMgpu(); default: break; } diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 2865026f0..e9797fbe4 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -56,10 +56,12 @@ static int cursorTicker(void* data) { CHyprRenderer::CHyprRenderer() { if (g_pCompositor->m_aqBackend->hasSession()) { + size_t drmDevices = 0; for (auto const& dev : g_pCompositor->m_aqBackend->session->sessionDevices) { const auto DRMV = drmGetVersion(dev->fd); if (!DRMV) continue; + drmDevices++; std::string name = std::string{DRMV->name, DRMV->name_len}; std::ranges::transform(name, name.begin(), tolower); @@ -71,6 +73,7 @@ CHyprRenderer::CHyprRenderer() { drmFreeVersion(DRMV); } + m_mgpu = drmDevices > 1; } else { Debug::log(LOG, "Aq backend has no session, omitting full DRM node checks"); @@ -2371,6 +2374,10 @@ bool CHyprRenderer::isNvidia() { return m_nvidia; } +bool CHyprRenderer::isMgpu() { + return m_mgpu; +} + void CHyprRenderer::addWindowToRenderUnfocused(PHLWINDOW window) { static auto PFPS = CConfigValue("misc:render_unfocused_fps"); diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp index 9f733a573..7798c0d48 100644 --- a/src/render/Renderer.hpp +++ b/src/render/Renderer.hpp @@ -75,6 +75,7 @@ class CHyprRenderer { void onRenderbufferDestroy(CRenderbuffer* rb); SP getCurrentRBO(); bool isNvidia(); + bool isMgpu(); void makeEGLCurrent(); void unsetEGL(); void addWindowToRenderUnfocused(PHLWINDOW window); @@ -140,6 +141,7 @@ class CHyprRenderer { SP m_currentBuffer = nullptr; eRenderMode m_renderMode = RENDER_MODE_NORMAL; bool m_nvidia = false; + bool m_mgpu = false; struct { bool hiddenOnTouch = false;