OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "android_webview/browser/shared_renderer_state.h" | 5 #include "android_webview/browser/shared_renderer_state.h" |
6 | 6 |
7 #include "android_webview/browser/browser_view_renderer_client.h" | 7 #include "android_webview/browser/browser_view_renderer.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
11 | 11 |
12 namespace android_webview { | 12 namespace android_webview { |
13 | 13 |
14 namespace internal { | 14 namespace internal { |
15 | 15 |
16 class RequestDrawGLTracker { | 16 class RequestDrawGLTracker { |
17 public: | 17 public: |
18 RequestDrawGLTracker(); | 18 RequestDrawGLTracker(); |
19 bool ShouldRequestOnNoneUiThread(SharedRendererState* state); | 19 bool ShouldRequestOnNonUiThread(SharedRendererState* state); |
20 bool ShouldRequestOnUiThread(SharedRendererState* state); | 20 bool ShouldRequestOnUiThread(SharedRendererState* state); |
21 void DidRequestOnUiThread(); | 21 void DidRequestOnUiThread(); |
22 void ResetPending(); | 22 void ResetPending(); |
23 | 23 |
24 private: | 24 private: |
25 base::Lock lock_; | 25 base::Lock lock_; |
26 SharedRendererState* pending_ui_; | 26 SharedRendererState* pending_ui_; |
27 SharedRendererState* pending_non_ui_; | 27 SharedRendererState* pending_non_ui_; |
28 }; | 28 }; |
29 | 29 |
30 RequestDrawGLTracker::RequestDrawGLTracker() | 30 RequestDrawGLTracker::RequestDrawGLTracker() |
31 : pending_ui_(NULL), pending_non_ui_(NULL) { | 31 : pending_ui_(NULL), pending_non_ui_(NULL) { |
32 } | 32 } |
33 | 33 |
34 bool RequestDrawGLTracker::ShouldRequestOnNoneUiThread( | 34 bool RequestDrawGLTracker::ShouldRequestOnNonUiThread( |
35 SharedRendererState* state) { | 35 SharedRendererState* state) { |
36 base::AutoLock lock(lock_); | 36 base::AutoLock lock(lock_); |
37 if (pending_ui_ || pending_non_ui_) | 37 if (pending_ui_ || pending_non_ui_) |
38 return false; | 38 return false; |
39 pending_non_ui_ = state; | 39 pending_non_ui_ = state; |
40 return true; | 40 return true; |
41 } | 41 } |
42 | 42 |
43 bool RequestDrawGLTracker::ShouldRequestOnUiThread(SharedRendererState* state) { | 43 bool RequestDrawGLTracker::ShouldRequestOnUiThread(SharedRendererState* state) { |
44 base::AutoLock lock(lock_); | 44 base::AutoLock lock(lock_); |
(...skipping 16 matching lines...) Expand all Loading... |
61 } // namespace internal | 61 } // namespace internal |
62 | 62 |
63 namespace { | 63 namespace { |
64 | 64 |
65 base::LazyInstance<internal::RequestDrawGLTracker> g_request_draw_gl_tracker = | 65 base::LazyInstance<internal::RequestDrawGLTracker> g_request_draw_gl_tracker = |
66 LAZY_INSTANCE_INITIALIZER; | 66 LAZY_INSTANCE_INITIALIZER; |
67 | 67 |
68 } | 68 } |
69 | 69 |
70 SharedRendererState::SharedRendererState( | 70 SharedRendererState::SharedRendererState( |
71 scoped_refptr<base::MessageLoopProxy> ui_loop, | 71 const scoped_refptr<base::SingleThreadTaskRunner>& ui_loop, |
72 BrowserViewRendererClient* client) | 72 BrowserViewRenderer* browser_view_renderer) |
73 : ui_loop_(ui_loop), | 73 : ui_loop_(ui_loop), |
74 client_on_ui_(client), | 74 browser_view_renderer_(browser_view_renderer), |
75 force_commit_(false), | 75 force_commit_(false), |
76 inside_hardware_release_(false), | 76 inside_hardware_release_(false), |
77 needs_force_invalidate_on_next_draw_gl_(false), | 77 needs_force_invalidate_on_next_draw_gl_(false), |
78 weak_factory_on_ui_thread_(this) { | 78 weak_factory_on_ui_thread_(this) { |
79 DCHECK(ui_loop_->BelongsToCurrentThread()); | 79 DCHECK(ui_loop_->BelongsToCurrentThread()); |
80 DCHECK(client_on_ui_); | 80 DCHECK(browser_view_renderer_); |
81 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr(); | 81 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr(); |
82 ResetRequestDrawGLCallback(); | 82 ResetRequestDrawGLCallback(); |
83 } | 83 } |
84 | 84 |
85 SharedRendererState::~SharedRendererState() { | 85 SharedRendererState::~SharedRendererState() { |
86 DCHECK(ui_loop_->BelongsToCurrentThread()); | 86 DCHECK(ui_loop_->BelongsToCurrentThread()); |
87 } | 87 } |
88 | 88 |
89 void SharedRendererState::ClientRequestDrawGL() { | 89 void SharedRendererState::ClientRequestDrawGL() { |
90 if (ui_loop_->BelongsToCurrentThread()) { | 90 if (ui_loop_->BelongsToCurrentThread()) { |
91 if (!g_request_draw_gl_tracker.Get().ShouldRequestOnUiThread(this)) | 91 if (!g_request_draw_gl_tracker.Get().ShouldRequestOnUiThread(this)) |
92 return; | 92 return; |
93 ClientRequestDrawGLOnUIThread(); | 93 ClientRequestDrawGLOnUIThread(); |
94 } else { | 94 } else { |
95 if (!g_request_draw_gl_tracker.Get().ShouldRequestOnNoneUiThread(this)) | 95 if (!g_request_draw_gl_tracker.Get().ShouldRequestOnNonUiThread(this)) |
96 return; | 96 return; |
97 base::Closure callback; | 97 base::Closure callback; |
98 { | 98 { |
99 base::AutoLock lock(lock_); | 99 base::AutoLock lock(lock_); |
100 callback = request_draw_gl_closure_; | 100 callback = request_draw_gl_closure_; |
101 } | 101 } |
102 ui_loop_->PostTask(FROM_HERE, callback); | 102 ui_loop_->PostTask(FROM_HERE, callback); |
103 } | 103 } |
104 } | 104 } |
105 | 105 |
106 void SharedRendererState::DidDrawGLProcess() { | 106 void SharedRendererState::DidDrawGLProcess() { |
107 g_request_draw_gl_tracker.Get().ResetPending(); | 107 g_request_draw_gl_tracker.Get().ResetPending(); |
108 } | 108 } |
109 | 109 |
110 void SharedRendererState::ResetRequestDrawGLCallback() { | 110 void SharedRendererState::ResetRequestDrawGLCallback() { |
111 DCHECK(ui_loop_->BelongsToCurrentThread()); | 111 DCHECK(ui_loop_->BelongsToCurrentThread()); |
112 base::AutoLock lock(lock_); | 112 base::AutoLock lock(lock_); |
113 request_draw_gl_cancelable_closure_.Reset( | 113 request_draw_gl_cancelable_closure_.Reset( |
114 base::Bind(&SharedRendererState::ClientRequestDrawGLOnUIThread, | 114 base::Bind(&SharedRendererState::ClientRequestDrawGLOnUIThread, |
115 base::Unretained(this))); | 115 base::Unretained(this))); |
116 request_draw_gl_closure_ = request_draw_gl_cancelable_closure_.callback(); | 116 request_draw_gl_closure_ = request_draw_gl_cancelable_closure_.callback(); |
117 } | 117 } |
118 | 118 |
119 void SharedRendererState::ClientRequestDrawGLOnUIThread() { | 119 void SharedRendererState::ClientRequestDrawGLOnUIThread() { |
120 DCHECK(ui_loop_->BelongsToCurrentThread()); | 120 DCHECK(ui_loop_->BelongsToCurrentThread()); |
121 ResetRequestDrawGLCallback(); | 121 ResetRequestDrawGLCallback(); |
122 if (!client_on_ui_->RequestDrawGL(NULL, false)) { | 122 if (!browser_view_renderer_->RequestDrawGL(NULL, false)) { |
123 g_request_draw_gl_tracker.Get().ResetPending(); | 123 g_request_draw_gl_tracker.Get().ResetPending(); |
124 LOG(ERROR) << "Failed to request GL process. Deadlock likely"; | 124 LOG(ERROR) << "Failed to request GL process. Deadlock likely"; |
125 } | 125 } |
126 } | 126 } |
127 | 127 |
128 void SharedRendererState::UpdateParentDrawConstraintsOnUIThread() { | 128 void SharedRendererState::UpdateParentDrawConstraintsOnUIThread() { |
129 DCHECK(ui_loop_->BelongsToCurrentThread()); | 129 DCHECK(ui_loop_->BelongsToCurrentThread()); |
130 client_on_ui_->UpdateParentDrawConstraints(); | 130 browser_view_renderer_->UpdateParentDrawConstraints(); |
131 } | 131 } |
132 | 132 |
133 void SharedRendererState::SetScrollOffset(gfx::Vector2d scroll_offset) { | 133 void SharedRendererState::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) { |
134 base::AutoLock lock(lock_); | 134 base::AutoLock lock(lock_); |
135 scroll_offset_ = scroll_offset; | 135 scroll_offset_ = scroll_offset; |
136 } | 136 } |
137 | 137 |
138 gfx::Vector2d SharedRendererState::GetScrollOffset() { | 138 gfx::Vector2d SharedRendererState::GetScrollOffsetOnRT() { |
139 base::AutoLock lock(lock_); | 139 base::AutoLock lock(lock_); |
140 return scroll_offset_; | 140 return scroll_offset_; |
141 } | 141 } |
142 | 142 |
143 bool SharedRendererState::HasCompositorFrame() const { | 143 bool SharedRendererState::HasCompositorFrameOnUI() const { |
144 base::AutoLock lock(lock_); | 144 base::AutoLock lock(lock_); |
145 return compositor_frame_.get(); | 145 return compositor_frame_.get(); |
146 } | 146 } |
147 | 147 |
148 void SharedRendererState::SetCompositorFrame( | 148 void SharedRendererState::SetCompositorFrameOnUI( |
149 scoped_ptr<cc::CompositorFrame> frame, bool force_commit) { | 149 scoped_ptr<cc::CompositorFrame> frame, |
| 150 bool force_commit) { |
150 base::AutoLock lock(lock_); | 151 base::AutoLock lock(lock_); |
151 DCHECK(!compositor_frame_.get()); | 152 DCHECK(!compositor_frame_.get()); |
152 compositor_frame_ = frame.Pass(); | 153 compositor_frame_ = frame.Pass(); |
153 force_commit_ = force_commit; | 154 force_commit_ = force_commit; |
154 } | 155 } |
155 | 156 |
156 scoped_ptr<cc::CompositorFrame> SharedRendererState::PassCompositorFrame() { | 157 scoped_ptr<cc::CompositorFrame> SharedRendererState::PassCompositorFrame() { |
157 base::AutoLock lock(lock_); | 158 base::AutoLock lock(lock_); |
158 return compositor_frame_.Pass(); | 159 return compositor_frame_.Pass(); |
159 } | 160 } |
160 | 161 |
161 bool SharedRendererState::ForceCommit() const { | 162 bool SharedRendererState::ForceCommitOnRT() const { |
162 base::AutoLock lock(lock_); | 163 base::AutoLock lock(lock_); |
163 return force_commit_; | 164 return force_commit_; |
164 } | 165 } |
165 | 166 |
166 bool SharedRendererState::UpdateDrawConstraints( | 167 bool SharedRendererState::UpdateDrawConstraintsOnRT( |
167 const ParentCompositorDrawConstraints& parent_draw_constraints) { | 168 const ParentCompositorDrawConstraints& parent_draw_constraints) { |
168 base::AutoLock lock(lock_); | 169 base::AutoLock lock(lock_); |
169 if (needs_force_invalidate_on_next_draw_gl_ || | 170 if (needs_force_invalidate_on_next_draw_gl_ || |
170 !parent_draw_constraints_.Equals(parent_draw_constraints)) { | 171 !parent_draw_constraints_.Equals(parent_draw_constraints)) { |
171 parent_draw_constraints_ = parent_draw_constraints; | 172 parent_draw_constraints_ = parent_draw_constraints; |
172 return true; | 173 return true; |
173 } | 174 } |
174 | 175 |
175 return false; | 176 return false; |
176 } | 177 } |
177 | 178 |
178 void SharedRendererState::PostExternalDrawConstraintsToChildCompositor( | 179 void SharedRendererState::PostExternalDrawConstraintsToChildCompositorOnRT( |
179 const ParentCompositorDrawConstraints& parent_draw_constraints) { | 180 const ParentCompositorDrawConstraints& parent_draw_constraints) { |
180 if (UpdateDrawConstraints(parent_draw_constraints)) { | 181 if (UpdateDrawConstraintsOnRT(parent_draw_constraints)) { |
181 // No need to hold the lock_ during the post task. | 182 // No need to hold the lock_ during the post task. |
182 ui_loop_->PostTask( | 183 ui_loop_->PostTask( |
183 FROM_HERE, | 184 FROM_HERE, |
184 base::Bind(&SharedRendererState::UpdateParentDrawConstraintsOnUIThread, | 185 base::Bind(&SharedRendererState::UpdateParentDrawConstraintsOnUIThread, |
185 ui_thread_weak_ptr_)); | 186 ui_thread_weak_ptr_)); |
186 } | 187 } |
187 } | 188 } |
188 | 189 |
189 void SharedRendererState::DidSkipCommitFrame() { | 190 void SharedRendererState::DidSkipCommitFrameOnRT() { |
190 ui_loop_->PostTask( | 191 ui_loop_->PostTask(FROM_HERE, |
191 FROM_HERE, | 192 base::Bind(&SharedRendererState::DidSkipCommitFrameOnUI, |
192 base::Bind(&SharedRendererState::DidSkipCommitFrameOnUIThread, | 193 ui_thread_weak_ptr_)); |
193 ui_thread_weak_ptr_)); | |
194 } | 194 } |
195 | 195 |
196 void SharedRendererState::DidSkipCommitFrameOnUIThread() { | 196 void SharedRendererState::DidSkipCommitFrameOnUI() { |
197 DCHECK(ui_loop_->BelongsToCurrentThread()); | 197 DCHECK(ui_loop_->BelongsToCurrentThread()); |
198 client_on_ui_->DidSkipCommitFrame(); | 198 browser_view_renderer_->DidSkipCommitFrame(); |
199 } | 199 } |
200 | 200 |
201 const ParentCompositorDrawConstraints | 201 ParentCompositorDrawConstraints |
202 SharedRendererState::ParentDrawConstraints() const { | 202 SharedRendererState::GetParentDrawConstraintsOnUI() const { |
203 base::AutoLock lock(lock_); | 203 base::AutoLock lock(lock_); |
204 return parent_draw_constraints_; | 204 return parent_draw_constraints_; |
205 } | 205 } |
206 | 206 |
207 void SharedRendererState::SetForceInvalidateOnNextDrawGL( | 207 void SharedRendererState::SetForceInvalidateOnNextDrawGLOnUI( |
208 bool needs_force_invalidate_on_next_draw_gl) { | 208 bool needs_force_invalidate_on_next_draw_gl) { |
209 base::AutoLock lock(lock_); | 209 base::AutoLock lock(lock_); |
210 needs_force_invalidate_on_next_draw_gl_ = | 210 needs_force_invalidate_on_next_draw_gl_ = |
211 needs_force_invalidate_on_next_draw_gl; | 211 needs_force_invalidate_on_next_draw_gl; |
212 } | 212 } |
213 | 213 |
214 bool SharedRendererState::NeedsForceInvalidateOnNextDrawGL() const { | 214 bool SharedRendererState::NeedsForceInvalidateOnNextDrawGLOnUI() const { |
215 base::AutoLock lock(lock_); | 215 base::AutoLock lock(lock_); |
216 return needs_force_invalidate_on_next_draw_gl_; | 216 return needs_force_invalidate_on_next_draw_gl_; |
217 } | 217 } |
218 | 218 |
219 void SharedRendererState::SetInsideHardwareRelease(bool inside) { | 219 void SharedRendererState::SetInsideHardwareRelease(bool inside) { |
220 base::AutoLock lock(lock_); | 220 base::AutoLock lock(lock_); |
221 inside_hardware_release_ = inside; | 221 inside_hardware_release_ = inside; |
222 } | 222 } |
223 | 223 |
224 bool SharedRendererState::IsInsideHardwareRelease() const { | 224 bool SharedRendererState::IsInsideHardwareRelease() const { |
225 base::AutoLock lock(lock_); | 225 base::AutoLock lock(lock_); |
226 return inside_hardware_release_; | 226 return inside_hardware_release_; |
227 } | 227 } |
228 | 228 |
229 void SharedRendererState::InsertReturnedResources( | 229 void SharedRendererState::InsertReturnedResourcesOnRT( |
230 const cc::ReturnedResourceArray& resources) { | 230 const cc::ReturnedResourceArray& resources) { |
231 base::AutoLock lock(lock_); | 231 base::AutoLock lock(lock_); |
232 returned_resources_.insert( | 232 returned_resources_.insert( |
233 returned_resources_.end(), resources.begin(), resources.end()); | 233 returned_resources_.end(), resources.begin(), resources.end()); |
234 } | 234 } |
235 | 235 |
236 void SharedRendererState::SwapReturnedResources( | 236 void SharedRendererState::SwapReturnedResourcesOnUI( |
237 cc::ReturnedResourceArray* resources) { | 237 cc::ReturnedResourceArray* resources) { |
238 DCHECK(resources->empty()); | 238 DCHECK(resources->empty()); |
239 base::AutoLock lock(lock_); | 239 base::AutoLock lock(lock_); |
240 resources->swap(returned_resources_); | 240 resources->swap(returned_resources_); |
241 } | 241 } |
242 | 242 |
243 bool SharedRendererState::ReturnedResourcesEmpty() const { | 243 bool SharedRendererState::ReturnedResourcesEmpty() const { |
244 base::AutoLock lock(lock_); | 244 base::AutoLock lock(lock_); |
245 return returned_resources_.empty(); | 245 return returned_resources_.empty(); |
246 } | 246 } |
247 | 247 |
248 InsideHardwareReleaseReset::InsideHardwareReleaseReset( | 248 InsideHardwareReleaseReset::InsideHardwareReleaseReset( |
249 SharedRendererState* shared_renderer_state) | 249 SharedRendererState* shared_renderer_state) |
250 : shared_renderer_state_(shared_renderer_state) { | 250 : shared_renderer_state_(shared_renderer_state) { |
251 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); | 251 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); |
252 shared_renderer_state_->SetInsideHardwareRelease(true); | 252 shared_renderer_state_->SetInsideHardwareRelease(true); |
253 } | 253 } |
254 | 254 |
255 InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { | 255 InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { |
256 shared_renderer_state_->SetInsideHardwareRelease(false); | 256 shared_renderer_state_->SetInsideHardwareRelease(false); |
257 } | 257 } |
258 | 258 |
259 } // namespace android_webview | 259 } // namespace android_webview |
OLD | NEW |