[sf] Pass metadata to layer during composition
Adds the simple bits of code to grab a snapshot of the front-end Layer
generic metadata, storing a copy in LayerFECompositionState, and then
sending int to the HWC2::Layer along with other "geometry update"
settings.
As the metadata stored in the layers uses integer keys, they need to be
translated to name strings. For hard-coded mapping is defined, with a
TODO left to remove the hard-coded mapping.
A test is added to ensure that the metadata is written by OutputLayer
when present, and that it is not set as part of a "per-frame" update.
Bug: 139747351
Test: atest libcompositionengine_test
Change-Id: I63f2a34e1fb70e1aefc5aa7e97ce56b7c2579a29
diff --git a/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp b/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp
index 3e0f803..02e3a45 100644
--- a/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/LayerFECompositionState.cpp
@@ -32,6 +32,20 @@
} // namespace
+std::string GenericLayerMetadataEntry::dumpAsString() const {
+ using android::base::StringAppendF;
+ std::string out;
+
+ out.append("GenericLayerMetadataEntry{mandatory: ");
+ StringAppendF(&out, "%d", mandatory);
+ out.append(" value: ");
+ for (uint8_t byte : value) {
+ StringAppendF(&out, "0x08%" PRIx8 " ", byte);
+ }
+ out.append("]}");
+ return out;
+}
+
LayerFECompositionState::~LayerFECompositionState() = default;
void LayerFECompositionState::dump(std::string& out) const {
@@ -65,6 +79,17 @@
dumpVal(out, "type", type);
dumpVal(out, "appId", appId);
+ if (!metadata.empty()) {
+ out.append("\n metadata {");
+ for (const auto& [key, entry] : metadata) {
+ out.append("\n ");
+ out.append(key);
+ out.append("=");
+ out.append(entry.dumpAsString());
+ }
+ out.append("\n }\n ");
+ }
+
dumpVal(out, "composition type", toString(compositionType), compositionType);
out.append("\n buffer: ");