From 078e7e8ff65ccaa12c11d7b8fc171f643dab3d4c Mon Sep 17 00:00:00 2001 From: UjinT34 Date: Wed, 5 Feb 2025 14:28:11 +0300 Subject: [PATCH] fix DS and VRR automation --- src/config/ConfigDescriptions.hpp | 4 ++-- src/config/ConfigManager.cpp | 32 +++++++++++++++---------------- src/render/Renderer.cpp | 9 ++++----- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index 28cd29c4525..2eb2778a817 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -1024,9 +1024,9 @@ inline static const std::vector CONFIG_OPTIONS = { }, SConfigOptionDescription{ .value = "misc:vrr", - .description = " controls the VRR (Adaptive Sync) of your monitors. 0 - off, 1 - on, 2 - fullscreen only [0/1/2]", + .description = " controls the VRR (Adaptive Sync) of your monitors. 0 - off, 1 - on, 2 - fullscreen only, 3 - fullscreen with game or video content type [0/1/2/3]", .type = CONFIG_OPTION_INT, - .data = SConfigOptionDescription::SRangeData{0, 0, 2}, + .data = SConfigOptionDescription::SRangeData{.value = 0, .min = 0, .max = 3}, }, SConfigOptionDescription{ .value = "misc:mouse_move_enables_dpms", diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 3f45ddfe0a7..e6626650cb9 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -49,6 +49,7 @@ #include using namespace Hyprutils::String; using namespace Hyprutils::Animation; +using enum NContentType::eContentType; //NOLINTNEXTLINE extern "C" char** environ; @@ -1618,37 +1619,34 @@ void CConfigManager::ensureVRR(PHLMONITOR pMonitor) { } m->vrrActive = true; return; - } else if (USEVRR == 2) { + } else if (USEVRR == 2 || USEVRR == 3) { const auto PWORKSPACE = m->activeWorkspace; if (!PWORKSPACE) return; // ??? - const auto WORKSPACEFULL = PWORKSPACE->m_bHasFullscreenWindow && (PWORKSPACE->m_efFullscreenMode & FSMODE_FULLSCREEN); + bool wantVRR = PWORKSPACE->m_bHasFullscreenWindow && (PWORKSPACE->m_efFullscreenMode & FSMODE_FULLSCREEN); + if (wantVRR && USEVRR == 3) { + const auto contentType = PWORKSPACE->getFullscreenWindow()->getContentType(); + wantVRR = contentType == CONTENT_TYPE_GAME || contentType == CONTENT_TYPE_VIDEO; + } - if (WORKSPACEFULL) { + if (wantVRR) { /* fullscreen */ m->vrrActive = true; - m->output->state->resetExplicitFences(); - m->output->state->setAdaptiveSync(true); + if (!m->output->state->state().adaptiveSync) { + m->output->state->setAdaptiveSync(true); - if (!m->state.test()) { - Debug::log(LOG, "Pending output {} does not accept VRR.", m->output->name); - m->output->state->setAdaptiveSync(false); + if (!m->state.test()) { + Debug::log(LOG, "Pending output {} does not accept VRR.", m->output->name); + m->output->state->setAdaptiveSync(false); + } } - - if (!m->state.commit()) - Debug::log(ERR, "Couldn't commit output {} in ensureVRR -> true", m->output->name); - - } else if (!WORKSPACEFULL) { + } else { m->vrrActive = false; - m->output->state->resetExplicitFences(); m->output->state->setAdaptiveSync(false); - - if (!m->state.commit()) - Debug::log(ERR, "Couldn't commit output {} in ensureVRR -> false", m->output->name); } } }; diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 0fcda827fa2..69c286cdc49 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -32,10 +32,8 @@ #include "pass/RendererHintsPassElement.hpp" #include "pass/SurfacePassElement.hpp" #include "debug/Log.hpp" -#include "protocols/ColorManagement.hpp" -#if AQUAMARINE_VERSION_NUMBER > 702 // >0.7.2 -#include "protocols/types/ContentType.hpp" -#endif +#include "../protocols/ColorManagement.hpp" +#include "../protocols/types/ContentType.hpp" #include using namespace Hyprutils::Utils; @@ -1197,7 +1195,8 @@ void CHyprRenderer::renderMonitor(PHLMONITOR pMonitor) { pMonitor->tearingState.activelyTearing = shouldTear; if ((*PDIRECTSCANOUT == 1 || - (*PDIRECTSCANOUT == 2 && pMonitor->activeWorkspace->getFullscreenWindow() && pMonitor->activeWorkspace->getFullscreenWindow()->getContentType() == CONTENT_TYPE_GAME)) && + (*PDIRECTSCANOUT == 2 && pMonitor->activeWorkspace && pMonitor->activeWorkspace->m_bHasFullscreenWindow && + pMonitor->activeWorkspace->m_efFullscreenMode == FSMODE_FULLSCREEN && pMonitor->activeWorkspace->getFullscreenWindow()->getContentType() == CONTENT_TYPE_GAME)) && !shouldTear) { if (pMonitor->attemptDirectScanout()) { return;