Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Side by Side Diff: ui/android/window_android.cc

Issue 2585993002: Revert of [android] Make RWHVAndroid a BeginFrameObserver. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/android/window_android.h ('k') | ui/android/window_android_compositor.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/android/window_android.h" 5 #include "ui/android/window_android.h"
6 6
7 #include "base/android/context_utils.h" 7 #include "base/android/context_utils.h"
8 #include "base/android/jni_android.h" 8 #include "base/android/jni_android.h"
9 #include "base/android/jni_array.h" 9 #include "base/android/jni_array.h"
10 #include "base/android/jni_string.h" 10 #include "base/android/jni_string.h"
11 #include "base/android/jni_weak_ref.h" 11 #include "base/android/jni_weak_ref.h"
12 #include "base/android/scoped_java_ref.h" 12 #include "base/android/scoped_java_ref.h"
13 #include "base/auto_reset.h"
14 #include "base/observer_list.h"
15 #include "cc/output/begin_frame_args.h"
16 #include "cc/scheduler/begin_frame_source.h"
17 #include "jni/WindowAndroid_jni.h" 13 #include "jni/WindowAndroid_jni.h"
18 #include "ui/android/window_android_compositor.h" 14 #include "ui/android/window_android_compositor.h"
19 #include "ui/android/window_android_observer.h" 15 #include "ui/android/window_android_observer.h"
20 16
21 namespace ui { 17 namespace ui {
22 18
23 using base::android::AttachCurrentThread; 19 using base::android::AttachCurrentThread;
24 using base::android::JavaParamRef; 20 using base::android::JavaParamRef;
25 using base::android::JavaRef; 21 using base::android::JavaRef;
26 using base::android::ScopedJavaLocalRef; 22 using base::android::ScopedJavaLocalRef;
27 23
28 class WindowAndroid::WindowBeginFrameSource : public cc::BeginFrameSource {
29 public:
30 explicit WindowBeginFrameSource(WindowAndroid* window)
31 : window_(window),
32 observer_count_(0),
33 in_on_vsync_(false) {}
34 ~WindowBeginFrameSource() override {}
35
36 // cc::BeginFrameSource implementation.
37 void AddObserver(cc::BeginFrameObserver* obs) override;
38 void RemoveObserver(cc::BeginFrameObserver* obs) override;
39 void DidFinishFrame(cc::BeginFrameObserver* obs,
40 size_t remaining_frames) override {}
41 bool IsThrottled() const override { return true; }
42
43 void OnVSync(base::TimeTicks frame_time,
44 base::TimeDelta vsync_period);
45
46 private:
47 WindowAndroid* const window_;
48 base::ObserverList<cc::BeginFrameObserver> observers_;
49 int observer_count_;
50 cc::BeginFrameArgs last_begin_frame_args_;
51 bool in_on_vsync_;
52 };
53
54 void WindowAndroid::WindowBeginFrameSource::AddObserver(
55 cc::BeginFrameObserver* obs) {
56 DCHECK(obs);
57 DCHECK(!observers_.HasObserver(obs));
58
59 observers_.AddObserver(obs);
60 observer_count_++;
61 obs->OnBeginFrameSourcePausedChanged(false);
62 window_->SetNeedsBeginFrames(true);
63
64 // Send a MISSED BeginFrame if possible and necessary. If an observer is added
65 // during OnVSync(), it will get a NORMAL BeginFrame from OnVSync() instead.
66 if (!in_on_vsync_ && last_begin_frame_args_.IsValid()) {
67 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs();
68 if (!last_args.IsValid() ||
69 last_args.frame_time < last_begin_frame_args_.frame_time) {
70 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED;
71 // TODO(crbug.com/602485): A deadline doesn't make too much sense
72 // for a missed BeginFrame (the intention rather is 'immediately'),
73 // but currently the retro frame logic is very strict in discarding
74 // BeginFrames.
75 last_begin_frame_args_.deadline =
76 base::TimeTicks::Now() + last_begin_frame_args_.interval;
77 obs->OnBeginFrame(last_begin_frame_args_);
78 }
79 }
80 }
81
82 void WindowAndroid::WindowBeginFrameSource::RemoveObserver(
83 cc::BeginFrameObserver* obs) {
84 DCHECK(obs);
85 DCHECK(observers_.HasObserver(obs));
86
87 observers_.RemoveObserver(obs);
88 observer_count_--;
89 if (observer_count_ <= 0)
90 window_->SetNeedsBeginFrames(false);
91 }
92
93 void WindowAndroid::WindowBeginFrameSource::OnVSync(
94 base::TimeTicks frame_time,
95 base::TimeDelta vsync_period) {
96 // frame time is in the past, so give the next vsync period as the deadline.
97 base::TimeTicks deadline = frame_time + vsync_period;
98 last_begin_frame_args_ =
99 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline,
100 vsync_period, cc::BeginFrameArgs::NORMAL);
101 DCHECK(last_begin_frame_args_.IsValid());
102
103 // We support adding/removing observers during observer iteration through
104 // base::ObserverList. We also prevent observers that are added during
105 // observer iteration from receiving a MISSED BeginFrame by means of
106 // |in_on_vsync_| - they will receive the current NORMAL one during the
107 // iteration instead. Note that SynchronousCompositorBrowserFilter relies on
108 // this behavior.
109 base::AutoReset<bool> auto_reset(&in_on_vsync_, true);
110 for (auto& obs : observers_)
111 obs.OnBeginFrame(last_begin_frame_args_);
112 }
113
114 WindowAndroid::WindowAndroid(JNIEnv* env, jobject obj, int display_id) 24 WindowAndroid::WindowAndroid(JNIEnv* env, jobject obj, int display_id)
115 : display_id_(display_id), 25 : display_id_(display_id), compositor_(NULL) {
116 compositor_(NULL),
117 begin_frame_source_(new WindowBeginFrameSource(this)),
118 needs_begin_frames_(false) {
119 java_window_.Reset(env, obj); 26 java_window_.Reset(env, obj);
120 } 27 }
121 28
122 void WindowAndroid::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { 29 void WindowAndroid::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
123 delete this; 30 delete this;
124 } 31 }
125 32
126 ScopedJavaLocalRef<jobject> WindowAndroid::GetJavaObject() { 33 ScopedJavaLocalRef<jobject> WindowAndroid::GetJavaObject() {
127 return base::android::ScopedJavaLocalRef<jobject>(java_window_); 34 return base::android::ScopedJavaLocalRef<jobject>(java_window_);
128 } 35 }
(...skipping 26 matching lines...) Expand all
155 62
156 void WindowAndroid::AddObserver(WindowAndroidObserver* observer) { 63 void WindowAndroid::AddObserver(WindowAndroidObserver* observer) {
157 if (!observer_list_.HasObserver(observer)) 64 if (!observer_list_.HasObserver(observer))
158 observer_list_.AddObserver(observer); 65 observer_list_.AddObserver(observer);
159 } 66 }
160 67
161 void WindowAndroid::RemoveObserver(WindowAndroidObserver* observer) { 68 void WindowAndroid::RemoveObserver(WindowAndroidObserver* observer) {
162 observer_list_.RemoveObserver(observer); 69 observer_list_.RemoveObserver(observer);
163 } 70 }
164 71
165 cc::BeginFrameSource* WindowAndroid::GetBeginFrameSource() {
166 return begin_frame_source_.get();
167 }
168
169 void WindowAndroid::AttachCompositor(WindowAndroidCompositor* compositor) { 72 void WindowAndroid::AttachCompositor(WindowAndroidCompositor* compositor) {
170 if (compositor_ && compositor != compositor_) 73 if (compositor_ && compositor != compositor_)
171 DetachCompositor(); 74 DetachCompositor();
172 75
173 compositor_ = compositor; 76 compositor_ = compositor;
174 for (WindowAndroidObserver& observer : observer_list_) 77 for (WindowAndroidObserver& observer : observer_list_)
175 observer.OnAttachCompositor(); 78 observer.OnAttachCompositor();
176 } 79 }
177 80
178 void WindowAndroid::DetachCompositor() { 81 void WindowAndroid::DetachCompositor() {
179 compositor_ = NULL; 82 compositor_ = NULL;
180 for (WindowAndroidObserver& observer : observer_list_) 83 for (WindowAndroidObserver& observer : observer_list_)
181 observer.OnDetachCompositor(); 84 observer.OnDetachCompositor();
182 observer_list_.Clear(); 85 observer_list_.Clear();
183 } 86 }
184 87
185 void WindowAndroid::RequestVSyncUpdate() { 88 void WindowAndroid::RequestVSyncUpdate() {
186 JNIEnv* env = AttachCurrentThread(); 89 JNIEnv* env = AttachCurrentThread();
187 Java_WindowAndroid_requestVSyncUpdate(env, GetJavaObject()); 90 Java_WindowAndroid_requestVSyncUpdate(env, GetJavaObject());
188 } 91 }
189 92
190 void WindowAndroid::SetNeedsBeginFrames(bool needs_begin_frames) {
191 if (needs_begin_frames_ == needs_begin_frames)
192 return;
193
194 needs_begin_frames_ = needs_begin_frames;
195 if (needs_begin_frames_)
196 RequestVSyncUpdate();
197 }
198
199 void WindowAndroid::SetNeedsAnimate() { 93 void WindowAndroid::SetNeedsAnimate() {
200 if (compositor_) 94 if (compositor_)
201 compositor_->SetNeedsAnimate(); 95 compositor_->SetNeedsAnimate();
202 } 96 }
203 97
204 void WindowAndroid::Animate(base::TimeTicks begin_frame_time) { 98 void WindowAndroid::Animate(base::TimeTicks begin_frame_time) {
205 for (WindowAndroidObserver& observer : observer_list_) 99 for (WindowAndroidObserver& observer : observer_list_)
206 observer.OnAnimate(begin_frame_time); 100 observer.OnAnimate(begin_frame_time);
207 } 101 }
208 102
209 void WindowAndroid::OnVSync(JNIEnv* env, 103 void WindowAndroid::OnVSync(JNIEnv* env,
210 const JavaParamRef<jobject>& obj, 104 const JavaParamRef<jobject>& obj,
211 jlong time_micros, 105 jlong time_micros,
212 jlong period_micros) { 106 jlong period_micros) {
213 base::TimeTicks frame_time(base::TimeTicks::FromInternalValue(time_micros)); 107 base::TimeTicks frame_time(base::TimeTicks::FromInternalValue(time_micros));
214 base::TimeDelta vsync_period( 108 base::TimeDelta vsync_period(
215 base::TimeDelta::FromMicroseconds(period_micros)); 109 base::TimeDelta::FromMicroseconds(period_micros));
216 begin_frame_source_->OnVSync(frame_time, vsync_period); 110 for (WindowAndroidObserver& observer : observer_list_)
217 if (needs_begin_frames_) 111 observer.OnVSync(frame_time, vsync_period);
218 RequestVSyncUpdate(); 112 if (compositor_)
113 compositor_->OnVSync(frame_time, vsync_period);
219 } 114 }
220 115
221 void WindowAndroid::OnVisibilityChanged(JNIEnv* env, 116 void WindowAndroid::OnVisibilityChanged(JNIEnv* env,
222 const JavaParamRef<jobject>& obj, 117 const JavaParamRef<jobject>& obj,
223 bool visible) { 118 bool visible) {
224 for (WindowAndroidObserver& observer : observer_list_) 119 for (WindowAndroidObserver& observer : observer_list_)
225 observer.OnRootWindowVisibilityChanged(visible); 120 observer.OnRootWindowVisibilityChanged(visible);
226 } 121 }
227 122
228 void WindowAndroid::OnActivityStopped(JNIEnv* env, 123 void WindowAndroid::OnActivityStopped(JNIEnv* env,
(...skipping 30 matching lines...) Expand all
259 // ---------------------------------------------------------------------------- 154 // ----------------------------------------------------------------------------
260 // Native JNI methods 155 // Native JNI methods
261 // ---------------------------------------------------------------------------- 156 // ----------------------------------------------------------------------------
262 157
263 jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj, int sdk_display_id) { 158 jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj, int sdk_display_id) {
264 WindowAndroid* window = new WindowAndroid(env, obj, sdk_display_id); 159 WindowAndroid* window = new WindowAndroid(env, obj, sdk_display_id);
265 return reinterpret_cast<intptr_t>(window); 160 return reinterpret_cast<intptr_t>(window);
266 } 161 }
267 162
268 } // namespace ui 163 } // namespace ui
OLDNEW
« no previous file with comments | « ui/android/window_android.h ('k') | ui/android/window_android_compositor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698