blob: 8aacbca90cafea70d47da3b1dfe2e4439be8f826 [file] [log] [blame]
Vishnu Nair7891e962021-11-11 12:07:21 -08001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#undef LOG_TAG
18#define LOG_TAG "TransactionTracing"
19#define ATRACE_TAG ATRACE_TAG_GRAPHICS
20
21#include <android-base/stringprintf.h>
22#include <log/log.h>
23#include <utils/SystemClock.h>
24#include <utils/Trace.h>
25
Vishnu Nair81750622023-03-08 15:02:06 -080026#include "Client.h"
27#include "FrontEnd/LayerCreationArgs.h"
Vishnu Nair7891e962021-11-11 12:07:21 -080028#include "TransactionTracing.h"
29
30namespace android {
Vishnu Naird1f74982023-06-15 20:16:51 -070031ANDROID_SINGLETON_STATIC_INSTANCE(android::TransactionTraceWriter)
Vishnu Nair7891e962021-11-11 12:07:21 -080032
Vishnu Nair685cfef2022-02-02 10:01:25 -080033TransactionTracing::TransactionTracing()
Vishnu Nair81750622023-03-08 15:02:06 -080034 : mProtoParser(std::make_unique<TransactionProtoParser::FlingerDataMapper>()) {
Vishnu Nair7891e962021-11-11 12:07:21 -080035 std::scoped_lock lock(mTraceLock);
Dominik Laskowski46471e62022-01-14 15:34:03 -080036
Diwas Sharmaa0021172023-09-01 00:43:31 +000037 mBuffer.setSize(mBufferSizeInBytes);
Vishnu Nair0cc69e12021-11-18 09:05:49 -080038 mStartingTimestamp = systemTime();
Vishnu Nair7891e962021-11-11 12:07:21 -080039 {
40 std::scoped_lock lock(mMainThreadLock);
Vishnu Nair7891e962021-11-11 12:07:21 -080041 mThread = std::thread(&TransactionTracing::loop, this);
42 }
Vishnu Nair7891e962021-11-11 12:07:21 -080043}
44
Dominik Laskowski46471e62022-01-14 15:34:03 -080045TransactionTracing::~TransactionTracing() {
Vishnu Nair7891e962021-11-11 12:07:21 -080046 std::thread thread;
47 {
48 std::scoped_lock lock(mMainThreadLock);
49 mDone = true;
50 mTransactionsAvailableCv.notify_all();
51 thread = std::move(mThread);
52 }
53 if (thread.joinable()) {
54 thread.join();
55 }
56
Diwas Sharmaa0021172023-09-01 00:43:31 +000057 writeToFile();
Vishnu Nair7891e962021-11-11 12:07:21 -080058}
59
Vishnu Naird1f74982023-06-15 20:16:51 -070060status_t TransactionTracing::writeToFile(const std::string& filename) {
Diwas Sharmaa0021172023-09-01 00:43:31 +000061 std::scoped_lock lock(mTraceLock);
Kean Mariotti4ba343c2023-04-19 13:31:02 +000062 perfetto::protos::TransactionTraceFile fileProto = createTraceFileProto();
Diwas Sharmaa0021172023-09-01 00:43:31 +000063 addStartingStateToProtoLocked(fileProto);
64 return mBuffer.writeToFile(fileProto, filename);
Vishnu Nair7891e962021-11-11 12:07:21 -080065}
66
67void TransactionTracing::setBufferSize(size_t bufferSizeInBytes) {
68 std::scoped_lock lock(mTraceLock);
Diwas Sharmaa0021172023-09-01 00:43:31 +000069 mBufferSizeInBytes = bufferSizeInBytes;
70 mBuffer.setSize(mBufferSizeInBytes);
Vishnu Nair7891e962021-11-11 12:07:21 -080071}
72
Kean Mariotti4ba343c2023-04-19 13:31:02 +000073perfetto::protos::TransactionTraceFile TransactionTracing::createTraceFileProto() const {
74 perfetto::protos::TransactionTraceFile proto;
75 proto.set_magic_number(
76 uint64_t(perfetto::protos::TransactionTraceFile_MagicNumber_MAGIC_NUMBER_H) << 32 |
77 perfetto::protos::TransactionTraceFile_MagicNumber_MAGIC_NUMBER_L);
Diwas Sharmaa0021172023-09-01 00:43:31 +000078 auto timeOffsetNs = static_cast<std::uint64_t>(systemTime(SYSTEM_TIME_REALTIME) -
79 systemTime(SYSTEM_TIME_MONOTONIC));
Kean Mariottic44fdaf2022-07-29 14:20:39 +000080 proto.set_real_to_elapsed_time_offset_nanos(timeOffsetNs);
Vishnu Nair81750622023-03-08 15:02:06 -080081 proto.set_version(TRACING_VERSION);
Vishnu Nair7891e962021-11-11 12:07:21 -080082 return proto;
83}
84
85void TransactionTracing::dump(std::string& result) const {
86 std::scoped_lock lock(mTraceLock);
Vishnu Nair81750622023-03-08 15:02:06 -080087 base::StringAppendF(&result, " queued transactions=%zu created layers=%zu states=%zu\n",
88 mQueuedTransactions.size(), mCreatedLayers.size(), mStartingStates.size());
Dominik Laskowski46471e62022-01-14 15:34:03 -080089 mBuffer.dump(result);
Vishnu Nair7891e962021-11-11 12:07:21 -080090}
91
92void TransactionTracing::addQueuedTransaction(const TransactionState& transaction) {
Kean Mariotti4ba343c2023-04-19 13:31:02 +000093 perfetto::protos::TransactionState* state =
94 new perfetto::protos::TransactionState(mProtoParser.toProto(transaction));
Robert Carra63d52a2022-03-03 08:03:37 -080095 mTransactionQueue.push(state);
Vishnu Nair7891e962021-11-11 12:07:21 -080096}
97
Dominik Laskowski6b049ff2023-01-29 15:46:45 -050098void TransactionTracing::addCommittedTransactions(int64_t vsyncId, nsecs_t commitTime,
99 frontend::Update& newUpdate,
100 const frontend::DisplayInfos& displayInfos,
101 bool displayInfoChanged) {
Vishnu Nair81750622023-03-08 15:02:06 -0800102 CommittedUpdates update;
103 update.vsyncId = vsyncId;
104 update.timestamp = commitTime;
105 update.transactionIds.reserve(newUpdate.transactions.size());
106 for (const auto& transaction : newUpdate.transactions) {
107 update.transactionIds.emplace_back(transaction.id);
Vishnu Nair286f4f92022-06-08 16:37:39 -0700108 }
Vishnu Nair81750622023-03-08 15:02:06 -0800109 update.displayInfoChanged = displayInfoChanged;
110 if (displayInfoChanged) {
111 update.displayInfos = displayInfos;
Vishnu Nair7891e962021-11-11 12:07:21 -0800112 }
Vishnu Nair81750622023-03-08 15:02:06 -0800113 update.createdLayers = std::move(newUpdate.layerCreationArgs);
114 newUpdate.layerCreationArgs.clear();
115 update.destroyedLayerHandles.reserve(newUpdate.destroyedHandles.size());
Vishnu Nair606d9d02023-08-19 14:20:18 -0700116 for (auto& [handle, _] : newUpdate.destroyedHandles) {
Vishnu Nair81750622023-03-08 15:02:06 -0800117 update.destroyedLayerHandles.push_back(handle);
118 }
119 mPendingUpdates.emplace_back(update);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800120 tryPushToTracingThread();
Vishnu Naird1f74982023-06-15 20:16:51 -0700121 mLastUpdatedVsyncId = vsyncId;
Vishnu Nair7891e962021-11-11 12:07:21 -0800122}
123
124void TransactionTracing::loop() {
125 while (true) {
Vishnu Nair81750622023-03-08 15:02:06 -0800126 std::vector<CommittedUpdates> committedUpdates;
127 std::vector<uint32_t> destroyedLayers;
Vishnu Nair7891e962021-11-11 12:07:21 -0800128 {
129 std::unique_lock<std::mutex> lock(mMainThreadLock);
130 base::ScopedLockAssertion assumeLocked(mMainThreadLock);
131 mTransactionsAvailableCv.wait(lock, [&]() REQUIRES(mMainThreadLock) {
Vishnu Nair81750622023-03-08 15:02:06 -0800132 return mDone || !mUpdates.empty();
Vishnu Nair7891e962021-11-11 12:07:21 -0800133 });
134 if (mDone) {
Vishnu Nair81750622023-03-08 15:02:06 -0800135 mUpdates.clear();
136 mDestroyedLayers.clear();
Vishnu Nair7891e962021-11-11 12:07:21 -0800137 break;
138 }
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800139
Vishnu Nair81750622023-03-08 15:02:06 -0800140 destroyedLayers = std::move(mDestroyedLayers);
141 mDestroyedLayers.clear();
142 committedUpdates = std::move(mUpdates);
143 mUpdates.clear();
Vishnu Nair7891e962021-11-11 12:07:21 -0800144 } // unlock mMainThreadLock
145
Vishnu Nair81750622023-03-08 15:02:06 -0800146 if (!committedUpdates.empty() || !destroyedLayers.empty()) {
147 addEntry(committedUpdates, destroyedLayers);
Vishnu Nairb8f2a2d2022-01-13 08:10:10 -0800148 }
Vishnu Nair7891e962021-11-11 12:07:21 -0800149 }
150}
151
Vishnu Nair81750622023-03-08 15:02:06 -0800152void TransactionTracing::addEntry(const std::vector<CommittedUpdates>& committedUpdates,
153 const std::vector<uint32_t>& destroyedLayers) {
Vishnu Nair7891e962021-11-11 12:07:21 -0800154 ATRACE_CALL();
155 std::scoped_lock lock(mTraceLock);
Vishnu Nair62863552021-12-10 13:34:48 -0800156 std::vector<std::string> removedEntries;
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000157 perfetto::protos::TransactionTraceEntry entryProto;
Robert Carra63d52a2022-03-03 08:03:37 -0800158
159 while (auto incomingTransaction = mTransactionQueue.pop()) {
160 auto transaction = *incomingTransaction;
Robert Carra63d52a2022-03-03 08:03:37 -0800161 mQueuedTransactions[incomingTransaction->transaction_id()] = transaction;
162 delete incomingTransaction;
163 }
Vishnu Nair81750622023-03-08 15:02:06 -0800164 for (const CommittedUpdates& update : committedUpdates) {
165 entryProto.set_elapsed_realtime_nanos(update.timestamp);
166 entryProto.set_vsync_id(update.vsyncId);
Vishnu Nair286f4f92022-06-08 16:37:39 -0700167 entryProto.mutable_added_layers()->Reserve(
Vishnu Nair81750622023-03-08 15:02:06 -0800168 static_cast<int32_t>(update.createdLayers.size()));
Vishnu Nair286f4f92022-06-08 16:37:39 -0700169
Vishnu Nair81750622023-03-08 15:02:06 -0800170 for (const auto& args : update.createdLayers) {
171 entryProto.mutable_added_layers()->Add(std::move(mProtoParser.toProto(args)));
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800172 }
Vishnu Nair286f4f92022-06-08 16:37:39 -0700173
Vishnu Nair81750622023-03-08 15:02:06 -0800174 entryProto.mutable_destroyed_layers()->Reserve(
175 static_cast<int32_t>(destroyedLayers.size()));
176 for (auto& destroyedLayer : destroyedLayers) {
177 entryProto.mutable_destroyed_layers()->Add(destroyedLayer);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800178 }
Vishnu Nair7891e962021-11-11 12:07:21 -0800179 entryProto.mutable_transactions()->Reserve(
Vishnu Nair81750622023-03-08 15:02:06 -0800180 static_cast<int32_t>(update.transactionIds.size()));
181 for (const uint64_t& id : update.transactionIds) {
Vishnu Nair7891e962021-11-11 12:07:21 -0800182 auto it = mQueuedTransactions.find(id);
183 if (it != mQueuedTransactions.end()) {
184 entryProto.mutable_transactions()->Add(std::move(it->second));
185 mQueuedTransactions.erase(it);
186 } else {
Vishnu Nair047fb332021-12-09 09:54:36 -0800187 ALOGW("Could not find transaction id %" PRIu64, id);
Vishnu Nair7891e962021-11-11 12:07:21 -0800188 }
189 }
Vishnu Nair62863552021-12-10 13:34:48 -0800190
Vishnu Nair81750622023-03-08 15:02:06 -0800191 entryProto.mutable_destroyed_layer_handles()->Reserve(
192 static_cast<int32_t>(update.destroyedLayerHandles.size()));
193 for (auto layerId : update.destroyedLayerHandles) {
194 entryProto.mutable_destroyed_layer_handles()->Add(layerId);
Vishnu Nair3e40cdd2022-06-08 16:50:17 -0700195 }
Vishnu Nair81750622023-03-08 15:02:06 -0800196
197 entryProto.set_displays_changed(update.displayInfoChanged);
198 if (update.displayInfoChanged) {
199 entryProto.mutable_displays()->Reserve(
200 static_cast<int32_t>(update.displayInfos.size()));
201 for (auto& [layerStack, displayInfo] : update.displayInfos) {
202 entryProto.mutable_displays()->Add(
203 std::move(mProtoParser.toProto(displayInfo, layerStack.id)));
204 }
205 }
Vishnu Nair3e40cdd2022-06-08 16:50:17 -0700206
Vishnu Nair62863552021-12-10 13:34:48 -0800207 std::string serializedProto;
208 entryProto.SerializeToString(&serializedProto);
Diwas Sharmaa0021172023-09-01 00:43:31 +0000209 entryProto.Clear();
Dominik Laskowski46471e62022-01-14 15:34:03 -0800210 std::vector<std::string> entries = mBuffer.emplace(std::move(serializedProto));
Vishnu Nair62863552021-12-10 13:34:48 -0800211 removedEntries.reserve(removedEntries.size() + entries.size());
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800212 removedEntries.insert(removedEntries.end(), std::make_move_iterator(entries.begin()),
213 std::make_move_iterator(entries.end()));
214 }
215
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000216 perfetto::protos::TransactionTraceEntry removedEntryProto;
Vishnu Nair62863552021-12-10 13:34:48 -0800217 for (const std::string& removedEntry : removedEntries) {
218 removedEntryProto.ParseFromString(removedEntry);
219 updateStartingStateLocked(removedEntryProto);
220 removedEntryProto.Clear();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800221 }
222 mTransactionsAddedToBufferCv.notify_one();
223}
224
Vishnu Naird1f74982023-06-15 20:16:51 -0700225void TransactionTracing::flush() {
226 {
227 std::scoped_lock lock(mMainThreadLock);
228 // Collect any pending transactions and wait for transactions to be added to
229 mUpdates.insert(mUpdates.end(), std::make_move_iterator(mPendingUpdates.begin()),
230 std::make_move_iterator(mPendingUpdates.end()));
231 mPendingUpdates.clear();
232 mDestroyedLayers.insert(mDestroyedLayers.end(), mPendingDestroyedLayers.begin(),
233 mPendingDestroyedLayers.end());
234 mPendingDestroyedLayers.clear();
235 mTransactionsAvailableCv.notify_one();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800236 }
237 std::unique_lock<std::mutex> lock(mTraceLock);
238 base::ScopedLockAssertion assumeLocked(mTraceLock);
Vishnu Naird1f74982023-06-15 20:16:51 -0700239 mTransactionsAddedToBufferCv.wait_for(lock, std::chrono::milliseconds(100),
240 [&]() REQUIRES(mTraceLock) {
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000241 perfetto::protos::TransactionTraceEntry entry;
Vishnu Naird1f74982023-06-15 20:16:51 -0700242 if (mBuffer.used() > 0) {
243 entry.ParseFromString(mBuffer.back());
244 }
245 return mBuffer.used() > 0 &&
246 entry.vsync_id() >= mLastUpdatedVsyncId;
247 });
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800248}
249
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800250void TransactionTracing::onLayerRemoved(int32_t layerId) {
Vishnu Nair81750622023-03-08 15:02:06 -0800251 mPendingDestroyedLayers.emplace_back(layerId);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800252 tryPushToTracingThread();
253}
254
255void TransactionTracing::tryPushToTracingThread() {
256 // Try to acquire the lock from main thread.
257 if (mMainThreadLock.try_lock()) {
258 // We got the lock! Collect any pending transactions and continue.
Vishnu Nair81750622023-03-08 15:02:06 -0800259 mUpdates.insert(mUpdates.end(), std::make_move_iterator(mPendingUpdates.begin()),
260 std::make_move_iterator(mPendingUpdates.end()));
261 mPendingUpdates.clear();
262 mDestroyedLayers.insert(mDestroyedLayers.end(), mPendingDestroyedLayers.begin(),
263 mPendingDestroyedLayers.end());
264 mPendingDestroyedLayers.clear();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800265 mTransactionsAvailableCv.notify_one();
266 mMainThreadLock.unlock();
267 } else {
268 ALOGV("Couldn't get lock");
Vishnu Nair7891e962021-11-11 12:07:21 -0800269 }
270}
271
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800272void TransactionTracing::updateStartingStateLocked(
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000273 const perfetto::protos::TransactionTraceEntry& removedEntry) {
Vishnu Nairb8f2a2d2022-01-13 08:10:10 -0800274 mStartingTimestamp = removedEntry.elapsed_realtime_nanos();
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800275 // Keep track of layer starting state so we can reconstruct the layer state as we purge
276 // transactions from the buffer.
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000277 for (const perfetto::protos::LayerCreationArgs& addedLayer : removedEntry.added_layers()) {
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800278 TracingLayerState& startingState = mStartingStates[addedLayer.layer_id()];
279 startingState.layerId = addedLayer.layer_id();
Vishnu Nair685cfef2022-02-02 10:01:25 -0800280 mProtoParser.fromProto(addedLayer, startingState.args);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800281 }
282
283 // Merge layer states to starting transaction state.
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000284 for (const perfetto::protos::TransactionState& transaction : removedEntry.transactions()) {
285 for (const perfetto::protos::LayerState& layerState : transaction.layer_changes()) {
Vishnu Nair81750622023-03-08 15:02:06 -0800286 auto it = mStartingStates.find(layerState.layer_id());
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800287 if (it == mStartingStates.end()) {
Vishnu Nair20e1f962023-03-29 15:58:34 -0700288 // TODO(b/238781169) make this log fatal when we switch over to using new fe
Vishnu Nair81750622023-03-08 15:02:06 -0800289 ALOGW("Could not find layer id %d", layerState.layer_id());
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800290 continue;
291 }
Vishnu Nair685cfef2022-02-02 10:01:25 -0800292 mProtoParser.mergeFromProto(layerState, it->second);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800293 }
294 }
295
Vishnu Nair81750622023-03-08 15:02:06 -0800296 for (const uint32_t destroyedLayerHandleId : removedEntry.destroyed_layer_handles()) {
297 mRemovedLayerHandlesAtStart.insert(destroyedLayerHandleId);
Vishnu Nair3e40cdd2022-06-08 16:50:17 -0700298 }
299
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800300 // Clean up stale starting states since the layer has been removed and the buffer does not
301 // contain any references to the layer.
Vishnu Nair81750622023-03-08 15:02:06 -0800302 for (const uint32_t destroyedLayerId : removedEntry.destroyed_layers()) {
303 mStartingStates.erase(destroyedLayerId);
304 mRemovedLayerHandlesAtStart.erase(destroyedLayerId);
305 }
306
307 if (removedEntry.displays_changed()) {
308 mProtoParser.fromProto(removedEntry.displays(), mStartingDisplayInfos);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800309 }
310}
311
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000312void TransactionTracing::addStartingStateToProtoLocked(
313 perfetto::protos::TransactionTraceFile& proto) {
Diwas Sharmaa0021172023-09-01 00:43:31 +0000314 if (mStartingStates.size() == 0) {
315 return;
Vishnu Nair84125ac2021-12-02 08:47:48 -0800316 }
317
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000318 perfetto::protos::TransactionTraceEntry* entryProto = proto.add_entry();
Diwas Sharmaa0021172023-09-01 00:43:31 +0000319 entryProto->set_elapsed_realtime_nanos(mStartingTimestamp);
320 entryProto->set_vsync_id(0);
Vishnu Nairb8f2a2d2022-01-13 08:10:10 -0800321
Diwas Sharmaa0021172023-09-01 00:43:31 +0000322 entryProto->mutable_added_layers()->Reserve(static_cast<int32_t>(mStartingStates.size()));
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800323 for (auto& [layerId, state] : mStartingStates) {
Diwas Sharmaa0021172023-09-01 00:43:31 +0000324 entryProto->mutable_added_layers()->Add(mProtoParser.toProto(state.args));
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800325 }
326
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000327 perfetto::protos::TransactionState transactionProto = mProtoParser.toProto(mStartingStates);
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800328 transactionProto.set_vsync_id(0);
329 transactionProto.set_post_time(mStartingTimestamp);
Diwas Sharmaa0021172023-09-01 00:43:31 +0000330 entryProto->mutable_transactions()->Add(std::move(transactionProto));
Vishnu Nair3e40cdd2022-06-08 16:50:17 -0700331
Diwas Sharmaa0021172023-09-01 00:43:31 +0000332 entryProto->mutable_destroyed_layer_handles()->Reserve(
Vishnu Nair3e40cdd2022-06-08 16:50:17 -0700333 static_cast<int32_t>(mRemovedLayerHandlesAtStart.size()));
Vishnu Nair81750622023-03-08 15:02:06 -0800334 for (const uint32_t destroyedLayerHandleId : mRemovedLayerHandlesAtStart) {
Diwas Sharmaa0021172023-09-01 00:43:31 +0000335 entryProto->mutable_destroyed_layer_handles()->Add(destroyedLayerHandleId);
Vishnu Nair81750622023-03-08 15:02:06 -0800336 }
337
Diwas Sharmaa0021172023-09-01 00:43:31 +0000338 entryProto->mutable_displays()->Reserve(static_cast<int32_t>(mStartingDisplayInfos.size()));
Vishnu Nair81750622023-03-08 15:02:06 -0800339 for (auto& [layerStack, displayInfo] : mStartingDisplayInfos) {
Diwas Sharmaa0021172023-09-01 00:43:31 +0000340 entryProto->mutable_displays()->Add(mProtoParser.toProto(displayInfo, layerStack.id));
Vishnu Nair3e40cdd2022-06-08 16:50:17 -0700341 }
Diwas Sharmaa0021172023-09-01 00:43:31 +0000342}
Vishnu Nair0cc69e12021-11-18 09:05:49 -0800343
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000344perfetto::protos::TransactionTraceFile TransactionTracing::writeToProto() {
Diwas Sharmaa0021172023-09-01 00:43:31 +0000345 std::scoped_lock<std::mutex> lock(mTraceLock);
Kean Mariotti4ba343c2023-04-19 13:31:02 +0000346 perfetto::protos::TransactionTraceFile proto = createTraceFileProto();
Diwas Sharmaa0021172023-09-01 00:43:31 +0000347 addStartingStateToProtoLocked(proto);
348 mBuffer.writeToProto(proto);
349 return proto;
Vishnu Nair7891e962021-11-11 12:07:21 -0800350}
351
352} // namespace android