| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|