| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/metrics/time_to_first_present_recorder.h" |
| |
| #include "base/bind.h" |
| #include "base/bind_helpers.h" |
| #include "base/metrics/histogram_macros.h" |
| #include "base/time/time.h" |
| #include "ui/aura/window.h" |
| #include "ui/aura/window_tree_host.h" |
| #include "ui/compositor/compositor.h" |
| #include "ui/gfx/presentation_feedback.h" |
| |
| namespace ash { |
| |
| TimeToFirstPresentRecorder::TimeToFirstPresentRecorder(aura::Window* window) { |
| aura::WindowTreeHost* window_tree_host = window->GetHost(); |
| DCHECK(window_tree_host); |
| window_tree_host->compositor()->RequestPresentationTimeForNextFrame( |
| base::BindOnce(&TimeToFirstPresentRecorder::DidPresentCompositorFrame, |
| base::Unretained(this))); |
| } |
| |
| TimeToFirstPresentRecorder::~TimeToFirstPresentRecorder() = default; |
| |
| void TimeToFirstPresentRecorder::Bind( |
| mojom::ProcessCreationTimeRecorderRequest request) { |
| // Process createion time should only be set once. |
| if (binding_.is_bound() || !process_creation_time_.is_null()) |
| return; |
| |
| binding_.Bind(std::move(request)); |
| } |
| |
| void TimeToFirstPresentRecorder::SetMainProcessCreationTime( |
| base::TimeTicks start_time) { |
| if (!process_creation_time_.is_null()) |
| return; |
| |
| process_creation_time_ = start_time; |
| LogTime(); |
| |
| // Process creation time should be set only once. |
| binding_.Close(); |
| } |
| |
| void TimeToFirstPresentRecorder::LogTime() { |
| if (present_time_.is_null() || process_creation_time_.is_null()) |
| return; |
| |
| UMA_HISTOGRAM_TIMES("Ash.ProcessCreationToFirstPresent", |
| time_to_first_present()); |
| if (log_callback_) |
| std::move(log_callback_).Run(); |
| } |
| |
| void TimeToFirstPresentRecorder::DidPresentCompositorFrame( |
| const gfx::PresentationFeedback& feedback) { |
| DCHECK(present_time_.is_null()); // This should only be called once. |
| present_time_ = feedback.timestamp; |
| LogTime(); |
| } |
| |
| } // namespace ash |