1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file. 4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/base/latency_info_swap_promise_monitor.h" 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/threading/platform_thread.h" 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/base/latency_info_swap_promise.h" 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/trees/layer_tree_host.h" 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace { 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool AddRenderingScheduledComponent(ui::LatencyInfo* latency_info) { 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (latency_info->FindLatency( 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_COMPONENT, 0, NULL)) 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) latency_info->AddLatencyNumber( 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::INPUT_EVENT_LATENCY_RENDERING_SCHEDULED_COMPONENT, 0, 0); 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return true; 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool AddForwardingScrollUpdateToMainComponent(ui::LatencyInfo* latency_info) { 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (latency_info->FindLatency( 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT, 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 0, 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NULL)) 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) latency_info->AddLatencyNumber( 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT, 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 0, 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) latency_info->trace_id); 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return true; 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace cc { 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)LatencyInfoSwapPromiseMonitor::LatencyInfoSwapPromiseMonitor( 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::LatencyInfo* latency, 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LayerTreeHost* layer_tree_host, 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LayerTreeHostImpl* layer_tree_host_impl) 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : SwapPromiseMonitor(layer_tree_host, layer_tree_host_impl), 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) latency_(latency) {} 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)LatencyInfoSwapPromiseMonitor::~LatencyInfoSwapPromiseMonitor() {} 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LatencyInfoSwapPromiseMonitor::OnSetNeedsCommitOnMain() { 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (AddRenderingScheduledComponent(latency_)) { 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<SwapPromise> swap_promise(new LatencyInfoSwapPromise(*latency_)); 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_tree_host_->QueueSwapPromise(swap_promise.Pass()); 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void LatencyInfoSwapPromiseMonitor::OnSetNeedsRedrawOnImpl() { 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (AddRenderingScheduledComponent(latency_)) { 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<SwapPromise> swap_promise(new LatencyInfoSwapPromise(*latency_)); 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_tree_host_impl_->active_tree()->QueueSwapPromise(swap_promise.Pass()); 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void LatencyInfoSwapPromiseMonitor::OnForwardScrollUpdateToMainThreadOnImpl() { 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (AddForwardingScrollUpdateToMainComponent(latency_)) { 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int64 new_sequence_number = 0; 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) for (ui::LatencyInfo::LatencyMap::const_iterator it = 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) latency_->latency_components.begin(); 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) it != latency_->latency_components.end(); 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ++it) { 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (it->first.first == ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT) { 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new_sequence_number = 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) (static_cast<int64>(base::PlatformThread::CurrentId()) << 32) | 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) (it->second.sequence_number & 0xffffffff); 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(new_sequence_number != it->second.sequence_number); 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) break; 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!new_sequence_number) 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return; 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::LatencyInfo new_latency; 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new_latency.AddLatencyNumber( 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::INPUT_EVENT_LATENCY_BEGIN_SCROLL_UPDATE_MAIN_COMPONENT, 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 0, 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new_sequence_number); 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new_latency.TraceEventType("ScrollUpdate"); 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new_latency.CopyLatencyFrom( 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) *latency_, 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT); 906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<SwapPromise> swap_promise( 916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new LatencyInfoSwapPromise(new_latency)); 926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) layer_tree_host_impl_->QueueSwapPromiseForMainThreadScrollUpdate( 936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) swap_promise.Pass()); 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace cc 98