Commit 0723e43e authored by Sadrul Habib Chowdhury's avatar Sadrul Habib Chowdhury Committed by Commit Bot

viz: Additional traces for compositing pipeline.

Add some trace-events for the draw operation, and include breakdown
steps for draw, swap, and wait-for-ack. Link these trace-events from
the surface-aggregation trace-events for various surfaces, so that it
is possible to track all the way from begin-frame to swap-ack (and
later, presentation-time, when we request that for every frame).

BUG=855328

Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel
Change-Id: I319b551a46a0e3f9039ae5250a6b421079cb9b71
Reviewed-on: https://chromium-review.googlesource.com/1153494Reviewed-by: default avatarFady Samuel <fsamuel@chromium.org>
Commit-Queue: Sadrul Chowdhury <sadrul@chromium.org>
Cr-Commit-Position: refs/heads/master@{#579534}
parent 34e603cf
...@@ -282,8 +282,10 @@ bool Display::DrawAndSwap() { ...@@ -282,8 +282,10 @@ bool Display::DrawAndSwap() {
base::ElapsedTimer aggregate_timer; base::ElapsedTimer aggregate_timer;
CompositorFrame frame = aggregator_->Aggregate( CompositorFrame frame = aggregator_->Aggregate(
current_surface_id_, scheduler_ ? scheduler_->current_frame_display_time() current_surface_id_,
: base::TimeTicks::Now()); scheduler_ ? scheduler_->current_frame_display_time()
: base::TimeTicks::Now(),
++swapped_trace_id_);
UMA_HISTOGRAM_COUNTS_1M("Compositing.SurfaceAggregator.AggregateUs", UMA_HISTOGRAM_COUNTS_1M("Compositing.SurfaceAggregator.AggregateUs",
aggregate_timer.Elapsed().InMicroseconds()); aggregate_timer.Elapsed().InMicroseconds());
...@@ -293,6 +295,9 @@ bool Display::DrawAndSwap() { ...@@ -293,6 +295,9 @@ bool Display::DrawAndSwap() {
return false; return false;
} }
TRACE_EVENT_ASYNC_BEGIN0("viz", "Graphics.Pipeline.DrawAndSwap",
swapped_trace_id_);
// Run callbacks early to allow pipelining and collect presented callbacks. // Run callbacks early to allow pipelining and collect presented callbacks.
for (const auto& surface_id : surfaces_to_ack_on_next_draw_) { for (const auto& surface_id : surfaces_to_ack_on_next_draw_) {
Surface* surface = surface_manager_->GetSurfaceForId(surface_id); Surface* surface = surface_manager_->GetSurfaceForId(surface_id);
...@@ -336,6 +341,8 @@ bool Display::DrawAndSwap() { ...@@ -336,6 +341,8 @@ bool Display::DrawAndSwap() {
client_->DisplayWillDrawAndSwap(should_draw, frame.render_pass_list); client_->DisplayWillDrawAndSwap(should_draw, frame.render_pass_list);
if (should_draw) { if (should_draw) {
TRACE_EVENT_ASYNC_STEP_INTO0("viz", "Graphics.Pipeline.DrawAndSwap",
swapped_trace_id_, "Draw");
if (settings_.enable_draw_occlusion) { if (settings_.enable_draw_occlusion) {
base::ElapsedTimer draw_occlusion_timer; base::ElapsedTimer draw_occlusion_timer;
RemoveOverdrawQuads(&frame); RemoveOverdrawQuads(&frame);
...@@ -371,6 +378,8 @@ bool Display::DrawAndSwap() { ...@@ -371,6 +378,8 @@ bool Display::DrawAndSwap() {
bool should_swap = should_draw && size_matches; bool should_swap = should_draw && size_matches;
if (should_swap) { if (should_swap) {
TRACE_EVENT_ASYNC_STEP_INTO0("viz", "Graphics.Pipeline.DrawAndSwap",
swapped_trace_id_, "Swap");
swapped_since_resize_ = true; swapped_since_resize_ = true;
if (scheduler_) { if (scheduler_) {
...@@ -421,11 +430,16 @@ bool Display::DrawAndSwap() { ...@@ -421,11 +430,16 @@ bool Display::DrawAndSwap() {
} }
} }
++last_acked_trace_id_;
TRACE_EVENT_ASYNC_END0("viz", "Graphics.Pipeline.DrawAndSwap",
last_acked_trace_id_);
if (scheduler_) { if (scheduler_) {
scheduler_->DidSwapBuffers(); scheduler_->DidSwapBuffers();
scheduler_->DidReceiveSwapBuffersAck(); scheduler_->DidReceiveSwapBuffersAck();
} }
} }
TRACE_EVENT_ASYNC_STEP_INTO0("viz", "Graphics.Pipeline.DrawAndSwap",
swapped_trace_id_, "WaitForAck");
client_->DisplayDidDrawAndSwap(); client_->DisplayDidDrawAndSwap();
...@@ -438,6 +452,9 @@ bool Display::DrawAndSwap() { ...@@ -438,6 +452,9 @@ bool Display::DrawAndSwap() {
} }
void Display::DidReceiveSwapBuffersAck() { void Display::DidReceiveSwapBuffersAck() {
++last_acked_trace_id_;
TRACE_EVENT_ASYNC_END0("viz", "Graphics.Pipeline.DrawAndSwap",
last_acked_trace_id_);
if (scheduler_) if (scheduler_)
scheduler_->DidReceiveSwapBuffersAck(); scheduler_->DidReceiveSwapBuffersAck();
if (renderer_) if (renderer_)
......
...@@ -171,7 +171,9 @@ class VIZ_SERVICE_EXPORT Display : public DisplaySchedulerClient, ...@@ -171,7 +171,9 @@ class VIZ_SERVICE_EXPORT Display : public DisplaySchedulerClient,
base::circular_deque<std::vector<Surface::PresentedCallback>> base::circular_deque<std::vector<Surface::PresentedCallback>>
pending_presented_callbacks_; pending_presented_callbacks_;
private: int32_t swapped_trace_id_ = 0;
int32_t last_acked_trace_id_ = 0;
DISALLOW_COPY_AND_ASSIGN(Display); DISALLOW_COPY_AND_ASSIGN(Display);
}; };
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <map> #include <map>
#include "base/auto_reset.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/containers/adapters.h" #include "base/containers/adapters.h"
#include "base/logging.h" #include "base/logging.h"
...@@ -303,11 +304,11 @@ void SurfaceAggregator::EmitSurfaceContent( ...@@ -303,11 +304,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( TRACE_EVENT_WITH_FLOW2(
"viz,benchmark", "Graphics.Pipeline", "viz,benchmark", "Graphics.Pipeline",
TRACE_ID_GLOBAL(frame.metadata.begin_frame_ack.trace_id), TRACE_ID_GLOBAL(frame.metadata.begin_frame_ack.trace_id),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step", TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step",
"SurfaceAggregation"); "SurfaceAggregation", "display_trace", display_trace_id_);
if (ignore_undamaged) { if (ignore_undamaged) {
gfx::Transform quad_to_target_transform( gfx::Transform quad_to_target_transform(
...@@ -1150,7 +1151,8 @@ void SurfaceAggregator::PropagateCopyRequestPasses() { ...@@ -1150,7 +1151,8 @@ void SurfaceAggregator::PropagateCopyRequestPasses() {
CompositorFrame SurfaceAggregator::Aggregate( CompositorFrame SurfaceAggregator::Aggregate(
const SurfaceId& surface_id, const SurfaceId& surface_id,
base::TimeTicks expected_display_time) { base::TimeTicks expected_display_time,
int32_t display_trace_id) {
DCHECK(!expected_display_time.is_null()); DCHECK(!expected_display_time.is_null());
uma_stats_.Reset(); uma_stats_.Reset();
...@@ -1167,12 +1169,14 @@ CompositorFrame SurfaceAggregator::Aggregate( ...@@ -1167,12 +1169,14 @@ CompositorFrame SurfaceAggregator::Aggregate(
if (!surface->HasActiveFrame()) if (!surface->HasActiveFrame())
return {}; return {};
base::AutoReset<int32_t> reset_display_trace_id(&display_trace_id_,
display_trace_id);
const CompositorFrame& root_surface_frame = surface->GetActiveFrame(); const CompositorFrame& root_surface_frame = surface->GetActiveFrame();
TRACE_EVENT_WITH_FLOW1( TRACE_EVENT_WITH_FLOW2(
"viz,benchmark", "Graphics.Pipeline", "viz,benchmark", "Graphics.Pipeline",
TRACE_ID_GLOBAL(root_surface_frame.metadata.begin_frame_ack.trace_id), TRACE_ID_GLOBAL(root_surface_frame.metadata.begin_frame_ack.trace_id),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step", TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step",
"SurfaceAggregation"); "SurfaceAggregation", "display_trace", display_trace_id_);
CompositorFrame frame; CompositorFrame frame;
......
...@@ -38,7 +38,8 @@ class VIZ_SERVICE_EXPORT SurfaceAggregator { ...@@ -38,7 +38,8 @@ class VIZ_SERVICE_EXPORT SurfaceAggregator {
~SurfaceAggregator(); ~SurfaceAggregator();
CompositorFrame Aggregate(const SurfaceId& surface_id, CompositorFrame Aggregate(const SurfaceId& surface_id,
base::TimeTicks expected_display_time); base::TimeTicks expected_display_time,
int32_t display_trace_id = -1);
void ReleaseResources(const SurfaceId& surface_id); void ReleaseResources(const SurfaceId& surface_id);
const SurfaceIndexMap& previous_contained_surfaces() const { const SurfaceIndexMap& previous_contained_surfaces() const {
return previous_contained_surfaces_; return previous_contained_surfaces_;
...@@ -280,6 +281,8 @@ class VIZ_SERVICE_EXPORT SurfaceAggregator { ...@@ -280,6 +281,8 @@ class VIZ_SERVICE_EXPORT SurfaceAggregator {
base::flat_map<FrameSinkId, std::pair<LocalSurfaceId, LocalSurfaceId>> base::flat_map<FrameSinkId, std::pair<LocalSurfaceId, LocalSurfaceId>>
damage_ranges_; damage_ranges_;
int32_t display_trace_id_ = -1;
base::WeakPtrFactory<SurfaceAggregator> weak_factory_; base::WeakPtrFactory<SurfaceAggregator> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(SurfaceAggregator); DISALLOW_COPY_AND_ASSIGN(SurfaceAggregator);
......
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