17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file. 47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/json/json_writer.h" 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/begin_frame_args.h" 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/frame_time.h" 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace cc { 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)BeginFrameArgs::BeginFrameArgs() 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : frame_time(base::TimeTicks()), 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) deadline(base::TimeTicks()), 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch interval(base::TimeDelta::FromMicroseconds(-1)) { 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)BeginFrameArgs::BeginFrameArgs(base::TimeTicks frame_time, 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::TimeTicks deadline, 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::TimeDelta interval) 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : frame_time(frame_time), 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) deadline(deadline), 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) interval(interval) 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){} 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)BeginFrameArgs BeginFrameArgs::Create(base::TimeTicks frame_time, 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::TimeTicks deadline, 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::TimeDelta interval) { 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return BeginFrameArgs(frame_time, deadline, interval); 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<base::Value> BeginFrameArgs::AsValue() const { 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) state->SetString("type", "BeginFrameArgs"); 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) state->SetDouble("frame_time_us", frame_time.ToInternalValue()); 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) state->SetDouble("deadline_us", deadline.ToInternalValue()); 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) state->SetDouble("interval_us", interval.InMicroseconds()); 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return state.PassAs<base::Value>(); 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)BeginFrameArgs BeginFrameArgs::CreateForSynchronousCompositor( 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks now) { 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For WebView/SynchronousCompositor, we always want to draw immediately, 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // so we set the deadline to 0 and guess that the interval is 16 milliseconds. 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (now.is_null()) 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) now = gfx::FrameTime::Now(); 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return BeginFrameArgs(now, base::TimeTicks(), DefaultInterval()); 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// This is a hard-coded deadline adjustment that assumes 60Hz, to be used in 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// cases where a good estimated draw time is not known. Using 1/3 of the vsync 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// as the default adjustment gives the Browser the last 1/3 of a frame to 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// produce output, the Renderer Impl thread the middle 1/3 of a frame to produce 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// ouput, and the Renderer Main thread the first 1/3 of a frame to produce 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// output. 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::TimeDelta BeginFrameArgs::DefaultEstimatedParentDrawTime() { 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return base::TimeDelta::FromMicroseconds(16666 / 3); 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::TimeDelta BeginFrameArgs::DefaultInterval() { 607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return base::TimeDelta::FromMicroseconds(16666); 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::TimeDelta BeginFrameArgs::DefaultRetroactiveBeginFramePeriod() { 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return base::TimeDelta::FromMicroseconds(4444); 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace cc 68