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

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

Issue 1816283005: Move SharedRendererState ownership to AwContents (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Begin to disentangle SRS and BVR Created 4 years, 9 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
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 <utility> 7 #include <utility>
8 8
9 #include "android_webview/browser/browser_view_renderer.h" 9 #include "android_webview/browser/browser_view_renderer.h"
10 #include "android_webview/browser/child_frame.h" 10 #include "android_webview/browser/child_frame.h"
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 } // namespace internal 80 } // namespace internal
81 81
82 namespace { 82 namespace {
83 83
84 base::LazyInstance<internal::RequestDrawGLTracker> g_request_draw_gl_tracker = 84 base::LazyInstance<internal::RequestDrawGLTracker> g_request_draw_gl_tracker =
85 LAZY_INSTANCE_INITIALIZER; 85 LAZY_INSTANCE_INITIALIZER;
86 86
87 } 87 }
88 88
89 SharedRendererState::SharedRendererState( 89 SharedRendererState::SharedRendererState(
90 const scoped_refptr<base::SingleThreadTaskRunner>& ui_loop, 90 const scoped_refptr<base::SingleThreadTaskRunner>& ui_loop)
91 BrowserViewRenderer* browser_view_renderer)
92 : ui_loop_(ui_loop), 91 : ui_loop_(ui_loop),
93 browser_view_renderer_(browser_view_renderer), 92 browser_view_renderer_(nullptr),
94 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()), 93 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()),
95 hardware_renderer_has_frame_(false), 94 hardware_renderer_has_frame_(false),
96 inside_hardware_release_(false), 95 inside_hardware_release_(false),
97 weak_factory_on_ui_thread_(this) { 96 weak_factory_on_ui_thread_(this) {
98 DCHECK(ui_loop_->BelongsToCurrentThread()); 97 DCHECK(ui_loop_->BelongsToCurrentThread());
99 DCHECK(browser_view_renderer_);
100 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr(); 98 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr();
101 ResetRequestDrawGLCallback(); 99 ResetRequestDrawGLCallback();
102 } 100 }
103 101
104 SharedRendererState::~SharedRendererState() { 102 SharedRendererState::~SharedRendererState() {
105 DCHECK(ui_loop_->BelongsToCurrentThread()); 103 DCHECK(ui_loop_->BelongsToCurrentThread());
106 DCHECK(!hardware_renderer_.get()); 104 DCHECK(!hardware_renderer_.get());
107 } 105 }
108 106
109 void SharedRendererState::ClientRequestDrawGL(bool for_idle) { 107 void SharedRendererState::ClientRequestDrawGL(bool for_idle) {
(...skipping 25 matching lines...) Expand all
135 void SharedRendererState::ResetRequestDrawGLCallback() { 133 void SharedRendererState::ResetRequestDrawGLCallback() {
136 DCHECK(ui_loop_->BelongsToCurrentThread()); 134 DCHECK(ui_loop_->BelongsToCurrentThread());
137 base::AutoLock lock(lock_); 135 base::AutoLock lock(lock_);
138 request_draw_gl_cancelable_closure_.Reset(base::Bind( 136 request_draw_gl_cancelable_closure_.Reset(base::Bind(
139 &SharedRendererState::ClientRequestDrawGLOnUI, base::Unretained(this))); 137 &SharedRendererState::ClientRequestDrawGLOnUI, base::Unretained(this)));
140 request_draw_gl_closure_ = request_draw_gl_cancelable_closure_.callback(); 138 request_draw_gl_closure_ = request_draw_gl_cancelable_closure_.callback();
141 } 139 }
142 140
143 void SharedRendererState::ClientRequestDrawGLOnUI() { 141 void SharedRendererState::ClientRequestDrawGLOnUI() {
144 DCHECK(ui_loop_->BelongsToCurrentThread()); 142 DCHECK(ui_loop_->BelongsToCurrentThread());
143 DCHECK(browser_view_renderer_);
145 ResetRequestDrawGLCallback(); 144 ResetRequestDrawGLCallback();
146 g_request_draw_gl_tracker.Get().SetQueuedFunctorOnUi(this); 145 g_request_draw_gl_tracker.Get().SetQueuedFunctorOnUi(this);
147 if (!browser_view_renderer_->RequestDrawGL(false)) { 146 if (!browser_view_renderer_->RequestDrawGL(false)) {
148 g_request_draw_gl_tracker.Get().ResetPending(); 147 g_request_draw_gl_tracker.Get().ResetPending();
149 LOG(ERROR) << "Failed to request GL process. Deadlock likely"; 148 LOG(ERROR) << "Failed to request GL process. Deadlock likely";
150 } 149 }
151 } 150 }
152 151
153 void SharedRendererState::UpdateParentDrawConstraintsOnUI() { 152 void SharedRendererState::UpdateParentDrawConstraintsOnUI() {
154 DCHECK(ui_loop_->BelongsToCurrentThread()); 153 DCHECK(ui_loop_->BelongsToCurrentThread());
154 DCHECK(browser_view_renderer_);
155 browser_view_renderer_->UpdateParentDrawConstraints(); 155 browser_view_renderer_->UpdateParentDrawConstraints();
156 } 156 }
157 157
158 void SharedRendererState::SetBrowserViewRendererOnUI(
159 BrowserViewRenderer* browser_view_renderer) {
160 DCHECK(ui_loop_->BelongsToCurrentThread());
161 browser_view_renderer_ = browser_view_renderer;
162 }
163
158 void SharedRendererState::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) { 164 void SharedRendererState::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) {
159 base::AutoLock lock(lock_); 165 base::AutoLock lock(lock_);
160 scroll_offset_ = scroll_offset; 166 scroll_offset_ = scroll_offset;
161 } 167 }
162 168
163 gfx::Vector2d SharedRendererState::GetScrollOffsetOnRT() { 169 gfx::Vector2d SharedRendererState::GetScrollOffsetOnRT() {
164 base::AutoLock lock(lock_); 170 base::AutoLock lock(lock_);
165 return scroll_offset_; 171 return scroll_offset_;
166 } 172 }
167 173
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 if (draw_info->mode == AwDrawGLInfo::kModeProcess) { 313 if (draw_info->mode == AwDrawGLInfo::kModeProcess) {
308 DeferredGpuCommandService::GetInstance()->PerformIdleWork(true); 314 DeferredGpuCommandService::GetInstance()->PerformIdleWork(true);
309 } 315 }
310 return; 316 return;
311 } 317 }
312 318
313 hardware_renderer_->DrawGL(draw_info, state_restore); 319 hardware_renderer_->DrawGL(draw_info, state_restore);
314 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false); 320 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false);
315 } 321 }
316 322
317 void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() { 323 void SharedRendererState::ReleaseCompositorResourcesIfNeededOnUI() {
boliu 2016/03/23 20:42:32 DeleteHardwareRendererOnUIThread actually sounds b
Tobias Sargeant 2016/03/24 16:53:05 Done.
318 ReleaseCompositorResourcesIfNeededOnUI(true); 324 DCHECK(ui_loop_->BelongsToCurrentThread());
319 }
320 325
321 void SharedRendererState::DeleteHardwareRendererOnUI() {
322 ReleaseCompositorResourcesIfNeededOnUI(false);
323 }
324
325 void SharedRendererState::ReleaseCompositorResourcesIfNeededOnUI(
326 bool release_hardware_draw) {
327 DCHECK(ui_loop_->BelongsToCurrentThread());
328 InsideHardwareReleaseReset auto_inside_hardware_release_reset(this); 326 InsideHardwareReleaseReset auto_inside_hardware_release_reset(this);
329 327
330 browser_view_renderer_->DetachFunctorFromView(); 328 browser_view_renderer_->DetachFunctorFromView();
331 bool hardware_initialized = browser_view_renderer_->hardware_enabled(); 329 bool hardware_initialized = browser_view_renderer_->hardware_enabled();
332 // If the WebView gets onTrimMemory >= MODERATE twice in a row, the 2nd 330 // If the WebView gets onTrimMemory >= MODERATE twice in a row, the 2nd
333 // onTrimMemory will result in an unnecessary Render Thread DrawGL call. 331 // onTrimMemory will result in an unnecessary Render Thread DrawGL call.
334 if (hardware_initialized) { 332 if (hardware_initialized) {
335 bool draw_functor_succeeded = browser_view_renderer_->RequestDrawGL(true); 333 bool draw_functor_succeeded = browser_view_renderer_->RequestDrawGL(true);
336 if (!draw_functor_succeeded) { 334 if (!draw_functor_succeeded) {
337 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?"; 335 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?";
338 // Calling release on wrong thread intentionally. 336 // Calling release on wrong thread intentionally.
339 AwDrawGLInfo info; 337 AwDrawGLInfo info;
340 info.mode = AwDrawGLInfo::kModeProcess; 338 info.mode = AwDrawGLInfo::kModeProcess;
341 DrawGL(&info); 339 DrawGL(&info);
342 } 340 }
343
344 if (release_hardware_draw)
345 browser_view_renderer_->ReleaseHardware();
346 } 341 }
347 342
348 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); 343 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
349 344
350 { 345 {
351 base::AutoLock lock(lock_); 346 base::AutoLock lock(lock_);
352 if (renderer_manager_key_ != manager->NullKey()) { 347 if (renderer_manager_key_ != manager->NullKey()) {
353 manager->Remove(renderer_manager_key_); 348 manager->Remove(renderer_manager_key_);
354 renderer_manager_key_ = manager->NullKey(); 349 renderer_manager_key_ = manager->NullKey();
355 } 350 }
356 } 351 }
357 352
358 if (hardware_initialized) { 353 if (hardware_initialized) {
359 // Flush any invoke functors that's caused by ReleaseHardware. 354 // Flush any invoke functors that's caused by ReleaseHardware.
360 browser_view_renderer_->RequestDrawGL(true); 355 browser_view_renderer_->RequestDrawGL(true);
361 } 356 }
362 } 357 }
363 358
364 bool SharedRendererState::HasFrameOnUI() const { 359 bool SharedRendererState::HasFrameOnUI() const {
365 base::AutoLock lock(lock_); 360 base::AutoLock lock(lock_);
366 return hardware_renderer_has_frame_ || child_frame_.get(); 361 return hardware_renderer_has_frame_ || child_frame_.get();
367 } 362 }
368 363
364 void SharedRendererState::TrimMemoryOnUI(int level) {
boliu 2016/03/23 20:42:32 The level check got dropped?
Tobias Sargeant 2016/03/24 16:53:05 Done. Deciding what to trim and when moved to AwCo
365 ReleaseCompositorResourcesIfNeededOnUI();
366 }
367
369 void SharedRendererState::InitializeHardwareDrawIfNeededOnUI() { 368 void SharedRendererState::InitializeHardwareDrawIfNeededOnUI() {
370 DCHECK(ui_loop_->BelongsToCurrentThread()); 369 DCHECK(ui_loop_->BelongsToCurrentThread());
371 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); 370 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
372 371
373 base::AutoLock lock(lock_); 372 base::AutoLock lock(lock_);
374 if (renderer_manager_key_ == manager->NullKey()) { 373 if (renderer_manager_key_ == manager->NullKey()) {
375 renderer_manager_key_ = manager->PushBack(this); 374 renderer_manager_key_ = manager->PushBack(this);
376 } 375 }
377 } 376 }
378 377
379 SharedRendererState::InsideHardwareReleaseReset::InsideHardwareReleaseReset( 378 SharedRendererState::InsideHardwareReleaseReset::InsideHardwareReleaseReset(
380 SharedRendererState* shared_renderer_state) 379 SharedRendererState* shared_renderer_state)
381 : shared_renderer_state_(shared_renderer_state) { 380 : shared_renderer_state_(shared_renderer_state) {
382 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); 381 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease());
383 shared_renderer_state_->SetInsideHardwareRelease(true); 382 shared_renderer_state_->SetInsideHardwareRelease(true);
384 } 383 }
385 384
386 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { 385 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() {
387 shared_renderer_state_->SetInsideHardwareRelease(false); 386 shared_renderer_state_->SetInsideHardwareRelease(false);
388 } 387 }
389 388
390 } // namespace android_webview 389 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698