diff options
| author | UjinT34 <41110182+UjinT34@users.noreply.github.com> | 2026-04-16 21:19:25 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-16 19:19:25 +0100 |
| commit | 66ea2e2c9ed4e9257521e6706fbd21feb7e3cc5b (patch) | |
| tree | 6c0c9842245917e9828874263cd11d6f556a0a48 /src/helpers/MonitorResources.cpp | |
| parent | 4cce7f60a9c8772d18ffb43cb74aa227ab4b3bc4 (diff) | |
renderer: Various CM fixes, part 8 of refactors (#13860)
Part 8 of Ujin's refactors.
Diffstat (limited to 'src/helpers/MonitorResources.cpp')
| -rw-r--r-- | src/helpers/MonitorResources.cpp | 37 |
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(); } |
