Skip to content

Commit 587d360

Browse files
hoxyqmeta-codesync[bot]
authored andcommitted
Define serializers for frame timings as part of HostTargetTracingProfile (facebook#54681)
Summary: Pull Request resolved: facebook#54681 # Changelog: [Internal] Now when Frame Timings are part of the whole `HostTargetTracingProfile`, we need to define how these will be serialized into chunks of `Tracing.dataCollected` messages. Reviewed By: sbuggay Differential Revision: D87373810 fbshipit-source-id: dd4e9ce6c691e92710d9c3c66f7d134f3fba1ddd
1 parent 57973fa commit 587d360

File tree

3 files changed

+93
-4
lines changed

3 files changed

+93
-4
lines changed

packages/react-native/ReactCommon/jsinspector-modern/tests/TracingTest.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,23 @@ TEST_F(TracingTest, RecordsFrameTimings) {
7676
EXPECT_EQ(tracingProfile.frameTimings[0].id, frameTimingSequence.id);
7777
}
7878

79+
TEST_F(TracingTest, EmitsRecordedFrameTimingSequences) {
80+
InSequence s;
81+
82+
startTracing();
83+
auto now = HighResTimeStamp::now();
84+
page_->recordFrameTimings(
85+
tracing::FrameTimingSequence(
86+
1, // id
87+
11, // threadId
88+
now,
89+
now + HighResDuration::fromNanoseconds(10),
90+
now + HighResDuration::fromNanoseconds(50)));
91+
92+
auto allTraceEvents = endTracingAndCollectEvents();
93+
EXPECT_THAT(allTraceEvents, Contains(AtJsonPtr("/name", "BeginFrame")));
94+
EXPECT_THAT(allTraceEvents, Contains(AtJsonPtr("/name", "Commit")));
95+
EXPECT_THAT(allTraceEvents, Contains(AtJsonPtr("/name", "DrawFrame")));
96+
}
97+
7998
} // namespace facebook::react::jsinspector_modern

packages/react-native/ReactCommon/jsinspector-modern/tracing/HostTracingProfileSerializer.cpp

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "HostTracingProfileSerializer.h"
99
#include "RuntimeSamplingProfileTraceEventSerializer.h"
10+
#include "TraceEventGenerator.h"
1011
#include "TraceEventSerializer.h"
1112

1213
namespace facebook::react::jsinspector_modern::tracing {
@@ -20,13 +21,26 @@ folly::dynamic generateNewChunk(uint16_t chunkSize) {
2021
return chunk;
2122
}
2223

24+
/**
25+
* Hardcoded layer tree ID for all recorded frames.
26+
* https://chromedevtools.github.io/devtools-protocol/tot/LayerTree/
27+
*/
28+
constexpr int FALLBACK_LAYER_TREE_ID = 1;
29+
2330
} // namespace
2431

2532
/* static */ void HostTracingProfileSerializer::emitAsDataCollectedChunks(
2633
HostTracingProfile&& hostTracingProfile,
2734
const std::function<void(folly::dynamic&&)>& chunkCallback,
28-
uint16_t performanceTraceEventsChunkSize,
35+
uint16_t traceEventsChunkSize,
2936
uint16_t profileTraceEventsChunkSize) {
37+
emitFrameTimings(
38+
std::move(hostTracingProfile.frameTimings),
39+
hostTracingProfile.processId,
40+
hostTracingProfile.startTime,
41+
chunkCallback,
42+
traceEventsChunkSize);
43+
3044
auto instancesProfiles =
3145
std::move(hostTracingProfile.instanceTracingProfiles);
3246
IdGenerator profileIdGenerator;
@@ -35,7 +49,7 @@ folly::dynamic generateNewChunk(uint16_t chunkSize) {
3549
emitPerformanceTraceEvents(
3650
std::move(instanceProfile.performanceTraceEvents),
3751
chunkCallback,
38-
performanceTraceEventsChunkSize);
52+
traceEventsChunkSize);
3953
}
4054

4155
RuntimeSamplingProfileTraceEventSerializer::serializeAndDispatch(
@@ -66,4 +80,52 @@ folly::dynamic generateNewChunk(uint16_t chunkSize) {
6680
}
6781
}
6882

83+
/* static */ void HostTracingProfileSerializer::emitFrameTimings(
84+
std::vector<FrameTimingSequence>&& frameTimings,
85+
ProcessId processId,
86+
HighResTimeStamp recordingStartTimestamp,
87+
const std::function<void(folly::dynamic&& chunk)>& chunkCallback,
88+
uint16_t chunkSize) {
89+
if (frameTimings.empty()) {
90+
return;
91+
}
92+
93+
folly::dynamic chunk = generateNewChunk(chunkSize);
94+
auto setLayerTreeIdEvent = TraceEventGenerator::createSetLayerTreeIdEvent(
95+
"", // Hardcoded frame name for the default (and only) layer.
96+
FALLBACK_LAYER_TREE_ID,
97+
processId,
98+
frameTimings.front().threadId,
99+
recordingStartTimestamp);
100+
chunk.push_back(
101+
TraceEventSerializer::serialize(std::move(setLayerTreeIdEvent)));
102+
103+
for (const auto& frameTimingSequence : frameTimings) {
104+
if (chunk.size() >= chunkSize) {
105+
chunkCallback(std::move(chunk));
106+
chunk = generateNewChunk(chunkSize);
107+
}
108+
109+
auto [beginDrawingEvent, commitEvent, endDrawingEvent] =
110+
TraceEventGenerator::createFrameTimingsEvents(
111+
frameTimingSequence.id,
112+
FALLBACK_LAYER_TREE_ID,
113+
frameTimingSequence.beginDrawingTimestamp,
114+
frameTimingSequence.commitTimestamp,
115+
frameTimingSequence.endDrawingTimestamp,
116+
processId,
117+
frameTimingSequence.threadId);
118+
119+
chunk.push_back(
120+
TraceEventSerializer::serialize(std::move(beginDrawingEvent)));
121+
chunk.push_back(TraceEventSerializer::serialize(std::move(commitEvent)));
122+
chunk.push_back(
123+
TraceEventSerializer::serialize(std::move(endDrawingEvent)));
124+
}
125+
126+
if (!chunk.empty()) {
127+
chunkCallback(std::move(chunk));
128+
}
129+
}
130+
69131
} // namespace facebook::react::jsinspector_modern::tracing

packages/react-native/ReactCommon/jsinspector-modern/tracing/HostTracingProfileSerializer.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#pragma once
99

10+
#include "FrameTimingSequence.h"
1011
#include "HostTracingProfile.h"
1112
#include "TraceEvent.h"
1213

@@ -23,20 +24,27 @@ class HostTracingProfileSerializer {
2324
public:
2425
/**
2526
* Transforms the profile into a sequence of serialized Trace Events, which
26-
* is split in chunks of sizes \p performanceTraceEventsChunkSize or
27+
* is split in chunks of sizes \p traceEventsChunkSize or
2728
* \p profileTraceEventsChunkSize, depending on type, and sent with \p
2829
* chunkCallback.
2930
*/
3031
static void emitAsDataCollectedChunks(
3132
HostTracingProfile &&hostTracingProfile,
3233
const std::function<void(folly::dynamic &&chunk)> &chunkCallback,
33-
uint16_t performanceTraceEventsChunkSize,
34+
uint16_t traceEventsChunkSize,
3435
uint16_t profileTraceEventsChunkSize);
3536

3637
static void emitPerformanceTraceEvents(
3738
std::vector<TraceEvent> &&events,
3839
const std::function<void(folly::dynamic &&chunk)> &chunkCallback,
3940
uint16_t chunkSize);
41+
42+
static void emitFrameTimings(
43+
std::vector<FrameTimingSequence> &&frameTimings,
44+
ProcessId processId,
45+
HighResTimeStamp recordingStartTimestamp,
46+
const std::function<void(folly::dynamic &&chunk)> &chunkCallback,
47+
uint16_t chunkSize);
4048
};
4149

4250
} // namespace facebook::react::jsinspector_modern::tracing

0 commit comments

Comments
 (0)