Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/compositor/compositor.h" | 5 #include "ui/compositor/compositor.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 34 #include "ui/gl/gl_switches.h" | 34 #include "ui/gl/gl_switches.h" |
| 35 | 35 |
| 36 namespace { | 36 namespace { |
| 37 | 37 |
| 38 const double kDefaultRefreshRate = 60.0; | 38 const double kDefaultRefreshRate = 60.0; |
| 39 const double kTestRefreshRate = 200.0; | 39 const double kTestRefreshRate = 200.0; |
| 40 | 40 |
| 41 } // namespace | 41 } // namespace |
| 42 | 42 |
| 43 namespace ui { | 43 namespace ui { |
| 44 // ResizeSwapPromise is used to track the progression of a frame of a given size | |
| 45 // through commit/draw/post. Once complete, this class updates Compositor's | |
| 46 // pending swapped frame size. | |
| 47 class Compositor::ResizeSwapPromise : public cc::SwapPromise { | |
| 48 public: | |
| 49 ResizeSwapPromise(Compositor* compositor, const gfx::Size& pending_size) | |
| 50 : compositor_(compositor), pending_size_(pending_size) {} | |
| 51 ~ResizeSwapPromise() override {} | |
| 52 | |
| 53 // cc::SwapPromise implementation: | |
| 54 void DidActivate() override {} | |
| 55 void DidNotSwap(DidNotSwapReason reason) override {} | |
| 56 void DidSwap(cc::CompositorFrameMetadata* metadata) override { | |
| 57 // This will come in on the impl thread - schedule the update on the main | |
| 58 // thread. | |
|
piman
2015/12/15 07:15:36
We have only one thread on the browser side now, s
| |
| 59 compositor_->task_runner_->PostTask( | |
| 60 FROM_HERE, | |
| 61 base::Bind(&Compositor::set_pending_swapped_frame_size, | |
| 62 compositor_->weak_ptr_factory_.GetWeakPtr(), pending_size_)); | |
| 63 } | |
| 64 virtual int64 TraceId() const { return 0; } | |
| 65 | |
| 66 private: | |
| 67 Compositor* compositor_; | |
| 68 gfx::Size pending_size_; | |
| 69 }; | |
| 44 | 70 |
| 45 CompositorLock::CompositorLock(Compositor* compositor) | 71 CompositorLock::CompositorLock(Compositor* compositor) |
| 46 : compositor_(compositor) { | 72 : compositor_(compositor) { |
| 47 if (compositor_->locks_will_time_out_) { | 73 if (compositor_->locks_will_time_out_) { |
| 48 compositor_->task_runner_->PostDelayedTask( | 74 compositor_->task_runner_->PostDelayedTask( |
| 49 FROM_HERE, | 75 FROM_HERE, |
| 50 base::Bind(&CompositorLock::CancelLock, AsWeakPtr()), | 76 base::Bind(&CompositorLock::CancelLock, AsWeakPtr()), |
| 51 base::TimeDelta::FromMilliseconds(kCompositorLockTimeoutMs)); | 77 base::TimeDelta::FromMilliseconds(kCompositorLockTimeoutMs)); |
| 52 } | 78 } |
| 53 } | 79 } |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 274 host_->QueueSwapPromise(swap_promise.Pass()); | 300 host_->QueueSwapPromise(swap_promise.Pass()); |
| 275 } | 301 } |
| 276 | 302 |
| 277 void Compositor::SetScaleAndSize(float scale, const gfx::Size& size_in_pixel) { | 303 void Compositor::SetScaleAndSize(float scale, const gfx::Size& size_in_pixel) { |
| 278 DCHECK_GT(scale, 0); | 304 DCHECK_GT(scale, 0); |
| 279 if (!size_in_pixel.IsEmpty()) { | 305 if (!size_in_pixel.IsEmpty()) { |
| 280 size_ = size_in_pixel; | 306 size_ = size_in_pixel; |
| 281 host_->SetViewportSize(size_in_pixel); | 307 host_->SetViewportSize(size_in_pixel); |
| 282 root_web_layer_->SetBounds(size_in_pixel); | 308 root_web_layer_->SetBounds(size_in_pixel); |
| 283 context_factory_->ResizeDisplay(this, size_in_pixel); | 309 context_factory_->ResizeDisplay(this, size_in_pixel); |
| 310 | |
| 311 scoped_ptr<ResizeSwapPromise> resize_swap_promise( | |
| 312 new ResizeSwapPromise(this, size_in_pixel)); | |
| 313 host_->QueueSwapPromise(resize_swap_promise.Pass()); | |
| 284 } | 314 } |
| 285 if (device_scale_factor_ != scale) { | 315 if (device_scale_factor_ != scale) { |
| 286 device_scale_factor_ = scale; | 316 device_scale_factor_ = scale; |
| 287 host_->SetDeviceScaleFactor(scale); | 317 host_->SetDeviceScaleFactor(scale); |
| 288 if (root_layer_) | 318 if (root_layer_) |
| 289 root_layer_->OnDeviceScaleFactorChanged(scale); | 319 root_layer_->OnDeviceScaleFactorChanged(scale); |
| 290 } | 320 } |
| 291 } | 321 } |
| 292 | 322 |
| 293 void Compositor::SetBackgroundColor(SkColor color) { | 323 void Compositor::SetBackgroundColor(SkColor color) { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 439 | 469 |
| 440 void Compositor::DidCompleteSwapBuffers() { | 470 void Compositor::DidCompleteSwapBuffers() { |
| 441 FOR_EACH_OBSERVER(CompositorObserver, observer_list_, | 471 FOR_EACH_OBSERVER(CompositorObserver, observer_list_, |
| 442 OnCompositingEnded(this)); | 472 OnCompositingEnded(this)); |
| 443 } | 473 } |
| 444 | 474 |
| 445 void Compositor::DidPostSwapBuffers() { | 475 void Compositor::DidPostSwapBuffers() { |
| 446 base::TimeTicks start_time = base::TimeTicks::Now(); | 476 base::TimeTicks start_time = base::TimeTicks::Now(); |
| 447 FOR_EACH_OBSERVER(CompositorObserver, observer_list_, | 477 FOR_EACH_OBSERVER(CompositorObserver, observer_list_, |
| 448 OnCompositingStarted(this, start_time)); | 478 OnCompositingStarted(this, start_time)); |
| 479 | |
| 480 // Enqueue the last_swapped update on our task runner. to ensure ordering with | |
| 481 // relation to the ResizeSwapPromise's call to set_pending_swapped_size. | |
| 482 task_runner_->PostTask( | |
| 483 FROM_HERE, base::Bind(&Compositor::UpdateLastSwappedFrameSize, | |
| 484 weak_ptr_factory_.GetWeakPtr())); | |
|
piman
2015/12/15 07:15:35
You don't need to post the task any more (see abov
| |
| 449 } | 485 } |
| 450 | 486 |
| 451 void Compositor::DidAbortSwapBuffers() { | 487 void Compositor::DidAbortSwapBuffers() { |
| 452 FOR_EACH_OBSERVER(CompositorObserver, | 488 FOR_EACH_OBSERVER(CompositorObserver, |
| 453 observer_list_, | 489 observer_list_, |
| 454 OnCompositingAborted(this)); | 490 OnCompositingAborted(this)); |
| 455 } | 491 } |
| 456 | 492 |
| 457 void Compositor::SendBeginFramesToChildren(const cc::BeginFrameArgs& args) { | 493 void Compositor::SendBeginFramesToChildren(const cc::BeginFrameArgs& args) { |
| 458 FOR_EACH_OBSERVER(CompositorBeginFrameObserver, begin_frame_observer_list_, | 494 FOR_EACH_OBSERVER(CompositorBeginFrameObserver, begin_frame_observer_list_, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 504 observer_list_, | 540 observer_list_, |
| 505 OnCompositingLockStateChanged(this)); | 541 OnCompositingLockStateChanged(this)); |
| 506 } | 542 } |
| 507 | 543 |
| 508 void Compositor::CancelCompositorLock() { | 544 void Compositor::CancelCompositorLock() { |
| 509 if (compositor_lock_) | 545 if (compositor_lock_) |
| 510 compositor_lock_->CancelLock(); | 546 compositor_lock_->CancelLock(); |
| 511 } | 547 } |
| 512 | 548 |
| 513 } // namespace ui | 549 } // namespace ui |
| OLD | NEW |