SF: Fix transaction trace merging
As entries get purged from the ring buffer, they need to be
merged in order to update the starting state. The tracing logic
tried to update the state directly from proto to be more
efficient. But this introduced slight changes in behavior.
Fix by reusing layerstate merge logic.
Test: atest TransactionProtoParserTest
Bug: 200284593
Change-Id: I8bfcf23c43fa89f3e5c4e899c5c8942d098bbe7f
diff --git a/services/surfaceflinger/Tracing/TransactionProtoParser.cpp b/services/surfaceflinger/Tracing/TransactionProtoParser.cpp
index 056015d..a91698f 100644
--- a/services/surfaceflinger/Tracing/TransactionProtoParser.cpp
+++ b/services/surfaceflinger/Tracing/TransactionProtoParser.cpp
@@ -305,6 +305,7 @@
t.states.reserve(static_cast<size_t>(layerCount));
for (int i = 0; i < layerCount; i++) {
ComposerState s;
+ s.state.what = 0;
fromProto(proto.layer_changes(i), getLayerHandle, s.state);
t.states.add(s);
}
@@ -326,21 +327,23 @@
outArgs.mirrorFromId = proto.mirror_from_id();
}
-void TransactionProtoParser::fromProto(const proto::LayerState& proto,
- LayerIdToHandleFn getLayerHandle,
- TracingLayerState& outState) {
- fromProto(proto, getLayerHandle, static_cast<layer_state_t&>(outState));
- if (proto.what() & layer_state_t::eReparent) {
+void TransactionProtoParser::mergeFromProto(const proto::LayerState& proto,
+ LayerIdToHandleFn getLayerHandle,
+ TracingLayerState& outState) {
+ layer_state_t state;
+ fromProto(proto, getLayerHandle, state);
+ outState.merge(state);
+
+ if (state.what & layer_state_t::eReparent) {
outState.parentId = proto.parent_id();
- outState.args.parentId = outState.parentId;
}
- if (proto.what() & layer_state_t::eRelativeLayerChanged) {
+ if (state.what & layer_state_t::eRelativeLayerChanged) {
outState.relativeParentId = proto.relative_parent_id();
}
- if (proto.what() & layer_state_t::eInputInfoChanged) {
+ if (state.what & layer_state_t::eInputInfoChanged) {
outState.inputCropId = proto.window_info_handle().crop_layer_id();
}
- if (proto.what() & layer_state_t::eBufferChanged) {
+ if (state.what & layer_state_t::eBufferChanged) {
const proto::LayerState_BufferData& bufferProto = proto.buffer_data();
outState.bufferId = bufferProto.buffer_id();
outState.bufferWidth = bufferProto.width();
@@ -348,7 +351,7 @@
outState.pixelFormat = bufferProto.pixel_format();
outState.bufferUsage = bufferProto.usage();
}
- if (proto.what() & layer_state_t::eSidebandStreamChanged) {
+ if (state.what & layer_state_t::eSidebandStreamChanged) {
outState.hasSidebandStream = proto.has_sideband_stream();
}
}