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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 namespace gpu { | 74 namespace gpu { |
75 struct GpuProcessHostedCALayerTreeParamsMac; | 75 struct GpuProcessHostedCALayerTreeParamsMac; |
76 } | 76 } |
77 | 77 |
78 namespace content { | 78 namespace content { |
79 | 79 |
80 namespace { | 80 namespace { |
81 | 81 |
82 const unsigned int kMaxDisplaySwapBuffers = 1U; | 82 const unsigned int kMaxDisplaySwapBuffers = 1U; |
83 | 83 |
84 class ExternalBeginFrameSource : public cc::BeginFrameSourceBase, | 84 class ExternalBeginFrameSource : public cc::BeginFrameSource, |
85 public CompositorImpl::VSyncObserver { | 85 public CompositorImpl::VSyncObserver { |
86 public: | 86 public: |
87 ExternalBeginFrameSource(CompositorImpl* compositor) | 87 explicit ExternalBeginFrameSource(CompositorImpl* compositor) |
88 : compositor_(compositor) { | 88 : compositor_(compositor) { |
89 compositor_->AddObserver(this); | 89 compositor_->AddObserver(this); |
90 } | 90 } |
91 | |
92 ~ExternalBeginFrameSource() override { compositor_->RemoveObserver(this); } | 91 ~ExternalBeginFrameSource() override { compositor_->RemoveObserver(this); } |
93 | 92 |
94 // cc::BeginFrameSourceBase implementation: | 93 // cc::BeginFrameSource implementation. |
95 void AddObserver(cc::BeginFrameObserver* obs) override { | 94 void AddObserver(cc::BeginFrameObserver* obs) override; |
96 cc::BeginFrameSourceBase::AddObserver(obs); | 95 void RemoveObserver(cc::BeginFrameObserver* obs) override; |
97 DCHECK(needs_begin_frames()); | 96 void DidFinishFrame(cc::BeginFrameObserver* obs, |
98 if (!last_begin_frame_args_.IsValid()) | 97 size_t remaining_frames) override {} |
99 return; | |
100 | 98 |
| 99 // CompositorImpl::VSyncObserver implementation. |
| 100 void OnVSync(base::TimeTicks frame_time, |
| 101 base::TimeDelta vsync_period) override; |
| 102 |
| 103 private: |
| 104 CompositorImpl* const compositor_; |
| 105 std::set<cc::BeginFrameObserver*> observers_; |
| 106 cc::BeginFrameArgs last_begin_frame_args_; |
| 107 }; |
| 108 |
| 109 void ExternalBeginFrameSource::AddObserver(cc::BeginFrameObserver* obs) { |
| 110 DCHECK(obs); |
| 111 DCHECK(observers_.find(obs) == observers_.end()); |
| 112 |
| 113 DEBUG_FRAMES("ExternalBeginFrameSource::AddObserver", "num observers", |
| 114 observers_.size(), "to add observer", obs); |
| 115 observers_.insert(obs); |
| 116 obs->OnBeginFrameSourcePausedChanged(false); |
| 117 compositor_->OnNeedsBeginFramesChange(true); |
| 118 |
| 119 if (last_begin_frame_args_.IsValid()) { |
101 // Send a MISSED begin frame if necessary. | 120 // Send a MISSED begin frame if necessary. |
102 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); | 121 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); |
103 if (!last_args.IsValid() || | 122 if (!last_args.IsValid() || |
104 (last_begin_frame_args_.frame_time > last_args.frame_time)) { | 123 (last_begin_frame_args_.frame_time > last_args.frame_time)) { |
105 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; | 124 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; |
106 // TODO(crbug.com/602485): A deadline doesn't make too much sense | 125 // TODO(crbug.com/602485): A deadline doesn't make too much sense |
107 // for a missed BeginFrame (the intention rather is 'immediately'), | 126 // for a missed BeginFrame (the intention rather is 'immediately'), |
108 // but currently the retro frame logic is very strict in discarding | 127 // but currently the retro frame logic is very strict in discarding |
109 // BeginFrames. | 128 // BeginFrames. |
110 last_begin_frame_args_.deadline = | 129 last_begin_frame_args_.deadline = |
111 base::TimeTicks::Now() + last_begin_frame_args_.interval; | 130 base::TimeTicks::Now() + last_begin_frame_args_.interval; |
112 obs->OnBeginFrame(last_begin_frame_args_); | 131 obs->OnBeginFrame(last_begin_frame_args_); |
113 } | 132 } |
114 } | 133 } |
| 134 } |
115 | 135 |
116 void OnNeedsBeginFramesChanged(bool needs_begin_frames) override { | 136 void ExternalBeginFrameSource::RemoveObserver(cc::BeginFrameObserver* obs) { |
117 TRACE_EVENT1("compositor", "OnNeedsBeginFramesChanged", | 137 DCHECK(obs); |
118 "needs_begin_frames", needs_begin_frames); | 138 DCHECK(observers_.find(obs) != observers_.end()); |
119 compositor_->OnNeedsBeginFramesChange(needs_begin_frames); | |
120 } | |
121 | 139 |
122 // CompositorImpl::VSyncObserver implementation: | 140 DEBUG_FRAMES("ExternalBeginFrameSource::RemoveObserver", "num observers", |
123 void OnVSync(base::TimeTicks frame_time, | 141 observers_.size(), "removed observer", obs); |
124 base::TimeDelta vsync_period) override { | 142 observers_.erase(obs); |
125 base::TimeTicks deadline = std::max(base::TimeTicks::Now(), frame_time); | 143 if (observers_.empty()) |
126 last_begin_frame_args_ = | 144 compositor_->OnNeedsBeginFramesChange(false); |
127 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, | 145 } |
128 vsync_period, cc::BeginFrameArgs::NORMAL); | |
129 CallOnBeginFrame(last_begin_frame_args_); | |
130 } | |
131 | 146 |
132 private: | 147 void ExternalBeginFrameSource::OnVSync(base::TimeTicks frame_time, |
133 CompositorImpl* compositor_; | 148 base::TimeDelta vsync_period) { |
134 cc::BeginFrameArgs last_begin_frame_args_; | 149 base::TimeTicks deadline = std::max(base::TimeTicks::Now(), frame_time); |
135 }; | 150 last_begin_frame_args_ = |
| 151 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
| 152 vsync_period, cc::BeginFrameArgs::NORMAL); |
| 153 std::set<cc::BeginFrameObserver*> observers(observers_); |
| 154 for (auto* obs : observers) |
| 155 obs->OnBeginFrame(last_begin_frame_args_); |
| 156 } |
136 | 157 |
137 // Used to override capabilities_.adjust_deadline_for_parent to false | 158 // Used to override capabilities_.adjust_deadline_for_parent to false |
138 class OutputSurfaceWithoutParent : public cc::OutputSurface, | 159 class OutputSurfaceWithoutParent : public cc::OutputSurface, |
139 public CompositorImpl::VSyncObserver { | 160 public CompositorImpl::VSyncObserver { |
140 public: | 161 public: |
141 OutputSurfaceWithoutParent( | 162 OutputSurfaceWithoutParent( |
142 CompositorImpl* compositor, | 163 CompositorImpl* compositor, |
143 scoped_refptr<ContextProviderCommandBuffer> context_provider, | 164 scoped_refptr<ContextProviderCommandBuffer> context_provider, |
144 const base::Callback<void(gpu::Capabilities)>& | 165 const base::Callback<void(gpu::Capabilities)>& |
145 populate_gpu_capabilities_callback, | 166 populate_gpu_capabilities_callback, |
(...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
799 void CompositorImpl::SetNeedsAnimate() { | 820 void CompositorImpl::SetNeedsAnimate() { |
800 needs_animate_ = true; | 821 needs_animate_ = true; |
801 if (!host_->visible()) | 822 if (!host_->visible()) |
802 return; | 823 return; |
803 | 824 |
804 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); | 825 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); |
805 host_->SetNeedsAnimate(); | 826 host_->SetNeedsAnimate(); |
806 } | 827 } |
807 | 828 |
808 } // namespace content | 829 } // namespace content |
OLD | NEW |