diff options
author | 2023-01-25 13:47:12 -0500 | |
---|---|---|
committer | 2023-01-25 17:19:47 -0500 | |
commit | 6879659d589a17d362f91bba4bec5737504a75e7 (patch) | |
tree | 5b7dc6d0fa14fe1fbd925854c760b75841f9231b | |
parent | 6caf98c5d0033ad009ae822fb22ddb5802aa5e03 (diff) |
Add extended brightness range impl
Bug: 241001465
Test: manual currently, flagged off
Change-Id: I707281b9acaf6ea218f1d9ce888fc7cdbf1cf7c9
-rw-r--r-- | libs/gui/LayerState.cpp | 14 | ||||
-rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 15 | ||||
-rw-r--r-- | libs/gui/include/gui/LayerState.h | 8 | ||||
-rw-r--r-- | libs/gui/include/gui/SurfaceComposerClient.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h | 3 | ||||
-rw-r--r-- | services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp | 4 | ||||
-rw-r--r-- | services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp | 15 | ||||
-rw-r--r-- | services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp | 2 | ||||
-rw-r--r-- | services/surfaceflinger/FrontEnd/RequestedLayerState.cpp | 2 | ||||
-rw-r--r-- | services/surfaceflinger/HdrLayerInfoReporter.h | 25 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 27 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 8 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 48 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 8 |
14 files changed, 153 insertions, 28 deletions
diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp index 43acb16299..8372363185 100644 --- a/libs/gui/LayerState.cpp +++ b/libs/gui/LayerState.cpp @@ -187,6 +187,8 @@ status_t layer_state_t::write(Parcel& output) const } SAFE_PARCEL(output.writeParcelable, trustedPresentationThresholds); SAFE_PARCEL(output.writeParcelable, trustedPresentationListener); + SAFE_PARCEL(output.writeFloat, currentSdrHdrRatio); + SAFE_PARCEL(output.writeFloat, desiredSdrHdrRatio); return NO_ERROR; } @@ -321,6 +323,11 @@ status_t layer_state_t::read(const Parcel& input) SAFE_PARCEL(input.readParcelable, &trustedPresentationThresholds); SAFE_PARCEL(input.readParcelable, &trustedPresentationListener); + SAFE_PARCEL(input.readFloat, &tmpFloat); + currentSdrHdrRatio = tmpFloat; + SAFE_PARCEL(input.readFloat, &tmpFloat); + desiredSdrHdrRatio = tmpFloat; + return NO_ERROR; } @@ -568,6 +575,11 @@ void layer_state_t::merge(const layer_state_t& other) { what |= eDataspaceChanged; dataspace = other.dataspace; } + if (other.what & eExtendedRangeBrightnessChanged) { + what |= eExtendedRangeBrightnessChanged; + desiredSdrHdrRatio = other.desiredSdrHdrRatio; + currentSdrHdrRatio = other.currentSdrHdrRatio; + } if (other.what & eHdrMetadataChanged) { what |= eHdrMetadataChanged; hdrMetadata = other.hdrMetadata; @@ -714,6 +726,8 @@ uint64_t layer_state_t::diff(const layer_state_t& other) const { CHECK_DIFF(diff, eCropChanged, other, crop); if (other.what & eBufferChanged) diff |= eBufferChanged; CHECK_DIFF(diff, eDataspaceChanged, other, dataspace); + CHECK_DIFF2(diff, eExtendedRangeBrightnessChanged, other, currentSdrHdrRatio, + desiredSdrHdrRatio); CHECK_DIFF(diff, eHdrMetadataChanged, other, hdrMetadata); if (other.what & eSurfaceDamageRegionChanged && (!surfaceDamageRegion.hasSameRects(other.surfaceDamageRegion))) { diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 5bdeae8a1f..cf9828b2f8 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -1673,6 +1673,21 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDatas return *this; } +SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setExtendedRangeBrightness( + const sp<SurfaceControl>& sc, float currentBufferRatio, float desiredRatio) { + layer_state_t* s = getLayerState(sc); + if (!s) { + mStatus = BAD_INDEX; + return *this; + } + s->what |= layer_state_t::eExtendedRangeBrightnessChanged; + s->currentSdrHdrRatio = currentBufferRatio; + s->desiredSdrHdrRatio = desiredRatio; + + registerSurfaceControlForCallback(sc); + return *this; +} + SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setHdrMetadata( const sp<SurfaceControl>& sc, const HdrMetadata& hdrMetadata) { layer_state_t* s = getLayerState(sc); diff --git a/libs/gui/include/gui/LayerState.h b/libs/gui/include/gui/LayerState.h index 70c9daf42b..b8bee72cec 100644 --- a/libs/gui/include/gui/LayerState.h +++ b/libs/gui/include/gui/LayerState.h @@ -209,7 +209,8 @@ struct layer_state_t { eAutoRefreshChanged = 0x1000'00000000, eStretchChanged = 0x2000'00000000, eTrustedOverlayChanged = 0x4000'00000000, - eDropInputModeChanged = 0x8000'00000000 + eDropInputModeChanged = 0x8000'00000000, + eExtendedRangeBrightnessChanged = 0x10000'00000000 }; layer_state_t(); @@ -240,7 +241,8 @@ struct layer_state_t { layer_state_t::eBufferTransformChanged | layer_state_t::eDataspaceChanged | layer_state_t::eSidebandStreamChanged | layer_state_t::eSurfaceDamageRegionChanged | layer_state_t::eTransformToDisplayInverseChanged | - layer_state_t::eTransparentRegionChanged; + layer_state_t::eTransparentRegionChanged | + layer_state_t::eExtendedRangeBrightnessChanged; // Content updates. static constexpr uint64_t CONTENT_CHANGES = layer_state_t::BUFFER_CHANGES | @@ -385,6 +387,8 @@ struct layer_state_t { gui::DropInputMode dropInputMode; bool dimmingEnabled; + float currentSdrHdrRatio = 1.f; + float desiredSdrHdrRatio = 1.f; TrustedPresentationThresholds trustedPresentationThresholds; TrustedPresentationListener trustedPresentationListener; diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index 439e06049b..c5f59c8e3d 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -559,6 +559,8 @@ public: Transaction& setBufferHasBarrier(const sp<SurfaceControl>& sc, uint64_t barrierFrameNumber); Transaction& setDataspace(const sp<SurfaceControl>& sc, ui::Dataspace dataspace); + Transaction& setExtendedRangeBrightness(const sp<SurfaceControl>& sc, + float currentBufferRatio, float desiredRatio); Transaction& setHdrMetadata(const sp<SurfaceControl>& sc, const HdrMetadata& hdrMetadata); Transaction& setSurfaceDamageRegion(const sp<SurfaceControl>& sc, const Region& surfaceDamageRegion); diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h index ad98e93232..5bb249719e 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h @@ -209,6 +209,9 @@ struct LayerFECompositionState { // The dimming flag bool dimmingEnabled{true}; + float currentSdrHdrRatio = 1.f; + float desiredSdrHdrRatio = 1.f; + virtual ~LayerFECompositionState(); // Debugging diff --git a/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp b/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp index a405c4df88..531b65963d 100644 --- a/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp +++ b/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp @@ -121,6 +121,10 @@ void LayerFECompositionState::dump(std::string& out) const { dumpVal(out, "dataspace", toString(dataspace), dataspace); dumpVal(out, "hdr metadata types", hdrMetadata.validTypes); dumpVal(out, "dimming enabled", dimmingEnabled); + if (currentSdrHdrRatio > 1.01f || desiredSdrHdrRatio > 1.01f) { + dumpVal(out, "current sdr/hdr ratio", currentSdrHdrRatio); + dumpVal(out, "desired sdr/hdr ratio", desiredSdrHdrRatio); + } dumpVal(out, "colorTransform", colorTransform); out.append("\n"); diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp index 60a2c83194..6b69ce7941 100644 --- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp +++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp @@ -340,10 +340,17 @@ void OutputLayer::updateCompositionState( state.dimmingRatio = 1.f; state.whitePointNits = getOutput().getState().displayBrightnessNits; } else { - state.dimmingRatio = std::clamp(getOutput().getState().sdrWhitePointNits / - getOutput().getState().displayBrightnessNits, - 0.f, 1.f); - state.whitePointNits = getOutput().getState().sdrWhitePointNits; + float layerBrightnessNits = getOutput().getState().sdrWhitePointNits; + // RANGE_EXTENDED can "self-promote" to HDR, but is still rendered for a particular + // range that we may need to re-adjust to the current display conditions + if ((state.dataspace & HAL_DATASPACE_RANGE_MASK) == HAL_DATASPACE_RANGE_EXTENDED && + layerFEState->currentSdrHdrRatio > 1.01f) { + layerBrightnessNits *= layerFEState->currentSdrHdrRatio; + } + state.dimmingRatio = + std::clamp(layerBrightnessNits / getOutput().getState().displayBrightnessNits, 0.f, + 1.f); + state.whitePointNits = layerBrightnessNits; } // These are evaluated every frame as they can potentially change at any diff --git a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp index 40dffb9706..cc265916f1 100644 --- a/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp +++ b/services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp @@ -667,6 +667,8 @@ void LayerSnapshotBuilder::updateSnapshot(LayerSnapshot& snapshot, const Args& a snapshot.sidebandStream = requested.sidebandStream; snapshot.transparentRegionHint = requested.transparentRegion; snapshot.color.rgb = requested.getColor().rgb; + snapshot.currentSdrHdrRatio = requested.currentSdrHdrRatio; + snapshot.desiredSdrHdrRatio = requested.desiredSdrHdrRatio; } if (snapshot.isHiddenByPolicyFromParent && !newSnapshot) { diff --git a/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp b/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp index 39bf07abd2..b7fa4f0aa2 100644 --- a/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp +++ b/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp @@ -96,6 +96,8 @@ RequestedLayerState::RequestedLayerState(const LayerCreationArgs& args) layerStack = ui::DEFAULT_LAYER_STACK; transformToDisplayInverse = false; dataspace = ui::Dataspace::UNKNOWN; + desiredSdrHdrRatio = 1.f; + currentSdrHdrRatio = 1.f; dataspaceRequested = false; hdrMetadata.validTypes = 0; surfaceDamageRegion = Region::INVALID_REGION; diff --git a/services/surfaceflinger/HdrLayerInfoReporter.h b/services/surfaceflinger/HdrLayerInfoReporter.h index 4ada2b6372..9b70c164de 100644 --- a/services/surfaceflinger/HdrLayerInfoReporter.h +++ b/services/surfaceflinger/HdrLayerInfoReporter.h @@ -33,6 +33,17 @@ public: int32_t maxW = 0; int32_t maxH = 0; int32_t flags = 0; + // Counter-intuitively a value of "1" means "as much as you can give me" due to "1" being + // the default value for all layers, so any HDR layer with a value of 1.f means no + // reduced maximum has been requested + // TODO: Should the max desired ratio have a better meaning for HLG/PQ so this can be + // eliminated? If we assume an SDR white point of even just 100 nits for those content + // then HLG could have a meaningful max ratio of 10.f and PQ of 100.f instead of needing + // to treat 1.f as "uncapped" + // With peak display brightnesses exceeding 1,000 nits currently, HLG's request could + // actually be satisfied in some ambient conditions such that limiting that max for that + // content in theory makes sense + float maxDesiredSdrHdrRatio = 0.f; bool operator==(const HdrLayerInfo& other) const { return numberOfHdrLayers == other.numberOfHdrLayers && maxW == other.maxW && @@ -40,6 +51,20 @@ public: } bool operator!=(const HdrLayerInfo& other) const { return !(*this == other); } + + void mergeDesiredRatio(float update) { + if (maxDesiredSdrHdrRatio == 0.f) { + // If nothing is set, take the incoming value + maxDesiredSdrHdrRatio = update; + } else if (update == 1.f) { + // If the request is to "go to max", then take it regardless + maxDesiredSdrHdrRatio = 1.f; + } else if (maxDesiredSdrHdrRatio != 1.f) { + // If we're not currently asked to "go to max", then take the max + // of the incoming requests + maxDesiredSdrHdrRatio = std::max(maxDesiredSdrHdrRatio, update); + } + } }; HdrLayerInfoReporter() = default; diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 539f2fe353..953cdff237 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -622,6 +622,8 @@ void Layer::preparePerFrameCompositionState() { snapshot->surfaceDamage = surfaceDamageRegion; snapshot->hasProtectedContent = isProtected(); snapshot->dimmingEnabled = isDimmingEnabled(); + snapshot->currentSdrHdrRatio = getCurrentSdrHdrRatio(); + snapshot->desiredSdrHdrRatio = getDesiredSdrHdrRatio(); const bool usesRoundedCorners = hasRoundedCorners(); @@ -3041,6 +3043,17 @@ bool Layer::setDataspace(ui::Dataspace dataspace) { return true; } +bool Layer::setExtendedRangeBrightness(float currentBufferRatio, float desiredRatio) { + if (mDrawingState.currentSdrHdrRatio == currentBufferRatio && + mDrawingState.desiredSdrHdrRatio == desiredRatio) + return false; + mDrawingState.currentSdrHdrRatio = currentBufferRatio; + mDrawingState.desiredSdrHdrRatio = desiredRatio; + mDrawingState.modified = true; + setTransactionFlags(eTransactionNeeded); + return true; +} + bool Layer::setHdrMetadata(const HdrMetadata& hdrMetadata) { if (mDrawingState.hdrMetadata == hdrMetadata) return false; mDrawingState.hdrMetadata = hdrMetadata; @@ -3272,7 +3285,11 @@ void Layer::gatherBufferInfo() { auto lastDataspace = mBufferInfo.mDataspace; mBufferInfo.mDataspace = translateDataspace(mDrawingState.dataspace); if (lastDataspace != mBufferInfo.mDataspace) { - mFlinger->mSomeDataspaceChanged = true; + mFlinger->mHdrLayerInfoChanged = true; + } + if (mBufferInfo.mDesiredSdrHdrRatio != mDrawingState.desiredSdrHdrRatio) { + mBufferInfo.mDesiredSdrHdrRatio = mDrawingState.desiredSdrHdrRatio; + mFlinger->mHdrLayerInfoChanged = true; } mBufferInfo.mCrop = computeBufferCrop(mDrawingState); mBufferInfo.mScaleMode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW; @@ -3563,6 +3580,14 @@ bool Layer::simpleBufferUpdate(const layer_state_t& s) const { } } + if (s.what & layer_state_t::eExtendedRangeBrightnessChanged) { + if (mDrawingState.currentSdrHdrRatio != s.currentSdrHdrRatio || + mDrawingState.desiredSdrHdrRatio != s.desiredSdrHdrRatio) { + ALOGV("%s: false [eDimmingEnabledChanged changed]", __func__); + return false; + } + } + ALOGV("%s: true", __func__); return true; } diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 7631f5d963..3384e4af2d 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -223,6 +223,8 @@ public: gui::DropInputMode dropInputMode; bool autoRefresh = false; bool dimmingEnabled = true; + float currentSdrHdrRatio = 1.f; + float desiredSdrHdrRatio = 1.f; }; explicit Layer(const LayerCreationArgs& args); @@ -289,7 +291,9 @@ public: virtual mat4 getColorTransform() const; virtual bool hasColorTransform() const; virtual bool isColorSpaceAgnostic() const { return mDrawingState.colorSpaceAgnostic; } - virtual bool isDimmingEnabled() const { return getDrawingState().dimmingEnabled; }; + virtual bool isDimmingEnabled() const { return getDrawingState().dimmingEnabled; } + float getDesiredSdrHdrRatio() const { return getDrawingState().desiredSdrHdrRatio; } + float getCurrentSdrHdrRatio() const { return getDrawingState().currentSdrHdrRatio; } bool setTransform(uint32_t /*transform*/); bool setTransformToDisplayInverse(bool /*transformToDisplayInverse*/); @@ -298,6 +302,7 @@ public: nsecs_t /*desiredPresentTime*/, bool /*isAutoTimestamp*/, std::optional<nsecs_t> /* dequeueTime */, const FrameTimelineInfo& /*info*/); bool setDataspace(ui::Dataspace /*dataspace*/); + bool setExtendedRangeBrightness(float currentBufferRatio, float desiredRatio); bool setHdrMetadata(const HdrMetadata& /*hdrMetadata*/); bool setSurfaceDamageRegion(const Region& /*surfaceDamage*/); bool setApi(int32_t /*api*/); @@ -499,6 +504,7 @@ public: uint64_t mFrameNumber; bool mFrameLatencyNeeded{false}; + float mDesiredSdrHdrRatio = 1.f; }; BufferInfo mBufferInfo; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index cb3c94f5b0..546aceb74f 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2476,7 +2476,7 @@ void SurfaceFlinger::composite(TimePoint frameTime, VsyncId vsyncId) mLayerTracing.notify(mVisibleRegionsDirty, frameTime.ns(), vsyncId.value); } - mVisibleRegionsWereDirtyThisFrame = mVisibleRegionsDirty; // Cache value for use in post-comp + if (mVisibleRegionsDirty) mHdrLayerInfoChanged = true; mVisibleRegionsDirty = false; if (mCompositionEngine->needsAnotherUpdate()) { @@ -2504,21 +2504,32 @@ void SurfaceFlinger::updateLayerGeometry() { } bool SurfaceFlinger::isHdrLayer(Layer* layer) const { - // Treat all layers as non-HDR if: - // 1. They do not have a valid HDR dataspace. Currently we treat those as PQ or HLG. and - // 2. The layer is allowed to be dimmed. WindowManager may disable dimming in order to - // keep animations invoking SDR screenshots of HDR layers seamless. Treat such tagged - // layers as HDR so that DisplayManagerService does not try to change the screen brightness - if (!isHdrDataspace(layer->getDataSpace()) && layer->isDimmingEnabled()) { - return false; - } + // Even though the camera layer may be using an HDR transfer function or otherwise be "HDR" + // the device may need to avoid boosting the brightness as a result of these layers to + // reduce power consumption during camera recording if (mIgnoreHdrCameraLayers) { auto buffer = layer->getBuffer(); if (buffer && (buffer->getUsage() & GRALLOC_USAGE_HW_CAMERA_WRITE) != 0) { return false; } } - return true; + if (isHdrDataspace(layer->getDataSpace())) { + return true; + } + // If the layer is not allowed to be dimmed, treat it as HDR. WindowManager may disable + // dimming in order to keep animations invoking SDR screenshots of HDR layers seamless. + // Treat such tagged layers as HDR so that DisplayManagerService does not try to change + // the screen brightness + if (!layer->isDimmingEnabled()) { + return true; + } + // RANGE_EXTENDED layers may identify themselves as being "HDR" via a desired sdr/hdr ratio + if ((layer->getDataSpace() & (int32_t)Dataspace::RANGE_MASK) == + (int32_t)Dataspace::RANGE_EXTENDED && + layer->getDesiredSdrHdrRatio() > 1.01f) { + return true; + } + return false; } ui::Rotation SurfaceFlinger::getPhysicalDisplayOrientation(DisplayId displayId, @@ -2637,7 +2648,7 @@ void SurfaceFlinger::postComposition(nsecs_t callTime) { mAddingHDRLayerInfoListener = false; } - if (haveNewListeners || mSomeDataspaceChanged || mVisibleRegionsWereDirtyThisFrame) { + if (haveNewListeners || mHdrLayerInfoChanged) { for (auto& [compositionDisplay, listener] : hdrInfoListeners) { HdrLayerInfoReporter::HdrLayerInfo info; int32_t maxArea = 0; @@ -2649,6 +2660,7 @@ void SurfaceFlinger::postComposition(nsecs_t callTime) { const auto* outputLayer = compositionDisplay->getOutputLayerForLayer(layerFe); if (outputLayer) { + info.mergeDesiredRatio(layer->getDesiredSdrHdrRatio()); info.numberOfHdrLayers++; const auto displayFrame = outputLayer->getState().displayFrame; const int32_t area = displayFrame.width() * displayFrame.height(); @@ -2665,8 +2677,7 @@ void SurfaceFlinger::postComposition(nsecs_t callTime) { } } - mSomeDataspaceChanged = false; - mVisibleRegionsWereDirtyThisFrame = false; + mHdrLayerInfoChanged = false; mTransactionCallbackInvoker.addPresentFence(std::move(presentFence)); mTransactionCallbackInvoker.sendCallbacks(false /* onCommitOnly */); @@ -4492,9 +4503,6 @@ uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTime if (what & layer_state_t::eDataspaceChanged) { if (layer->setDataspace(s.dataspace)) flags |= eTraversalNeeded; } - if (what & layer_state_t::eHdrMetadataChanged) { - if (layer->setHdrMetadata(s.hdrMetadata)) flags |= eTraversalNeeded; - } if (what & layer_state_t::eSurfaceDamageRegionChanged) { if (layer->setSurfaceDamageRegion(s.surfaceDamageRegion)) flags |= eTraversalNeeded; } @@ -4568,6 +4576,14 @@ uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTime if (what & layer_state_t::eDimmingEnabledChanged) { if (layer->setDimmingEnabled(s.dimmingEnabled)) flags |= eTraversalNeeded; } + if (what & layer_state_t::eExtendedRangeBrightnessChanged) { + if (layer->setExtendedRangeBrightness(s.currentSdrHdrRatio, s.desiredSdrHdrRatio)) { + flags |= eTraversalNeeded; + } + } + if (what & layer_state_t::eHdrMetadataChanged) { + if (layer->setHdrMetadata(s.hdrMetadata)) flags |= eTraversalNeeded; + } if (what & layer_state_t::eTrustedOverlayChanged) { if (layer->setTrustedOverlay(s.isTrustedOverlay)) { flags |= eTraversalNeeded; diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 5e4015e728..c107d02c03 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -1140,9 +1140,8 @@ private: State mDrawingState{LayerVector::StateSet::Drawing}; bool mVisibleRegionsDirty = false; - // VisibleRegions dirty is already cleared by postComp, but we need to track it to prevent - // extra work in the HDR layer info listener. - bool mVisibleRegionsWereDirtyThisFrame = false; + bool mHdrLayerInfoChanged = false; + // Used to ensure we omit a callback when HDR layer info listener is newly added but the // scene hasn't changed bool mAddingHDRLayerInfoListener = false; @@ -1153,7 +1152,6 @@ private: // TODO: Also move visibleRegions over to a boolean system. bool mUpdateInputInfo = false; bool mSomeChildrenChanged; - bool mSomeDataspaceChanged = false; bool mForceTransactionDisplayChange = false; // Set if LayerMetadata has changed since the last LayerMetadata snapshot. @@ -1342,6 +1340,7 @@ private: std::unordered_map<DisplayId, sp<HdrLayerInfoReporter>> mHdrLayerInfoListeners GUARDED_BY(mStateLock); + mutable std::mutex mCreatedLayersLock; struct LayerCreatedState { LayerCreatedState(const wp<Layer>& layer, const wp<Layer> parent, bool addToRoot) @@ -1497,6 +1496,7 @@ public: binder::Status removeHdrLayerInfoListener( const sp<IBinder>& displayToken, const sp<gui::IHdrLayerInfoListener>& listener) override; + binder::Status notifyPowerBoost(int boostId) override; binder::Status setGlobalShadowSettings(const gui::Color& ambientColor, const gui::Color& spotColor, float lightPosY, |