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

Commit 329e0ae9 authored by Pablo Gamito's avatar Pablo Gamito
Browse files

Add more trace points for Layer and Transaction tracing.

This is to help up keep track of the performance of tracing from the field in APC.

Bug: 409289578
Flag: EXEMPT tracing only
Change-Id: I6cca8fdd11156258080614e17a6fbd8783480288
parent 3a10a9e7
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -192,9 +192,11 @@ void LayerTracing::writeSnapshotToStream(perfetto::protos::LayersSnapshotProto&&

void LayerTracing::writeSnapshotToPerfetto(const perfetto::protos::LayersSnapshotProto& snapshot,
                                           Mode srcMode) {
    SFTRACE_CALL();
    const auto snapshotBytes = snapshot.SerializeAsString();

    LayerDataSource::Trace([&](LayerDataSource::TraceContext context) {
        SFTRACE_NAME("writeSnapshotToPerfetto_traceFunction");
        auto dstMode = context.GetCustomTlsState()->mMode;
        if (srcMode == Mode::MODE_GENERATED) {
            // Layers snapshots produced by LayerTraceGenerator have srcMode == MODE_GENERATED
+10 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#define LOG_TAG "TransactionTracing"

#include <android-base/stringprintf.h>
#include <common/trace.h>
#include <log/log.h>
#include <utils/SystemClock.h>

@@ -87,6 +88,7 @@ void TransactionTracing::onFlush(TransactionTracing::Mode mode) {
void TransactionTracing::writeRingBufferToPerfetto(TransactionTracing::Mode mode) {
    // Write the ring buffer (starting state + following sequence of transactions) to perfetto
    // tracing sessions with the specified mode.
    SFTRACE_CALL();
    const auto fileProto = writeToProto();

    TransactionDataSource::Trace([&](TransactionDataSource::TraceContext context) {
@@ -132,6 +134,7 @@ status_t TransactionTracing::writeToFile(const std::string& filename) {
}

perfetto::protos::TransactionTraceFile TransactionTracing::writeToProto() {
    SFTRACE_CALL();
    std::scoped_lock<std::mutex> lock(mTraceLock);
    perfetto::protos::TransactionTraceFile fileProto = createTraceFileProto();
    const auto startingStateProto = createStartingStateProtoLocked();
@@ -160,6 +163,7 @@ perfetto::protos::TransactionTraceFile TransactionTracing::createTraceFileProto(
}

void TransactionTracing::dump(std::string& result) const {
    SFTRACE_CALL();
    std::scoped_lock lock(mTraceLock);
    base::StringAppendF(&result, "  queued transactions=%zu created layers=%zu states=%zu\n",
                        mQueuedTransactions.size(), mCreatedLayers.size(), mStartingStates.size());
@@ -167,6 +171,7 @@ void TransactionTracing::dump(std::string& result) const {
}

void TransactionTracing::addQueuedTransaction(const QueuedTransactionState& transaction) {
    SFTRACE_CALL();
    perfetto::protos::TransactionState* state =
            new perfetto::protos::TransactionState(mProtoParser.toProto(transaction));
    mTransactionQueue.push(state);
@@ -176,6 +181,7 @@ void TransactionTracing::addCommittedTransactions(int64_t vsyncId, nsecs_t commi
                                                  frontend::Update& newUpdate,
                                                  const frontend::DisplayInfos& displayInfos,
                                                  bool displayInfoChanged) {
    SFTRACE_CALL();
    CommittedUpdates update;
    update.vsyncId = vsyncId;
    update.timestamp = commitTime;
@@ -228,6 +234,7 @@ void TransactionTracing::loop() {

void TransactionTracing::addEntry(const std::vector<CommittedUpdates>& committedUpdates,
                                  const std::vector<uint32_t>& destroyedLayers) {
    SFTRACE_CALL();
    std::scoped_lock lock(mTraceLock);
    std::vector<std::string> removedEntries;
    perfetto::protos::TransactionTraceEntry entryProto;
@@ -354,6 +361,7 @@ void TransactionTracing::onLayerRemoved(int32_t layerId) {
void TransactionTracing::tryPushToTracingThread() {
    // Try to acquire the lock from main thread.
    if (mMainThreadLock.try_lock()) {
        SFTRACE_NAME("pushTransactionsToTracingThread");
        // We got the lock! Collect any pending transactions and continue.
        mUpdates.insert(mUpdates.end(), std::make_move_iterator(mPendingUpdates.begin()),
                        std::make_move_iterator(mPendingUpdates.end()));
@@ -370,6 +378,7 @@ void TransactionTracing::tryPushToTracingThread() {

void TransactionTracing::updateStartingStateLocked(
        const perfetto::protos::TransactionTraceEntry& removedEntry) {
    SFTRACE_CALL();
    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.
@@ -410,6 +419,7 @@ void TransactionTracing::updateStartingStateLocked(

std::optional<perfetto::protos::TransactionTraceEntry>
TransactionTracing::createStartingStateProtoLocked() {
    SFTRACE_CALL();
    if (mStartingStates.empty()) {
        return std::nullopt;
    }