From 2db4602bcd8e28387c4908c7f2539f302e734e03 Mon Sep 17 00:00:00 2001 From: ThevGPUSupplier <265896746+ThevGPUSupplier@users.noreply.github.com> Date: Sat, 7 Mar 2026 02:06:36 +0000 Subject: [PATCH] Add headless output if no gpus in session supports KMS --- src/Compositor.cpp | 22 ++++++++++++++++++---- src/Compositor.hpp | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index b0fc15453..2b242f7f8 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -735,8 +735,7 @@ void CCompositor::removeLockFile() { std::filesystem::remove(PATH); } -void CCompositor::prepareFallbackOutput() { - // create a backup monitor +void CCompositor::prepareFallbackOutputs() { SP headless; for (auto const& impl : m_aqBackend->getImplementations()) { if (impl->type() == Aquamarine::AQ_BACKEND_HEADLESS) { @@ -746,14 +745,29 @@ void CCompositor::prepareFallbackOutput() { } if (!headless) { - Log::logger->log(Log::WARN, "No headless in prepareFallbackOutput?!"); + Log::logger->log(Log::WARN, "No headless in prepareFallbackOutputs?!"); return; } + // create a backup monitor headless->createOutput(); if (m_monitors.empty()) enterUnsafeState(); + + // create a headless monitor if no card support kms. + bool supportsKMS = false; + if (m_aqBackend->hasSession()) { + for (SP dev : m_aqBackend->session->sessionDevices) { + supportsKMS |= dev->supportsKMS(); + } + } + + if (supportsKMS) + return; + + Log::logger->log(Log::DEBUG, "Running on DRM-only gpu. Creating initial HEADLESS-0 output."); + headless->createOutput("HEADLESS-0"); } void CCompositor::startCompositor() { @@ -775,7 +789,7 @@ void CCompositor::startCompositor() { Log::logger->log(Log::DEBUG, "Running on WAYLAND_DISPLAY: {}", m_wlDisplaySocket); - prepareFallbackOutput(); + prepareFallbackOutputs(); g_pHyprRenderer->setCursorFromName("left_ptr"); diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 6d2044fed..52320626b 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -178,7 +178,7 @@ class CCompositor { void cleanEnvironment(); void setRandomSplash(); void initManagers(eManagersInitStage stage); - void prepareFallbackOutput(); + void prepareFallbackOutputs(); void createLockFile(); void removeLockFile(); void setMallocThreshold();