Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 85065699 authored by Alec Mouri's avatar Alec Mouri
Browse files

Plumb through dimming stage into RenderEngine.

If HWC is requesting that dimming happens after OETF is applied, then
apply the dimming matrix as part of the display color transform

Bug: 218954037
Test: Toggle client composition in adaptive color mode during HDR
playback

Change-Id: Ib72f3f4b6dfcced02fc330e64fa72546a18fb608
Merged-In: Ib72f3f4b6dfcced02fc330e64fa72546a18fb608
parent 56becd9a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ cc_defaults {
        "-DEGL_EGLEXT_PROTOTYPES",
    ],
    shared_libs: [
        "android.hardware.graphics.composer3-V1-ndk",
        "libbase",
        "libcutils",
        "libEGL",
+1 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ cc_benchmark {
    ],

    shared_libs: [
        "android.hardware.graphics.composer3-V1-ndk",
        "libbase",
        "libcutils",
        "libjnigraphics",
+5 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#pragma once

#include <aidl/android/hardware/graphics/composer3/DimmingStage.h>
#include <iosfwd>

#include <math/mat4.h>
@@ -68,6 +69,10 @@ struct DisplaySettings {
    // All layers will be dimmed by (max(layer white points) / targetLuminanceNits).
    // If the target luminance is unknown, then no display-level dimming occurs.
    float targetLuminanceNits = -1.f;

    // Configures when dimming should be applied for each layer.
    aidl::android::hardware::graphics::composer3::DimmingStage dimmingStage =
            aidl::android::hardware::graphics::composer3::DimmingStage::NONE;
};

static inline bool operator==(const DisplaySettings& lhs, const DisplaySettings& rhs) {
+24 −4
Original line number Diff line number Diff line
@@ -736,7 +736,9 @@ static SkRRect getBlurRRect(const BlurRegion& region) {
    return roundedRect;
}

static bool equalsWithinMargin(float expected, float value, float margin) {
// Arbitrary default margin which should be close enough to zero.
constexpr float kDefaultMargin = 0.0001f;
static bool equalsWithinMargin(float expected, float value, float margin = kDefaultMargin) {
    LOG_ALWAYS_FATAL_IF(margin < 0.f, "Margin is negative!");
    return std::abs(expected - value) < margin;
}
@@ -994,10 +996,13 @@ void SkiaGLRenderEngine::drawLayersInternal(
                ? displayDimmingRatio
                : (layer.whitePointNits / maxLayerWhitePoint) * displayDimmingRatio;

        const bool dimInLinearSpace = display.dimmingStage !=
                aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF;

        const bool requiresLinearEffect = layer.colorTransform != mat4() ||
                (mUseColorManagement &&
                 needsToneMapping(layer.sourceDataspace, display.outputDataspace)) ||
                !equalsWithinMargin(1.f, layerDimmingRatio, 0.001f);
                (dimInLinearSpace && !equalsWithinMargin(1.f, layerDimmingRatio));

        // quick abort from drawing the remaining portion of the layer
        if (layer.skipContentDraw ||
@@ -1103,7 +1108,9 @@ void SkiaGLRenderEngine::drawLayersInternal(
                                                  .undoPremultipliedAlpha = !item.isOpaque &&
                                                          item.usePremultipliedAlpha,
                                                  .requiresLinearEffect = requiresLinearEffect,
                                                  .layerDimmingRatio = layerDimmingRatio}));
                                                  .layerDimmingRatio = dimInLinearSpace
                                                          ? layerDimmingRatio
                                                          : 1.f}));

            // Turn on dithering when dimming beyond this threshold.
            static constexpr float kDimmingThreshold = 0.2f;
@@ -1170,8 +1177,21 @@ void SkiaGLRenderEngine::drawLayersInternal(
        // An A8 buffer will already have the proper color filter attached to
        // its paint, including the displayColorTransform as needed.
        if (!paint.getColorFilter()) {
            if (!dimInLinearSpace && !equalsWithinMargin(1.0, layerDimmingRatio)) {
                // If we don't dim in linear space, then when we gamma correct the dimming ratio we
                // can assume a gamma 2.2 transfer function.
                static constexpr float kInverseGamma22 = 1.f / 2.2f;
                const auto gammaCorrectedDimmingRatio =
                        std::pow(layerDimmingRatio, kInverseGamma22);
                const auto dimmingMatrix =
                        mat4::scale(vec4(gammaCorrectedDimmingRatio, gammaCorrectedDimmingRatio,
                                         gammaCorrectedDimmingRatio, 1.f));
                paint.setColorFilter(SkColorFilters::Matrix(
                        toSkColorMatrix(display.colorTransform * dimmingMatrix)));
            } else {
                paint.setColorFilter(displayColorTransform);
            }
        }

        if (!roundRectClip.isEmpty()) {
            canvas->clipRRect(roundRectClip, true);
+1 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ cc_test {
    ],

    shared_libs: [
        "android.hardware.graphics.composer3-V1-ndk",
        "libbase",
        "libcutils",
        "libEGL",
Loading