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

Commit 91443a6b authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Plumb through dimming stage into RenderEngine." into tm-dev am: 94109c06 am: 6c917b06

parents 84b7401e 6c917b06
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
@@ -737,7 +737,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;
}
@@ -995,10 +997,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 ||
@@ -1104,7 +1109,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 (arbitrary) threshold...
            static constexpr float kDimmingThreshold = 0.2f;
@@ -1177,8 +1184,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