From 3f7f4207a6dd8bd217c01514ea40e9e4b9b7874a Mon Sep 17 00:00:00 2001 From: vaxerski Date: Fri, 11 Aug 2023 17:37:52 +0200 Subject: [PATCH] config: add vrr per-display --- src/config/ConfigManager.cpp | 11 ++++++++--- src/config/ConfigManager.hpp | 14 +------------- src/helpers/Monitor.hpp | 17 ++++++++++++++++- src/render/Renderer.cpp | 3 +++ 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index cf2f8ed6..bb582039 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -660,6 +660,9 @@ void CConfigManager::handleMonitor(const std::string& command, const std::string } else if (ARGS[argno] == "transform") { newrule.transform = (wl_output_transform)std::stoi(ARGS[argno + 1]); argno++; + } else if (ARGS[argno] == "vrr") { + newrule.vrr = std::stoi(ARGS[argno + 1]); + argno++; } else if (ARGS[argno] == "workspace") { std::string name = ""; int wsId = getWorkspaceIDFromString(ARGS[argno + 1], name); @@ -2070,7 +2073,9 @@ void CConfigManager::ensureVRR(CMonitor* pMonitor) { if (!m->output) return; - if (*PVRR == 0) { + const auto USEVRR = m->activeMonitorRule.vrr.has_value() ? m->activeMonitorRule.vrr.value() : *PVRR; + + if (USEVRR == 0) { if (m->vrrActive) { wlr_output_enable_adaptive_sync(m->output, 0); @@ -2080,7 +2085,7 @@ void CConfigManager::ensureVRR(CMonitor* pMonitor) { } m->vrrActive = false; return; - } else if (*PVRR == 1) { + } else if (USEVRR == 1) { if (!m->vrrActive) { wlr_output_enable_adaptive_sync(m->output, 1); @@ -2095,7 +2100,7 @@ void CConfigManager::ensureVRR(CMonitor* pMonitor) { } m->vrrActive = true; return; - } else if (*PVRR == 2) { + } else if (USEVRR == 2) { /* fullscreen */ m->vrrActive = true; diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp index d5cd77db..b2b9c38c 100644 --- a/src/config/ConfigManager.hpp +++ b/src/config/ConfigManager.hpp @@ -14,6 +14,7 @@ #include #include "../Window.hpp" #include "../helpers/WLClasses.hpp" +#include "../helpers/Monitor.hpp" #include "defaultConfig.hpp" #include "ConfigDataValues.hpp" @@ -35,19 +36,6 @@ struct SConfigValue { bool set = false; // used for device configs }; -struct SMonitorRule { - std::string name = ""; - Vector2D resolution = Vector2D(1280, 720); - Vector2D offset = Vector2D(0, 0); - float scale = 1; - float refreshRate = 60; - bool disabled = false; - wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL; - std::string mirrorOf = ""; - bool enable10bit = false; - drmModeModeInfo drmMode = {}; -}; - struct SWorkspaceRule { std::string monitor = ""; std::string workspaceString = ""; diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp index b453bc8c..e4bf6251 100644 --- a/src/helpers/Monitor.hpp +++ b/src/helpers/Monitor.hpp @@ -9,8 +9,21 @@ #include #include "Timer.hpp" #include "Region.hpp" +#include -struct SMonitorRule; +struct SMonitorRule { + std::string name = ""; + Vector2D resolution = Vector2D(1280, 720); + Vector2D offset = Vector2D(0, 0); + float scale = 1; + float refreshRate = 60; + bool disabled = false; + wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL; + std::string mirrorOf = ""; + bool enable10bit = false; + drmModeModeInfo drmMode = {}; + std::optional vrr; +}; class CMonitor { public: @@ -58,6 +71,8 @@ class CMonitor { bool RATScheduled = false; CTimer lastPresentationTimer; + SMonitorRule activeMonitorRule; + // mirroring CMonitor* pMirrorOf = nullptr; std::vector mirrors; diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 5f929540..1f75fd4f 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1568,6 +1568,8 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR Debug::log(LOG, "Applying monitor rule for %s", pMonitor->szName.c_str()); + pMonitor->activeMonitorRule = *pMonitorRule; + // if it's disabled, disable and ignore if (pMonitorRule->disabled) { @@ -1587,6 +1589,7 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR } // Check if the rule isn't already applied + // TODO: clean this up lol if (!force && DELTALESSTHAN(pMonitor->vecPixelSize.x, pMonitorRule->resolution.x, 1) && DELTALESSTHAN(pMonitor->vecPixelSize.y, pMonitorRule->resolution.y, 1) && DELTALESSTHAN(pMonitor->refreshRate, pMonitorRule->refreshRate, 1) && pMonitor->scale == pMonitorRule->scale && ((DELTALESSTHAN(pMonitor->vecPosition.x, pMonitorRule->offset.x, 1) && DELTALESSTHAN(pMonitor->vecPosition.y, pMonitorRule->offset.y, 1)) ||