summaryrefslogtreecommitdiff
path: root/src/helpers/MonitorResources.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/helpers/MonitorResources.cpp')
-rw-r--r--src/helpers/MonitorResources.cpp37
1 files changed, 29 insertions, 8 deletions
diff --git a/src/helpers/MonitorResources.cpp b/src/helpers/MonitorResources.cpp
index 6f5c4d33..8e7723c2 100644
--- a/src/helpers/MonitorResources.cpp
+++ b/src/helpers/MonitorResources.cpp
@@ -15,6 +15,7 @@ CMonitorResources::CMonitorResources(WP<CMonitor> monitor, DRMFormat format, Vec
m_blurFB(g_pHyprRenderer->createFB(std::format("Monitor {} blur FB", monitor->m_name))), m_monitor(monitor), m_drmFormat(format), m_size(size),
m_imageDescription(imageDescription) {
initFB(m_blurFB);
+ monitor->m_blurFBDirty = true;
}
void CMonitorResources::initFB(SP<Render::IFramebuffer> fb) {
@@ -23,6 +24,19 @@ void CMonitorResources::initFB(SP<Render::IFramebuffer> fb) {
fb->setImageDescription(m_imageDescription);
}
+void CMonitorResources::setImageDescription(NColorManagement::PImageDescription imageDescription) {
+ if (m_imageDescription == imageDescription)
+ return;
+ m_imageDescription = imageDescription;
+ m_blurFB->setImageDescription(imageDescription);
+ for (const auto& res : m_workBuffers)
+ res.buffer->setImageDescription(imageDescription);
+ if (m_monitorMirrorFB)
+ m_monitorMirrorFB->setImageDescription(NColorManagement::getDefaultImageDescription());
+ if (m_mirrorTex)
+ m_mirrorTex->m_imageDescription = getMirrorTexImageDescription();
+}
+
SP<Render::IFramebuffer> CMonitorResources::getUnusedWorkBuffer() {
std::erase_if(m_workBuffers, [](const auto& res) { return res.lastUsed.getSeconds() >= MAX_UNUSED_SECONDS; });
@@ -65,7 +79,7 @@ SP<Render::IFramebuffer> CMonitorResources::mirrorFB() {
if (!m_monitorMirrorFB->isAllocated()) {
m_monitorMirrorFB->alloc(m_size.x, m_size.y, DRM_FORMAT_XRGB8888);
- m_monitorMirrorFB->setImageDescription(NColorManagement::DEFAULT_IMAGE_DESCRIPTION);
+ m_monitorMirrorFB->setImageDescription(NColorManagement::getDefaultImageDescription());
}
return m_monitorMirrorFB;
@@ -75,13 +89,9 @@ SP<Render::ITexture> CMonitorResources::getMirrorTexture() {
return hasMirrorFB() ? mirrorFB()->getTexture() : nullptr;
}
-void CMonitorResources::enableMirror() {
- if (m_mirrorTex)
- return;
- m_mirrorTex = g_pHyprRenderer->createTexture();
- m_mirrorTex->allocate({m_size.x, m_size.y}, DRM_FORMAT_XRGB8888);
- m_mirrorTex->m_imageDescription = CImageDescription::from(SImageDescription{
- .transferFunction = NColorManagement::CM_TRANSFER_FUNCTION_GAMMA22,
+NColorManagement::PImageDescription CMonitorResources::getMirrorTexImageDescription() {
+ return CImageDescription::from(SImageDescription{
+ .transferFunction = NColorManagement::CM_TRANSFER_FUNCTION_SRGB,
.primariesNameSet = m_imageDescription->value().primariesNameSet,
.primariesNamed = m_imageDescription->value().primariesNamed,
.primaries = m_imageDescription->value().primaries,
@@ -89,6 +99,17 @@ void CMonitorResources::enableMirror() {
});
}
+void CMonitorResources::enableMirror() {
+ if (m_mirrorTex)
+ return;
+ m_mirrorTex = g_pHyprRenderer->createTexture();
+ m_mirrorTex->allocate({m_size.x, m_size.y}, DRM_FORMAT_XRGB8888);
+ m_mirrorTex->m_imageDescription = getMirrorTexImageDescription();
+ m_monitor->m_blurFBDirty = true;
+}
+
void CMonitorResources::disableMirror() {
+ if (m_mirrorTex)
+ m_monitor->m_blurFBDirty = true;
m_mirrorTex.reset();
}