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 "content/browser/renderer_host/compositor_impl_android.h" | 5 #include "content/browser/renderer_host/compositor_impl_android.h" |
6 | 6 |
7 #include <android/bitmap.h> | 7 #include <android/bitmap.h> |
8 #include <android/native_window_jni.h> | 8 #include <android/native_window_jni.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 public CompositorImpl::VSyncObserver { | 79 public CompositorImpl::VSyncObserver { |
80 public: | 80 public: |
81 ExternalBeginFrameSource(CompositorImpl* compositor) | 81 ExternalBeginFrameSource(CompositorImpl* compositor) |
82 : compositor_(compositor) { | 82 : compositor_(compositor) { |
83 compositor_->AddObserver(this); | 83 compositor_->AddObserver(this); |
84 } | 84 } |
85 | 85 |
86 ~ExternalBeginFrameSource() override { compositor_->RemoveObserver(this); } | 86 ~ExternalBeginFrameSource() override { compositor_->RemoveObserver(this); } |
87 | 87 |
88 // cc::BeginFrameSourceBase implementation: | 88 // cc::BeginFrameSourceBase implementation: |
| 89 void AddObserver(cc::BeginFrameObserver* obs) override { |
| 90 cc::BeginFrameSourceBase::AddObserver(obs); |
| 91 DCHECK(needs_begin_frames()); |
| 92 if (!last_begin_frame_args_.IsValid()) |
| 93 return; |
| 94 |
| 95 // Send a MISSED begin frame if necessary. |
| 96 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); |
| 97 if (!last_args.IsValid() || |
| 98 (last_begin_frame_args_.frame_time > last_args.frame_time)) { |
| 99 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; |
| 100 // TODO(crbug.com/602485): A deadline doesn't make too much sense |
| 101 // for a missed BeginFrame (the intention rather is 'immediately'), |
| 102 // but currently the retro frame logic is very strict in discarding |
| 103 // BeginFrames. |
| 104 last_begin_frame_args_.deadline = |
| 105 base::TimeTicks::Now() + last_begin_frame_args_.interval; |
| 106 obs->OnBeginFrame(last_begin_frame_args_); |
| 107 } |
| 108 } |
| 109 |
89 void OnNeedsBeginFramesChanged(bool needs_begin_frames) override { | 110 void OnNeedsBeginFramesChanged(bool needs_begin_frames) override { |
| 111 TRACE_EVENT1("compositor", "OnNeedsBeginFramesChanged", |
| 112 "needs_begin_frames", needs_begin_frames); |
90 compositor_->OnNeedsBeginFramesChange(needs_begin_frames); | 113 compositor_->OnNeedsBeginFramesChange(needs_begin_frames); |
91 } | 114 } |
92 | 115 |
93 // CompositorImpl::VSyncObserver implementation: | 116 // CompositorImpl::VSyncObserver implementation: |
94 void OnVSync(base::TimeTicks frame_time, | 117 void OnVSync(base::TimeTicks frame_time, |
95 base::TimeDelta vsync_period) override { | 118 base::TimeDelta vsync_period) override { |
96 CallOnBeginFrame(cc::BeginFrameArgs::Create( | 119 base::TimeTicks deadline = std::max(base::TimeTicks::Now(), frame_time); |
97 BEGINFRAME_FROM_HERE, frame_time, base::TimeTicks::Now(), vsync_period, | 120 last_begin_frame_args_ = |
98 cc::BeginFrameArgs::NORMAL)); | 121 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
| 122 vsync_period, cc::BeginFrameArgs::NORMAL); |
| 123 CallOnBeginFrame(last_begin_frame_args_); |
99 } | 124 } |
100 | 125 |
101 private: | 126 private: |
102 CompositorImpl* compositor_; | 127 CompositorImpl* compositor_; |
| 128 cc::BeginFrameArgs last_begin_frame_args_; |
103 }; | 129 }; |
104 | 130 |
105 // Used to override capabilities_.adjust_deadline_for_parent to false | 131 // Used to override capabilities_.adjust_deadline_for_parent to false |
106 class OutputSurfaceWithoutParent : public cc::OutputSurface, | 132 class OutputSurfaceWithoutParent : public cc::OutputSurface, |
107 public CompositorImpl::VSyncObserver { | 133 public CompositorImpl::VSyncObserver { |
108 public: | 134 public: |
109 OutputSurfaceWithoutParent( | 135 OutputSurfaceWithoutParent( |
110 CompositorImpl* compositor, | 136 CompositorImpl* compositor, |
111 const scoped_refptr<ContextProviderCommandBuffer>& context_provider, | 137 const scoped_refptr<ContextProviderCommandBuffer>& context_provider, |
112 const base::Callback<void(gpu::Capabilities)>& | 138 const base::Callback<void(gpu::Capabilities)>& |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 | 434 |
409 void CompositorImpl::SetHasTransparentBackground(bool flag) { | 435 void CompositorImpl::SetHasTransparentBackground(bool flag) { |
410 has_transparent_background_ = flag; | 436 has_transparent_background_ = flag; |
411 if (host_) | 437 if (host_) |
412 host_->set_has_transparent_background(flag); | 438 host_->set_has_transparent_background(flag); |
413 } | 439 } |
414 | 440 |
415 void CompositorImpl::SetNeedsComposite() { | 441 void CompositorImpl::SetNeedsComposite() { |
416 if (!host_->visible()) | 442 if (!host_->visible()) |
417 return; | 443 return; |
| 444 TRACE_EVENT0("compositor", "Compositor::SetNeedsComposite"); |
418 host_->SetNeedsAnimate(); | 445 host_->SetNeedsAnimate(); |
419 } | 446 } |
420 | 447 |
421 void CompositorImpl::UpdateLayerTreeHost() { | 448 void CompositorImpl::UpdateLayerTreeHost() { |
422 client_->UpdateLayerTreeHost(); | 449 client_->UpdateLayerTreeHost(); |
423 if (needs_animate_) { | 450 if (needs_animate_) { |
424 needs_animate_ = false; | 451 needs_animate_ = false; |
425 root_window_->Animate(base::TimeTicks::Now()); | 452 root_window_->Animate(base::TimeTicks::Now()); |
426 } | 453 } |
427 } | 454 } |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
588 void CompositorImpl::AddObserver(VSyncObserver* observer) { | 615 void CompositorImpl::AddObserver(VSyncObserver* observer) { |
589 observer_list_.AddObserver(observer); | 616 observer_list_.AddObserver(observer); |
590 } | 617 } |
591 | 618 |
592 void CompositorImpl::RemoveObserver(VSyncObserver* observer) { | 619 void CompositorImpl::RemoveObserver(VSyncObserver* observer) { |
593 observer_list_.RemoveObserver(observer); | 620 observer_list_.RemoveObserver(observer); |
594 } | 621 } |
595 | 622 |
596 cc::UIResourceId CompositorImpl::CreateUIResource( | 623 cc::UIResourceId CompositorImpl::CreateUIResource( |
597 cc::UIResourceClient* client) { | 624 cc::UIResourceClient* client) { |
| 625 TRACE_EVENT0("compositor", "CompositorImpl::CreateUIResource"); |
598 return host_->CreateUIResource(client); | 626 return host_->CreateUIResource(client); |
599 } | 627 } |
600 | 628 |
601 void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) { | 629 void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) { |
| 630 TRACE_EVENT0("compositor", "CompositorImpl::DeleteUIResource"); |
602 host_->DeleteUIResource(resource_id); | 631 host_->DeleteUIResource(resource_id); |
603 } | 632 } |
604 | 633 |
605 bool CompositorImpl::SupportsETC1NonPowerOfTwo() const { | 634 bool CompositorImpl::SupportsETC1NonPowerOfTwo() const { |
606 return gpu_capabilities_.texture_format_etc1_npot; | 635 return gpu_capabilities_.texture_format_etc1_npot; |
607 } | 636 } |
608 | 637 |
609 void CompositorImpl::DidPostSwapBuffers() { | 638 void CompositorImpl::DidPostSwapBuffers() { |
610 TRACE_EVENT0("compositor", "CompositorImpl::DidPostSwapBuffers"); | 639 TRACE_EVENT0("compositor", "CompositorImpl::DidPostSwapBuffers"); |
611 pending_swapbuffers_++; | 640 pending_swapbuffers_++; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 needs_begin_frames_ = needs_begin_frames; | 681 needs_begin_frames_ = needs_begin_frames; |
653 if (needs_begin_frames_) | 682 if (needs_begin_frames_) |
654 root_window_->RequestVSyncUpdate(); | 683 root_window_->RequestVSyncUpdate(); |
655 } | 684 } |
656 | 685 |
657 void CompositorImpl::SetNeedsAnimate() { | 686 void CompositorImpl::SetNeedsAnimate() { |
658 needs_animate_ = true; | 687 needs_animate_ = true; |
659 if (!host_->visible()) | 688 if (!host_->visible()) |
660 return; | 689 return; |
661 | 690 |
| 691 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); |
662 host_->SetNeedsAnimate(); | 692 host_->SetNeedsAnimate(); |
663 } | 693 } |
664 | 694 |
665 } // namespace content | 695 } // namespace content |
OLD | NEW |