Merge "HDR video fix" into sc-dev
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h
index 269ddd5..801dc74 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h
@@ -132,6 +132,8 @@
compositionengine::OutputLayer* getBlurLayer() const;
+ bool hasHdrLayers() const;
+
private:
CachedSet() = default;
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h
index 0b78cb8..13b8781 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h
@@ -240,6 +240,15 @@
void resetFramesSinceBufferUpdate() { mFramesSinceBufferUpdate = 0; }
int64_t getFramesSinceBufferUpdate() const { return mFramesSinceBufferUpdate; }
+ ui::Dataspace getDataspace() const { return mOutputDataspace.get(); }
+
+ bool isHdr() const {
+ const ui::Dataspace transfer =
+ static_cast<ui::Dataspace>(getDataspace() & ui::Dataspace::TRANSFER_MASK);
+ return (transfer == ui::Dataspace::TRANSFER_ST2084 ||
+ transfer == ui::Dataspace::TRANSFER_HLG);
+ }
+
void dump(std::string& result) const;
std::optional<std::string> compare(const LayerState& other) const;
diff --git a/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp b/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp
index 3cfb211..0a67050 100644
--- a/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/planner/CachedSet.cpp
@@ -346,6 +346,11 @@
return mBlurLayer ? mBlurLayer->getOutputLayer() : nullptr;
}
+bool CachedSet::hasHdrLayers() const {
+ return std::any_of(mLayers.cbegin(), mLayers.cend(),
+ [](const Layer& layer) { return layer.getState()->isHdr(); });
+}
+
void CachedSet::dump(std::string& result) const {
const auto now = std::chrono::steady_clock::now();
diff --git a/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp b/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp
index ef46335..fb24fa4 100644
--- a/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp
@@ -368,7 +368,8 @@
for (auto currentSet = mLayers.cbegin(); currentSet != mLayers.cend(); ++currentSet) {
const bool layerIsInactive = now - currentSet->getLastUpdate() > kActiveLayerTimeout;
const bool layerHasBlur = currentSet->hasBlurBehind();
- if (layerIsInactive && (firstLayer || runHasFirstLayer || !layerHasBlur)) {
+ if (layerIsInactive && (firstLayer || runHasFirstLayer || !layerHasBlur) &&
+ !currentSet->hasHdrLayers()) {
if (isPartOfRun) {
builder.append(currentSet->getLayerCount());
} else {