Loading libs/renderengine/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,7 @@ cc_defaults { "-DEGL_EGLEXT_PROTOTYPES", "-DEGL_EGLEXT_PROTOTYPES", ], ], shared_libs: [ shared_libs: [ "android.hardware.graphics.composer3-V1-ndk", "libbase", "libbase", "libcutils", "libcutils", "libEGL", "libEGL", Loading libs/renderengine/benchmark/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -43,6 +43,7 @@ cc_benchmark { ], ], shared_libs: [ shared_libs: [ "android.hardware.graphics.composer3-V1-ndk", "libbase", "libbase", "libcutils", "libcutils", "libjnigraphics", "libjnigraphics", Loading libs/renderengine/include/renderengine/DisplaySettings.h +5 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ #pragma once #pragma once #include <aidl/android/hardware/graphics/composer3/DimmingStage.h> #include <iosfwd> #include <iosfwd> #include <math/mat4.h> #include <math/mat4.h> Loading Loading @@ -68,6 +69,10 @@ struct DisplaySettings { // All layers will be dimmed by (max(layer white points) / targetLuminanceNits). // All layers will be dimmed by (max(layer white points) / targetLuminanceNits). // If the target luminance is unknown, then no display-level dimming occurs. // If the target luminance is unknown, then no display-level dimming occurs. float targetLuminanceNits = -1.f; 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) { static inline bool operator==(const DisplaySettings& lhs, const DisplaySettings& rhs) { Loading libs/renderengine/skia/SkiaGLRenderEngine.cpp +24 −4 Original line number Original line Diff line number Diff line Loading @@ -737,7 +737,9 @@ static SkRRect getBlurRRect(const BlurRegion& region) { return roundedRect; 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!"); LOG_ALWAYS_FATAL_IF(margin < 0.f, "Margin is negative!"); return std::abs(expected - value) < margin; return std::abs(expected - value) < margin; } } Loading Loading @@ -995,10 +997,13 @@ void SkiaGLRenderEngine::drawLayersInternal( ? displayDimmingRatio ? displayDimmingRatio : (layer.whitePointNits / maxLayerWhitePoint) * displayDimmingRatio; : (layer.whitePointNits / maxLayerWhitePoint) * displayDimmingRatio; const bool dimInLinearSpace = display.dimmingStage != aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF; const bool requiresLinearEffect = layer.colorTransform != mat4() || const bool requiresLinearEffect = layer.colorTransform != mat4() || (mUseColorManagement && (mUseColorManagement && needsToneMapping(layer.sourceDataspace, display.outputDataspace)) || 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 // quick abort from drawing the remaining portion of the layer if (layer.skipContentDraw || if (layer.skipContentDraw || Loading Loading @@ -1104,7 +1109,9 @@ void SkiaGLRenderEngine::drawLayersInternal( .undoPremultipliedAlpha = !item.isOpaque && .undoPremultipliedAlpha = !item.isOpaque && item.usePremultipliedAlpha, item.usePremultipliedAlpha, .requiresLinearEffect = requiresLinearEffect, .requiresLinearEffect = requiresLinearEffect, .layerDimmingRatio = layerDimmingRatio})); .layerDimmingRatio = dimInLinearSpace ? layerDimmingRatio : 1.f})); // Turn on dithering when dimming beyond this (arbitrary) threshold... // Turn on dithering when dimming beyond this (arbitrary) threshold... static constexpr float kDimmingThreshold = 0.2f; static constexpr float kDimmingThreshold = 0.2f; Loading Loading @@ -1177,8 +1184,21 @@ void SkiaGLRenderEngine::drawLayersInternal( // An A8 buffer will already have the proper color filter attached to // An A8 buffer will already have the proper color filter attached to // its paint, including the displayColorTransform as needed. // its paint, including the displayColorTransform as needed. if (!paint.getColorFilter()) { 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); paint.setColorFilter(displayColorTransform); } } } if (!roundRectClip.isEmpty()) { if (!roundRectClip.isEmpty()) { canvas->clipRRect(roundRectClip, true); canvas->clipRRect(roundRectClip, true); Loading libs/renderengine/tests/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -47,6 +47,7 @@ cc_test { ], ], shared_libs: [ shared_libs: [ "android.hardware.graphics.composer3-V1-ndk", "libbase", "libbase", "libcutils", "libcutils", "libEGL", "libEGL", Loading Loading
libs/renderengine/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,7 @@ cc_defaults { "-DEGL_EGLEXT_PROTOTYPES", "-DEGL_EGLEXT_PROTOTYPES", ], ], shared_libs: [ shared_libs: [ "android.hardware.graphics.composer3-V1-ndk", "libbase", "libbase", "libcutils", "libcutils", "libEGL", "libEGL", Loading
libs/renderengine/benchmark/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -43,6 +43,7 @@ cc_benchmark { ], ], shared_libs: [ shared_libs: [ "android.hardware.graphics.composer3-V1-ndk", "libbase", "libbase", "libcutils", "libcutils", "libjnigraphics", "libjnigraphics", Loading
libs/renderengine/include/renderengine/DisplaySettings.h +5 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ #pragma once #pragma once #include <aidl/android/hardware/graphics/composer3/DimmingStage.h> #include <iosfwd> #include <iosfwd> #include <math/mat4.h> #include <math/mat4.h> Loading Loading @@ -68,6 +69,10 @@ struct DisplaySettings { // All layers will be dimmed by (max(layer white points) / targetLuminanceNits). // All layers will be dimmed by (max(layer white points) / targetLuminanceNits). // If the target luminance is unknown, then no display-level dimming occurs. // If the target luminance is unknown, then no display-level dimming occurs. float targetLuminanceNits = -1.f; 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) { static inline bool operator==(const DisplaySettings& lhs, const DisplaySettings& rhs) { Loading
libs/renderengine/skia/SkiaGLRenderEngine.cpp +24 −4 Original line number Original line Diff line number Diff line Loading @@ -737,7 +737,9 @@ static SkRRect getBlurRRect(const BlurRegion& region) { return roundedRect; 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!"); LOG_ALWAYS_FATAL_IF(margin < 0.f, "Margin is negative!"); return std::abs(expected - value) < margin; return std::abs(expected - value) < margin; } } Loading Loading @@ -995,10 +997,13 @@ void SkiaGLRenderEngine::drawLayersInternal( ? displayDimmingRatio ? displayDimmingRatio : (layer.whitePointNits / maxLayerWhitePoint) * displayDimmingRatio; : (layer.whitePointNits / maxLayerWhitePoint) * displayDimmingRatio; const bool dimInLinearSpace = display.dimmingStage != aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF; const bool requiresLinearEffect = layer.colorTransform != mat4() || const bool requiresLinearEffect = layer.colorTransform != mat4() || (mUseColorManagement && (mUseColorManagement && needsToneMapping(layer.sourceDataspace, display.outputDataspace)) || 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 // quick abort from drawing the remaining portion of the layer if (layer.skipContentDraw || if (layer.skipContentDraw || Loading Loading @@ -1104,7 +1109,9 @@ void SkiaGLRenderEngine::drawLayersInternal( .undoPremultipliedAlpha = !item.isOpaque && .undoPremultipliedAlpha = !item.isOpaque && item.usePremultipliedAlpha, item.usePremultipliedAlpha, .requiresLinearEffect = requiresLinearEffect, .requiresLinearEffect = requiresLinearEffect, .layerDimmingRatio = layerDimmingRatio})); .layerDimmingRatio = dimInLinearSpace ? layerDimmingRatio : 1.f})); // Turn on dithering when dimming beyond this (arbitrary) threshold... // Turn on dithering when dimming beyond this (arbitrary) threshold... static constexpr float kDimmingThreshold = 0.2f; static constexpr float kDimmingThreshold = 0.2f; Loading Loading @@ -1177,8 +1184,21 @@ void SkiaGLRenderEngine::drawLayersInternal( // An A8 buffer will already have the proper color filter attached to // An A8 buffer will already have the proper color filter attached to // its paint, including the displayColorTransform as needed. // its paint, including the displayColorTransform as needed. if (!paint.getColorFilter()) { 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); paint.setColorFilter(displayColorTransform); } } } if (!roundRectClip.isEmpty()) { if (!roundRectClip.isEmpty()) { canvas->clipRRect(roundRectClip, true); canvas->clipRRect(roundRectClip, true); Loading
libs/renderengine/tests/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -47,6 +47,7 @@ cc_test { ], ], shared_libs: [ shared_libs: [ "android.hardware.graphics.composer3-V1-ndk", "libbase", "libbase", "libcutils", "libcutils", "libEGL", "libEGL", Loading