Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8f2a2d5 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

SF: Only create a starting entry if there are starting states

Test: atest TransactionTracingTest
Bug: 200284593
Change-Id: Ie260fb094117ec754778f8277602d10df6606fb2
parent 858a3b4c
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -128,9 +128,11 @@ void TransactionTracing::loop() {
            mCommittedTransactions.clear();
        } // unlock mMainThreadLock

        if (!committedTransactions.empty() || !removedLayers.empty()) {
            addEntry(committedTransactions, removedLayers);
        }
    }
}

void TransactionTracing::addEntry(const std::vector<CommittedTransactions>& committedTransactions,
                                  const std::vector<int32_t>& removedLayers) {
@@ -275,6 +277,7 @@ int32_t TransactionTracing::getLayerIdLocked(const sp<IBinder>& layerHandle) {

void TransactionTracing::updateStartingStateLocked(
        const proto::TransactionTraceEntry& removedEntry) {
    mStartingTimestamp = removedEntry.elapsed_realtime_nanos();
    // Keep track of layer starting state so we can reconstruct the layer state as we purge
    // transactions from the buffer.
    for (const proto::LayerCreationArgs& addedLayer : removedEntry.added_layers()) {
@@ -303,13 +306,14 @@ void TransactionTracing::updateStartingStateLocked(
}

void TransactionTracing::addStartingStateToProtoLocked(proto::TransactionTraceFile& proto) {
    proto::TransactionTraceEntry* entryProto = proto.add_entry();
    entryProto->set_elapsed_realtime_nanos(mStartingTimestamp);
    entryProto->set_vsync_id(0);
    if (mStartingStates.size() == 0) {
        return;
    }

    proto::TransactionTraceEntry* entryProto = proto.add_entry();
    entryProto->set_elapsed_realtime_nanos(mStartingTimestamp);
    entryProto->set_vsync_id(0);

    entryProto->mutable_added_layers()->Reserve(static_cast<int32_t>(mStartingStates.size()));
    for (auto& [layerId, state] : mStartingStates) {
        entryProto->mutable_added_layers()->Add(TransactionProtoParser::toProto(state.args));
+9 −12
Original line number Diff line number Diff line
@@ -91,10 +91,9 @@ TEST_F(TransactionTracingTest, addTransactions) {
    flush(secondTransactionSetVsyncId);

    proto::TransactionTraceFile proto = writeToProto();
    EXPECT_EQ(proto.entry().size(), 3);
    // skip starting entry
    verifyEntry(proto.entry(1), firstTransactionSet, firstTransactionSetVsyncId);
    verifyEntry(proto.entry(2), secondTransactionSet, secondTransactionSetVsyncId);
    EXPECT_EQ(proto.entry().size(), 2);
    verifyEntry(proto.entry(0), firstTransactionSet, firstTransactionSetVsyncId);
    verifyEntry(proto.entry(1), secondTransactionSet, secondTransactionSetVsyncId);
}

class TransactionTracingLayerHandlingTest : public TransactionTracingTest {
@@ -274,15 +273,13 @@ protected:
TEST_F(TransactionTracingMirrorLayerTest, canAddMirrorLayers) {
    proto::TransactionTraceFile proto = writeToProto();
    // We don't have any starting states since no layer was removed from.
    EXPECT_EQ(proto.entry().size(), 2);
    EXPECT_EQ(proto.entry(0).transactions().size(), 0);
    EXPECT_EQ(proto.entry(0).added_layers().size(), 0);
    EXPECT_EQ(proto.entry().size(), 1);

    // Verify the mirror layer was added
    EXPECT_EQ(proto.entry(1).transactions().size(), 1);
    EXPECT_EQ(proto.entry(1).added_layers().size(), 2);
    EXPECT_EQ(proto.entry(1).added_layers(1).layer_id(), mMirrorLayerId);
    EXPECT_EQ(proto.entry(1).transactions(0).layer_changes().size(), 2);
    EXPECT_EQ(proto.entry(1).transactions(0).layer_changes(1).z(), 43);
    EXPECT_EQ(proto.entry(0).transactions().size(), 1);
    EXPECT_EQ(proto.entry(0).added_layers().size(), 2);
    EXPECT_EQ(proto.entry(0).added_layers(1).layer_id(), mMirrorLayerId);
    EXPECT_EQ(proto.entry(0).transactions(0).layer_changes().size(), 2);
    EXPECT_EQ(proto.entry(0).transactions(0).layer_changes(1).z(), 43);
}
} // namespace android