1111namespace sky {
1212namespace shell {
1313
14+ const int kPipelineDepth = 2 ;
15+
1416Animator::Animator (const Engine::Config& config, Engine* engine)
1517 : config_(config),
1618 engine_ (engine),
19+ outstanding_draw_requests_(0 ),
20+ did_defer_frame_request_(false ),
1721 engine_requested_frame_(false ),
18- frame_in_progress_(false ),
1922 paused_(false ),
2023 weak_factory_(this ) {
2124}
@@ -27,15 +30,19 @@ void Animator::RequestFrame() {
2730 if (engine_requested_frame_)
2831 return ;
2932
33+ DCHECK (!did_defer_frame_request_);
34+
3035 TRACE_EVENT_ASYNC_BEGIN0 (" sky" , " Frame request pending" , this );
3136 engine_requested_frame_ = true ;
3237
33- if (!frame_in_progress_) {
34- frame_in_progress_ = true ;
35- base::MessageLoop::current ()->PostTask (
36- FROM_HERE,
37- base::Bind (&Animator::BeginFrame, weak_factory_.GetWeakPtr ()));
38+ if (outstanding_draw_requests_ >= kPipelineDepth ) {
39+ did_defer_frame_request_ = true ;
40+ return ;
3841 }
42+
43+ base::MessageLoop::current ()->PostTask (
44+ FROM_HERE,
45+ base::Bind (&Animator::BeginFrame, weak_factory_.GetWeakPtr ()));
3946}
4047
4148void Animator::Stop () {
@@ -49,31 +56,30 @@ void Animator::Start() {
4956}
5057
5158void Animator::BeginFrame () {
52- DCHECK (frame_in_progress_);
53- // There could be a request in the message loop at time of cancel.
54- if (!engine_requested_frame_) {
55- frame_in_progress_ = false ;
59+ if (!engine_requested_frame_)
5660 return ;
57- }
58-
5961 engine_requested_frame_ = false ;
6062 TRACE_EVENT_ASYNC_END0 (" sky" , " Frame request pending" , this );
6163
6264 engine_->BeginFrame (base::TimeTicks::Now ());
65+ skia::RefPtr<SkPicture> picture = engine_->Paint ();
66+
67+ outstanding_draw_requests_++;
68+ DCHECK (outstanding_draw_requests_ <= kPipelineDepth );
6369 config_.gpu_task_runner ->PostTaskAndReply (
6470 FROM_HERE,
65- base::Bind (&GPUDelegate::Draw, config_.gpu_delegate , engine_-> Paint () ),
71+ base::Bind (&GPUDelegate::Draw, config_.gpu_delegate , picture ),
6672 base::Bind (&Animator::OnFrameComplete, weak_factory_.GetWeakPtr ()));
6773}
6874
6975void Animator::OnFrameComplete () {
70- DCHECK (frame_in_progress_ );
71- frame_in_progress_ = false ;
76+ DCHECK (outstanding_draw_requests_ > 0 );
77+ --outstanding_draw_requests_ ;
7278 if (paused_)
7379 return ;
7480
75- if (engine_requested_frame_) {
76- frame_in_progress_ = true ;
81+ if (engine_requested_frame_ && did_defer_frame_request_ ) {
82+ did_defer_frame_request_ = false ;
7783 BeginFrame ();
7884 }
7985}
0 commit comments