Chromium Code Reviews| 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.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 Loading... | |
| 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 |
| OLD | NEW |