1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/output/begin_frame_args.h"
7 #include "base/debug/trace_event_argument.h"
8 #include "ui/gfx/frame_time.h"
12 BeginFrameArgs::BeginFrameArgs()
13 : frame_time(base::TimeTicks()),
14 deadline(base::TimeTicks()),
15 interval(base::TimeDelta::FromMicroseconds(-1)),
16 type(BeginFrameArgs::INVALID
) {
19 BeginFrameArgs::BeginFrameArgs(base::TimeTicks frame_time
,
20 base::TimeTicks deadline
,
21 base::TimeDelta interval
,
22 BeginFrameArgs::BeginFrameArgsType type
)
23 : frame_time(frame_time
),
29 BeginFrameArgs
BeginFrameArgs::CreateTyped(
30 base::TimeTicks frame_time
,
31 base::TimeTicks deadline
,
32 base::TimeDelta interval
,
33 BeginFrameArgs::BeginFrameArgsType type
) {
34 DCHECK_NE(type
, BeginFrameArgs::INVALID
);
35 return BeginFrameArgs(frame_time
, deadline
, interval
, type
);
38 BeginFrameArgs
BeginFrameArgs::Create(base::TimeTicks frame_time
,
39 base::TimeTicks deadline
,
40 base::TimeDelta interval
) {
41 return CreateTyped(frame_time
, deadline
, interval
, BeginFrameArgs::NORMAL
);
44 scoped_refptr
<base::debug::ConvertableToTraceFormat
> BeginFrameArgs::AsValue()
46 scoped_refptr
<base::debug::TracedValue
> state
=
47 new base::debug::TracedValue();
48 AsValueInto(state
.get());
52 void BeginFrameArgs::AsValueInto(base::debug::TracedValue
* state
) const {
53 state
->SetString("type", "BeginFrameArgs");
55 case BeginFrameArgs::INVALID
:
56 state
->SetString("subtype", "INVALID");
58 case BeginFrameArgs::NORMAL
:
59 state
->SetString("subtype", "NORMAL");
61 case BeginFrameArgs::SYNCHRONOUS
:
62 state
->SetString("subtype", "SYNCHRONOUS");
64 case BeginFrameArgs::MISSED
:
65 state
->SetString("subtype", "MISSED");
68 state
->SetDouble("frame_time_us", frame_time
.ToInternalValue());
69 state
->SetDouble("deadline_us", deadline
.ToInternalValue());
70 state
->SetDouble("interval_us", interval
.InMicroseconds());
73 BeginFrameArgs
BeginFrameArgs::CreateForSynchronousCompositor(
74 base::TimeTicks now
) {
75 // For WebView/SynchronousCompositor, we always want to draw immediately,
76 // so we set the deadline to 0 and guess that the interval is 16 milliseconds.
78 now
= gfx::FrameTime::Now();
80 now
, base::TimeTicks(), DefaultInterval(), BeginFrameArgs::SYNCHRONOUS
);
83 // This is a hard-coded deadline adjustment that assumes 60Hz, to be used in
84 // cases where a good estimated draw time is not known. Using 1/3 of the vsync
85 // as the default adjustment gives the Browser the last 1/3 of a frame to
86 // produce output, the Renderer Impl thread the middle 1/3 of a frame to produce
87 // ouput, and the Renderer Main thread the first 1/3 of a frame to produce
89 base::TimeDelta
BeginFrameArgs::DefaultEstimatedParentDrawTime() {
90 return base::TimeDelta::FromMicroseconds(16666 / 3);
93 base::TimeDelta
BeginFrameArgs::DefaultInterval() {
94 return base::TimeDelta::FromMicroseconds(16666);
97 base::TimeDelta
BeginFrameArgs::DefaultRetroactiveBeginFramePeriod() {
98 return base::TimeDelta::FromMicroseconds(4444);