From e0bfec6ef2507de3f13e1d4690adfe195cf1643c Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 4 Jul 2022 17:47:31 +0200 Subject: added experimental:vfr --- src/events/Monitors.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src/events/Monitors.cpp') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 11527cee..562c4533 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -173,6 +173,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { static auto *const PDEBUGOVERLAY = &g_pConfigManager->getConfigValuePtr("debug:overlay")->intValue; static auto *const PDAMAGETRACKINGMODE = &g_pConfigManager->getConfigValuePtr("general:damage_tracking_internal")->intValue; static auto *const PDAMAGEBLINK = &g_pConfigManager->getConfigValuePtr("debug:damage_blink")->intValue; + static auto *const VFRENABLED = &g_pConfigManager->getConfigValuePtr("experimental:vfr")->intValue; static int damageBlinkCleanup = 0; // because double-buffered @@ -231,7 +232,10 @@ void Events::listener_monitorFrame(void* owner, void* data) { if (!hasChanged && *PDAMAGETRACKINGMODE != DAMAGE_TRACKING_NONE && PMONITOR->forceFullFrames == 0 && damageBlinkCleanup == 0) { pixman_region32_fini(&damage); wlr_output_rollback(PMONITOR->output); - wlr_output_schedule_frame(PMONITOR->output); // we update shit at the monitor's Hz so we need to schedule frames because rollback wont + + if (!*VFRENABLED) + wlr_output_schedule_frame(PMONITOR->output); + return; } @@ -319,7 +323,8 @@ void Events::listener_monitorFrame(void* owner, void* data) { wlr_output_commit(PMONITOR->output); - wlr_output_schedule_frame(PMONITOR->output); + if (!*VFRENABLED) + wlr_output_schedule_frame(PMONITOR->output); if (*PDEBUGOVERLAY == 1) { const float µs = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - startRender).count() / 1000.f; -- cgit v1.2.3 From ae096219e83b1a90990f2277b5a9302a3e943d84 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 5 Jul 2022 21:45:32 +0200 Subject: do updates on every mon update if VFR is enabled --- src/events/Monitors.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/events/Monitors.cpp') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 562c4533..d46b02ff 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -184,7 +184,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { // Hack: only check when monitor with top hz refreshes, saves a bit of resources. // This is for stuff that should be run every frame - if (PMONITOR->ID == pMostHzMonitor->ID) { + if (PMONITOR->ID == pMostHzMonitor->ID || *VFRENABLED) { // unfortunately with VFR we don't have the guarantee mostHz is going to be updated all the time, so we have to ignore that g_pCompositor->sanityCheckWorkspaces(); g_pAnimationManager->tick(); g_pCompositor->cleanupFadingOut(); -- cgit v1.2.3 From 06c0be5ea6e3ed6b7fe7a45a550d42bc646ad6db Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sun, 10 Jul 2022 11:45:50 +0200 Subject: clear with 17 --- src/events/Monitors.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/events/Monitors.cpp') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index d46b02ff..7a0fb358 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -270,7 +270,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { // potentially can save on resources. g_pHyprOpenGL->begin(PMONITOR, &damage); - g_pHyprOpenGL->clear(CColor(100, 11, 11, 255)); + g_pHyprOpenGL->clear(CColor(17, 17, 17, 255)); g_pHyprOpenGL->clearWithTex(); // will apply the hypr "wallpaper" g_pHyprRenderer->renderAllClientsForMonitor(PMONITOR->ID, &now); -- cgit v1.2.3 From c0c75db62188667a4f42aef1ae6bfd8034093af7 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 11 Jul 2022 23:56:24 +0200 Subject: roll VFR for everyone --- src/events/Monitors.cpp | 47 ++++++++++++----------------------------------- 1 file changed, 12 insertions(+), 35 deletions(-) (limited to 'src/events/Monitors.cpp') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 7a0fb358..1b90fbd0 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -15,8 +15,6 @@ // // // --------------------------------------------------------- // -SMonitor* pMostHzMonitor = nullptr; - void Events::listener_change(wl_listener* listener, void* data) { // layout got changed, let's update monitors. const auto CONFIG = wlr_output_configuration_v1_create(); @@ -149,9 +147,6 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { g_pCompositor->deactivateAllWLRWorkspaces(PNEWWORKSPACE->m_pWlrHandle); PNEWWORKSPACE->setActive(true); - - if (!pMostHzMonitor || monitorRule.refreshRate > pMostHzMonitor->refreshRate) - pMostHzMonitor = PNEWMONITOR; // if (!g_pCompositor->m_pLastMonitor) // set the last monitor if it isnt set yet @@ -173,7 +168,6 @@ void Events::listener_monitorFrame(void* owner, void* data) { static auto *const PDEBUGOVERLAY = &g_pConfigManager->getConfigValuePtr("debug:overlay")->intValue; static auto *const PDAMAGETRACKINGMODE = &g_pConfigManager->getConfigValuePtr("general:damage_tracking_internal")->intValue; static auto *const PDAMAGEBLINK = &g_pConfigManager->getConfigValuePtr("debug:damage_blink")->intValue; - static auto *const VFRENABLED = &g_pConfigManager->getConfigValuePtr("experimental:vfr")->intValue; static int damageBlinkCleanup = 0; // because double-buffered @@ -182,22 +176,20 @@ void Events::listener_monitorFrame(void* owner, void* data) { g_pDebugOverlay->frameData(PMONITOR); } - // Hack: only check when monitor with top hz refreshes, saves a bit of resources. - // This is for stuff that should be run every frame - if (PMONITOR->ID == pMostHzMonitor->ID || *VFRENABLED) { // unfortunately with VFR we don't have the guarantee mostHz is going to be updated all the time, so we have to ignore that - g_pCompositor->sanityCheckWorkspaces(); - g_pAnimationManager->tick(); - g_pCompositor->cleanupFadingOut(); + // checks // + g_pCompositor->sanityCheckWorkspaces(); + g_pAnimationManager->tick(); + g_pCompositor->cleanupFadingOut(); - HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit + HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit - g_pConfigManager->dispatchExecOnce(); // We exec-once when at least one monitor starts refreshing, meaning stuff has init'd + g_pConfigManager->dispatchExecOnce(); // We exec-once when at least one monitor starts refreshing, meaning stuff has init'd - if (g_pConfigManager->m_bWantsMonitorReload) - g_pConfigManager->performMonitorReload(); + if (g_pConfigManager->m_bWantsMonitorReload) + g_pConfigManager->performMonitorReload(); - g_pHyprRenderer->ensureCursorRenderingMode(); // so that the cursor gets hidden/shown if the user requested timeouts - } + g_pHyprRenderer->ensureCursorRenderingMode(); // so that the cursor gets hidden/shown if the user requested timeouts + // // if (PMONITOR->framesToSkip > 0) { PMONITOR->framesToSkip -= 1; @@ -233,7 +225,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { pixman_region32_fini(&damage); wlr_output_rollback(PMONITOR->output); - if (!*VFRENABLED) + if (*PDAMAGEBLINK) wlr_output_schedule_frame(PMONITOR->output); return; @@ -323,7 +315,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { wlr_output_commit(PMONITOR->output); - if (!*VFRENABLED) + if (*PDAMAGEBLINK) wlr_output_schedule_frame(PMONITOR->output); if (*PDEBUGOVERLAY == 1) { @@ -390,19 +382,4 @@ void Events::listener_monitorDestroy(void* owner, void* data) { g_pEventManager->postEvent(SHyprIPCEvent("monitorremoved", pMonitor->szName)); g_pCompositor->m_vMonitors.erase(std::remove_if(g_pCompositor->m_vMonitors.begin(), g_pCompositor->m_vMonitors.end(), [&](std::unique_ptr& el) { return el.get() == pMonitor; })); - - // update the pMostHzMonitor - if (pMostHzMonitor == pMonitor) { - int mostHz = 0; - SMonitor* pMonitorMostHz = nullptr; - - for (auto& m : g_pCompositor->m_vMonitors) { - if (m->refreshRate > mostHz) { - pMonitorMostHz = m.get(); - mostHz = m->refreshRate; - } - } - - pMostHzMonitor = pMonitorMostHz; - } } -- cgit v1.2.3 From 29e2bb27f6073695aa4f9767f87cd653db5ce811 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 12 Jul 2022 10:02:12 +0200 Subject: added misc:no_vfr --- src/events/Monitors.cpp | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) (limited to 'src/events/Monitors.cpp') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 1b90fbd0..d523aeb3 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -15,6 +15,8 @@ // // // --------------------------------------------------------- // +SMonitor* pMostHzMonitor = nullptr; + void Events::listener_change(wl_listener* listener, void* data) { // layout got changed, let's update monitors. const auto CONFIG = wlr_output_configuration_v1_create(); @@ -149,6 +151,9 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { PNEWWORKSPACE->setActive(true); // + if (!pMostHzMonitor || monitorRule.refreshRate > pMostHzMonitor->refreshRate) + pMostHzMonitor = PNEWMONITOR; + if (!g_pCompositor->m_pLastMonitor) // set the last monitor if it isnt set yet g_pCompositor->m_pLastMonitor = PNEWMONITOR; @@ -168,6 +173,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { static auto *const PDEBUGOVERLAY = &g_pConfigManager->getConfigValuePtr("debug:overlay")->intValue; static auto *const PDAMAGETRACKINGMODE = &g_pConfigManager->getConfigValuePtr("general:damage_tracking_internal")->intValue; static auto *const PDAMAGEBLINK = &g_pConfigManager->getConfigValuePtr("debug:damage_blink")->intValue; + static auto *const PNOVFR = &g_pConfigManager->getConfigValuePtr("misc:no_vfr")->intValue; static int damageBlinkCleanup = 0; // because double-buffered @@ -177,18 +183,20 @@ void Events::listener_monitorFrame(void* owner, void* data) { } // checks // - g_pCompositor->sanityCheckWorkspaces(); - g_pAnimationManager->tick(); - g_pCompositor->cleanupFadingOut(); + if (PMONITOR->ID == pMostHzMonitor->ID || !*PNOVFR) { // unfortunately with VFR we don't have the guarantee mostHz is going to be updated all the time, so we have to ignore that + g_pCompositor->sanityCheckWorkspaces(); + g_pAnimationManager->tick(); + g_pCompositor->cleanupFadingOut(); - HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit + HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit - g_pConfigManager->dispatchExecOnce(); // We exec-once when at least one monitor starts refreshing, meaning stuff has init'd + g_pConfigManager->dispatchExecOnce(); // We exec-once when at least one monitor starts refreshing, meaning stuff has init'd - if (g_pConfigManager->m_bWantsMonitorReload) - g_pConfigManager->performMonitorReload(); + if (g_pConfigManager->m_bWantsMonitorReload) + g_pConfigManager->performMonitorReload(); - g_pHyprRenderer->ensureCursorRenderingMode(); // so that the cursor gets hidden/shown if the user requested timeouts + g_pHyprRenderer->ensureCursorRenderingMode(); // so that the cursor gets hidden/shown if the user requested timeouts + } // // if (PMONITOR->framesToSkip > 0) { @@ -225,7 +233,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { pixman_region32_fini(&damage); wlr_output_rollback(PMONITOR->output); - if (*PDAMAGEBLINK) + if (*PDAMAGEBLINK || *PNOVFR) wlr_output_schedule_frame(PMONITOR->output); return; @@ -315,7 +323,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { wlr_output_commit(PMONITOR->output); - if (*PDAMAGEBLINK) + if (*PDAMAGEBLINK || *PNOVFR) wlr_output_schedule_frame(PMONITOR->output); if (*PDEBUGOVERLAY == 1) { @@ -382,4 +390,18 @@ void Events::listener_monitorDestroy(void* owner, void* data) { g_pEventManager->postEvent(SHyprIPCEvent("monitorremoved", pMonitor->szName)); g_pCompositor->m_vMonitors.erase(std::remove_if(g_pCompositor->m_vMonitors.begin(), g_pCompositor->m_vMonitors.end(), [&](std::unique_ptr& el) { return el.get() == pMonitor; })); + + if (pMostHzMonitor == pMonitor) { + int mostHz = 0; + SMonitor* pMonitorMostHz = nullptr; + + for (auto& m : g_pCompositor->m_vMonitors) { + if (m->refreshRate > mostHz) { + pMonitorMostHz = m.get(); + mostHz = m->refreshRate; + } + } + + pMostHzMonitor = pMonitorMostHz; + } } -- cgit v1.2.3 From bf762f566f1c8c5e9c636f0d1ad4e485ad322da9 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 12 Jul 2022 23:11:34 +0200 Subject: Fix VRAM memory leak when releasing snapshots --- src/events/Monitors.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/events/Monitors.cpp') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index d523aeb3..cf7e4b49 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -186,7 +186,6 @@ void Events::listener_monitorFrame(void* owner, void* data) { if (PMONITOR->ID == pMostHzMonitor->ID || !*PNOVFR) { // unfortunately with VFR we don't have the guarantee mostHz is going to be updated all the time, so we have to ignore that g_pCompositor->sanityCheckWorkspaces(); g_pAnimationManager->tick(); - g_pCompositor->cleanupFadingOut(); HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit @@ -229,6 +228,9 @@ void Events::listener_monitorFrame(void* owner, void* data) { return; } + // we need to cleanup fading out when rendering the appropriate context + g_pCompositor->cleanupFadingOut(PMONITOR->ID); + if (!hasChanged && *PDAMAGETRACKINGMODE != DAMAGE_TRACKING_NONE && PMONITOR->forceFullFrames == 0 && damageBlinkCleanup == 0) { pixman_region32_fini(&damage); wlr_output_rollback(PMONITOR->output); -- cgit v1.2.3 From 6708f3b1334e8b6a966f424fe04713a4e74d5fdb Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Wed, 13 Jul 2022 18:18:23 +0200 Subject: Fixed TTY switching (#364) --- src/events/Monitors.cpp | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) (limited to 'src/events/Monitors.cpp') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index cf7e4b49..949d4585 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -166,6 +166,11 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { void Events::listener_monitorFrame(void* owner, void* data) { SMonitor* const PMONITOR = (SMonitor*)owner; + if (!g_pCompositor->m_sWLRSession->active || !g_pCompositor->m_bSessionActive) { + Debug::log(WARN, "Attempted to render frame on inactive session!"); + return; // cannot draw on session inactive (different tty) + } + static std::chrono::high_resolution_clock::time_point startRender = std::chrono::high_resolution_clock::now(); static std::chrono::high_resolution_clock::time_point startRenderOverlay = std::chrono::high_resolution_clock::now(); static std::chrono::high_resolution_clock::time_point endRenderOverlay = std::chrono::high_resolution_clock::now(); @@ -182,6 +187,18 @@ void Events::listener_monitorFrame(void* owner, void* data) { g_pDebugOverlay->frameData(PMONITOR); } + if (PMONITOR->framesToSkip > 0) { + PMONITOR->framesToSkip -= 1; + + if (!PMONITOR->noFrameSchedule) + g_pCompositor->scheduleFrameForMonitor(PMONITOR); + else { + Debug::log(LOG, "NoFrameSchedule hit for %s.", PMONITOR->szName.c_str()); + } + g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PMONITOR->ID); + return; + } + // checks // if (PMONITOR->ID == pMostHzMonitor->ID || !*PNOVFR) { // unfortunately with VFR we don't have the guarantee mostHz is going to be updated all the time, so we have to ignore that g_pCompositor->sanityCheckWorkspaces(); @@ -198,18 +215,6 @@ void Events::listener_monitorFrame(void* owner, void* data) { } // // - if (PMONITOR->framesToSkip > 0) { - PMONITOR->framesToSkip -= 1; - - if (!PMONITOR->noFrameSchedule) - wlr_output_schedule_frame(PMONITOR->output); - else { - Debug::log(LOG, "NoFrameSchedule hit for %s.", PMONITOR->szName.c_str()); - } - g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PMONITOR->ID); - return; - } - timespec now; clock_gettime(CLOCK_MONOTONIC, &now); @@ -236,7 +241,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { wlr_output_rollback(PMONITOR->output); if (*PDAMAGEBLINK || *PNOVFR) - wlr_output_schedule_frame(PMONITOR->output); + g_pCompositor->scheduleFrameForMonitor(PMONITOR); return; } @@ -326,7 +331,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { wlr_output_commit(PMONITOR->output); if (*PDAMAGEBLINK || *PNOVFR) - wlr_output_schedule_frame(PMONITOR->output); + g_pCompositor->scheduleFrameForMonitor(PMONITOR); if (*PDEBUGOVERLAY == 1) { const float µs = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - startRender).count() / 1000.f; @@ -360,8 +365,7 @@ void Events::listener_monitorDestroy(void* owner, void* data) { if (!BACKUPMON) { Debug::log(CRIT, "No monitors! Unplugged last! Exiting."); - g_pCompositor->cleanupExit(); - exit(1); + g_pCompositor->cleanup(); return; } -- cgit v1.2.3 From 49dbb586e341b5aeb451897ddfe7b46dd538b8c9 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Wed, 13 Jul 2022 18:31:09 +0200 Subject: fixed session-less envs --- src/events/Monitors.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/events/Monitors.cpp') diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 949d4585..24a8faa7 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -166,7 +166,7 @@ void Events::listener_newOutput(wl_listener* listener, void* data) { void Events::listener_monitorFrame(void* owner, void* data) { SMonitor* const PMONITOR = (SMonitor*)owner; - if (!g_pCompositor->m_sWLRSession->active || !g_pCompositor->m_bSessionActive) { + if ((g_pCompositor->m_sWLRSession && !g_pCompositor->m_sWLRSession->active) || !g_pCompositor->m_bSessionActive) { Debug::log(WARN, "Attempted to render frame on inactive session!"); return; // cannot draw on session inactive (different tty) } -- cgit v1.2.3