From 96ed79fd6259a2c7776ef4d81c6b8386642f01b5 Mon Sep 17 00:00:00 2001 From: Xaver Hugl Date: Sat, 10 Aug 2024 15:06:51 +0200 Subject: [PATCH] backends/drm: fix ICC profiles not being applied The check for a shadow buffer used a variable before it was set to the new value, and the shaders are broken for some reason, so I reverted them to use the previous code with only the transfer function parameters added. --- src/backends/drm/drm_egl_layer_surface.cpp | 2 +- src/backends/drm/icc.frag | 5 ++++- src/backends/drm/icc_core.frag | 5 ++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/backends/drm/drm_egl_layer_surface.cpp b/src/backends/drm/drm_egl_layer_surface.cpp index a89d497e24..0598731a14 100644 --- a/src/backends/drm/drm_egl_layer_surface.cpp +++ b/src/backends/drm/drm_egl_layer_surface.cpp @@ -97,7 +97,7 @@ std::optional EglGbmLayerSurface::startRendering(cons if (m_surface->targetColorDescription != colorDescription || m_surface->channelFactors != channelFactors || m_surface->iccProfile != iccProfile) { m_surface->damageJournal.clear(); - m_surface->needsShadowBuffer = channelFactors != QVector3D(1, 1, 1) || m_surface->iccProfile || colorDescription.transferFunction().type != TransferFunction::gamma22; + m_surface->needsShadowBuffer = channelFactors != QVector3D(1, 1, 1) || iccProfile || colorDescription.transferFunction().type != TransferFunction::gamma22; m_surface->targetColorDescription = colorDescription; m_surface->channelFactors = channelFactors; m_surface->iccProfile = iccProfile; diff --git a/src/backends/drm/icc.frag b/src/backends/drm/icc.frag index a873df7f61..a473938d30 100644 --- a/src/backends/drm/icc.frag +++ b/src/backends/drm/icc.frag @@ -38,7 +38,10 @@ vec3 sample1DLut(vec3 input, sampler2D lut, int lutSize) { void main() { vec4 tex = texture2D(src, texcoord0); - tex = sourceEncodingToNitsInDestinationColorspace(tex) / destinationReferenceLuminance; + tex = encodingToNits(tex, sourceNamedTransferFunction, sourceTransferFunctionParams.x, sourceTransferFunctionParams.y); + tex.rgb /= max(tex.a, 0.001); + tex.rgb /= destinationReferenceLuminance; + tex.rgb = (toXYZD50 * vec4(tex.rgb, 1.0)).rgb; if (Bsize > 0) { tex.rgb = sample1DLut(tex.rgb, Bsampler, Bsize); } diff --git a/src/backends/drm/icc_core.frag b/src/backends/drm/icc_core.frag index e65271ee3b..9e40beb5d3 100644 --- a/src/backends/drm/icc_core.frag +++ b/src/backends/drm/icc_core.frag @@ -41,7 +41,10 @@ vec3 sample1DLut(in vec3 srcColor, in sampler2D lut, in int lutSize) { void main() { vec4 tex = texture(src, texcoord0); - tex = sourceEncodingToNitsInDestinationColorspace(tex) / destinationReferenceLuminance; + tex = encodingToNits(tex, sourceNamedTransferFunction, sourceTransferFunctionParams.x, sourceTransferFunctionParams.y); + tex.rgb /= max(tex.a, 0.001); + tex.rgb /= destinationReferenceLuminance; + tex.rgb = (toXYZD50 * vec4(tex.rgb, 1.0)).rgb; if (Bsize > 0) { tex.rgb = sample1DLut(tex.rgb, Bsampler, Bsize); }