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

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: 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"
10 #include "android_webview/browser/child_frame.h" 9 #include "android_webview/browser/child_frame.h"
11 #include "android_webview/browser/deferred_gpu_command_service.h" 10 #include "android_webview/browser/deferred_gpu_command_service.h"
12 #include "android_webview/browser/hardware_renderer.h" 11 #include "android_webview/browser/hardware_renderer.h"
13 #include "android_webview/browser/scoped_app_gl_state_restore.h" 12 #include "android_webview/browser/scoped_app_gl_state_restore.h"
13 #include "android_webview/browser/shared_renderer_state_client.h"
14 #include "android_webview/public/browser/draw_gl.h" 14 #include "android_webview/public/browser/draw_gl.h"
15 #include "base/bind.h" 15 #include "base/bind.h"
16 #include "base/lazy_instance.h" 16 #include "base/lazy_instance.h"
17 #include "base/location.h" 17 #include "base/location.h"
18 #include "base/time/time.h" 18 #include "base/time/time.h"
19 #include "base/trace_event/trace_event_argument.h" 19 #include "base/trace_event/trace_event_argument.h"
20 20
21 namespace android_webview { 21 namespace android_webview {
22 22
23 namespace internal { 23 namespace internal {
(...skipping 56 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 SharedRendererStateClient* client,
91 BrowserViewRenderer* browser_view_renderer) 91 const scoped_refptr<base::SingleThreadTaskRunner>& ui_loop)
92 : ui_loop_(ui_loop), 92 : ui_loop_(ui_loop),
93 browser_view_renderer_(browser_view_renderer), 93 client_(client),
94 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()), 94 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()),
95 hardware_renderer_has_frame_(false), 95 hardware_renderer_has_frame_(false),
96 inside_hardware_release_(false), 96 inside_hardware_release_(false),
97 weak_factory_on_ui_thread_(this) { 97 weak_factory_on_ui_thread_(this) {
98 DCHECK(ui_loop_->BelongsToCurrentThread()); 98 DCHECK(ui_loop_->BelongsToCurrentThread());
99 DCHECK(browser_view_renderer_); 99 DCHECK(client_);
100 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr(); 100 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr();
101 ResetRequestDrawGLCallback(); 101 ResetRequestDrawGLCallback();
102 } 102 }
103 103
104 SharedRendererState::~SharedRendererState() { 104 SharedRendererState::~SharedRendererState() {
105 DCHECK(ui_loop_->BelongsToCurrentThread()); 105 DCHECK(ui_loop_->BelongsToCurrentThread());
106 DCHECK(!hardware_renderer_.get()); 106 DCHECK(!hardware_renderer_.get());
107 } 107 }
108 108
109 void SharedRendererState::ClientRequestDrawGL(bool for_idle) { 109 void SharedRendererState::ClientRequestDrawGL(bool for_idle) {
(...skipping 27 matching lines...) Expand all
137 base::AutoLock lock(lock_); 137 base::AutoLock lock(lock_);
138 request_draw_gl_cancelable_closure_.Reset(base::Bind( 138 request_draw_gl_cancelable_closure_.Reset(base::Bind(
139 &SharedRendererState::ClientRequestDrawGLOnUI, base::Unretained(this))); 139 &SharedRendererState::ClientRequestDrawGLOnUI, base::Unretained(this)));
140 request_draw_gl_closure_ = request_draw_gl_cancelable_closure_.callback(); 140 request_draw_gl_closure_ = request_draw_gl_cancelable_closure_.callback();
141 } 141 }
142 142
143 void SharedRendererState::ClientRequestDrawGLOnUI() { 143 void SharedRendererState::ClientRequestDrawGLOnUI() {
144 DCHECK(ui_loop_->BelongsToCurrentThread()); 144 DCHECK(ui_loop_->BelongsToCurrentThread());
145 ResetRequestDrawGLCallback(); 145 ResetRequestDrawGLCallback();
146 g_request_draw_gl_tracker.Get().SetQueuedFunctorOnUi(this); 146 g_request_draw_gl_tracker.Get().SetQueuedFunctorOnUi(this);
147 if (!browser_view_renderer_->RequestDrawGL(false)) { 147 if (!client_->RequestDrawGL(false)) {
148 g_request_draw_gl_tracker.Get().ResetPending(); 148 g_request_draw_gl_tracker.Get().ResetPending();
149 LOG(ERROR) << "Failed to request GL process. Deadlock likely"; 149 LOG(ERROR) << "Failed to request GL process. Deadlock likely";
150 } 150 }
151 } 151 }
152 152
153 void SharedRendererState::UpdateParentDrawConstraintsOnUI() { 153 void SharedRendererState::UpdateParentDrawConstraintsOnUI() {
154 DCHECK(ui_loop_->BelongsToCurrentThread()); 154 DCHECK(ui_loop_->BelongsToCurrentThread());
155 browser_view_renderer_->UpdateParentDrawConstraints(); 155 client_->DrawConstraintsUpdated(GetParentDrawConstraintsOnUI());
156 } 156 }
157 157
158 void SharedRendererState::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) { 158 void SharedRendererState::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) {
159 base::AutoLock lock(lock_); 159 base::AutoLock lock(lock_);
160 scroll_offset_ = scroll_offset; 160 scroll_offset_ = scroll_offset;
161 } 161 }
162 162
163 gfx::Vector2d SharedRendererState::GetScrollOffsetOnRT() { 163 gfx::Vector2d SharedRendererState::GetScrollOffsetOnRT() {
164 base::AutoLock lock(lock_); 164 base::AutoLock lock(lock_);
165 return scroll_offset_; 165 return scroll_offset_;
166 } 166 }
167 167
168 void SharedRendererState::SetCompositorFrameOnUI(scoped_ptr<ChildFrame> frame) { 168 void SharedRendererState::SetFrameOnUI(scoped_ptr<ChildFrame> frame) {
169 base::AutoLock lock(lock_); 169 base::AutoLock lock(lock_);
170 DCHECK(!child_frame_.get()); 170 DCHECK(!child_frame_.get());
171 child_frame_ = std::move(frame); 171 child_frame_ = std::move(frame);
172 } 172 }
173 173
174 scoped_ptr<ChildFrame> SharedRendererState::PassCompositorFrameOnRT() { 174 scoped_ptr<ChildFrame> SharedRendererState::PassFrameOnRT() {
175 base::AutoLock lock(lock_); 175 base::AutoLock lock(lock_);
176 hardware_renderer_has_frame_ = 176 hardware_renderer_has_frame_ =
177 hardware_renderer_has_frame_ || child_frame_.get(); 177 hardware_renderer_has_frame_ || child_frame_.get();
178 return std::move(child_frame_); 178 return std::move(child_frame_);
179 } 179 }
180 180
181 scoped_ptr<ChildFrame> SharedRendererState::PassUncommittedFrameOnUI() { 181 scoped_ptr<ChildFrame> SharedRendererState::PassUncommittedFrameOnUI() {
182 base::AutoLock lock(lock_); 182 base::AutoLock lock(lock_);
183 return std::move(child_frame_); 183 return std::move(child_frame_);
184 } 184 }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 if (draw_info->mode == AwDrawGLInfo::kModeProcess) { 307 if (draw_info->mode == AwDrawGLInfo::kModeProcess) {
308 DeferredGpuCommandService::GetInstance()->PerformIdleWork(true); 308 DeferredGpuCommandService::GetInstance()->PerformIdleWork(true);
309 } 309 }
310 return; 310 return;
311 } 311 }
312 312
313 hardware_renderer_->DrawGL(draw_info, state_restore); 313 hardware_renderer_->DrawGL(draw_info, state_restore);
314 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false); 314 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false);
315 } 315 }
316 316
317 void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() { 317 void SharedRendererState::DeleteHardwareRendererOnUI() {
318 ReleaseCompositorResourcesIfNeededOnUI(true); 318 DCHECK(ui_loop_->BelongsToCurrentThread());
319 }
320 319
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); 320 InsideHardwareReleaseReset auto_inside_hardware_release_reset(this);
329 321
330 browser_view_renderer_->DetachFunctorFromView(); 322 client_->DetachFunctorFromView();
331 bool hardware_initialized = browser_view_renderer_->hardware_enabled(); 323 bool hardware_initialized = client_->IsHardwareEnabled();
boliu 2016/03/24 17:34:45 This used to call BVR clean up, so was checking wi
332 // If the WebView gets onTrimMemory >= MODERATE twice in a row, the 2nd 324 // If the WebView gets onTrimMemory >= MODERATE twice in a row, the 2nd
333 // onTrimMemory will result in an unnecessary Render Thread DrawGL call. 325 // onTrimMemory will result in an unnecessary Render Thread DrawGL call.
334 if (hardware_initialized) { 326 if (hardware_initialized) {
335 bool draw_functor_succeeded = browser_view_renderer_->RequestDrawGL(true); 327 bool draw_functor_succeeded = client_->RequestDrawGL(true);
336 if (!draw_functor_succeeded) { 328 if (!draw_functor_succeeded) {
337 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?"; 329 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?";
338 // Calling release on wrong thread intentionally. 330 // Calling release on wrong thread intentionally.
339 AwDrawGLInfo info; 331 AwDrawGLInfo info;
340 info.mode = AwDrawGLInfo::kModeProcess; 332 info.mode = AwDrawGLInfo::kModeProcess;
341 DrawGL(&info); 333 DrawGL(&info);
342 } 334 }
343
344 if (release_hardware_draw)
345 browser_view_renderer_->ReleaseHardware();
346 } 335 }
347 336
348 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); 337 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
349 338
350 { 339 {
351 base::AutoLock lock(lock_); 340 base::AutoLock lock(lock_);
352 if (renderer_manager_key_ != manager->NullKey()) { 341 if (renderer_manager_key_ != manager->NullKey()) {
353 manager->Remove(renderer_manager_key_); 342 manager->Remove(renderer_manager_key_);
354 renderer_manager_key_ = manager->NullKey(); 343 renderer_manager_key_ = manager->NullKey();
355 } 344 }
356 } 345 }
357 346
358 if (hardware_initialized) { 347 if (hardware_initialized) {
359 // Flush any invoke functors that's caused by ReleaseHardware. 348 // Flush any invoke functors that's caused by ReleaseHardware.
360 browser_view_renderer_->RequestDrawGL(true); 349 client_->RequestDrawGL(true);
361 } 350 }
362 } 351 }
363 352
364 bool SharedRendererState::HasFrameOnUI() const { 353 bool SharedRendererState::HasFrameOnUI() const {
365 base::AutoLock lock(lock_); 354 base::AutoLock lock(lock_);
366 return hardware_renderer_has_frame_ || child_frame_.get(); 355 return hardware_renderer_has_frame_ || child_frame_.get();
367 } 356 }
368 357
358 void SharedRendererState::TrimMemoryOnUI(int level) {
boliu 2016/03/24 17:34:45 don't need level arg
359 DeleteHardwareRendererOnUI();
360 }
361
369 void SharedRendererState::InitializeHardwareDrawIfNeededOnUI() { 362 void SharedRendererState::InitializeHardwareDrawIfNeededOnUI() {
370 DCHECK(ui_loop_->BelongsToCurrentThread()); 363 DCHECK(ui_loop_->BelongsToCurrentThread());
371 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); 364 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
372 365
373 base::AutoLock lock(lock_); 366 base::AutoLock lock(lock_);
374 if (renderer_manager_key_ == manager->NullKey()) { 367 if (renderer_manager_key_ == manager->NullKey()) {
375 renderer_manager_key_ = manager->PushBack(this); 368 renderer_manager_key_ = manager->PushBack(this);
376 } 369 }
377 } 370 }
378 371
379 SharedRendererState::InsideHardwareReleaseReset::InsideHardwareReleaseReset( 372 SharedRendererState::InsideHardwareReleaseReset::InsideHardwareReleaseReset(
380 SharedRendererState* shared_renderer_state) 373 SharedRendererState* shared_renderer_state)
381 : shared_renderer_state_(shared_renderer_state) { 374 : shared_renderer_state_(shared_renderer_state) {
382 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); 375 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease());
383 shared_renderer_state_->SetInsideHardwareRelease(true); 376 shared_renderer_state_->SetInsideHardwareRelease(true);
384 } 377 }
385 378
386 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { 379 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() {
387 shared_renderer_state_->SetInsideHardwareRelease(false); 380 shared_renderer_state_->SetInsideHardwareRelease(false);
388 } 381 }
389 382
390 } // namespace android_webview 383 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698