diff options
author | 2022-03-23 18:14:26 +0000 | |
---|---|---|
committer | 2022-04-08 22:55:30 +0000 | |
commit | 4d8a05d372f8cf40a294ed4e9718b54b51f15a34 (patch) | |
tree | c8501211fbd619b33348990a506913a1b4d1b266 | |
parent | 5a896f35e170172ca3596cd5644ad67674041493 (diff) |
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
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<status_t>(NO_ERROR)))); @@ -650,6 +651,7 @@ TEST_F(DisplayChooseCompositionStrategyTest, normalOperationWithDisplayBrightnes mock::RenderSurface* renderSurface = new StrictMock<mock::RenderSurface>(); EXPECT_CALL(*renderSurface, beginFrame(_)).Times(1); mDisplay->setRenderSurfaceForTest(std::unique_ptr<RenderSurface>(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<status_t>(PhysicalDisplayId, float, + MOCK_METHOD4(setDisplayBrightness, + std::future<status_t>(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<int64_t>(display), brightness); + mWriter.setDisplayBrightness(translate<int64_t>(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<IComposerClient::PerFrameMetadataBlob>& 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<Error> 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<Error>(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<android::Fence>* outPresentFence, uint32_t* state) = 0; [[nodiscard]] virtual std::future<hal::Error> 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<android::Fence>* outPresentFence, uint32_t* state) override; std::future<hal::Error> 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<status_t> HWComposer::setDisplayBrightness( - PhysicalDisplayId displayId, float brightness, + PhysicalDisplayId displayId, float brightness, float brightnessNits, const Hwc2::Composer::DisplayBrightnessOptions& options) { RETURN_IF_INVALID_DISPLAY(displayId, ftl::yield<status_t>(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<status_t> 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<status_t> 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<IComposerClient::PerFrameMetadataBlob>& 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<IBinder>& 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<PerFrameMetadataBlob>{}); composer->setDisplayBrightness(display, mFdp.ConsumeFloatingPoint<float>(), + mFdp.ConsumeFloatingPoint<float>(), Hwc2::Composer::DisplayBrightnessOptions{ .applyImmediately = mFdp.ConsumeIntegral<bool>()}); } @@ -585,6 +586,7 @@ void DisplayHardwareFuzzer::invokeComposer() { getDisplayedContentSample(halDisplayID); mHwc.setDisplayBrightness(mPhysicalDisplayId, mFdp.ConsumeFloatingPoint<float>(), + mFdp.ConsumeFloatingPoint<float>(), Hwc2::Composer::DisplayBrightnessOptions{ .applyImmediately = mFdp.ConsumeIntegral<bool>()}); 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<IComposerClient::PerFrameMetadataBlob>&)); - 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<android::Fence> *, uint32_t *), (override)); MOCK_METHOD(std::future<hal::Error>, 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 *), |