@@ -969,6 +969,7 @@ static void getCMShaderUniforms(SShader& shader) {
969969 shader.uniformLocations [SHADER_DST_TF_RANGE] = glGetUniformLocation (shader.program , " dstTFRange" );
970970 shader.uniformLocations [SHADER_TARGET_PRIMARIES] = glGetUniformLocation (shader.program , " targetPrimaries" );
971971 shader.uniformLocations [SHADER_MAX_LUMINANCE] = glGetUniformLocation (shader.program , " maxLuminance" );
972+ shader.uniformLocations [SHADER_SRC_REF_LUMINANCE] = glGetUniformLocation (shader.program , " srcRefLuminance" );
972973 shader.uniformLocations [SHADER_DST_MAX_LUMINANCE] = glGetUniformLocation (shader.program , " dstMaxLuminance" );
973974 shader.uniformLocations [SHADER_DST_REF_LUMINANCE] = glGetUniformLocation (shader.program , " dstRefLuminance" );
974975 shader.uniformLocations [SHADER_SDR_SATURATION] = glGetUniformLocation (shader.program , " sdrSaturation" );
@@ -1589,10 +1590,12 @@ void CHyprOpenGLImpl::passCMUniforms(SShader& shader, const NColorManagement::SI
15891590 shader.setUniformFloat2 (SHADER_DST_TF_RANGE, targetImageDescription.getTFMinLuminance (needsSDRmod ? sdrMinLuminance : -1 ),
15901591 targetImageDescription.getTFMaxLuminance (needsSDRmod ? sdrMaxLuminance : -1 ));
15911592
1593+ shader.setUniformFloat (SHADER_SRC_REF_LUMINANCE, imageDescription.getTFRefLuminance (-1 ));
1594+ shader.setUniformFloat (SHADER_DST_REF_LUMINANCE, targetImageDescription.getTFRefLuminance (-1 ));
1595+
15921596 const float maxLuminance = imageDescription.luminances .max > 0 ? imageDescription.luminances .max : imageDescription.luminances .reference ;
15931597 shader.setUniformFloat (SHADER_MAX_LUMINANCE, maxLuminance * targetImageDescription.luminances .reference / imageDescription.luminances .reference );
15941598 shader.setUniformFloat (SHADER_DST_MAX_LUMINANCE, targetImageDescription.luminances .max > 0 ? targetImageDescription.luminances .max : 10000 );
1595- shader.setUniformFloat (SHADER_DST_REF_LUMINANCE, targetImageDescription.luminances .reference );
15961599 shader.setUniformFloat (SHADER_SDR_SATURATION, needsSDRmod && m_renderData.pMonitor ->m_sdrSaturation > 0 ? m_renderData.pMonitor ->m_sdrSaturation : 1 .0f );
15971600 shader.setUniformFloat (SHADER_SDR_BRIGHTNESS, needsSDRmod && m_renderData.pMonitor ->m_sdrBrightness > 0 ? m_renderData.pMonitor ->m_sdrBrightness : 1 .0f );
15981601 const auto cacheKey = std::make_pair (imageDescription.getId (), targetImageDescription.getId ());
@@ -1709,9 +1712,11 @@ void CHyprOpenGLImpl::renderTextureInternal(SP<CTexture> tex, const CBox& box, c
17091712 shader->setUniformInt (SHADER_TEX_TYPE, texType);
17101713 if (data.cmBackToSRGB ) {
17111714 // revert luma changes to avoid black screenshots.
1712- // this will likely not be 1:1, and might cause screenshots to be too bright, but it's better than pitch black.
1713- imageDescription.luminances = {};
1714- passCMUniforms (*shader, imageDescription, NColorManagement::SImageDescription{}, true , -1 , -1 );
1715+ imageDescription.luminances = {
1716+ .min = imageDescription.getTFMinLuminance (-1 ), .max = imageDescription.getTFMaxLuminance (-1 ), .reference = imageDescription.getTFRefLuminance (-1 )};
1717+ static auto PSDREOTF = CConfigValue<Hyprlang::INT>(" render:cm_sdr_eotf" );
1718+ auto chosenSdrEotf = *PSDREOTF > 0 ? NColorManagement::CM_TRANSFER_FUNCTION_GAMMA22 : NColorManagement::CM_TRANSFER_FUNCTION_SRGB;
1719+ passCMUniforms (*shader, imageDescription, NColorManagement::SImageDescription{.transferFunction = chosenSdrEotf}, true , -1 , -1 );
17151720 } else
17161721 passCMUniforms (*shader, imageDescription);
17171722 }
0 commit comments