Skip to content

Commit

Permalink
Refactoring the way begin frame sources inside scheduler work.
Browse files Browse the repository at this point in the history
This change;
 * Makes non-vsync aligned rendering just another begin frame source.
 * Makes it easier to add vsync/begin frame stabilisation / filtering in the future.

This CL no longer moves background ticking into the scheduler rather than the LayerTreeHostImpl, that will occur in a later CL.

BUG=345459

Review URL: https://codereview.chromium.org/267783004

Cr-Commit-Position: refs/heads/master@{#297389}
  • Loading branch information
mithro authored and Commit bot committed Sep 30, 2014
1 parent c6d9433 commit c34fc0b
Show file tree
Hide file tree
Showing 27 changed files with 2,163 additions and 416 deletions.
4 changes: 4 additions & 0 deletions cc/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ component("cc") {
"output/software_renderer.h",
"output/viewport_selection_bound.cc",
"output/viewport_selection_bound.h",
"output/vsync_parameter_observer.h",
"quads/checkerboard_draw_quad.cc",
"quads/checkerboard_draw_quad.h",
"quads/content_draw_quad_base.cc",
Expand Down Expand Up @@ -430,6 +431,8 @@ component("cc") {
"resources/video_resource_updater.h",
"resources/zero_copy_raster_worker_pool.cc",
"resources/zero_copy_raster_worker_pool.h",
"scheduler/begin_frame_source.cc",
"scheduler/begin_frame_source.h",
"scheduler/delay_based_time_source.cc",
"scheduler/delay_based_time_source.h",
"scheduler/draw_result.h",
Expand Down Expand Up @@ -733,6 +736,7 @@ test("cc_unittests") {
"resources/tile_manager_unittest.cc",
"resources/tile_priority_unittest.cc",
"resources/video_resource_updater_unittest.cc",
"scheduler/begin_frame_source_unittest.cc",
"scheduler/delay_based_time_source_unittest.cc",
"scheduler/scheduler_state_machine_unittest.cc",
"scheduler/scheduler_unittest.cc",
Expand Down
3 changes: 3 additions & 0 deletions cc/cc.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,7 @@
'output/software_renderer.h',
'output/viewport_selection_bound.cc',
'output/viewport_selection_bound.h',
'output/vsync_parameter_observer.h',
'quads/checkerboard_draw_quad.cc',
'quads/checkerboard_draw_quad.h',
'quads/content_draw_quad_base.cc',
Expand Down Expand Up @@ -458,6 +459,8 @@
'resources/video_resource_updater.h',
'resources/zero_copy_raster_worker_pool.cc',
'resources/zero_copy_raster_worker_pool.h',
'scheduler/begin_frame_source.cc',
'scheduler/begin_frame_source.h',
'scheduler/delay_based_time_source.cc',
'scheduler/delay_based_time_source.h',
'scheduler/draw_result.h',
Expand Down
1 change: 1 addition & 0 deletions cc/cc_tests.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
'resources/tile_manager_unittest.cc',
'resources/tile_priority_unittest.cc',
'resources/video_resource_updater_unittest.cc',
'scheduler/begin_frame_source_unittest.cc',
'scheduler/delay_based_time_source_unittest.cc',
'scheduler/scheduler_state_machine_unittest.cc',
'scheduler/scheduler_unittest.cc',
Expand Down
47 changes: 37 additions & 10 deletions cc/output/begin_frame_args.cc
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,35 @@
namespace cc {

BeginFrameArgs::BeginFrameArgs()
: frame_time(base::TimeTicks()),
deadline(base::TimeTicks()),
interval(base::TimeDelta::FromMicroseconds(-1)) {
: 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)
: frame_time(frame_time),
deadline(deadline),
interval(interval)
{}
base::TimeDelta interval,
BeginFrameArgs::BeginFrameArgsType type)
: frame_time(frame_time),
deadline(deadline),
interval(interval),
type(type) {
}

BeginFrameArgs BeginFrameArgs::CreateTyped(
base::TimeTicks frame_time,
base::TimeTicks deadline,
base::TimeDelta interval,
BeginFrameArgs::BeginFrameArgsType type) {
DCHECK_NE(type, BeginFrameArgs::INVALID);
return BeginFrameArgs(frame_time, deadline, interval, type);
}

BeginFrameArgs BeginFrameArgs::Create(base::TimeTicks frame_time,
base::TimeTicks deadline,
base::TimeDelta interval) {
return BeginFrameArgs(frame_time, deadline, interval);
return CreateTyped(frame_time, deadline, interval, BeginFrameArgs::NORMAL);
}

scoped_refptr<base::debug::ConvertableToTraceFormat> BeginFrameArgs::AsValue()
Expand All @@ -39,6 +51,20 @@ scoped_refptr<base::debug::ConvertableToTraceFormat> BeginFrameArgs::AsValue()

void BeginFrameArgs::AsValueInto(base::debug::TracedValue* state) const {
state->SetString("type", "BeginFrameArgs");
switch (type) {
case BeginFrameArgs::INVALID:
state->SetString("subtype", "INVALID");
break;
case BeginFrameArgs::NORMAL:
state->SetString("subtype", "NORMAL");
break;
case BeginFrameArgs::SYNCHRONOUS:
state->SetString("subtype", "SYNCHRONOUS");
break;
case BeginFrameArgs::MISSED:
state->SetString("subtype", "MISSED");
break;
}
state->SetDouble("frame_time_us", frame_time.ToInternalValue());
state->SetDouble("deadline_us", deadline.ToInternalValue());
state->SetDouble("interval_us", interval.InMicroseconds());
Expand All @@ -50,7 +76,8 @@ BeginFrameArgs BeginFrameArgs::CreateForSynchronousCompositor(
// 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());
return CreateTyped(
now, base::TimeTicks(), DefaultInterval(), BeginFrameArgs::SYNCHRONOUS);
}

// This is a hard-coded deadline adjustment that assumes 60Hz, to be used in
Expand Down
15 changes: 14 additions & 1 deletion cc/output/begin_frame_args.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ class TracedValue;
namespace cc {

struct CC_EXPORT BeginFrameArgs {
enum BeginFrameArgsType {
INVALID,
NORMAL,
SYNCHRONOUS,
MISSED,
};

// Creates an invalid set of values.
BeginFrameArgs();

Expand All @@ -28,6 +35,10 @@ struct CC_EXPORT BeginFrameArgs {
static BeginFrameArgs Create(base::TimeTicks frame_time,
base::TimeTicks deadline,
base::TimeDelta interval);
static BeginFrameArgs CreateTyped(base::TimeTicks frame_time,
base::TimeTicks deadline,
base::TimeDelta interval,
BeginFrameArgsType type);
static BeginFrameArgs CreateForSynchronousCompositor(
base::TimeTicks now = base::TimeTicks());

Expand All @@ -53,11 +64,13 @@ struct CC_EXPORT BeginFrameArgs {
base::TimeTicks frame_time;
base::TimeTicks deadline;
base::TimeDelta interval;
BeginFrameArgsType type;

private:
BeginFrameArgs(base::TimeTicks frame_time,
base::TimeTicks deadline,
base::TimeDelta interval);
base::TimeDelta interval,
BeginFrameArgsType type);
};

} // namespace cc
Expand Down
18 changes: 18 additions & 0 deletions cc/output/vsync_parameter_observer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Copyright 2014 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.

#ifndef CC_OUTPUT_VSYNC_PARAMETER_OBSERVER_H_
#define CC_OUTPUT_VSYNC_PARAMETER_OBSERVER_H_

#include "base/time/time.h"

// Interface for a class which observes the parameters regarding vsync
// information.
class VSyncParameterObserver {
public:
virtual void OnUpdateVSyncParameters(base::TimeTicks timebase,
base::TimeDelta interval) = 0;
};

#endif // CC_OUTPUT_VSYNC_PARAMETER_OBSERVER_H_
Loading

0 comments on commit c34fc0b

Please sign in to comment.