| Index: cc/output/output_surface.cc
|
| diff --git a/cc/output/output_surface.cc b/cc/output/output_surface.cc
|
| index 3aaa1a1768637829e2f5fe5dfdb3b9c221a0563c..7818849cc55facef5e5eb226a6d1c9d0b86347bd 100644
|
| --- a/cc/output/output_surface.cc
|
| +++ b/cc/output/output_surface.cc
|
| @@ -46,8 +46,8 @@ namespace cc {
|
| OutputSurface::OutputSurface(scoped_refptr<ContextProvider> context_provider)
|
| : context_provider_(context_provider),
|
| device_scale_factor_(-1),
|
| - max_frames_pending_(0),
|
| - pending_swap_buffers_(0),
|
| + begin_frame_interval_(BeginFrameArgs::DefaultInterval()),
|
| + throttle_frame_production_(true),
|
| needs_begin_frame_(false),
|
| client_ready_for_begin_frame_(true),
|
| client_(NULL),
|
| @@ -59,8 +59,8 @@ OutputSurface::OutputSurface(scoped_refptr<ContextProvider> context_provider)
|
| OutputSurface::OutputSurface(scoped_ptr<SoftwareOutputDevice> software_device)
|
| : software_device_(software_device.Pass()),
|
| device_scale_factor_(-1),
|
| - max_frames_pending_(0),
|
| - pending_swap_buffers_(0),
|
| + begin_frame_interval_(BeginFrameArgs::DefaultInterval()),
|
| + throttle_frame_production_(true),
|
| needs_begin_frame_(false),
|
| client_ready_for_begin_frame_(true),
|
| client_(NULL),
|
| @@ -74,8 +74,8 @@ OutputSurface::OutputSurface(scoped_refptr<ContextProvider> context_provider,
|
| : context_provider_(context_provider),
|
| software_device_(software_device.Pass()),
|
| device_scale_factor_(-1),
|
| - max_frames_pending_(0),
|
| - pending_swap_buffers_(0),
|
| + begin_frame_interval_(BeginFrameArgs::DefaultInterval()),
|
| + throttle_frame_production_(true),
|
| needs_begin_frame_(false),
|
| client_ready_for_begin_frame_(true),
|
| client_(NULL),
|
| @@ -84,37 +84,26 @@ OutputSurface::OutputSurface(scoped_refptr<ContextProvider> context_provider,
|
| weak_ptr_factory_(this),
|
| gpu_latency_history_(kGpuLatencyHistorySize) {}
|
|
|
| +void OutputSurface::SetThrottleFrameProduction(bool enable) {
|
| + DCHECK(!frame_rate_controller_);
|
| + throttle_frame_production_ = enable;
|
| +}
|
| +
|
| void OutputSurface::InitializeBeginFrameEmulation(
|
| base::SingleThreadTaskRunner* task_runner,
|
| - bool throttle_frame_production,
|
| base::TimeDelta interval) {
|
| - if (throttle_frame_production) {
|
| - scoped_refptr<DelayBasedTimeSource> time_source;
|
| - if (gfx::FrameTime::TimestampsAreHighRes())
|
| - time_source = DelayBasedTimeSourceHighRes::Create(interval, task_runner);
|
| - else
|
| - time_source = DelayBasedTimeSource::Create(interval, task_runner);
|
| - frame_rate_controller_.reset(new FrameRateController(time_source));
|
| - } else {
|
| - frame_rate_controller_.reset(new FrameRateController(task_runner));
|
| - }
|
| + DCHECK(throttle_frame_production_);
|
| + scoped_refptr<DelayBasedTimeSource> time_source;
|
| + if (gfx::FrameTime::TimestampsAreHighRes())
|
| + time_source = DelayBasedTimeSourceHighRes::Create(interval, task_runner);
|
| + else
|
| + time_source = DelayBasedTimeSource::Create(interval, task_runner);
|
| + frame_rate_controller_.reset(new FrameRateController(time_source));
|
|
|
| frame_rate_controller_->SetClient(this);
|
| - frame_rate_controller_->SetMaxSwapsPending(max_frames_pending_);
|
| frame_rate_controller_->SetDeadlineAdjustment(
|
| capabilities_.adjust_deadline_for_parent ?
|
| BeginFrameArgs::DefaultDeadlineAdjustment() : base::TimeDelta());
|
| -
|
| - // The new frame rate controller will consume the swap acks of the old
|
| - // frame rate controller, so we set that expectation up here.
|
| - for (int i = 0; i < pending_swap_buffers_; i++)
|
| - frame_rate_controller_->DidSwapBuffers();
|
| -}
|
| -
|
| -void OutputSurface::SetMaxFramesPending(int max_frames_pending) {
|
| - if (frame_rate_controller_)
|
| - frame_rate_controller_->SetMaxSwapsPending(max_frames_pending);
|
| - max_frames_pending_ = max_frames_pending;
|
| }
|
|
|
| void OutputSurface::CommitVSyncParameters(base::TimeTicks timebase,
|
| @@ -125,17 +114,14 @@ void OutputSurface::CommitVSyncParameters(base::TimeTicks timebase,
|
| (timebase - base::TimeTicks()).InSecondsF(),
|
| "interval",
|
| interval.InSecondsF());
|
| + begin_frame_interval_ = interval;
|
| if (frame_rate_controller_)
|
| frame_rate_controller_->SetTimebaseAndInterval(timebase, interval);
|
| }
|
|
|
| -void OutputSurface::FrameRateControllerTick(bool throttled,
|
| - const BeginFrameArgs& args) {
|
| +void OutputSurface::FrameRateControllerTick(const BeginFrameArgs& args) {
|
| DCHECK(frame_rate_controller_);
|
| - if (throttled)
|
| - skipped_begin_frame_args_ = args;
|
| - else
|
| - BeginFrame(args);
|
| + BeginFrame(args);
|
| }
|
|
|
| // Forwarded to OutputSurfaceClient
|
| @@ -148,25 +134,29 @@ void OutputSurface::SetNeedsBeginFrame(bool enable) {
|
| TRACE_EVENT1("cc", "OutputSurface::SetNeedsBeginFrame", "enable", enable);
|
| needs_begin_frame_ = enable;
|
| client_ready_for_begin_frame_ = true;
|
| - if (frame_rate_controller_) {
|
| + if (!throttle_frame_production_) {
|
| + if (enable) {
|
| + base::TimeTicks frame_time = gfx::FrameTime::Now();
|
| + base::TimeTicks deadline = frame_time + begin_frame_interval_;
|
| + skipped_begin_frame_args_ =
|
| + BeginFrameArgs::Create(frame_time, deadline, begin_frame_interval_);
|
| + }
|
| + } else if (frame_rate_controller_) {
|
| BeginFrameArgs skipped = frame_rate_controller_->SetActive(enable);
|
| if (skipped.IsValid())
|
| skipped_begin_frame_args_ = skipped;
|
| }
|
| +
|
| if (needs_begin_frame_)
|
| PostCheckForRetroactiveBeginFrame();
|
| }
|
|
|
| void OutputSurface::BeginFrame(const BeginFrameArgs& args) {
|
| - TRACE_EVENT2("cc",
|
| + TRACE_EVENT1("cc",
|
| "OutputSurface::BeginFrame",
|
| "client_ready_for_begin_frame_",
|
| - client_ready_for_begin_frame_,
|
| - "pending_swap_buffers_",
|
| - pending_swap_buffers_);
|
| - if (!needs_begin_frame_ || !client_ready_for_begin_frame_ ||
|
| - (pending_swap_buffers_ >= max_frames_pending_ &&
|
| - max_frames_pending_ > 0)) {
|
| + client_ready_for_begin_frame_);
|
| + if (!needs_begin_frame_ || !client_ready_for_begin_frame_) {
|
| skipped_begin_frame_args_ = args;
|
| } else {
|
| client_ready_for_begin_frame_ = false;
|
| @@ -201,28 +191,19 @@ void OutputSurface::PostCheckForRetroactiveBeginFrame() {
|
| void OutputSurface::CheckForRetroactiveBeginFrame() {
|
| TRACE_EVENT0("cc", "OutputSurface::CheckForRetroactiveBeginFrame");
|
| check_for_retroactive_begin_frame_pending_ = false;
|
| - if (gfx::FrameTime::Now() < RetroactiveBeginFrameDeadline())
|
| + if (!throttle_frame_production_ ||
|
| + gfx::FrameTime::Now() < RetroactiveBeginFrameDeadline())
|
| BeginFrame(skipped_begin_frame_args_);
|
| }
|
|
|
| void OutputSurface::DidSwapBuffers() {
|
| - pending_swap_buffers_++;
|
| - TRACE_EVENT1("cc", "OutputSurface::DidSwapBuffers",
|
| - "pending_swap_buffers_", pending_swap_buffers_);
|
| + TRACE_EVENT0("cc", "OutputSurface::DidSwapBuffers");
|
| client_->DidSwapBuffers();
|
| - if (frame_rate_controller_)
|
| - frame_rate_controller_->DidSwapBuffers();
|
| - PostCheckForRetroactiveBeginFrame();
|
| }
|
|
|
| void OutputSurface::OnSwapBuffersComplete() {
|
| - pending_swap_buffers_--;
|
| - TRACE_EVENT1("cc", "OutputSurface::OnSwapBuffersComplete",
|
| - "pending_swap_buffers_", pending_swap_buffers_);
|
| - client_->OnSwapBuffersComplete();
|
| - if (frame_rate_controller_)
|
| - frame_rate_controller_->DidSwapBuffersComplete();
|
| - PostCheckForRetroactiveBeginFrame();
|
| + TRACE_EVENT0("cc", "OutputSurface::OnSwapBuffersComplete");
|
| + client_->DidSwapBuffersComplete();
|
| }
|
|
|
| void OutputSurface::ReclaimResources(const CompositorFrameAck* ack) {
|
| @@ -232,7 +213,6 @@ void OutputSurface::ReclaimResources(const CompositorFrameAck* ack) {
|
| void OutputSurface::DidLoseOutputSurface() {
|
| TRACE_EVENT0("cc", "OutputSurface::DidLoseOutputSurface");
|
| client_ready_for_begin_frame_ = true;
|
| - pending_swap_buffers_ = 0;
|
| skipped_begin_frame_args_ = BeginFrameArgs();
|
| if (frame_rate_controller_)
|
| frame_rate_controller_->SetActive(false);
|
|
|