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