// 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 "base/json/json_writer.h" #include "cc/output/begin_frame_args.h" #include "ui/gfx/frame_time.h" namespace cc { BeginFrameArgs::BeginFrameArgs() : frame_time(base::TimeTicks()), deadline(base::TimeTicks()), interval(base::TimeDelta::FromMicroseconds(-1)) { } BeginFrameArgs::BeginFrameArgs(base::TimeTicks frame_time, base::TimeTicks deadline, base::TimeDelta interval) : frame_time(frame_time), deadline(deadline), interval(interval) {} BeginFrameArgs BeginFrameArgs::Create(base::TimeTicks frame_time, base::TimeTicks deadline, base::TimeDelta interval) { return BeginFrameArgs(frame_time, deadline, interval); } scoped_ptr BeginFrameArgs::AsValue() const { scoped_ptr state(new base::DictionaryValue); state->SetString("type", "BeginFrameArgs"); state->SetDouble("frame_time_us", frame_time.ToInternalValue()); state->SetDouble("deadline_us", deadline.ToInternalValue()); state->SetDouble("interval_us", interval.InMicroseconds()); return state.PassAs(); } BeginFrameArgs BeginFrameArgs::CreateForSynchronousCompositor( base::TimeTicks now) { // For WebView/SynchronousCompositor, we always want to draw immediately, // so we set the deadline to 0 and guess that the interval is 16 milliseconds. if (now.is_null()) now = gfx::FrameTime::Now(); return BeginFrameArgs(now, base::TimeTicks(), DefaultInterval()); } // This is a hard-coded deadline adjustment that assumes 60Hz, to be used in // cases where a good estimated draw time is not known. Using 1/3 of the vsync // as the default adjustment gives the Browser the last 1/3 of a frame to // produce output, the Renderer Impl thread the middle 1/3 of a frame to produce // ouput, and the Renderer Main thread the first 1/3 of a frame to produce // output. base::TimeDelta BeginFrameArgs::DefaultDeadlineAdjustment() { return base::TimeDelta::FromMicroseconds(-16666 / 3); } base::TimeDelta BeginFrameArgs::DefaultInterval() { return base::TimeDelta::FromMicroseconds(16666); } base::TimeDelta BeginFrameArgs::DefaultRetroactiveBeginFramePeriod() { return base::TimeDelta::FromMicroseconds(4444); } } // namespace cc