From 4d8a05d372f8cf40a294ed4e9718b54b51f15a34 Mon Sep 17 00:00:00 2001 From: Alec Mouri Date: Wed, 23 Mar 2022 18:14:26 +0000 Subject: Plumb display brightness nits to composer hal. OEM feedback was that the display brightness in nits should be known to the Hardware Composer for correct tone-mapping behavior by the DPU. Inteperpolating the display brightness curve that's defined in display config files is possible, but it would require the vendor to re-implement DisplayManager logic for interpolating a spline curve. Bug: 220396224 Test: builds, boots Change-Id: I28d936c118bed1184d4f742478c8862f9e0aba95 --- services/surfaceflinger/CompositionEngine/src/Display.cpp | 1 + services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp | 4 +++- services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h | 4 ++-- services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp | 4 ++-- services/surfaceflinger/DisplayHardware/AidlComposerHal.h | 2 +- services/surfaceflinger/DisplayHardware/ComposerHal.h | 2 +- services/surfaceflinger/DisplayHardware/HWC2.cpp | 8 +++++--- services/surfaceflinger/DisplayHardware/HWC2.h | 6 ++++-- services/surfaceflinger/DisplayHardware/HWComposer.cpp | 4 ++-- services/surfaceflinger/DisplayHardware/HWComposer.h | 4 ++-- services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp | 2 +- services/surfaceflinger/DisplayHardware/HidlComposerHal.h | 2 +- services/surfaceflinger/SurfaceFlinger.cpp | 4 ++++ .../fuzzer/surfaceflinger_displayhardware_fuzzer.cpp | 2 ++ .../tests/unittests/mock/DisplayHardware/MockComposer.h | 3 ++- .../tests/unittests/mock/DisplayHardware/MockHWC2.h | 2 +- 16 files changed, 34 insertions(+), 20 deletions(-) diff --git a/services/surfaceflinger/CompositionEngine/src/Display.cpp b/services/surfaceflinger/CompositionEngine/src/Display.cpp index 84c22cf9bc..f5458865e8 100644 --- a/services/surfaceflinger/CompositionEngine/src/Display.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Display.cpp @@ -221,6 +221,7 @@ void Display::beginFrame() { physicalDisplayId && getState().displayBrightness) { const status_t result = hwc.setDisplayBrightness(*physicalDisplayId, *getState().displayBrightness, + getState().displayBrightnessNits, Hwc2::Composer::DisplayBrightnessOptions{ .applyImmediately = false}) .get(); diff --git a/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp b/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp index 9a616679f3..0e5a7b6a99 100644 --- a/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/DisplayTest.cpp @@ -640,8 +640,9 @@ TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithDisplayBrightnes // values, use a Sequence to control the matching so the values are returned in a known // order. constexpr float kDisplayBrightness = 0.5f; + constexpr float kDisplayBrightnessNits = 200.f; EXPECT_CALL(mHwComposer, - setDisplayBrightness(DEFAULT_DISPLAY_ID, kDisplayBrightness, + setDisplayBrightness(DEFAULT_DISPLAY_ID, kDisplayBrightness, kDisplayBrightnessNits, Hwc2::Composer::DisplayBrightnessOptions{.applyImmediately = false})) .WillOnce(Return(ByMove(ftl::yield(NO_ERROR)))); @@ -650,6 +651,7 @@ TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithDisplayBrightnes mock::RenderSurface* renderSurface = new StrictMock(); EXPECT_CALL(*renderSurface, beginFrame(_)).Times(1); mDisplay->setRenderSurfaceForTest(std::unique_ptr(renderSurface)); + mDisplay->editState().displayBrightnessNits = kDisplayBrightnessNits; mDisplay->beginFrame(); auto& state = mDisplay->getState(); diff --git a/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h b/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h index af013b02f1..ff2aa15dc9 100644 --- a/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h +++ b/services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h @@ -84,8 +84,8 @@ public: MOCK_METHOD4(setDisplayContentSamplingEnabled, status_t(HalDisplayId, bool, uint8_t, uint64_t)); MOCK_METHOD4(getDisplayedContentSample, status_t(HalDisplayId, uint64_t, uint64_t, DisplayedFrameStats*)); - MOCK_METHOD3(setDisplayBrightness, - std::future(PhysicalDisplayId, float, + MOCK_METHOD4(setDisplayBrightness, + std::future(PhysicalDisplayId, float, float, const Hwc2::Composer::DisplayBrightnessOptions&)); MOCK_METHOD2(getDisplayBrightnessSupport, status_t(PhysicalDisplayId, bool*)); diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp index 117540d312..79dcd159d3 100644 --- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp +++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp @@ -927,9 +927,9 @@ Error AidlComposer::setLayerPerFrameMetadataBlobs( return Error::NONE; } -Error AidlComposer::setDisplayBrightness(Display display, float brightness, +Error AidlComposer::setDisplayBrightness(Display display, float brightness, float brightnessNits, const DisplayBrightnessOptions& options) { - mWriter.setDisplayBrightness(translate(display), brightness); + mWriter.setDisplayBrightness(translate(display), brightness, brightnessNits); if (options.applyImmediately) { return execute(); diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h index 00990244e3..18d2242c7e 100644 --- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h +++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h @@ -183,7 +183,7 @@ public: Error setLayerPerFrameMetadataBlobs( Display display, Layer layer, const std::vector& metadata) override; - Error setDisplayBrightness(Display display, float brightness, + Error setDisplayBrightness(Display display, float brightness, float brightnessNits, const DisplayBrightnessOptions& options) override; // Composer HAL 2.4 diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.h b/services/surfaceflinger/DisplayHardware/ComposerHal.h index fd26e0bfcc..d266d942fb 100644 --- a/services/surfaceflinger/DisplayHardware/ComposerHal.h +++ b/services/surfaceflinger/DisplayHardware/ComposerHal.h @@ -237,7 +237,7 @@ public: return applyImmediately == other.applyImmediately; } }; - virtual Error setDisplayBrightness(Display display, float brightness, + virtual Error setDisplayBrightness(Display display, float brightness, float brightnessNits, const DisplayBrightnessOptions& options) = 0; // Composer HAL 2.4 diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index d8f233441d..adf4be3df5 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -544,9 +544,11 @@ Error Display::presentOrValidate(nsecs_t expectedPresentTime, uint32_t* outNumTy } std::future Display::setDisplayBrightness( - float brightness, const Hwc2::Composer::DisplayBrightnessOptions& options) { - return ftl::defer([composer = &mComposer, id = mId, brightness, options] { - const auto intError = composer->setDisplayBrightness(id, brightness, options); + float brightness, float brightnessNits, + const Hwc2::Composer::DisplayBrightnessOptions& options) { + return ftl::defer([composer = &mComposer, id = mId, brightness, brightnessNits, options] { + const auto intError = + composer->setDisplayBrightness(id, brightness, brightnessNits, options); return static_cast(intError); }); } diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h index 2154553301..cca20bd47f 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.h +++ b/services/surfaceflinger/DisplayHardware/HWC2.h @@ -148,7 +148,8 @@ public: android::sp* outPresentFence, uint32_t* state) = 0; [[nodiscard]] virtual std::future setDisplayBrightness( - float brightness, const Hwc2::Composer::DisplayBrightnessOptions& options) = 0; + float brightness, float brightnessNits, + const Hwc2::Composer::DisplayBrightnessOptions& options) = 0; [[nodiscard]] virtual hal::Error setActiveConfigWithConstraints( hal::HWConfigId configId, const hal::VsyncPeriodChangeConstraints& constraints, hal::VsyncPeriodChangeTimeline* outTimeline) = 0; @@ -229,7 +230,8 @@ public: android::sp* outPresentFence, uint32_t* state) override; std::future setDisplayBrightness( - float brightness, const Hwc2::Composer::DisplayBrightnessOptions& options) override; + float brightness, float brightnessNits, + const Hwc2::Composer::DisplayBrightnessOptions& options) override; hal::Error setActiveConfigWithConstraints(hal::HWConfigId configId, const hal::VsyncPeriodChangeConstraints& constraints, hal::VsyncPeriodChangeTimeline* outTimeline) override; diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 9580964588..79e4c75393 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -721,12 +721,12 @@ status_t HWComposer::getDisplayedContentSample(HalDisplayId displayId, uint64_t } std::future HWComposer::setDisplayBrightness( - PhysicalDisplayId displayId, float brightness, + PhysicalDisplayId displayId, float brightness, float brightnessNits, const Hwc2::Composer::DisplayBrightnessOptions& options) { RETURN_IF_INVALID_DISPLAY(displayId, ftl::yield(BAD_INDEX)); auto& display = mDisplayData[displayId].hwcDisplay; - return ftl::chain(display->setDisplayBrightness(brightness, options)) + return ftl::chain(display->setDisplayBrightness(brightness, brightnessNits, options)) .then([displayId](hal::Error error) -> status_t { if (error == hal::Error::UNSUPPORTED) { RETURN_IF_HWC_ERROR(error, displayId, INVALID_OPERATION); diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index 5e2ab784fa..7dc10eaa7d 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -196,7 +196,7 @@ public: // Sets the brightness of a display. virtual std::future setDisplayBrightness( - PhysicalDisplayId, float brightness, + PhysicalDisplayId, float brightness, float brightnessNits, const Hwc2::Composer::DisplayBrightnessOptions&) = 0; // Events handling --------------------------------------------------------- @@ -373,7 +373,7 @@ public: status_t getDisplayedContentSample(HalDisplayId, uint64_t maxFrames, uint64_t timestamp, DisplayedFrameStats* outStats) override; std::future setDisplayBrightness( - PhysicalDisplayId, float brightness, + PhysicalDisplayId, float brightness, float brightnessNits, const Hwc2::Composer::DisplayBrightnessOptions&) override; // Events handling --------------------------------------------------------- diff --git a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp index fd456ffe66..2597ae6091 100644 --- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp +++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp @@ -1115,7 +1115,7 @@ Error HidlComposer::setLayerPerFrameMetadataBlobs( return Error::NONE; } -Error HidlComposer::setDisplayBrightness(Display display, float brightness, +Error HidlComposer::setDisplayBrightness(Display display, float brightness, float, const DisplayBrightnessOptions&) { if (!mClient_2_3) { return Error::UNSUPPORTED; diff --git a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h index 68c1c1503e..d0d3c2e6d7 100644 --- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h +++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h @@ -292,7 +292,7 @@ public: Error setLayerPerFrameMetadataBlobs( Display display, Layer layer, const std::vector& metadata) override; - Error setDisplayBrightness(Display display, float brightness, + Error setDisplayBrightness(Display display, float brightness, float brightnessNits, const DisplayBrightnessOptions& options) override; // Composer HAL 2.4 diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 8850c76122..115dc6435b 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1709,6 +1709,7 @@ status_t SurfaceFlinger::setDisplayBrightness(const sp& displayToken, return getHwComposer() .setDisplayBrightness(display->getPhysicalId(), brightness.displayBrightness, + brightness.displayBrightnessNits, Hwc2::Composer::DisplayBrightnessOptions{ .applyImmediately = true}); } @@ -3249,6 +3250,9 @@ void SurfaceFlinger::persistDisplayBrightness(bool needsComposite) { const status_t error = getHwComposer() .setDisplayBrightness(display->getPhysicalId(), *brightness, + display->getCompositionDisplay() + ->getState() + .displayBrightnessNits, Hwc2::Composer::DisplayBrightnessOptions{ .applyImmediately = true}) .get(); diff --git a/services/surfaceflinger/fuzzer/surfaceflinger_displayhardware_fuzzer.cpp b/services/surfaceflinger/fuzzer/surfaceflinger_displayhardware_fuzzer.cpp index 3c4ab95c50..a605a2fd9b 100644 --- a/services/surfaceflinger/fuzzer/surfaceflinger_displayhardware_fuzzer.cpp +++ b/services/surfaceflinger/fuzzer/surfaceflinger_displayhardware_fuzzer.cpp @@ -358,6 +358,7 @@ void DisplayHardwareFuzzer::invokeComposerHal2_3(Hwc2::AidlComposer* composer, D composer->setLayerPerFrameMetadataBlobs(display, outLayer, std::vector{}); composer->setDisplayBrightness(display, mFdp.ConsumeFloatingPoint(), + mFdp.ConsumeFloatingPoint(), Hwc2::Composer::DisplayBrightnessOptions{ .applyImmediately = mFdp.ConsumeIntegral()}); } @@ -585,6 +586,7 @@ void DisplayHardwareFuzzer::invokeComposer() { getDisplayedContentSample(halDisplayID); mHwc.setDisplayBrightness(mPhysicalDisplayId, mFdp.ConsumeFloatingPoint(), + mFdp.ConsumeFloatingPoint(), Hwc2::Composer::DisplayBrightnessOptions{ .applyImmediately = mFdp.ConsumeIntegral()}); diff --git a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h index e215550669..aa8b5211e9 100644 --- a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h +++ b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h @@ -126,7 +126,8 @@ public: Error(Display, uint64_t, uint64_t, DisplayedFrameStats*)); MOCK_METHOD3(setLayerPerFrameMetadataBlobs, Error(Display, Layer, const std::vector&)); - MOCK_METHOD3(setDisplayBrightness, Error(Display, float, const DisplayBrightnessOptions&)); + MOCK_METHOD4(setDisplayBrightness, + Error(Display, float, float, const DisplayBrightnessOptions&)); MOCK_METHOD2( getDisplayCapabilities, Error(Display, diff --git a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h index 4c2aa34c87..3e0d6d304b 100644 --- a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h +++ b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockHWC2.h @@ -81,7 +81,7 @@ public: (nsecs_t, uint32_t *, uint32_t *, android::sp *, uint32_t *), (override)); MOCK_METHOD(std::future, setDisplayBrightness, - (float, const Hwc2::Composer::DisplayBrightnessOptions &), (override)); + (float, float, const Hwc2::Composer::DisplayBrightnessOptions &), (override)); MOCK_METHOD(hal::Error, setActiveConfigWithConstraints, (hal::HWConfigId, const hal::VsyncPeriodChangeConstraints &, hal::VsyncPeriodChangeTimeline *), -- cgit v1.2.3-59-g8ed1b