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

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

Issue 2754493002: Expose VSync pausing through WindowAndroid and pause VSync during webVR presentation (Closed)
Patch Set: Fix behaviour Created 3 years, 9 months 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
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"
(...skipping 25 matching lines...) Expand all
36 ~WindowBeginFrameSource() override {} 36 ~WindowBeginFrameSource() override {}
37 37
38 // cc::BeginFrameSource implementation. 38 // cc::BeginFrameSource implementation.
39 void AddObserver(cc::BeginFrameObserver* obs) override; 39 void AddObserver(cc::BeginFrameObserver* obs) override;
40 void RemoveObserver(cc::BeginFrameObserver* obs) override; 40 void RemoveObserver(cc::BeginFrameObserver* obs) override;
41 void DidFinishFrame(cc::BeginFrameObserver* obs, 41 void DidFinishFrame(cc::BeginFrameObserver* obs,
42 const cc::BeginFrameAck& ack) override {} 42 const cc::BeginFrameAck& ack) override {}
43 bool IsThrottled() const override { return true; } 43 bool IsThrottled() const override { return true; }
44 44
45 void OnVSync(base::TimeTicks frame_time, base::TimeDelta vsync_period); 45 void OnVSync(base::TimeTicks frame_time, base::TimeDelta vsync_period);
46 void OnPauseChanged(bool paused);
46 47
47 private: 48 private:
48 WindowAndroid* const window_; 49 WindowAndroid* const window_;
49 base::ObserverList<cc::BeginFrameObserver> observers_; 50 base::ObserverList<cc::BeginFrameObserver> observers_;
50 int observer_count_; 51 int observer_count_;
51 cc::BeginFrameArgs last_begin_frame_args_; 52 cc::BeginFrameArgs last_begin_frame_args_;
52 uint64_t next_sequence_number_; 53 uint64_t next_sequence_number_;
53 }; 54 };
54 55
55 void WindowAndroid::WindowBeginFrameSource::AddObserver( 56 void WindowAndroid::WindowBeginFrameSource::AddObserver(
56 cc::BeginFrameObserver* obs) { 57 cc::BeginFrameObserver* obs) {
57 DCHECK(obs); 58 DCHECK(obs);
58 DCHECK(!observers_.HasObserver(obs)); 59 DCHECK(!observers_.HasObserver(obs));
59 60
60 observers_.AddObserver(obs); 61 observers_.AddObserver(obs);
61 observer_count_++; 62 observer_count_++;
62 obs->OnBeginFrameSourcePausedChanged(false); 63 obs->OnBeginFrameSourcePausedChanged(false);
boliu 2017/03/15 17:13:42 this is no longer correct
mthiesse 2017/03/15 21:32:17 Done.
63 window_->SetNeedsBeginFrames(true); 64 window_->SetNeedsBeginFrames(true);
64 65
65 // Send a MISSED BeginFrame if possible and necessary. 66 // Send a MISSED BeginFrame if possible and necessary.
66 if (last_begin_frame_args_.IsValid()) { 67 if (last_begin_frame_args_.IsValid()) {
67 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); 68 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs();
68 if (!last_args.IsValid() || 69 if (!last_args.IsValid() ||
69 last_args.frame_time < last_begin_frame_args_.frame_time) { 70 last_args.frame_time < last_begin_frame_args_.frame_time) {
70 DCHECK(last_args.sequence_number < 71 DCHECK(last_args.sequence_number <
71 last_begin_frame_args_.sequence_number || 72 last_begin_frame_args_.sequence_number ||
72 last_args.source_id != last_begin_frame_args_.source_id); 73 last_args.source_id != last_begin_frame_args_.source_id);
(...skipping 28 matching lines...) Expand all
101 last_begin_frame_args_ = cc::BeginFrameArgs::Create( 102 last_begin_frame_args_ = cc::BeginFrameArgs::Create(
102 BEGINFRAME_FROM_HERE, source_id(), next_sequence_number_, frame_time, 103 BEGINFRAME_FROM_HERE, source_id(), next_sequence_number_, frame_time,
103 deadline, vsync_period, cc::BeginFrameArgs::NORMAL); 104 deadline, vsync_period, cc::BeginFrameArgs::NORMAL);
104 DCHECK(last_begin_frame_args_.IsValid()); 105 DCHECK(last_begin_frame_args_.IsValid());
105 next_sequence_number_++; 106 next_sequence_number_++;
106 107
107 for (auto& obs : observers_) 108 for (auto& obs : observers_)
108 obs.OnBeginFrame(last_begin_frame_args_); 109 obs.OnBeginFrame(last_begin_frame_args_);
109 } 110 }
110 111
112 void WindowAndroid::WindowBeginFrameSource::OnPauseChanged(bool paused) {
113 for (auto& obs : observers_)
114 obs.OnBeginFrameSourcePausedChanged(paused);
115 }
116
111 WindowAndroid::WindowAndroid(JNIEnv* env, jobject obj, int display_id) 117 WindowAndroid::WindowAndroid(JNIEnv* env, jobject obj, int display_id)
112 : display_id_(display_id), 118 : display_id_(display_id),
113 compositor_(NULL), 119 compositor_(NULL),
114 begin_frame_source_(new WindowBeginFrameSource(this)), 120 begin_frame_source_(new WindowBeginFrameSource(this)),
115 needs_begin_frames_(false) { 121 needs_begin_frames_(false) {
116 java_window_.Reset(env, obj); 122 java_window_.Reset(env, obj);
117 } 123 }
118 124
119 void WindowAndroid::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { 125 void WindowAndroid::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
120 delete this; 126 delete this;
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 for (WindowAndroidObserver& observer : observer_list_) 243 for (WindowAndroidObserver& observer : observer_list_)
238 observer.OnActivityStopped(); 244 observer.OnActivityStopped();
239 } 245 }
240 246
241 void WindowAndroid::OnActivityStarted(JNIEnv* env, 247 void WindowAndroid::OnActivityStarted(JNIEnv* env,
242 const JavaParamRef<jobject>& obj) { 248 const JavaParamRef<jobject>& obj) {
243 for (WindowAndroidObserver& observer : observer_list_) 249 for (WindowAndroidObserver& observer : observer_list_)
244 observer.OnActivityStarted(); 250 observer.OnActivityStarted();
245 } 251 }
246 252
253 void WindowAndroid::SetVSyncPaused(JNIEnv* env,
254 const JavaParamRef<jobject>& obj,
255 bool paused) {
256 begin_frame_source_->OnPauseChanged(paused);
257 }
258
247 bool WindowAndroid::HasPermission(const std::string& permission) { 259 bool WindowAndroid::HasPermission(const std::string& permission) {
248 JNIEnv* env = AttachCurrentThread(); 260 JNIEnv* env = AttachCurrentThread();
249 return Java_WindowAndroid_hasPermission( 261 return Java_WindowAndroid_hasPermission(
250 env, GetJavaObject(), 262 env, GetJavaObject(),
251 base::android::ConvertUTF8ToJavaString(env, permission)); 263 base::android::ConvertUTF8ToJavaString(env, permission));
252 } 264 }
253 265
254 bool WindowAndroid::CanRequestPermission(const std::string& permission) { 266 bool WindowAndroid::CanRequestPermission(const std::string& permission) {
255 JNIEnv* env = AttachCurrentThread(); 267 JNIEnv* env = AttachCurrentThread();
256 return Java_WindowAndroid_canRequestPermission( 268 return Java_WindowAndroid_canRequestPermission(
257 env, GetJavaObject(), 269 env, GetJavaObject(),
258 base::android::ConvertUTF8ToJavaString(env, permission)); 270 base::android::ConvertUTF8ToJavaString(env, permission));
259 } 271 }
260 272
261 WindowAndroid* WindowAndroid::GetWindowAndroid() const { 273 WindowAndroid* WindowAndroid::GetWindowAndroid() const {
262 DCHECK(parent_ == nullptr); 274 DCHECK(parent_ == nullptr);
263 return const_cast<WindowAndroid*>(this); 275 return const_cast<WindowAndroid*>(this);
264 } 276 }
265 277
266 // ---------------------------------------------------------------------------- 278 // ----------------------------------------------------------------------------
267 // Native JNI methods 279 // Native JNI methods
268 // ---------------------------------------------------------------------------- 280 // ----------------------------------------------------------------------------
269 281
270 jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj, int sdk_display_id) { 282 jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj, int sdk_display_id) {
271 WindowAndroid* window = new WindowAndroid(env, obj, sdk_display_id); 283 WindowAndroid* window = new WindowAndroid(env, obj, sdk_display_id);
272 return reinterpret_cast<intptr_t>(window); 284 return reinterpret_cast<intptr_t>(window);
273 } 285 }
274 286
275 } // namespace ui 287 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698