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

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

Issue 2583483002: [cc] Adds source_id and sequence_number to BeginFrameArgs. (Closed)
Patch Set: fix field ordering Created 3 years, 12 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
« 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 <unordered_set> 7 #include <unordered_set>
8 8
9 #include "base/android/context_utils.h" 9 #include "base/android/context_utils.h"
10 #include "base/android/jni_android.h" 10 #include "base/android/jni_android.h"
(...skipping 15 matching lines...) Expand all
26 using base::android::AttachCurrentThread; 26 using base::android::AttachCurrentThread;
27 using base::android::JavaParamRef; 27 using base::android::JavaParamRef;
28 using base::android::JavaRef; 28 using base::android::JavaRef;
29 using base::android::ScopedJavaLocalRef; 29 using base::android::ScopedJavaLocalRef;
30 30
31 class WindowAndroid::WindowBeginFrameSource : public cc::BeginFrameSource { 31 class WindowAndroid::WindowBeginFrameSource : public cc::BeginFrameSource {
32 public: 32 public:
33 explicit WindowBeginFrameSource(WindowAndroid* window) 33 explicit WindowBeginFrameSource(WindowAndroid* window)
34 : window_(window), 34 : window_(window),
35 observer_count_(0), 35 observer_count_(0),
36 next_sequence_number_(cc::BeginFrameArgs::kStartingFrameNumber),
36 in_on_vsync_(false) {} 37 in_on_vsync_(false) {}
37 ~WindowBeginFrameSource() override {} 38 ~WindowBeginFrameSource() override {}
38 39
39 // cc::BeginFrameSource implementation. 40 // cc::BeginFrameSource implementation.
40 void AddObserver(cc::BeginFrameObserver* obs) override; 41 void AddObserver(cc::BeginFrameObserver* obs) override;
41 void RemoveObserver(cc::BeginFrameObserver* obs) override; 42 void RemoveObserver(cc::BeginFrameObserver* obs) override;
42 void DidFinishFrame(cc::BeginFrameObserver* obs, 43 void DidFinishFrame(cc::BeginFrameObserver* obs,
43 size_t remaining_frames) override {} 44 size_t remaining_frames) override {}
44 bool IsThrottled() const override { return true; } 45 bool IsThrottled() const override { return true; }
45 46
46 void OnVSync(base::TimeTicks frame_time, 47 void OnVSync(base::TimeTicks frame_time, base::TimeDelta vsync_period);
47 base::TimeDelta vsync_period);
48 48
49 private: 49 private:
50 WindowAndroid* const window_; 50 WindowAndroid* const window_;
51 base::ObserverList<cc::BeginFrameObserver> observers_; 51 base::ObserverList<cc::BeginFrameObserver> observers_;
52 int observer_count_; 52 int observer_count_;
53 cc::BeginFrameArgs last_begin_frame_args_; 53 cc::BeginFrameArgs last_begin_frame_args_;
54 uint64_t next_sequence_number_;
54 bool in_on_vsync_; 55 bool in_on_vsync_;
55 }; 56 };
56 57
57 void WindowAndroid::WindowBeginFrameSource::AddObserver( 58 void WindowAndroid::WindowBeginFrameSource::AddObserver(
58 cc::BeginFrameObserver* obs) { 59 cc::BeginFrameObserver* obs) {
59 DCHECK(obs); 60 DCHECK(obs);
60 DCHECK(!observers_.HasObserver(obs)); 61 DCHECK(!observers_.HasObserver(obs));
61 62
62 observers_.AddObserver(obs); 63 observers_.AddObserver(obs);
63 observer_count_++; 64 observer_count_++;
64 obs->OnBeginFrameSourcePausedChanged(false); 65 obs->OnBeginFrameSourcePausedChanged(false);
65 window_->SetNeedsBeginFrames(true); 66 window_->SetNeedsBeginFrames(true);
66 67
67 // Send a MISSED BeginFrame if possible and necessary. If an observer is added 68 // Send a MISSED BeginFrame if possible and necessary. If an observer is added
68 // during OnVSync(), it will get a NORMAL BeginFrame from OnVSync() instead. 69 // during OnVSync(), it will get a NORMAL BeginFrame from OnVSync() instead.
69 if (!in_on_vsync_ && last_begin_frame_args_.IsValid()) { 70 if (!in_on_vsync_ && last_begin_frame_args_.IsValid()) {
70 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); 71 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs();
71 if (!last_args.IsValid() || 72 if (!last_args.IsValid() ||
72 last_args.frame_time < last_begin_frame_args_.frame_time) { 73 last_args.frame_time < last_begin_frame_args_.frame_time) {
74 DCHECK(last_args.sequence_number <
75 last_begin_frame_args_.sequence_number ||
76 last_args.source_id != last_begin_frame_args_.source_id);
73 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; 77 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED;
74 // TODO(crbug.com/602485): A deadline doesn't make too much sense 78 // TODO(crbug.com/602485): A deadline doesn't make too much sense
75 // for a missed BeginFrame (the intention rather is 'immediately'), 79 // for a missed BeginFrame (the intention rather is 'immediately'),
76 // but currently the retro frame logic is very strict in discarding 80 // but currently the retro frame logic is very strict in discarding
77 // BeginFrames. 81 // BeginFrames.
78 last_begin_frame_args_.deadline = 82 last_begin_frame_args_.deadline =
79 base::TimeTicks::Now() + last_begin_frame_args_.interval; 83 base::TimeTicks::Now() + last_begin_frame_args_.interval;
80 obs->OnBeginFrame(last_begin_frame_args_); 84 obs->OnBeginFrame(last_begin_frame_args_);
81 } 85 }
82 } 86 }
83 } 87 }
84 88
85 void WindowAndroid::WindowBeginFrameSource::RemoveObserver( 89 void WindowAndroid::WindowBeginFrameSource::RemoveObserver(
86 cc::BeginFrameObserver* obs) { 90 cc::BeginFrameObserver* obs) {
87 DCHECK(obs); 91 DCHECK(obs);
88 DCHECK(observers_.HasObserver(obs)); 92 DCHECK(observers_.HasObserver(obs));
89 93
90 observers_.RemoveObserver(obs); 94 observers_.RemoveObserver(obs);
91 observer_count_--; 95 observer_count_--;
92 if (observer_count_ <= 0) 96 if (observer_count_ <= 0)
93 window_->SetNeedsBeginFrames(false); 97 window_->SetNeedsBeginFrames(false);
94 } 98 }
95 99
96 void WindowAndroid::WindowBeginFrameSource::OnVSync( 100 void WindowAndroid::WindowBeginFrameSource::OnVSync(
97 base::TimeTicks frame_time, 101 base::TimeTicks frame_time,
98 base::TimeDelta vsync_period) { 102 base::TimeDelta vsync_period) {
99 // frame time is in the past, so give the next vsync period as the deadline. 103 // frame time is in the past, so give the next vsync period as the deadline.
100 base::TimeTicks deadline = frame_time + vsync_period; 104 base::TimeTicks deadline = frame_time + vsync_period;
101 last_begin_frame_args_ = 105 last_begin_frame_args_ = cc::BeginFrameArgs::Create(
102 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, 106 BEGINFRAME_FROM_HERE, source_id(), next_sequence_number_, frame_time,
103 vsync_period, cc::BeginFrameArgs::NORMAL); 107 deadline, vsync_period, cc::BeginFrameArgs::NORMAL);
104 DCHECK(last_begin_frame_args_.IsValid()); 108 DCHECK(last_begin_frame_args_.IsValid());
109 next_sequence_number_++;
105 110
106 // We support adding/removing observers during observer iteration through 111 // We support adding/removing observers during observer iteration through
107 // base::ObserverList. We also prevent observers that are added during 112 // base::ObserverList. We also prevent observers that are added during
108 // observer iteration from receiving a MISSED BeginFrame by means of 113 // observer iteration from receiving a MISSED BeginFrame by means of
109 // |in_on_vsync_| - they will receive the current NORMAL one during the 114 // |in_on_vsync_| - they will receive the current NORMAL one during the
110 // iteration instead. Note that SynchronousCompositorBrowserFilter relies on 115 // iteration instead. Note that SynchronousCompositorBrowserFilter relies on
111 // this behavior. 116 // this behavior.
112 // TODO(eseckler): Remove SynchronousCompositorBrowserFilter's dependency on 117 // TODO(eseckler): Remove SynchronousCompositorBrowserFilter's dependency on
113 // this and replace observers_ by a std::unordered_set, iterate on a copy. 118 // this and replace observers_ by a std::unordered_set, iterate on a copy.
114 base::AutoReset<bool> auto_reset(&in_on_vsync_, true); 119 base::AutoReset<bool> auto_reset(&in_on_vsync_, true);
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 // ---------------------------------------------------------------------------- 283 // ----------------------------------------------------------------------------
279 // Native JNI methods 284 // Native JNI methods
280 // ---------------------------------------------------------------------------- 285 // ----------------------------------------------------------------------------
281 286
282 jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj, int sdk_display_id) { 287 jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj, int sdk_display_id) {
283 WindowAndroid* window = new WindowAndroid(env, obj, sdk_display_id); 288 WindowAndroid* window = new WindowAndroid(env, obj, sdk_display_id);
284 return reinterpret_cast<intptr_t>(window); 289 return reinterpret_cast<intptr_t>(window);
285 } 290 }
286 291
287 } // namespace ui 292 } // 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