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:

committed by
Chromium LUCI CQ

parent
e7fb7942ad
commit
a5027748e8
base/tracing/protos
cc/mojo_embedder
components
input
viz
service
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user