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

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

Issue 2583483002: [cc] Adds source_id and sequence_number to BeginFrameArgs. (Closed)
Patch Set: Address Brian's comments. 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 | « third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc ('k') | no next file » | 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"
(...skipping 12 matching lines...) Expand all
23 using base::android::AttachCurrentThread; 23 using base::android::AttachCurrentThread;
24 using base::android::JavaParamRef; 24 using base::android::JavaParamRef;
25 using base::android::JavaRef; 25 using base::android::JavaRef;
26 using base::android::ScopedJavaLocalRef; 26 using base::android::ScopedJavaLocalRef;
27 27
28 class WindowAndroid::WindowBeginFrameSource : public cc::BeginFrameSource { 28 class WindowAndroid::WindowBeginFrameSource : public cc::BeginFrameSource {
29 public: 29 public:
30 explicit WindowBeginFrameSource(WindowAndroid* window) 30 explicit WindowBeginFrameSource(WindowAndroid* window)
31 : window_(window), 31 : window_(window),
32 observer_count_(0), 32 observer_count_(0),
33 next_sequence_number_(cc::BeginFrameArgs::kStartingFrameNumber),
33 in_on_vsync_(false) {} 34 in_on_vsync_(false) {}
34 ~WindowBeginFrameSource() override {} 35 ~WindowBeginFrameSource() override {}
35 36
36 // cc::BeginFrameSource implementation. 37 // cc::BeginFrameSource implementation.
37 void AddObserver(cc::BeginFrameObserver* obs) override; 38 void AddObserver(cc::BeginFrameObserver* obs) override;
38 void RemoveObserver(cc::BeginFrameObserver* obs) override; 39 void RemoveObserver(cc::BeginFrameObserver* obs) override;
39 void DidFinishFrame(cc::BeginFrameObserver* obs, 40 void DidFinishFrame(cc::BeginFrameObserver* obs,
40 size_t remaining_frames) override {} 41 size_t remaining_frames) override {}
41 bool IsThrottled() const override { return true; } 42 bool IsThrottled() const override { return true; }
42 43
43 void OnVSync(base::TimeTicks frame_time, 44 void OnVSync(base::TimeTicks frame_time, base::TimeDelta vsync_period);
44 base::TimeDelta vsync_period);
45 45
46 private: 46 private:
47 WindowAndroid* const window_; 47 WindowAndroid* const window_;
48 base::ObserverList<cc::BeginFrameObserver> observers_; 48 base::ObserverList<cc::BeginFrameObserver> observers_;
49 int observer_count_; 49 int observer_count_;
50 cc::BeginFrameArgs last_begin_frame_args_; 50 cc::BeginFrameArgs last_begin_frame_args_;
51 uint64_t next_sequence_number_;
51 bool in_on_vsync_; 52 bool in_on_vsync_;
52 }; 53 };
53 54
54 void WindowAndroid::WindowBeginFrameSource::AddObserver( 55 void WindowAndroid::WindowBeginFrameSource::AddObserver(
55 cc::BeginFrameObserver* obs) { 56 cc::BeginFrameObserver* obs) {
56 DCHECK(obs); 57 DCHECK(obs);
57 DCHECK(!observers_.HasObserver(obs)); 58 DCHECK(!observers_.HasObserver(obs));
58 59
59 observers_.AddObserver(obs); 60 observers_.AddObserver(obs);
60 observer_count_++; 61 observer_count_++;
61 obs->OnBeginFrameSourcePausedChanged(false); 62 obs->OnBeginFrameSourcePausedChanged(false);
62 window_->SetNeedsBeginFrames(true); 63 window_->SetNeedsBeginFrames(true);
63 64
64 // Send a MISSED BeginFrame if possible and necessary. If an observer is added 65 // 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 // during OnVSync(), it will get a NORMAL BeginFrame from OnVSync() instead.
66 if (!in_on_vsync_ && last_begin_frame_args_.IsValid()) { 67 if (!in_on_vsync_ && 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) {
71 DCHECK(last_args.sequence_number <
brianderson 2016/12/16 17:53:38 Is it possible for the source id to change? If yes
Eric Seckler 2016/12/20 12:52:29 I think you're right, the observer could switch wi
72 last_begin_frame_args_.sequence_number);
70 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; 73 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED;
71 // TODO(crbug.com/602485): A deadline doesn't make too much sense 74 // TODO(crbug.com/602485): A deadline doesn't make too much sense
72 // for a missed BeginFrame (the intention rather is 'immediately'), 75 // for a missed BeginFrame (the intention rather is 'immediately'),
73 // but currently the retro frame logic is very strict in discarding 76 // but currently the retro frame logic is very strict in discarding
74 // BeginFrames. 77 // BeginFrames.
75 last_begin_frame_args_.deadline = 78 last_begin_frame_args_.deadline =
76 base::TimeTicks::Now() + last_begin_frame_args_.interval; 79 base::TimeTicks::Now() + last_begin_frame_args_.interval;
77 obs->OnBeginFrame(last_begin_frame_args_); 80 obs->OnBeginFrame(last_begin_frame_args_);
78 } 81 }
79 } 82 }
80 } 83 }
81 84
82 void WindowAndroid::WindowBeginFrameSource::RemoveObserver( 85 void WindowAndroid::WindowBeginFrameSource::RemoveObserver(
83 cc::BeginFrameObserver* obs) { 86 cc::BeginFrameObserver* obs) {
84 DCHECK(obs); 87 DCHECK(obs);
85 DCHECK(observers_.HasObserver(obs)); 88 DCHECK(observers_.HasObserver(obs));
86 89
87 observers_.RemoveObserver(obs); 90 observers_.RemoveObserver(obs);
88 observer_count_--; 91 observer_count_--;
89 if (observer_count_ <= 0) 92 if (observer_count_ <= 0)
90 window_->SetNeedsBeginFrames(false); 93 window_->SetNeedsBeginFrames(false);
91 } 94 }
92 95
93 void WindowAndroid::WindowBeginFrameSource::OnVSync( 96 void WindowAndroid::WindowBeginFrameSource::OnVSync(
94 base::TimeTicks frame_time, 97 base::TimeTicks frame_time,
95 base::TimeDelta vsync_period) { 98 base::TimeDelta vsync_period) {
96 // frame time is in the past, so give the next vsync period as the deadline. 99 // frame time is in the past, so give the next vsync period as the deadline.
97 base::TimeTicks deadline = frame_time + vsync_period; 100 base::TimeTicks deadline = frame_time + vsync_period;
98 last_begin_frame_args_ = 101 last_begin_frame_args_ = cc::BeginFrameArgs::Create(
99 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, 102 BEGINFRAME_FROM_HERE, source_id(), next_sequence_number_++, frame_time,
100 vsync_period, cc::BeginFrameArgs::NORMAL); 103 deadline, vsync_period, cc::BeginFrameArgs::NORMAL);
101 DCHECK(last_begin_frame_args_.IsValid()); 104 DCHECK(last_begin_frame_args_.IsValid());
102 105
103 // We support adding/removing observers during observer iteration through 106 // We support adding/removing observers during observer iteration through
104 // base::ObserverList. We also prevent observers that are added during 107 // base::ObserverList. We also prevent observers that are added during
105 // observer iteration from receiving a MISSED BeginFrame by means of 108 // observer iteration from receiving a MISSED BeginFrame by means of
106 // |in_on_vsync_| - they will receive the current NORMAL one during the 109 // |in_on_vsync_| - they will receive the current NORMAL one during the
107 // iteration instead. Note that SynchronousCompositorBrowserFilter relies on 110 // iteration instead. Note that SynchronousCompositorBrowserFilter relies on
108 // this behavior. 111 // this behavior.
109 base::AutoReset<bool> auto_reset(&in_on_vsync_, true); 112 base::AutoReset<bool> auto_reset(&in_on_vsync_, true);
110 for (auto& obs : observers_) 113 for (auto& obs : observers_)
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 // ---------------------------------------------------------------------------- 262 // ----------------------------------------------------------------------------
260 // Native JNI methods 263 // Native JNI methods
261 // ---------------------------------------------------------------------------- 264 // ----------------------------------------------------------------------------
262 265
263 jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj, int sdk_display_id) { 266 jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj, int sdk_display_id) {
264 WindowAndroid* window = new WindowAndroid(env, obj, sdk_display_id); 267 WindowAndroid* window = new WindowAndroid(env, obj, sdk_display_id);
265 return reinterpret_cast<intptr_t>(window); 268 return reinterpret_cast<intptr_t>(window);
266 } 269 }
267 270
268 } // namespace ui 271 } // namespace ui
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698