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

Side by Side Diff: android_webview/browser/shared_renderer_state.cc

Issue 655813004: Part 1: Refactor Android WebView graphics code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@refactor
Patch Set: comments Created 6 years, 1 month 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 | « android_webview/browser/shared_renderer_state.h ('k') | android_webview/native/aw_contents.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « android_webview/browser/shared_renderer_state.h ('k') | android_webview/native/aw_contents.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698