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

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

Issue 1082393003: TrimMemory strategy while offscreenPreRaster is on. (Closed) Base URL: https://chromium.googlesource.com/a/chromium/src.git@master
Patch Set: tiny bug Created 5 years, 8 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 "android_webview/browser/browser_view_renderer.h" 7 #include "android_webview/browser/browser_view_renderer.h"
8 #include "android_webview/browser/child_frame.h" 8 #include "android_webview/browser/child_frame.h"
9 #include "android_webview/browser/deferred_gpu_command_service.h" 9 #include "android_webview/browser/deferred_gpu_command_service.h"
10 #include "android_webview/browser/hardware_renderer.h" 10 #include "android_webview/browser/hardware_renderer.h"
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 hardware_renderer_->CommitFrame(); 278 hardware_renderer_->CommitFrame();
279 } 279 }
280 280
281 hardware_renderer_->DrawGL(state_restore.stencil_enabled(), 281 hardware_renderer_->DrawGL(state_restore.stencil_enabled(),
282 state_restore.framebuffer_binding_ext(), 282 state_restore.framebuffer_binding_ext(),
283 draw_info); 283 draw_info);
284 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false); 284 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false);
285 } 285 }
286 286
287 void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() { 287 void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() {
288 ReleaseCompositorResourcesIfNeededOnUI(false);
289 }
290
291 void SharedRendererState::DeleteHardwareRendererOnUI() {
292 ReleaseCompositorResourcesIfNeededOnUI(true);
293 }
294
295 void SharedRendererState::ReleaseCompositorResourcesIfNeededOnUI(
296 bool keep_child_compositor_tiles) {
boliu 2015/04/16 01:58:40 release_hardware_draw? This class doesn't know an
hush (inactive) 2015/04/16 04:06:25 Done.
288 DCHECK(ui_loop_->BelongsToCurrentThread()); 297 DCHECK(ui_loop_->BelongsToCurrentThread());
289 InsideHardwareReleaseReset auto_inside_hardware_release_reset(this); 298 InsideHardwareReleaseReset auto_inside_hardware_release_reset(this);
290 299
291 browser_view_renderer_->DetachFunctorFromView(); 300 browser_view_renderer_->DetachFunctorFromView();
292 bool hardware_initialized = browser_view_renderer_->hardware_enabled(); 301 bool hardware_initialized = browser_view_renderer_->hardware_enabled();
293 if (hardware_initialized) { 302 if (hardware_initialized) {
boliu 2015/04/16 01:58:40 This check doesn't catch all cases anymore, since
hush (inactive) 2015/04/16 04:06:25 Are you only worried about the 2nd onTrimMemory be
boliu 2015/04/16 04:14:06 The wasteful part is 2 state restores, and blockin
294 bool draw_functor_succeeded = browser_view_renderer_->RequestDrawGL(true); 303 bool draw_functor_succeeded = browser_view_renderer_->RequestDrawGL(true);
295 if (!draw_functor_succeeded) { 304 if (!draw_functor_succeeded) {
296 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?"; 305 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?";
297 // Calling release on wrong thread intentionally. 306 // Calling release on wrong thread intentionally.
298 AwDrawGLInfo info; 307 AwDrawGLInfo info;
299 info.mode = AwDrawGLInfo::kModeProcess; 308 info.mode = AwDrawGLInfo::kModeProcess;
300 DrawGL(&info); 309 DrawGL(&info);
301 } 310 }
302 311
303 browser_view_renderer_->ReleaseHardware(); 312 if (!keep_child_compositor_tiles)
313 browser_view_renderer_->ReleaseHardware();
304 } 314 }
305 315
306 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); 316 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
307 317
308 { 318 {
309 base::AutoLock lock(lock_); 319 base::AutoLock lock(lock_);
310 if (renderer_manager_key_ != manager->NullKey()) { 320 if (renderer_manager_key_ != manager->NullKey()) {
311 manager->Remove(renderer_manager_key_); 321 manager->Remove(renderer_manager_key_);
312 renderer_manager_key_ = manager->NullKey(); 322 renderer_manager_key_ = manager->NullKey();
313 } 323 }
314 } 324 }
315 325
316 if (hardware_initialized) { 326 if (hardware_initialized && !keep_child_compositor_tiles) {
boliu 2015/04/16 01:58:40 Can't skip this (in theory), some other thread can
hush (inactive) 2015/04/16 04:06:25 Removed the additional condition. What's the situa
317 // Flush any invoke functors that's caused by ReleaseHardware. 327 // Flush any invoke functors that's caused by ReleaseHardware.
318 browser_view_renderer_->RequestDrawGL(true); 328 browser_view_renderer_->RequestDrawGL(true);
319 } 329 }
320 } 330 }
321 331
322 void SharedRendererState::InitializeHardwareDrawIfNeededOnUI() { 332 void SharedRendererState::InitializeHardwareDrawIfNeededOnUI() {
323 DCHECK(ui_loop_->BelongsToCurrentThread()); 333 DCHECK(ui_loop_->BelongsToCurrentThread());
324 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); 334 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
325 335
326 base::AutoLock lock(lock_); 336 base::AutoLock lock(lock_);
327 if (renderer_manager_key_ == manager->NullKey()) { 337 if (renderer_manager_key_ == manager->NullKey()) {
328 renderer_manager_key_ = manager->PushBack(this); 338 renderer_manager_key_ = manager->PushBack(this);
329 DeferredGpuCommandService::SetInstance(); 339 DeferredGpuCommandService::SetInstance();
330 } 340 }
331 } 341 }
332 342
333 SharedRendererState::InsideHardwareReleaseReset::InsideHardwareReleaseReset( 343 SharedRendererState::InsideHardwareReleaseReset::InsideHardwareReleaseReset(
334 SharedRendererState* shared_renderer_state) 344 SharedRendererState* shared_renderer_state)
335 : shared_renderer_state_(shared_renderer_state) { 345 : shared_renderer_state_(shared_renderer_state) {
336 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); 346 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease());
337 shared_renderer_state_->SetInsideHardwareRelease(true); 347 shared_renderer_state_->SetInsideHardwareRelease(true);
338 } 348 }
339 349
340 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { 350 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() {
341 shared_renderer_state_->SetInsideHardwareRelease(false); 351 shared_renderer_state_->SetInsideHardwareRelease(false);
342 } 352 }
343 353
344 } // namespace android_webview 354 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698