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

Commit d1b0cbd7 authored by Pablo Gamito's avatar Pablo Gamito Committed by Android (Google) Code Review
Browse files

Merge "Add more trace points for Layer and Transaction tracing." into main

parents dc27ea37 329e0ae9
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;
    }