Index: cc/output/begin_frame_args.cc |
diff --git a/cc/output/begin_frame_args.cc b/cc/output/begin_frame_args.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3663125715eaad0304f462087063f57e082508ec |
--- /dev/null |
+++ b/cc/output/begin_frame_args.cc |
@@ -0,0 +1,95 @@ |
+// 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 "cc/output/begin_frame_args.h" |
+ |
+#include "base/trace_event/trace_event_argument.h" |
+#include "ui/gfx/frame_time.h" |
+ |
+namespace cc { |
+ |
+const char* BeginFrameArgs::TypeToString(BeginFrameArgsType type) { |
+ switch (type) { |
+ case BeginFrameArgs::INVALID: |
+ return "INVALID"; |
+ case BeginFrameArgs::NORMAL: |
+ return "NORMAL"; |
+ case BeginFrameArgs::SYNCHRONOUS: |
+ return "SYNCHRONOUS"; |
+ case BeginFrameArgs::MISSED: |
+ return "MISSED"; |
+ case BeginFrameArgs::BEGIN_FRAME_ARGS_TYPE_MAX: |
+ return "BEGIN_FRAME_ARGS_TYPE_MAX"; |
+ } |
+ NOTREACHED(); |
+ return "???"; |
+} |
+ |
+BeginFrameArgs::BeginFrameArgs() |
+ : frame_time(base::TimeTicks()), |
+ deadline(base::TimeTicks()), |
+ interval(base::TimeDelta::FromMicroseconds(-1)), |
+ type(BeginFrameArgs::INVALID) { |
+} |
+ |
+BeginFrameArgs::BeginFrameArgs(base::TimeTicks frame_time, |
+ base::TimeTicks deadline, |
+ base::TimeDelta interval, |
+ BeginFrameArgs::BeginFrameArgsType type) |
+ : frame_time(frame_time), |
+ deadline(deadline), |
+ interval(interval), |
+ type(type) { |
+} |
+ |
+BeginFrameArgs BeginFrameArgs::Create(BeginFrameArgs::CreationLocation location, |
+ base::TimeTicks frame_time, |
+ base::TimeTicks deadline, |
+ base::TimeDelta interval, |
+ BeginFrameArgs::BeginFrameArgsType type) { |
+ DCHECK_NE(type, BeginFrameArgs::INVALID); |
+ DCHECK_NE(type, BeginFrameArgs::BEGIN_FRAME_ARGS_TYPE_MAX); |
+#ifdef NDEBUG |
+ return BeginFrameArgs(frame_time, deadline, interval, type); |
+#else |
+ BeginFrameArgs args = BeginFrameArgs(frame_time, deadline, interval, type); |
+ args.created_from = location; |
+ return args; |
+#endif |
+} |
+ |
+scoped_refptr<base::trace_event::ConvertableToTraceFormat> |
+BeginFrameArgs::AsValue() const { |
+ scoped_refptr<base::trace_event::TracedValue> state = |
+ new base::trace_event::TracedValue(); |
+ AsValueInto(state.get()); |
+ return state; |
+} |
+ |
+void BeginFrameArgs::AsValueInto(base::trace_event::TracedValue* state) const { |
+ state->SetString("type", "BeginFrameArgs"); |
+ state->SetString("subtype", TypeToString(type)); |
+ state->SetDouble("frame_time_us", frame_time.ToInternalValue()); |
+ state->SetDouble("deadline_us", deadline.ToInternalValue()); |
+ state->SetDouble("interval_us", interval.InMicroseconds()); |
+#ifndef NDEBUG |
+ state->SetString("created_from", created_from.ToString()); |
+#endif |
+} |
+ |
+// 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::DefaultEstimatedParentDrawTime() { |
+ return base::TimeDelta::FromMicroseconds(16666 / 3); |
+} |
+ |
+base::TimeDelta BeginFrameArgs::DefaultInterval() { |
+ return base::TimeDelta::FromMicroseconds(16666); |
+} |
+ |
+} // namespace cc |