From 8c14c2a5f472cf3d361d3cbb90ee7d2d455aae08 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Mon, 30 Dec 2024 11:57:55 +0100 Subject: [PATCH] ctm: disable fade animation by default on nvidia Fixes #8891, the nvidia driver dies when we spam CTM too much. --- src/config/ConfigDescriptions.hpp | 18 ++++++++++++++++++ src/config/ConfigManager.cpp | 1 + src/protocols/CTMControl.cpp | 14 ++++++++++++++ src/protocols/CTMControl.hpp | 1 + 4 files changed, 34 insertions(+) diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index e1c9cb46..17657983 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -1289,6 +1289,24 @@ inline static const std::vector CONFIG_OPTIONS = { .type = CONFIG_OPTION_BOOL, .data = SConfigOptionDescription::SBoolData{false}, }, + SConfigOptionDescription{ + .value = "render:expand_undersized_textures", + .description = "Whether to expand textures that have not yet resized to be larger, or to just stretch them instead.", + .type = CONFIG_OPTION_BOOL, + .data = SConfigOptionDescription::SBoolData{true}, + }, + SConfigOptionDescription{ + .value = "render:xp_mode", + .description = "Disable back buffer and bottom layer rendering.", + .type = CONFIG_OPTION_BOOL, + .data = SConfigOptionDescription::SBoolData{true}, + }, + SConfigOptionDescription{ + .value = "render:ctm_animation", + .description = "Whether to enable a fade animation for CTM changes (hyprsunset). 2 means 'auto' (Yes on everything but Nvidia).", + .type = CONFIG_OPTION_INT, + .data = SConfigOptionDescription::SRangeData{2, 0, 2}, + }, /* * cursor: diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 0b8e68f6..67df5bf4 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -614,6 +614,7 @@ CConfigManager::CConfigManager() { m_pConfig->addConfigValue("render:direct_scanout", Hyprlang::INT{0}); m_pConfig->addConfigValue("render:expand_undersized_textures", Hyprlang::INT{1}); m_pConfig->addConfigValue("render:xp_mode", Hyprlang::INT{0}); + m_pConfig->addConfigValue("render:ctm_animation", Hyprlang::INT{2}); m_pConfig->addConfigValue("ecosystem:no_update_news", Hyprlang::INT{0}); diff --git a/src/protocols/CTMControl.cpp b/src/protocols/CTMControl.cpp index 42c84e8f..250c6326 100644 --- a/src/protocols/CTMControl.cpp +++ b/src/protocols/CTMControl.cpp @@ -1,6 +1,8 @@ #include "CTMControl.hpp" #include "../Compositor.hpp" +#include "../render/Renderer.hpp" #include "core/Output.hpp" +#include "../config/ConfigValue.hpp" CHyprlandCTMControlResource::CHyprlandCTMControlResource(SP resource_) : resource(resource_) { if (!good()) @@ -81,12 +83,24 @@ void CHyprlandCTMControlProtocol::destroyResource(CHyprlandCTMControlResource* r std::erase_if(m_vManagers, [&](const auto& other) { return other.get() == res; }); } +bool CHyprlandCTMControlProtocol::isCTMAnimationEnabled() { + static auto PENABLEANIM = CConfigValue("render:ctm_animation"); + + if (*PENABLEANIM == 2) + return !g_pHyprRenderer->isNvidia(); + return *PENABLEANIM; +} + CHyprlandCTMControlProtocol::SCTMData::SCTMData() { progress.create(g_pConfigManager->getAnimationPropertyConfig("__internal_fadeCTM"), AVARDAMAGE_NONE); progress.setValueAndWarp(0.F); } void CHyprlandCTMControlProtocol::setCTM(PHLMONITOR monitor, const Mat3x3& ctm) { + if (!isCTMAnimationEnabled()) { + monitor->setCTM(ctm); + return; + } std::erase_if(m_mCTMDatas, [](const auto& el) { return !el.first; }); diff --git a/src/protocols/CTMControl.hpp b/src/protocols/CTMControl.hpp index 51820f20..dea2c258 100644 --- a/src/protocols/CTMControl.hpp +++ b/src/protocols/CTMControl.hpp @@ -34,6 +34,7 @@ class CHyprlandCTMControlProtocol : public IWaylandProtocol { void destroyResource(CHyprlandCTMControlResource* resource); void setCTM(PHLMONITOR monitor, const Mat3x3& ctm); + bool isCTMAnimationEnabled(); // std::vector> m_vManagers;