// Copyright 2015 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 "sky/shell/ui/animator.h" #include "base/bind.h" #include "base/message_loop/message_loop.h" #include "base/trace_event/trace_event.h" namespace sky { namespace shell { Animator::Animator(const Engine::Config& config, Engine* engine) : config_(config), engine_(engine), engine_requested_frame_(false), frame_in_progress_(false), weak_factory_(this) { } Animator::~Animator() { } void Animator::RequestFrame() { if (engine_requested_frame_) return; TRACE_EVENT_ASYNC_BEGIN0("sky", "Frame request pending", this); engine_requested_frame_ = true; if (!frame_in_progress_) { frame_in_progress_ = true; base::MessageLoop::current()->PostTask( FROM_HERE, base::Bind(&Animator::BeginFrame, weak_factory_.GetWeakPtr())); } } void Animator::CancelFrameRequest() { engine_requested_frame_ = false; } void Animator::BeginFrame() { DCHECK(frame_in_progress_); // There could be a request in the message loop at time of cancel. if (!engine_requested_frame_) { frame_in_progress_ = false; return; } engine_requested_frame_ = false; TRACE_EVENT_ASYNC_END0("sky", "Frame request pending", this); engine_->BeginFrame(base::TimeTicks::Now()); config_.gpu_task_runner->PostTaskAndReply( FROM_HERE, base::Bind(&GPUDelegate::Draw, config_.gpu_delegate, engine_->Paint()), base::Bind(&Animator::OnFrameComplete, weak_factory_.GetWeakPtr())); } void Animator::OnFrameComplete() { DCHECK(frame_in_progress_); frame_in_progress_ = false; if (engine_requested_frame_) { frame_in_progress_ = true; BeginFrame(); } } } // namespace shell } // namespace sky