diff options
Diffstat (limited to 'services/surfaceflinger/CompositionEngine/src/Display.cpp')
-rw-r--r-- | services/surfaceflinger/CompositionEngine/src/Display.cpp | 67 |
1 files changed, 55 insertions, 12 deletions
diff --git a/services/surfaceflinger/CompositionEngine/src/Display.cpp b/services/surfaceflinger/CompositionEngine/src/Display.cpp index 2353ab7cbb..747edc5e52 100644 --- a/services/surfaceflinger/CompositionEngine/src/Display.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Display.cpp @@ -244,24 +244,16 @@ void Display::setReleasedLayers(const compositionengine::CompositionRefreshArgs& setReleasedLayers(std::move(releasedLayers)); } -void Display::beginFrame() { - Output::beginFrame(); - - // If we don't have a HWC display, then we are done. - const auto halDisplayId = HalDisplayId::tryCast(mId); - if (!halDisplayId) { - return; - } - +void Display::applyDisplayBrightness(const bool applyImmediately) { auto& hwc = getCompositionEngine().getHwComposer(); - + const auto halDisplayId = HalDisplayId::tryCast(*getDisplayId()); if (const auto physicalDisplayId = PhysicalDisplayId::tryCast(*halDisplayId); physicalDisplayId && getState().displayBrightness) { const status_t result = hwc.setDisplayBrightness(*physicalDisplayId, *getState().displayBrightness, getState().displayBrightnessNits, Hwc2::Composer::DisplayBrightnessOptions{ - .applyImmediately = false}) + .applyImmediately = applyImmediately}) .get(); ALOGE_IF(result != NO_ERROR, "setDisplayBrightness failed for %s: %d, (%s)", getName().c_str(), result, strerror(-result)); @@ -270,6 +262,18 @@ void Display::beginFrame() { editState().displayBrightness.reset(); } +void Display::beginFrame() { + Output::beginFrame(); + + // If we don't have a HWC display, then we are done. + const auto halDisplayId = HalDisplayId::tryCast(mId); + if (!halDisplayId) { + return; + } + + applyDisplayBrightness(false); +} + bool Display::chooseCompositionStrategy( std::optional<android::HWComposer::DeviceRequestedChanges>* outChanges) { ATRACE_CALL(); @@ -285,12 +289,16 @@ bool Display::chooseCompositionStrategy( return false; } + const nsecs_t startTime = systemTime(); + beginDraw(); + // Get any composition changes requested by the HWC device, and apply them. std::optional<android::HWComposer::DeviceRequestedChanges> changes; auto& hwc = getCompositionEngine().getHwComposer(); + const bool requiresClientComposition = anyLayersRequireClientComposition(); if (status_t result = - hwc.getDeviceCompositionChanges(*halDisplayId, anyLayersRequireClientComposition(), + hwc.getDeviceCompositionChanges(*halDisplayId, requiresClientComposition, getState().earliestPresentTime, getState().previousPresentFence, getState().expectedPresentTime, outChanges); @@ -300,6 +308,11 @@ bool Display::chooseCompositionStrategy( return false; } + if (isPowerHintSessionEnabled()) { + mPowerAdvisor->setHwcValidateTiming(mId, startTime, systemTime()); + mPowerAdvisor->setRequiresClientComposition(mId, requiresClientComposition); + } + return true; } @@ -458,9 +471,24 @@ compositionengine::Output::FrameFences Display::presentAndGetFrameFences() { endDraw(); auto& hwc = getCompositionEngine().getHwComposer(); + + const nsecs_t startTime = systemTime(); + + if (isPowerHintSessionEnabled()) { + if (!getCompositionEngine().getHwComposer().getComposer()->isSupported( + Hwc2::Composer::OptionalFeature::ExpectedPresentTime) && + getState().previousPresentFence->getSignalTime() != Fence::SIGNAL_TIME_PENDING) { + mPowerAdvisor->setHwcPresentDelayedTime(mId, getState().earliestPresentTime); + } + } + hwc.presentAndGetReleaseFences(*halDisplayIdOpt, getState().earliestPresentTime, getState().previousPresentFence); + if (isPowerHintSessionEnabled()) { + mPowerAdvisor->setHwcPresentTiming(mId, startTime, systemTime()); + } + fences.presentFence = hwc.getPresentFence(*halDisplayIdOpt); // TODO(b/121291683): Change HWComposer call to return entire map @@ -486,6 +514,14 @@ void Display::setExpensiveRenderingExpected(bool enabled) { } } +bool Display::isPowerHintSessionEnabled() { + return mPowerAdvisor != nullptr && mPowerAdvisor->usePowerHintSession(); +} + +void Display::setHintSessionGpuFence(std::unique_ptr<FenceTime>&& gpuFence) { + mPowerAdvisor->setGpuFenceTime(mId, std::move(gpuFence)); +} + void Display::finishFrame(const compositionengine::CompositionRefreshArgs& refreshArgs, GpuCompositionResult&& result) { // We only need to actually compose the display if: @@ -498,6 +534,13 @@ void Display::finishFrame(const compositionengine::CompositionRefreshArgs& refre } impl::Output::finishFrame(refreshArgs, std::move(result)); + + if (isPowerHintSessionEnabled()) { + auto& hwc = getCompositionEngine().getHwComposer(); + if (auto halDisplayId = HalDisplayId::tryCast(mId)) { + mPowerAdvisor->setSkippedValidate(mId, hwc.getValidateSkipped(*halDisplayId)); + } + } } void Display::endDraw() { |