Commit b0c6bf3a authored by Sadrul Habib Chowdhury's avatar Sadrul Habib Chowdhury Committed by Commit Bot

cc/viz: Add some more flow trace-events.

Add some more flow trace-events for the various stages during a frame.
For example:
 . [client] Reception of BeginFrame (ReceiveBeginFrame).
 . [client] Generation of RenderPass, DrawQuad etc (GenerateRenderPass).
 . [client] Generation of CompositorFrame (GenerateCompositorFrame).
 . [client] Submission of CompositorFrame (SubmitCompositorFrame).
 . [server] Aggregation of surfaces from various clients in the
            DisplayCompositor (SurfaceAggregation).

An example screenshot: https://imgur.com/a/ZJGfq2J

BUG=855328

Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;master.tryserver.blink:linux_trusty_blink_rel
Change-Id: Iccb7b61d485b20256cc8f35a5a4efef4c8ed63ea
Reviewed-on: https://chromium-review.googlesource.com/1116345Reviewed-by: default avatarFady Samuel <fsamuel@chromium.org>
Reviewed-by: default avatarNed Nguyen <nednguyen@google.com>
Commit-Queue: Sadrul Chowdhury <sadrul@chromium.org>
Cr-Commit-Position: refs/heads/master@{#570859}
parent b767d54f
...@@ -120,6 +120,11 @@ void AsyncLayerTreeFrameSink::SubmitCompositorFrame( ...@@ -120,6 +120,11 @@ void AsyncLayerTreeFrameSink::SubmitCompositorFrame(
DCHECK(frame.metadata.begin_frame_ack.has_damage); DCHECK(frame.metadata.begin_frame_ack.has_damage);
DCHECK_LE(viz::BeginFrameArgs::kStartingFrameNumber, DCHECK_LE(viz::BeginFrameArgs::kStartingFrameNumber,
frame.metadata.begin_frame_ack.sequence_number); frame.metadata.begin_frame_ack.sequence_number);
TRACE_EVENT_WITH_FLOW1(
"viz,benchmark", "Graphics.Pipeline",
TRACE_ID_GLOBAL(frame.metadata.begin_frame_ack.trace_id),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step",
"SubmitCompositorFrame");
if (!enable_surface_synchronization_) { if (!enable_surface_synchronization_) {
local_surface_id_ = local_surface_id_ =
...@@ -194,9 +199,18 @@ void AsyncLayerTreeFrameSink::DidPresentCompositorFrame( ...@@ -194,9 +199,18 @@ void AsyncLayerTreeFrameSink::DidPresentCompositorFrame(
void AsyncLayerTreeFrameSink::OnBeginFrame(const viz::BeginFrameArgs& args) { void AsyncLayerTreeFrameSink::OnBeginFrame(const viz::BeginFrameArgs& args) {
if (!needs_begin_frames_) { if (!needs_begin_frames_) {
TRACE_EVENT_WITH_FLOW1("viz,benchmark", "Graphics.Pipeline",
TRACE_ID_GLOBAL(args.trace_id),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"step", "ReceiveBeginFrameDiscard");
// We had a race with SetNeedsBeginFrame(false) and still need to let the // We had a race with SetNeedsBeginFrame(false) and still need to let the
// sink know that we didn't use this BeginFrame. // sink know that we didn't use this BeginFrame.
DidNotProduceFrame(viz::BeginFrameAck(args, false)); DidNotProduceFrame(viz::BeginFrameAck(args, false));
} else {
TRACE_EVENT_WITH_FLOW1("viz,benchmark", "Graphics.Pipeline",
TRACE_ID_GLOBAL(args.trace_id),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"step", "ReceiveBeginFrame");
} }
if (begin_frame_source_) if (begin_frame_source_)
begin_frame_source_->OnBeginFrame(args); begin_frame_source_->OnBeginFrame(args);
......
...@@ -1277,6 +1277,10 @@ void LayerTreeHostImpl::InvalidateLayerTreeFrameSink(bool needs_redraw) { ...@@ -1277,6 +1277,10 @@ void LayerTreeHostImpl::InvalidateLayerTreeFrameSink(bool needs_redraw) {
DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) {
TRACE_EVENT1("cc", "LayerTreeHostImpl::PrepareToDraw", "SourceFrameNumber", TRACE_EVENT1("cc", "LayerTreeHostImpl::PrepareToDraw", "SourceFrameNumber",
active_tree_->source_frame_number()); active_tree_->source_frame_number());
TRACE_EVENT_WITH_FLOW1("viz,benchmark", "Graphics.Pipeline",
TRACE_ID_GLOBAL(CurrentBeginFrameArgs().trace_id),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"step", "GenerateRenderPass");
if (input_handler_client_) if (input_handler_client_)
input_handler_client_->ReconcileElasticOverscrollAndRootScroll(); input_handler_client_->ReconcileElasticOverscrollAndRootScroll();
...@@ -2013,9 +2017,6 @@ RenderFrameMetadata LayerTreeHostImpl::MakeRenderFrameMetadata( ...@@ -2013,9 +2017,6 @@ RenderFrameMetadata LayerTreeHostImpl::MakeRenderFrameMetadata(
bool LayerTreeHostImpl::DrawLayers(FrameData* frame) { bool LayerTreeHostImpl::DrawLayers(FrameData* frame) {
DCHECK(CanDraw()); DCHECK(CanDraw());
DCHECK_EQ(frame->has_no_damage, frame->render_passes.empty()); DCHECK_EQ(frame->has_no_damage, frame->render_passes.empty());
TRACE_EVENT0("cc,benchmark", "LayerTreeHostImpl::DrawLayers");
ResetRequiresHighResToDraw(); ResetRequiresHighResToDraw();
skipped_frame_tracker_.DidProduceFrame(); skipped_frame_tracker_.DidProduceFrame();
...@@ -2027,6 +2028,36 @@ bool LayerTreeHostImpl::DrawLayers(FrameData* frame) { ...@@ -2027,6 +2028,36 @@ bool LayerTreeHostImpl::DrawLayers(FrameData* frame) {
return false; return false;
} }
auto compositor_frame = GenerateCompositorFrame(frame);
layer_tree_frame_sink_->SubmitCompositorFrame(std::move(compositor_frame));
// Clears the list of swap promises after calling DidSwap on each of them to
// signal that the swap is over.
active_tree()->ClearSwapPromises();
// The next frame should start by assuming nothing has changed, and changes
// are noted as they occur.
// TODO(boliu): If we did a temporary software renderer frame, propogate the
// damage forward to the next frame.
for (size_t i = 0; i < frame->render_surface_list->size(); i++) {
auto* surface = (*frame->render_surface_list)[i];
surface->damage_tracker()->DidDrawDamagedArea();
}
active_tree_->ResetAllChangeTracking();
active_tree_->set_has_ever_been_drawn(true);
devtools_instrumentation::DidDrawFrame(id_);
benchmark_instrumentation::IssueImplThreadRenderingStatsEvent(
rendering_stats_instrumentation_->TakeImplThreadRenderingStats());
return true;
}
viz::CompositorFrame LayerTreeHostImpl::GenerateCompositorFrame(
FrameData* frame) {
TRACE_EVENT_WITH_FLOW1("viz,benchmark", "Graphics.Pipeline",
TRACE_ID_GLOBAL(CurrentBeginFrameArgs().trace_id),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"step", "GenerateCompositorFrame");
base::TimeTicks frame_time = CurrentBeginFrameArgs().frame_time; base::TimeTicks frame_time = CurrentBeginFrameArgs().frame_time;
fps_counter_->SaveTimeStamp(frame_time, fps_counter_->SaveTimeStamp(frame_time,
!layer_tree_frame_sink_->context_provider()); !layer_tree_frame_sink_->context_provider());
...@@ -2152,27 +2183,7 @@ bool LayerTreeHostImpl::DrawLayers(FrameData* frame) { ...@@ -2152,27 +2183,7 @@ bool LayerTreeHostImpl::DrawLayers(FrameData* frame) {
total_quad_count); total_quad_count);
} }
layer_tree_frame_sink_->SubmitCompositorFrame(std::move(compositor_frame)); return compositor_frame;
// Clears the list of swap promises after calling DidSwap on each of them to
// signal that the swap is over.
active_tree()->ClearSwapPromises();
// The next frame should start by assuming nothing has changed, and changes
// are noted as they occur.
// TODO(boliu): If we did a temporary software renderer frame, propogate the
// damage forward to the next frame.
for (size_t i = 0; i < frame->render_surface_list->size(); i++) {
auto* surface = (*frame->render_surface_list)[i];
surface->damage_tracker()->DidDrawDamagedArea();
}
active_tree_->ResetAllChangeTracking();
active_tree_->set_has_ever_been_drawn(true);
devtools_instrumentation::DidDrawFrame(id_);
benchmark_instrumentation::IssueImplThreadRenderingStatsEvent(
rendering_stats_instrumentation_->TakeImplThreadRenderingStats());
return true;
} }
void LayerTreeHostImpl::DidDrawAllLayers(const FrameData& frame) { void LayerTreeHostImpl::DidDrawAllLayers(const FrameData& frame) {
......
...@@ -60,6 +60,7 @@ class ScrollOffset; ...@@ -60,6 +60,7 @@ class ScrollOffset;
} }
namespace viz { namespace viz {
class CompositorFrame;
class CompositorFrameMetadata; class CompositorFrameMetadata;
} }
...@@ -365,6 +366,7 @@ class CC_EXPORT LayerTreeHostImpl ...@@ -365,6 +366,7 @@ class CC_EXPORT LayerTreeHostImpl
// called between the two. // called between the two.
virtual DrawResult PrepareToDraw(FrameData* frame); virtual DrawResult PrepareToDraw(FrameData* frame);
virtual bool DrawLayers(FrameData* frame); virtual bool DrawLayers(FrameData* frame);
viz::CompositorFrame GenerateCompositorFrame(FrameData* frame);
// Must be called if and only if PrepareToDraw was called. // Must be called if and only if PrepareToDraw was called.
void DidDrawAllLayers(const FrameData& frame); void DidDrawAllLayers(const FrameData& frame);
......
...@@ -301,6 +301,11 @@ void SurfaceAggregator::EmitSurfaceContent( ...@@ -301,6 +301,11 @@ void SurfaceAggregator::EmitSurfaceContent(
++uma_stats_.valid_surface; ++uma_stats_.valid_surface;
const CompositorFrame& frame = surface->GetActiveFrame(); const CompositorFrame& frame = surface->GetActiveFrame();
TRACE_EVENT_WITH_FLOW1(
"viz,benchmark", "Graphics.Pipeline",
TRACE_ID_GLOBAL(frame.metadata.begin_frame_ack.trace_id),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step",
"SurfaceAggregation");
if (ignore_undamaged) { if (ignore_undamaged) {
gfx::Transform quad_to_target_transform( gfx::Transform quad_to_target_transform(
...@@ -1160,7 +1165,11 @@ CompositorFrame SurfaceAggregator::Aggregate( ...@@ -1160,7 +1165,11 @@ CompositorFrame SurfaceAggregator::Aggregate(
return {}; return {};
const CompositorFrame& root_surface_frame = surface->GetActiveFrame(); const CompositorFrame& root_surface_frame = surface->GetActiveFrame();
TRACE_EVENT0("viz", "SurfaceAggregator::Aggregate"); TRACE_EVENT_WITH_FLOW1(
"viz,benchmark", "Graphics.Pipeline",
TRACE_ID_GLOBAL(root_surface_frame.metadata.begin_frame_ack.trace_id),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step",
"SurfaceAggregation");
CompositorFrame frame; CompositorFrame frame;
......
...@@ -42,7 +42,7 @@ ReportSilkDetails = ["renderer_main"] ...@@ -42,7 +42,7 @@ ReportSilkDetails = ["renderer_main"]
# could change. We should formalize these traces to keep this robust. # could change. We should formalize these traces to keep this robust.
OverheadTraceCategory = "trace_event_overhead" OverheadTraceCategory = "trace_event_overhead"
OverheadTraceName = "overhead" OverheadTraceName = "overhead"
FrameTraceName = "LayerTreeHostImpl::DrawLayers" FrameTraceName = "GenerateCompositorFrame"
FrameTraceThreadName = "renderer_compositor" FrameTraceThreadName = "renderer_compositor"
IntervalNames = ["frame", "second"] IntervalNames = ["frame", "second"]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment