summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2025-07-16 11:02:20 +0200
committerGitHub <noreply@github.com>2025-07-16 11:02:20 +0200
commit5bfe6dc703f678e6f8197ea587d798681fa21816 (patch)
tree14d17965d5863a9ccc3278453d437bd3fc19d6af /src
parent8453fbf4eb0af2e3265fd34a693b7d0e9167f4d2 (diff)
config: disable hw on mgpu nvidia by default (#11018)
Diffstat (limited to 'src')
-rw-r--r--src/config/ConfigDescriptions.hpp2
-rw-r--r--src/config/ConfigManager.cpp2
-rw-r--r--src/render/Renderer.cpp7
-rw-r--r--src/render/Renderer.hpp2
4 files changed, 11 insertions, 2 deletions
diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp
index 927d67de..ae1f51e4 100644
--- a/src/config/ConfigDescriptions.hpp
+++ b/src/config/ConfigDescriptions.hpp
@@ -1495,7 +1495,7 @@ inline static const std::vector<SConfigOptionDescription> 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 bc198fac..ceaa0979 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 2865026f..e9797fbe 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<Hyprlang::INT>("misc:render_unfocused_fps");
diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp
index 9f733a57..7798c0d4 100644
--- a/src/render/Renderer.hpp
+++ b/src/render/Renderer.hpp
@@ -75,6 +75,7 @@ class CHyprRenderer {
void onRenderbufferDestroy(CRenderbuffer* rb);
SP<CRenderbuffer> getCurrentRBO();
bool isNvidia();
+ bool isMgpu();
void makeEGLCurrent();
void unsetEGL();
void addWindowToRenderUnfocused(PHLWINDOW window);
@@ -140,6 +141,7 @@ class CHyprRenderer {
SP<Aquamarine::IBuffer> m_currentBuffer = nullptr;
eRenderMode m_renderMode = RENDER_MODE_NORMAL;
bool m_nvidia = false;
+ bool m_mgpu = false;
struct {
bool hiddenOnTouch = false;