diff options
-rw-r--r-- | libs/renderengine/skia/SkiaRenderEngine.cpp | 44 | ||||
-rw-r--r-- | libs/renderengine/skia/filters/MouriMap.cpp | 4 |
2 files changed, 27 insertions, 21 deletions
diff --git a/libs/renderengine/skia/SkiaRenderEngine.cpp b/libs/renderengine/skia/SkiaRenderEngine.cpp index e62640eb85..c39da958e8 100644 --- a/libs/renderengine/skia/SkiaRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaRenderEngine.cpp @@ -514,7 +514,7 @@ sk_sp<SkShader> SkiaRenderEngine::createRuntimeEffectShader( auto shader = parameters.shader; if (stretchEffect.hasEffect()) { const auto graphicBuffer = targetBuffer ? targetBuffer->getBuffer() : nullptr; - if (graphicBuffer && parameters.shader) { + if (graphicBuffer && shader) { shader = mStretchShaderFactory.createSkShader(shader, stretchEffect); } } @@ -525,21 +525,25 @@ sk_sp<SkShader> SkiaRenderEngine::createRuntimeEffectShader( static_cast<ui::PixelFormat>(targetBuffer->getPixelFormat())) : std::nullopt; - if (parameters.display.tonemapStrategy == DisplaySettings::TonemapStrategy::Local) { - // TODO: Handle color matrix transforms in linear space. - SkImage* image = parameters.shader->isAImage((SkMatrix*)nullptr, (SkTileMode*)nullptr); - if (image) { - static MouriMap kMapper; - const float ratio = getHdrRenderType(parameters.layer.sourceDataspace, format) == - HdrRenderType::GENERIC_HDR - ? 1.0f - : parameters.layerDimmingRatio; - return kMapper.mouriMap(getActiveContext(), parameters.shader, ratio); - } + const auto hdrType = getHdrRenderType(parameters.layer.sourceDataspace, format); + + const auto usingLocalTonemap = + parameters.display.tonemapStrategy == DisplaySettings::TonemapStrategy::Local && + hdrType != HdrRenderType::SDR && + shader->isAImage((SkMatrix*)nullptr, (SkTileMode*)nullptr); + + if (usingLocalTonemap) { + static MouriMap kMapper; + const float ratio = + hdrType == HdrRenderType::GENERIC_HDR ? 1.0f : parameters.layerDimmingRatio; + shader = kMapper.mouriMap(getActiveContext(), shader, ratio); } + // disable tonemapping if we already locally tonemapped + auto inputDataspace = + usingLocalTonemap ? parameters.outputDataSpace : parameters.layer.sourceDataspace; auto effect = - shaders::LinearEffect{.inputDataspace = parameters.layer.sourceDataspace, + shaders::LinearEffect{.inputDataspace = inputDataspace, .outputDataspace = parameters.outputDataSpace, .undoPremultipliedAlpha = parameters.undoPremultipliedAlpha, .fakeOutputDataspace = parameters.fakeOutputDataspace}; @@ -555,20 +559,22 @@ sk_sp<SkShader> SkiaRenderEngine::createRuntimeEffectShader( mat4 colorTransform = parameters.layer.colorTransform; - colorTransform *= - mat4::scale(vec4(parameters.layerDimmingRatio, parameters.layerDimmingRatio, - parameters.layerDimmingRatio, 1.f)); + if (!usingLocalTonemap) { + colorTransform *= + mat4::scale(vec4(parameters.layerDimmingRatio, parameters.layerDimmingRatio, + parameters.layerDimmingRatio, 1.f)); + } const auto targetBuffer = parameters.layer.source.buffer.buffer; const auto graphicBuffer = targetBuffer ? targetBuffer->getBuffer() : nullptr; const auto hardwareBuffer = graphicBuffer ? graphicBuffer->toAHardwareBuffer() : nullptr; - return createLinearEffectShader(parameters.shader, effect, runtimeEffect, - std::move(colorTransform), parameters.display.maxLuminance, + return createLinearEffectShader(shader, effect, runtimeEffect, std::move(colorTransform), + parameters.display.maxLuminance, parameters.display.currentLuminanceNits, parameters.layer.source.buffer.maxLuminanceNits, hardwareBuffer, parameters.display.renderIntent); } - return parameters.shader; + return shader; } void SkiaRenderEngine::initCanvas(SkCanvas* canvas, const DisplaySettings& display) { diff --git a/libs/renderengine/skia/filters/MouriMap.cpp b/libs/renderengine/skia/filters/MouriMap.cpp index 7d8b8a5116..cc25fcc5b9 100644 --- a/libs/renderengine/skia/filters/MouriMap.cpp +++ b/libs/renderengine/skia/filters/MouriMap.cpp @@ -84,13 +84,13 @@ const SkString kTonemap(R"( float3 linear = toLinearSrgb(rgba.rgb) * hdrSdrRatio; if (localMax <= 1.0) { - return float4(fromLinearSrgb(linear), 1.0); + return float4(fromLinearSrgb(linear), rgba.a); } float maxRGB = max(linear.r, max(linear.g, linear.b)); localMax = max(localMax, maxRGB); float gain = (1 + maxRGB / (localMax * localMax)) / (1 + maxRGB); - return float4(fromLinearSrgb(linear * gain), 1.0); + return float4(fromLinearSrgb(linear * gain), rgba.a); } )"); |