mirror of
https://github.com/hyprwm/Hyprland.git
synced 2025-07-25 17:21:54 -07:00
renderer: make lock fail textures dynamically loaded
this should reduce idle vram usage by a whopping 16MB, but also might fix the tty unknown issue.
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
#include "../protocols/types/ColorManagement.hpp"
|
||||
#include "../managers/HookSystemManager.hpp"
|
||||
#include "../managers/input/InputManager.hpp"
|
||||
#include "../managers/eventLoop/EventLoopManager.hpp"
|
||||
#include "../helpers/fs/FsUtils.hpp"
|
||||
#include "debug/HyprNotificationOverlay.hpp"
|
||||
#include "hyprerror/HyprError.hpp"
|
||||
@@ -2752,19 +2753,36 @@ void CHyprOpenGLImpl::useProgram(GLuint prog) {
|
||||
void CHyprOpenGLImpl::initAssets() {
|
||||
initMissingAssetTexture();
|
||||
|
||||
m_lockDeadTexture = loadAsset("lockdead.png");
|
||||
m_lockDead2Texture = loadAsset("lockdead2.png");
|
||||
|
||||
m_lockTtyTextTexture = renderText(
|
||||
std::format("Running on tty {}",
|
||||
g_pCompositor->m_aqBackend->hasSession() && g_pCompositor->m_aqBackend->session->vt > 0 ? std::to_string(g_pCompositor->m_aqBackend->session->vt) : "unknown"),
|
||||
CHyprColor{0.9F, 0.9F, 0.9F, 0.7F}, 20, true);
|
||||
|
||||
m_screencopyDeniedTexture = renderText("Permission denied to share screen", Colors::WHITE, 20);
|
||||
|
||||
ensureBackgroundTexturePresence();
|
||||
}
|
||||
|
||||
void CHyprOpenGLImpl::ensureLockTexturesRendered(bool load) {
|
||||
static bool loaded = false;
|
||||
|
||||
if (loaded == load)
|
||||
return;
|
||||
|
||||
loaded = load;
|
||||
|
||||
if (load) {
|
||||
// this will cause a small hitch. I don't think we can do much, other than wasting VRAM and having this loaded all the time.
|
||||
m_lockDeadTexture = loadAsset("lockdead.png");
|
||||
m_lockDead2Texture = loadAsset("lockdead2.png");
|
||||
|
||||
m_lockTtyTextTexture = renderText(std::format("Running on tty {}",
|
||||
g_pCompositor->m_aqBackend->hasSession() && g_pCompositor->m_aqBackend->session->vt > 0 ?
|
||||
std::to_string(g_pCompositor->m_aqBackend->session->vt) :
|
||||
"unknown"),
|
||||
CHyprColor{0.9F, 0.9F, 0.9F, 0.7F}, 20, true);
|
||||
} else {
|
||||
m_lockDeadTexture.reset();
|
||||
m_lockDead2Texture.reset();
|
||||
m_lockTtyTextTexture.reset();
|
||||
}
|
||||
}
|
||||
|
||||
void CHyprOpenGLImpl::ensureBackgroundTexturePresence() {
|
||||
static auto PNOWALLPAPER = CConfigValue<Hyprlang::INT>("misc:disable_hyprland_logo");
|
||||
static auto PFORCEWALLPAPER = CConfigValue<Hyprlang::INT>("misc:force_default_wallpaper");
|
||||
|
@@ -249,6 +249,8 @@ class CHyprOpenGLImpl {
|
||||
GLuint compileShader(const GLuint&, std::string, bool dynamic = false, bool silent = false);
|
||||
void useProgram(GLuint prog);
|
||||
|
||||
void ensureLockTexturesRendered(bool load);
|
||||
|
||||
bool m_shadersInitialized = false;
|
||||
SP<SPreparedShaders> m_shaders;
|
||||
|
||||
@@ -329,7 +331,7 @@ class CHyprOpenGLImpl {
|
||||
SP<CTexture> m_backgroundTexture;
|
||||
SP<CTexture> m_lockDeadTexture;
|
||||
SP<CTexture> m_lockDead2Texture;
|
||||
SP<CTexture> m_lockTtyTextTexture; // TODO: don't always load lock
|
||||
SP<CTexture> m_lockTtyTextTexture;
|
||||
|
||||
void logShaderError(const GLuint&, bool program = false, bool silent = false);
|
||||
void createBGTextureForMonitor(PHLMONITOR);
|
||||
|
@@ -835,8 +835,7 @@ void CHyprRenderer::renderAllClientsForWorkspace(PHLMONITOR pMonitor, PHLWORKSPA
|
||||
return;
|
||||
|
||||
if (g_pSessionLockManager->isSessionLocked() && !g_pSessionLockManager->isSessionLockPresent()) {
|
||||
// locked with no exclusive, draw only red
|
||||
renderSessionLockMissing(pMonitor);
|
||||
// do not render anything. We will render a lockscreen anyways later.
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -989,12 +988,21 @@ void CHyprRenderer::renderAllClientsForWorkspace(PHLMONITOR pMonitor, PHLWORKSPA
|
||||
void CHyprRenderer::renderLockscreen(PHLMONITOR pMonitor, const Time::steady_tp& now, const CBox& geometry) {
|
||||
TRACY_GPU_ZONE("RenderLockscreen");
|
||||
|
||||
if (g_pSessionLockManager->isSessionLocked()) {
|
||||
const bool LOCKED = g_pSessionLockManager->isSessionLocked();
|
||||
|
||||
g_pHyprOpenGL->ensureLockTexturesRendered( //
|
||||
LOCKED && // session is locked AND
|
||||
!g_pSessionLockManager->getSessionLockSurfaceForMonitor(pMonitor->m_id) && // no session lock surface AND
|
||||
(g_pSessionLockManager->shallConsiderLockMissing() ||
|
||||
!g_pSessionLockManager->isSessionLockPresent()) // we can consider rendering the lockMissing texture OR there is no client altogether
|
||||
);
|
||||
|
||||
if (LOCKED) {
|
||||
Vector2D translate = {geometry.x, geometry.y};
|
||||
|
||||
const auto PSLS = g_pSessionLockManager->getSessionLockSurfaceForMonitor(pMonitor->m_id);
|
||||
if (!PSLS) {
|
||||
if (g_pSessionLockManager->shallConsiderLockMissing())
|
||||
if (g_pSessionLockManager->shallConsiderLockMissing() || !g_pSessionLockManager->isSessionLockPresent())
|
||||
renderSessionLockMissing(pMonitor);
|
||||
} else {
|
||||
renderSessionLockSurface(PSLS, pMonitor, now);
|
||||
|
Reference in New Issue
Block a user