diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 37606d4f6..50822265c 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -2551,7 +2551,7 @@ bool CMonitor::useFP16() { WP CMonitor::resources() { const auto DRM_FORMAT = useFP16() ? DRM_FORMAT_ABGR16161616F : m_output->state->state().drmFormat; - const auto DESC = useFP16() ? LINEAR_IMAGE_DESCRIPTION : m_imageDescription; + const auto DESC = useFP16() ? LINEAR_IMAGE_DESCRIPTION : (m_imageDescription->value().icc.present ? getDefaultImageDescription() : m_imageDescription); if (!m_resources || m_resources->m_drmFormat != DRM_FORMAT || m_resources->m_size != m_pixelSize) m_resources = makeUnique(m_self, DRM_FORMAT, m_pixelSize, DESC); diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index a87ec2eef..fea93caba 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1789,10 +1789,11 @@ SP CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* or currentTex->setTexParameter(GL_TEXTURE_MIN_FILTER, GL_LINEAR); - // From FB to sRGB + // From sRGB back to the work buffer/output description const bool skipCM = !m_cmSupported || !g_pHyprRenderer->workBufferImageDescription()->needsCM(getDefaultImageDescription()); + const bool isICC = g_pHyprRenderer->workBufferImageDescription()->value().icc.present; if (!skipCM) { - shader = useShader(getShaderVariant(SH_FRAG_BLURFINISH, SH_FEAT_CM)); + shader = useShader(getShaderVariant(SH_FRAG_BLURFINISH, SH_FEAT_CM | (isICC ? SH_FEAT_ICC : 0))); passCMUniforms(shader, getDefaultImageDescription(), g_pHyprRenderer->workBufferImageDescription()); shader->setUniformFloat(SHADER_SDR_SATURATION, m_renderData.pMonitor->m_sdrSaturation > 0 && diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index fa1a8a061..c2002ae22 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -3256,14 +3256,9 @@ void IHyprRenderer::renderSnapshot(WP popup) { } NColorManagement::PImageDescription IHyprRenderer::workBufferImageDescription() { - // TODO - // const bool IS_MONITOR_ICC = m_renderData.pMonitor->m_imageDescription.valid() && m_renderData.pMonitor->m_imageDescription->value().icc.present; - // const auto sdrEOTF = NTransferFunction::fromConfig(IS_MONITOR_ICC); - // const auto CHOSEN_SDR_EOTF = sdrEOTF != NTransferFunction::TF_SRGB ? NColorManagement::CM_TRANSFER_FUNCTION_GAMMA22 : NColorManagement::CM_TRANSFER_FUNCTION_SRGB; - - return m_renderData.pMonitor->useFP16() ? - LINEAR_IMAGE_DESCRIPTION : - m_renderData.pMonitor->m_imageDescription; //CImageDescription::from(NColorManagement::SImageDescription{.transferFunction = CHOSEN_SDR_EOTF}); + return m_renderData.pMonitor->useFP16() ? LINEAR_IMAGE_DESCRIPTION : + // Keep intermediate passes in the default SDR space and apply monitor ICC on the final output pass. + (m_renderData.pMonitor->m_imageDescription->value().icc.present ? getDefaultImageDescription() : m_renderData.pMonitor->m_imageDescription); } bool IHyprRenderer::shouldBlur(PHLLS ls) { diff --git a/src/render/shaders/glsl/blurFinish.glsl b/src/render/shaders/glsl/blurFinish.glsl index e7e1f1c62..3a6247a44 100644 --- a/src/render/shaders/glsl/blurFinish.glsl +++ b/src/render/shaders/glsl/blurFinish.glsl @@ -19,6 +19,10 @@ vec4 blurFinish(vec4 pixColor, vec2 v_texcoord, float noise, float brightness #if USE_CM , int sourceTF, int targetTF, mat3 convertMatrix, vec2 srcTFRange, vec2 dstTFRange +#if USE_ICC + , + highp sampler3D iccLut3D, float iccLutSize +#endif #endif ) { // noise @@ -30,7 +34,12 @@ vec4 blurFinish(vec4 pixColor, vec2 v_texcoord, float noise, float brightness pixColor.rgb *= min(1.0, brightness); #if USE_CM - pixColor = doColorManagement(pixColor, sourceTF, targetTF, convertMatrix, srcTFRange, dstTFRange); + pixColor = doColorManagement(pixColor, sourceTF, targetTF, convertMatrix, srcTFRange, dstTFRange +#if USE_ICC + , + iccLut3D, iccLutSize +#endif + ); #endif return pixColor; diff --git a/src/render/shaders/glsl/blurfinish.frag b/src/render/shaders/glsl/blurfinish.frag index 51eb76849..76f40cb3e 100644 --- a/src/render/shaders/glsl/blurfinish.frag +++ b/src/render/shaders/glsl/blurfinish.frag @@ -26,6 +26,10 @@ void main() { #if USE_CM , sourceTF, targetTF, convertMatrix, srcTFRange, dstTFRange +#if USE_ICC + , + iccLut3D, iccLutSize +#endif #endif ); }