OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/renderer_host/compositor_impl_android.h" | 5 #include "content/browser/renderer_host/compositor_impl_android.h" |
6 | 6 |
7 #include <android/bitmap.h> | 7 #include <android/bitmap.h> |
8 #include <android/native_window_jni.h> | 8 #include <android/native_window_jni.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 #include <unordered_set> |
11 #include <utility> | 11 #include <utility> |
12 | 12 |
13 #include "base/android/jni_android.h" | 13 #include "base/android/jni_android.h" |
14 #include "base/android/scoped_java_ref.h" | 14 #include "base/android/scoped_java_ref.h" |
15 #include "base/auto_reset.h" | 15 #include "base/auto_reset.h" |
16 #include "base/bind.h" | 16 #include "base/bind.h" |
17 #include "base/cancelable_callback.h" | 17 #include "base/cancelable_callback.h" |
18 #include "base/command_line.h" | 18 #include "base/command_line.h" |
19 #include "base/containers/hash_tables.h" | 19 #include "base/containers/hash_tables.h" |
20 #include "base/lazy_instance.h" | 20 #include "base/lazy_instance.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 namespace gpu { | 74 namespace gpu { |
75 struct GpuProcessHostedCALayerTreeParamsMac; | 75 struct GpuProcessHostedCALayerTreeParamsMac; |
76 } | 76 } |
77 | 77 |
78 namespace content { | 78 namespace content { |
79 | 79 |
80 namespace { | 80 namespace { |
81 | 81 |
82 const unsigned int kMaxDisplaySwapBuffers = 1U; | 82 const unsigned int kMaxDisplaySwapBuffers = 1U; |
83 | 83 |
84 class ExternalBeginFrameSource : public cc::BeginFrameSourceBase, | 84 class ExternalBeginFrameSource : public cc::BeginFrameSource, |
85 public CompositorImpl::VSyncObserver { | 85 public CompositorImpl::VSyncObserver { |
86 public: | 86 public: |
87 ExternalBeginFrameSource(CompositorImpl* compositor) | 87 explicit ExternalBeginFrameSource(CompositorImpl* compositor) |
88 : compositor_(compositor) { | 88 : compositor_(compositor) { |
89 compositor_->AddObserver(this); | 89 compositor_->AddObserver(this); |
90 } | 90 } |
91 | |
92 ~ExternalBeginFrameSource() override { compositor_->RemoveObserver(this); } | 91 ~ExternalBeginFrameSource() override { compositor_->RemoveObserver(this); } |
93 | 92 |
94 // cc::BeginFrameSourceBase implementation: | 93 // cc::BeginFrameSource implementation. |
95 void AddObserver(cc::BeginFrameObserver* obs) override { | 94 void AddObserver(cc::BeginFrameObserver* obs) override; |
96 cc::BeginFrameSourceBase::AddObserver(obs); | 95 void RemoveObserver(cc::BeginFrameObserver* obs) override; |
97 DCHECK(needs_begin_frames()); | 96 void DidFinishFrame(cc::BeginFrameObserver* obs, |
98 if (!last_begin_frame_args_.IsValid()) | 97 size_t remaining_frames) override {} |
99 return; | |
100 | 98 |
| 99 // CompositorImpl::VSyncObserver implementation. |
| 100 void OnVSync(base::TimeTicks frame_time, |
| 101 base::TimeDelta vsync_period) override; |
| 102 |
| 103 private: |
| 104 CompositorImpl* const compositor_; |
| 105 std::unordered_set<cc::BeginFrameObserver*> observers_; |
| 106 cc::BeginFrameArgs last_begin_frame_args_; |
| 107 }; |
| 108 |
| 109 void ExternalBeginFrameSource::AddObserver(cc::BeginFrameObserver* obs) { |
| 110 DCHECK(obs); |
| 111 DCHECK(observers_.find(obs) == observers_.end()); |
| 112 |
| 113 observers_.insert(obs); |
| 114 obs->OnBeginFrameSourcePausedChanged(false); |
| 115 compositor_->OnNeedsBeginFramesChange(true); |
| 116 |
| 117 if (last_begin_frame_args_.IsValid()) { |
101 // Send a MISSED begin frame if necessary. | 118 // Send a MISSED begin frame if necessary. |
102 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); | 119 cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); |
103 if (!last_args.IsValid() || | 120 if (!last_args.IsValid() || |
104 (last_begin_frame_args_.frame_time > last_args.frame_time)) { | 121 (last_begin_frame_args_.frame_time > last_args.frame_time)) { |
105 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; | 122 last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; |
106 // TODO(crbug.com/602485): A deadline doesn't make too much sense | 123 // TODO(crbug.com/602485): A deadline doesn't make too much sense |
107 // for a missed BeginFrame (the intention rather is 'immediately'), | 124 // for a missed BeginFrame (the intention rather is 'immediately'), |
108 // but currently the retro frame logic is very strict in discarding | 125 // but currently the retro frame logic is very strict in discarding |
109 // BeginFrames. | 126 // BeginFrames. |
110 last_begin_frame_args_.deadline = | 127 last_begin_frame_args_.deadline = |
111 base::TimeTicks::Now() + last_begin_frame_args_.interval; | 128 base::TimeTicks::Now() + last_begin_frame_args_.interval; |
112 obs->OnBeginFrame(last_begin_frame_args_); | 129 obs->OnBeginFrame(last_begin_frame_args_); |
113 } | 130 } |
114 } | 131 } |
| 132 } |
115 | 133 |
116 void OnNeedsBeginFramesChanged(bool needs_begin_frames) override { | 134 void ExternalBeginFrameSource::RemoveObserver(cc::BeginFrameObserver* obs) { |
117 TRACE_EVENT1("compositor", "OnNeedsBeginFramesChanged", | 135 DCHECK(obs); |
118 "needs_begin_frames", needs_begin_frames); | 136 DCHECK(observers_.find(obs) != observers_.end()); |
119 compositor_->OnNeedsBeginFramesChange(needs_begin_frames); | |
120 } | |
121 | 137 |
122 // CompositorImpl::VSyncObserver implementation: | 138 observers_.erase(obs); |
123 void OnVSync(base::TimeTicks frame_time, | 139 if (observers_.empty()) |
124 base::TimeDelta vsync_period) override { | 140 compositor_->OnNeedsBeginFramesChange(false); |
125 base::TimeTicks deadline = std::max(base::TimeTicks::Now(), frame_time); | 141 } |
126 last_begin_frame_args_ = | |
127 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, | |
128 vsync_period, cc::BeginFrameArgs::NORMAL); | |
129 CallOnBeginFrame(last_begin_frame_args_); | |
130 } | |
131 | 142 |
132 private: | 143 void ExternalBeginFrameSource::OnVSync(base::TimeTicks frame_time, |
133 CompositorImpl* compositor_; | 144 base::TimeDelta vsync_period) { |
134 cc::BeginFrameArgs last_begin_frame_args_; | 145 base::TimeTicks deadline = std::max(base::TimeTicks::Now(), frame_time); |
135 }; | 146 last_begin_frame_args_ = |
| 147 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
| 148 vsync_period, cc::BeginFrameArgs::NORMAL); |
| 149 std::unordered_set<cc::BeginFrameObserver*> observers(observers_); |
| 150 for (auto* obs : observers) |
| 151 obs->OnBeginFrame(last_begin_frame_args_); |
| 152 } |
136 | 153 |
137 // Used to override capabilities_.adjust_deadline_for_parent to false | 154 // Used to override capabilities_.adjust_deadline_for_parent to false |
138 class OutputSurfaceWithoutParent : public cc::OutputSurface, | 155 class OutputSurfaceWithoutParent : public cc::OutputSurface, |
139 public CompositorImpl::VSyncObserver { | 156 public CompositorImpl::VSyncObserver { |
140 public: | 157 public: |
141 OutputSurfaceWithoutParent( | 158 OutputSurfaceWithoutParent( |
142 CompositorImpl* compositor, | 159 CompositorImpl* compositor, |
143 scoped_refptr<ContextProviderCommandBuffer> context_provider, | 160 scoped_refptr<ContextProviderCommandBuffer> context_provider, |
144 const base::Callback<void(gpu::Capabilities)>& | 161 const base::Callback<void(gpu::Capabilities)>& |
145 populate_gpu_capabilities_callback, | 162 populate_gpu_capabilities_callback, |
(...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
799 void CompositorImpl::SetNeedsAnimate() { | 816 void CompositorImpl::SetNeedsAnimate() { |
800 needs_animate_ = true; | 817 needs_animate_ = true; |
801 if (!host_->visible()) | 818 if (!host_->visible()) |
802 return; | 819 return; |
803 | 820 |
804 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); | 821 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); |
805 host_->SetNeedsAnimate(); | 822 host_->SetNeedsAnimate(); |
806 } | 823 } |
807 | 824 |
808 } // namespace content | 825 } // namespace content |
OLD | NEW |