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

Commit 94109c06 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Plumb through dimming stage into RenderEngine." into tm-dev

parents 922e1b9b 85065699
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