SF: Add mirror layers to transaction trace
Test: atest TransactionTracingTest
Bug: 200284593
Change-Id: I40fbf806f68c6b0bad29fb4568ac5ae1a547cc3b
diff --git a/services/surfaceflinger/Tracing/TransactionProtoParser.cpp b/services/surfaceflinger/Tracing/TransactionProtoParser.cpp
index 783b36e..d12b253 100644
--- a/services/surfaceflinger/Tracing/TransactionProtoParser.cpp
+++ b/services/surfaceflinger/Tracing/TransactionProtoParser.cpp
@@ -278,6 +278,7 @@
proto.set_name(args.name);
proto.set_flags(args.flags);
proto.set_parent_id(args.parentId);
+ proto.set_mirror_from_id(args.mirrorFromId);
return proto;
}
@@ -312,6 +313,7 @@
outArgs.name = proto.name();
outArgs.flags = proto.flags();
outArgs.parentId = proto.parent_id();
+ outArgs.mirrorFromId = proto.mirror_from_id();
}
void TransactionProtoParser::fromProto(const proto::LayerState& proto,
@@ -320,6 +322,7 @@
fromProto(proto, getLayerHandle, static_cast<layer_state_t&>(outState));
if (proto.what() & layer_state_t::eReparent) {
outState.parentId = proto.parent_id();
+ outState.args.parentId = outState.parentId;
}
if (proto.what() & layer_state_t::eRelativeLayerChanged) {
outState.relativeParentId = proto.relative_parent_id();
@@ -508,7 +511,9 @@
DisplayIdToHandleFn getDisplayHandle) {
DisplayState display;
display.what = proto.what();
- display.token = getDisplayHandle(proto.id());
+ if (getDisplayHandle != nullptr) {
+ display.token = getDisplayHandle(proto.id());
+ }
if (display.what & DisplayState::eLayerStackChanged) {
display.layerStack.id = proto.layer_stack();
diff --git a/services/surfaceflinger/Tracing/TransactionProtoParser.h b/services/surfaceflinger/Tracing/TransactionProtoParser.h
index 16e9b5e..b64c782 100644
--- a/services/surfaceflinger/Tracing/TransactionProtoParser.h
+++ b/services/surfaceflinger/Tracing/TransactionProtoParser.h
@@ -25,8 +25,9 @@
struct TracingLayerCreationArgs {
int32_t layerId;
std::string name;
- uint32_t flags;
- int32_t parentId;
+ uint32_t flags = 0;
+ int32_t parentId = -1;
+ int32_t mirrorFromId = -1;
};
struct TracingLayerState : layer_state_t {
@@ -37,8 +38,7 @@
int32_t parentId;
int32_t relativeParentId;
int32_t inputCropId;
- std::string name;
- uint32_t layerCreationFlags;
+ TracingLayerCreationArgs args;
};
class TransactionProtoParser {
diff --git a/services/surfaceflinger/Tracing/TransactionTracing.cpp b/services/surfaceflinger/Tracing/TransactionTracing.cpp
index cf488c2..6dd43ca 100644
--- a/services/surfaceflinger/Tracing/TransactionTracing.cpp
+++ b/services/surfaceflinger/Tracing/TransactionTracing.cpp
@@ -227,7 +227,17 @@
void TransactionTracing::onLayerAdded(BBinder* layerHandle, int layerId, const std::string& name,
uint32_t flags, int parentId) {
std::scoped_lock lock(mTraceLock);
- TracingLayerCreationArgs args{layerId, name, flags, parentId};
+ TracingLayerCreationArgs args{layerId, name, flags, parentId, -1 /* mirrorFromId */};
+ mLayerHandles[layerHandle] = layerId;
+ proto::LayerCreationArgs protoArgs = TransactionProtoParser::toProto(args);
+ proto::LayerCreationArgs protoArgsCopy = protoArgs;
+ mCreatedLayers.push_back(protoArgs);
+}
+
+void TransactionTracing::onMirrorLayerAdded(BBinder* layerHandle, int layerId,
+ const std::string& name, int mirrorFromId) {
+ std::scoped_lock lock(mTraceLock);
+ TracingLayerCreationArgs args{layerId, name, 0 /* flags */, -1 /* parentId */, mirrorFromId};
mLayerHandles[layerHandle] = layerId;
mCreatedLayers.emplace_back(TransactionProtoParser::toProto(args));
}
@@ -270,9 +280,7 @@
for (const proto::LayerCreationArgs& addedLayer : removedEntry.added_layers()) {
TracingLayerState& startingState = mStartingStates[addedLayer.layer_id()];
startingState.layerId = addedLayer.layer_id();
- startingState.name = addedLayer.name();
- startingState.layerCreationFlags = addedLayer.flags();
- startingState.parentId = addedLayer.parent_id();
+ TransactionProtoParser::fromProto(addedLayer, startingState.args);
}
// Merge layer states to starting transaction state.
@@ -305,11 +313,13 @@
proto::TransactionTraceEntry* entryProto = proto.add_entry();
entryProto->set_elapsed_realtime_nanos(mStartingTimestamp);
entryProto->set_vsync_id(0);
+ if (mStartingStates.size() == 0) {
+ return;
+ }
+
entryProto->mutable_added_layers()->Reserve(static_cast<int32_t>(mStartingStates.size()));
for (auto& [layerId, state] : mStartingStates) {
- TracingLayerCreationArgs args{layerId, state.name, state.layerCreationFlags,
- state.parentId};
- entryProto->mutable_added_layers()->Add(TransactionProtoParser::toProto(args));
+ entryProto->mutable_added_layers()->Add(TransactionProtoParser::toProto(state.args));
}
proto::TransactionState transactionProto = TransactionProtoParser::toProto(mStartingStates);
diff --git a/services/surfaceflinger/Tracing/TransactionTracing.h b/services/surfaceflinger/Tracing/TransactionTracing.h
index 546ac7a..814f857 100644
--- a/services/surfaceflinger/Tracing/TransactionTracing.h
+++ b/services/surfaceflinger/Tracing/TransactionTracing.h
@@ -64,6 +64,8 @@
void setBufferSize(size_t bufferSizeInBytes);
void onLayerAdded(BBinder* layerHandle, int layerId, const std::string& name, uint32_t flags,
int parentId);
+ void onMirrorLayerAdded(BBinder* layerHandle, int layerId, const std::string& name,
+ int mirrorFromId);
void onLayerRemoved(int layerId);
void dump(std::string&) const;
static constexpr auto CONTINUOUS_TRACING_BUFFER_SIZE = 512 * 1024;