0

Add tracing events for important scroll-related Mojo messages

This CL adds new tracing events that correspond to the following Mojo
messages being sent:

* blink.mojom.WidgetInputHandler::DispatchEvent from the browser main
  thread to a renderer's compositor
* viz.mojom.BeginFrameObserver::OnStandaloneBeginFrame from Viz to the
  browser main thread (for flings)
* viz.mojom.CompositorFrameSinkClient::OnBeginFrame from Viz to a
  renderer's compositor
* viz.mojom.CompositorFrameSink::SubmitCompositorFrame from a renderer's
  compositor to Viz

PERFETTO_TESTS=`autoninja -C out/Default perfetto_diff_tests && out/Default/bin/run_perfetto_diff_tests`

Bug: 374100154
Change-Id: Iecddea6e7cb65f30026dc7a85f8c4d81ffd687b0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6049015
Reviewed-by: Oksana Zhuravlova <oksamyt@chromium.org>
Reviewed-by: Jonathan Ross <jonross@chromium.org>
Commit-Queue: Petr Cermak <petrcermak@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1393202}
This commit is contained in:
Petr Cermak
2024-12-06 22:44:00 +00:00
committed by Chromium LUCI CQ
parent e7fb7942ad
commit a5027748e8
5 changed files with 86 additions and 10 deletions

@ -1390,6 +1390,7 @@ message LocalSurfaceId {
}
message ChromeGraphicsPipeline {
// Next id: 26
enum StepName {
STEP_UNKNOWN = 0;
STEP_DID_NOT_PRODUCE_FRAME = 1;
@ -1442,6 +1443,18 @@ message ChromeGraphicsPipeline {
STEP_BACKEND_SEND_BUFFER_SWAP = 18;
STEP_BACKEND_SEND_BUFFER_POST_SUBMIT = 19;
STEP_BACKEND_FINISH_BUFFER_SWAP = 20;
// Send viz.mojom.CompositorFrameSinkClient::OnBeginFrame Mojo message from
// Viz to a renderer's compositor.
STEP_SEND_ON_BEGIN_FRAME_MOJO_MESSAGE = 23;
// Send viz.mojom.BeginFrameObserver::OnStandaloneBeginFrame Mojo message
// from Viz to the browser main thread (for flings).
STEP_SEND_ON_STANDALONE_BEGIN_FRAME_MOJO_MESSAGE = 24;
// Send viz.mojom.CompositorFrameSink::SubmitCompositorFrame Mojo message
// from a renderer's compositor to Viz.
STEP_SEND_SUBMIT_COMPOSITOR_FRAME_MOJO_MESSAGE = 25;
}
enum FrameSkippedReason {
SKIPPED_REASON_UNKNOWN = 0;
@ -2035,7 +2048,7 @@ message CurrentTask {
message ChromeLatencyInfo2 {
optional int64 trace_id = 1;
// NEXT ID: 15
// NEXT ID: 16
// All step are optional but the enum is ordered (not by number) below in the
// order we expect them to appear if they are emitted in trace in a blocking
// fashion.
@ -2043,6 +2056,10 @@ message ChromeLatencyInfo2 {
STEP_UNSPECIFIED = 0;
// Emitted on the browser main thread.
STEP_SEND_INPUT_EVENT_UI = 3;
// The browser main thread sends a
// blink.mojom.WidgetInputHandler::DispatchEvent Mojo message to the
// renderer's compositor.
STEP_SEND_DISPATCH_EVENT_MOJO_MESSAGE = 15;
// Happens on the renderer's compositor.
STEP_HANDLE_INPUT_EVENT_IMPL = 5;
STEP_RESAMPLE_SCROLL_EVENTS = 14;

@ -243,12 +243,23 @@ void AsyncLayerTreeFrameSink::SubmitCompositorFrame(
// The trace_id is negated in order to keep the Graphics.Pipeline and
// Event.Pipeline flows separated.
const int64_t trace_id = ~frame.metadata.begin_frame_ack.trace_id;
const int64_t trace_id = frame.metadata.begin_frame_ack.trace_id;
const int64_t negated_trace_id = ~trace_id;
TRACE_EVENT_WITH_FLOW1(TRACE_DISABLED_BY_DEFAULT("viz.hit_testing_flow"),
"Event.Pipeline", TRACE_ID_GLOBAL(trace_id),
"Event.Pipeline", TRACE_ID_GLOBAL(negated_trace_id),
TRACE_EVENT_FLAG_FLOW_OUT, "step",
"SubmitHitTestData");
TRACE_EVENT(
"graphics.pipeline", "Graphics.Pipeline",
perfetto::Flow::Global(trace_id), [&](perfetto::EventContext ctx) {
auto* event = ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>();
auto* data = event->set_chrome_graphics_pipeline();
data->set_step(
perfetto::protos::pbzero::ChromeGraphicsPipeline::StepName::
STEP_SEND_SUBMIT_COMPOSITOR_FRAME_MOJO_MESSAGE);
data->set_surface_frame_trace_id(trace_id);
});
compositor_frame_sink_ptr_->SubmitCompositorFrame(
local_surface_id_, std::move(frame), std::move(hit_test_region_list), 0);
}

@ -620,8 +620,17 @@ void InputRouterImpl::FilterAndSendWebInputEvent(
std::move(touch_action));
},
std::move(callback), weak_this_);
client_->GetWidgetInputHandler()->DispatchEvent(
std::move(event), std::move(renderer_callback));
{
TRACE_EVENT(
"latencyInfo", "LatencyInfo.Flow", [&](perfetto::EventContext ctx) {
ui::LatencyInfo::FillTraceEvent(
ctx, latency_info.trace_id(),
ChromeLatencyInfo2::Step::STEP_SEND_DISPATCH_EVENT_MOJO_MESSAGE,
InputEventTypeToProto(input_event.GetType()));
});
client_->GetWidgetInputHandler()->DispatchEvent(
std::move(event), std::move(renderer_callback));
}
} else {
TRACE_EVENT_INSTANT0("input", "InputEventSentNonBlocking",
TRACE_EVENT_SCOPE_THREAD);

@ -1252,8 +1252,23 @@ void CompositorFrameSinkSupport::OnBeginFrame(const BeginFrameArgs& args) {
// this OnBeginFrame() call is triggered by an unsolicited frame in the
// AutoNeedsBeginFrame mode.
if (!handling_auto_needs_begin_frame_) {
client_->OnBeginFrame(adjusted_args, frame_timing_details_, frame_ack,
std::move(surface_returned_resources_));
{
TRACE_EVENT(
"graphics.pipeline", "Graphics.Pipeline",
perfetto::Flow::Global(adjusted_args.trace_id),
[&](perfetto::EventContext ctx) {
auto* event =
ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>();
auto* data = event->set_chrome_graphics_pipeline();
data->set_step(
perfetto::protos::pbzero::ChromeGraphicsPipeline::
StepName::STEP_SEND_ON_BEGIN_FRAME_MOJO_MESSAGE);
data->set_surface_frame_trace_id(adjusted_args.trace_id);
});
client_->OnBeginFrame(adjusted_args, frame_timing_details_,
frame_ack,
std::move(surface_returned_resources_));
}
frame_timing_details_.clear();
} else {
if (frame_ack) {
@ -1269,9 +1284,23 @@ void CompositorFrameSinkSupport::OnBeginFrame(const BeginFrameArgs& args) {
}
surface_returned_resources_.clear();
} else if (!handling_auto_needs_begin_frame_) {
client_->OnBeginFrame(adjusted_args, frame_timing_details_,
/*frame_ack=*/false,
std::vector<ReturnedResource>());
{
TRACE_EVENT(
"graphics.pipeline", "Graphics.Pipeline",
perfetto::Flow::Global(adjusted_args.trace_id),
[&](perfetto::EventContext ctx) {
auto* event =
ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>();
auto* data = event->set_chrome_graphics_pipeline();
data->set_step(
perfetto::protos::pbzero::ChromeGraphicsPipeline::StepName::
STEP_SEND_ON_BEGIN_FRAME_MOJO_MESSAGE);
data->set_surface_frame_trace_id(adjusted_args.trace_id);
});
client_->OnBeginFrame(adjusted_args, frame_timing_details_,
/*frame_ack=*/false,
std::vector<ReturnedResource>());
}
frame_timing_details_.clear();
}
}

@ -16,6 +16,7 @@
#include "base/task/single_thread_task_runner.h"
#include "base/threading/platform_thread.h"
#include "base/time/time.h"
#include "base/tracing/protos/chrome_track_event.pbzero.h"
#include "build/build_config.h"
#include "components/viz/common/features.h"
#include "components/viz/common/frame_sinks/begin_frame_source.h"
@ -65,6 +66,15 @@ class RootCompositorFrameSinkImpl::StandaloneBeginFrameObserver
~StandaloneBeginFrameObserver() override { StopObserving(); }
bool OnBeginFrameDerivedImpl(const BeginFrameArgs& args) override {
TRACE_EVENT(
"graphics.pipeline", "Graphics.Pipeline",
[&](perfetto::EventContext ctx) {
auto* event = ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>();
auto* data = event->set_chrome_graphics_pipeline();
data->set_step(
perfetto::protos::pbzero::ChromeGraphicsPipeline::StepName::
STEP_SEND_ON_STANDALONE_BEGIN_FRAME_MOJO_MESSAGE);
});
remote_observer_->OnStandaloneBeginFrame(args);
return true;
}