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() {
base::ElapsedTimer aggregate_timer;
CompositorFrame frame = aggregator_->Aggregate(
current_surface_id_, scheduler_ ? scheduler_->current_frame_display_time()
: base::TimeTicks::Now());
current_surface_id_,
scheduler_ ? scheduler_->current_frame_display_time()
: base::TimeTicks::Now(),
++swapped_trace_id_);
UMA_HISTOGRAM_COUNTS_1M("Compositing.SurfaceAggregator.AggregateUs",
aggregate_timer.Elapsed().InMicroseconds());
......@@ -293,6 +295,9 @@ bool Display::DrawAndSwap() {
return false;
}
TRACE_EVENT_ASYNC_BEGIN0("viz", "Graphics.Pipeline.DrawAndSwap",
swapped_trace_id_);
// Run callbacks early to allow pipelining and collect presented callbacks.
for (const auto& surface_id : surfaces_to_ack_on_next_draw_) {
Surface* surface = surface_manager_->GetSurfaceForId(surface_id);
......@@ -336,6 +341,8 @@ bool Display::DrawAndSwap() {
client_->DisplayWillDrawAndSwap(should_draw, frame.render_pass_list);
if (should_draw) {
TRACE_EVENT_ASYNC_STEP_INTO0("viz", "Graphics.Pipeline.DrawAndSwap",
swapped_trace_id_, "Draw");
if (settings_.enable_draw_occlusion) {
base::ElapsedTimer draw_occlusion_timer;
RemoveOverdrawQuads(&frame);
......@@ -371,6 +378,8 @@ bool Display::DrawAndSwap() {
bool should_swap = should_draw && size_matches;
if (should_swap) {
TRACE_EVENT_ASYNC_STEP_INTO0("viz", "Graphics.Pipeline.DrawAndSwap",
swapped_trace_id_, "Swap");
swapped_since_resize_ = true;
if (scheduler_) {
......@@ -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_) {
scheduler_->DidSwapBuffers();
scheduler_->DidReceiveSwapBuffersAck();
}
}
TRACE_EVENT_ASYNC_STEP_INTO0("viz", "Graphics.Pipeline.DrawAndSwap",
swapped_trace_id_, "WaitForAck");
client_->DisplayDidDrawAndSwap();
......@@ -438,6 +452,9 @@ bool Display::DrawAndSwap() {
}
void Display::DidReceiveSwapBuffersAck() {
++last_acked_trace_id_;
TRACE_EVENT_ASYNC_END0("viz", "Graphics.Pipeline.DrawAndSwap",
last_acked_trace_id_);
if (scheduler_)
scheduler_->DidReceiveSwapBuffersAck();
if (renderer_)
......
......@@ -171,7 +171,9 @@ class VIZ_SERVICE_EXPORT Display : public DisplaySchedulerClient,
base::circular_deque<std::vector<Surface::PresentedCallback>>
pending_presented_callbacks_;
private:
int32_t swapped_trace_id_ = 0;
int32_t last_acked_trace_id_ = 0;
DISALLOW_COPY_AND_ASSIGN(Display);
};
......
......@@ -8,6 +8,7 @@
#include <map>
#include "base/auto_reset.h"
#include "base/bind.h"
#include "base/containers/adapters.h"
#include "base/logging.h"
......@@ -303,11 +304,11 @@ void SurfaceAggregator::EmitSurfaceContent(
++uma_stats_.valid_surface;
const CompositorFrame& frame = surface->GetActiveFrame();
TRACE_EVENT_WITH_FLOW1(
TRACE_EVENT_WITH_FLOW2(
"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");
"SurfaceAggregation", "display_trace", display_trace_id_);
if (ignore_undamaged) {
gfx::Transform quad_to_target_transform(
......@@ -1150,7 +1151,8 @@ void SurfaceAggregator::PropagateCopyRequestPasses() {
CompositorFrame SurfaceAggregator::Aggregate(
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());
uma_stats_.Reset();
......@@ -1167,12 +1169,14 @@ CompositorFrame SurfaceAggregator::Aggregate(
if (!surface->HasActiveFrame())
return {};
base::AutoReset<int32_t> reset_display_trace_id(&display_trace_id_,
display_trace_id);
const CompositorFrame& root_surface_frame = surface->GetActiveFrame();
TRACE_EVENT_WITH_FLOW1(
TRACE_EVENT_WITH_FLOW2(
"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");
"SurfaceAggregation", "display_trace", display_trace_id_);
CompositorFrame frame;
......
......@@ -38,7 +38,8 @@ class VIZ_SERVICE_EXPORT SurfaceAggregator {
~SurfaceAggregator();
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);
const SurfaceIndexMap& previous_contained_surfaces() const {
return previous_contained_surfaces_;
......@@ -280,6 +281,8 @@ class VIZ_SERVICE_EXPORT SurfaceAggregator {
base::flat_map<FrameSinkId, std::pair<LocalSurfaceId, LocalSurfaceId>>
damage_ranges_;
int32_t display_trace_id_ = -1;
base::WeakPtrFactory<SurfaceAggregator> weak_factory_;
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