backends/drm: fix color management with sRGB output
We need to target the linear EOTF for rendering, even if the output EOTF is sRGB
This commit is contained in:
parent
bc62760186
commit
c112bb5c56
2 changed files with 5 additions and 3 deletions
|
@ -89,12 +89,13 @@ std::optional<OutputLayerBeginFrameInfo> EglGbmLayerSurface::startRendering(cons
|
||||||
}
|
}
|
||||||
m_surface.currentBuffer = buffer;
|
m_surface.currentBuffer = buffer;
|
||||||
|
|
||||||
if (m_surface.targetColorDescription != colorDescription || m_surface.channelFactors != channelFactors) {
|
if (m_surface.targetColorDescription != colorDescription || m_surface.channelFactors != channelFactors || m_surface.colormanagementEnabled != enableColormanagement) {
|
||||||
m_surface.gbmSwapchain->resetDamage();
|
m_surface.gbmSwapchain->resetDamage();
|
||||||
repaint = infiniteRegion();
|
repaint = infiniteRegion();
|
||||||
|
m_surface.colormanagementEnabled = enableColormanagement;
|
||||||
m_surface.targetColorDescription = colorDescription;
|
m_surface.targetColorDescription = colorDescription;
|
||||||
m_surface.channelFactors = channelFactors;
|
m_surface.channelFactors = channelFactors;
|
||||||
if (colorDescription != ColorDescription::sRGB) {
|
if (enableColormanagement) {
|
||||||
m_surface.intermediaryColorDescription = ColorDescription(colorDescription.colorimetry(), NamedTransferFunction::linear,
|
m_surface.intermediaryColorDescription = ColorDescription(colorDescription.colorimetry(), NamedTransferFunction::linear,
|
||||||
colorDescription.sdrBrightness(), colorDescription.minHdrBrightness(),
|
colorDescription.sdrBrightness(), colorDescription.minHdrBrightness(),
|
||||||
colorDescription.maxHdrBrightness(), colorDescription.maxHdrHighlightBrightness());
|
colorDescription.maxHdrBrightness(), colorDescription.maxHdrHighlightBrightness());
|
||||||
|
@ -126,7 +127,7 @@ std::optional<OutputLayerBeginFrameInfo> EglGbmLayerSurface::startRendering(cons
|
||||||
|
|
||||||
bool EglGbmLayerSurface::endRendering(const QRegion &damagedRegion)
|
bool EglGbmLayerSurface::endRendering(const QRegion &damagedRegion)
|
||||||
{
|
{
|
||||||
if (m_surface.shadowTexture) {
|
if (m_surface.colormanagementEnabled) {
|
||||||
const auto &[texture, fbo] = m_surface.textureCache[m_surface.currentBuffer->bo()];
|
const auto &[texture, fbo] = m_surface.textureCache[m_surface.currentBuffer->bo()];
|
||||||
GLFramebuffer::pushFramebuffer(fbo.get());
|
GLFramebuffer::pushFramebuffer(fbo.get());
|
||||||
ShaderBinder binder(ShaderTrait::MapTexture | ShaderTrait::TransformColorspace);
|
ShaderBinder binder(ShaderTrait::MapTexture | ShaderTrait::TransformColorspace);
|
||||||
|
|
|
@ -69,6 +69,7 @@ private:
|
||||||
};
|
};
|
||||||
struct Surface
|
struct Surface
|
||||||
{
|
{
|
||||||
|
bool colormanagementEnabled = false;
|
||||||
std::shared_ptr<GLTexture> shadowTexture;
|
std::shared_ptr<GLTexture> shadowTexture;
|
||||||
std::shared_ptr<GLFramebuffer> shadowBuffer;
|
std::shared_ptr<GLFramebuffer> shadowBuffer;
|
||||||
ColorDescription targetColorDescription = ColorDescription::sRGB;
|
ColorDescription targetColorDescription = ColorDescription::sRGB;
|
||||||
|
|
Loading…
Reference in a new issue