| // Copyright 2013 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 "cc/trees/latency_info_swap_promise_monitor.h" |
| |
| #include <stdint.h> |
| #include <memory> |
| #include <utility> |
| |
| #include "cc/trees/latency_info_swap_promise.h" |
| #include "cc/trees/layer_tree_host_impl.h" |
| #include "cc/trees/layer_tree_impl.h" |
| #include "cc/trees/swap_promise_manager.h" |
| |
| namespace { |
| |
| bool AddRenderingScheduledComponent(ui::LatencyInfo* latency_info, |
| bool on_main) { |
| ui::LatencyComponentType type = |
| on_main ? ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_MAIN_COMPONENT |
| : ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_IMPL_COMPONENT; |
| if (latency_info->FindLatency(type, nullptr)) |
| return false; |
| latency_info->AddLatencyNumber(type); |
| return true; |
| } |
| |
| } // namespace |
| |
| namespace cc { |
| |
| LatencyInfoSwapPromiseMonitor::LatencyInfoSwapPromiseMonitor( |
| ui::LatencyInfo* latency, |
| SwapPromiseManager* swap_promise_manager) |
| : latency_(latency), swap_promise_manager_(swap_promise_manager) { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_); |
| DCHECK(swap_promise_manager); |
| swap_promise_manager_->InsertLatencyInfoSwapPromiseMonitor(this); |
| } |
| |
| LatencyInfoSwapPromiseMonitor::LatencyInfoSwapPromiseMonitor( |
| ui::LatencyInfo* latency, |
| LayerTreeHostImpl* host_impl) |
| : latency_(latency), host_impl_(host_impl) { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(impl_sequence_checker_); |
| DCHECK(host_impl); |
| host_impl_->InsertLatencyInfoSwapPromiseMonitor(this); |
| } |
| |
| LatencyInfoSwapPromiseMonitor::~LatencyInfoSwapPromiseMonitor() { |
| if (swap_promise_manager_) { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_); |
| swap_promise_manager_->RemoveLatencyInfoSwapPromiseMonitor(this); |
| } else if (host_impl_) { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(impl_sequence_checker_); |
| host_impl_->RemoveLatencyInfoSwapPromiseMonitor(this); |
| } |
| } |
| |
| void LatencyInfoSwapPromiseMonitor::OnSetNeedsCommitOnMain() { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_); |
| if (AddRenderingScheduledComponent(latency_, true /* on_main */)) { |
| std::unique_ptr<SwapPromise> swap_promise( |
| new LatencyInfoSwapPromise(*latency_)); |
| swap_promise_manager_->QueueSwapPromise(std::move(swap_promise)); |
| } |
| } |
| |
| void LatencyInfoSwapPromiseMonitor::OnSetNeedsRedrawOnImpl() { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(impl_sequence_checker_); |
| if (AddRenderingScheduledComponent(latency_, false /* on_main */)) { |
| std::unique_ptr<SwapPromise> swap_promise( |
| new LatencyInfoSwapPromise(*latency_)); |
| // Queue a pinned swap promise on the active tree. This will allow |
| // measurement of the time to the next SwapBuffers(). The swap |
| // promise is pinned so that it is not interrupted by new incoming |
| // activations (which would otherwise break the swap promise). |
| host_impl_->active_tree()->QueuePinnedSwapPromise(std::move(swap_promise)); |
| } |
| } |
| |
| } // namespace cc |