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 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 DCHECK(ui_loop_->BelongsToCurrentThread()); | 288 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| 289 InsideHardwareReleaseReset auto_inside_hardware_release_reset(this); | 289 InsideHardwareReleaseReset auto_inside_hardware_release_reset(this); |
| 290 bool offscreen_pre_raster = browser_view_renderer_->offscreen_pre_raster(); | |
| 290 | 291 |
| 291 browser_view_renderer_->DetachFunctorFromView(); | 292 browser_view_renderer_->DetachFunctorFromView(); |
| 292 bool hardware_initialized = browser_view_renderer_->hardware_enabled(); | 293 bool hardware_initialized = browser_view_renderer_->hardware_enabled(); |
| 293 if (hardware_initialized) { | 294 if (hardware_initialized) { |
| 294 bool draw_functor_succeeded = browser_view_renderer_->RequestDrawGL(true); | 295 bool draw_functor_succeeded = browser_view_renderer_->RequestDrawGL(true); |
| 295 if (!draw_functor_succeeded) { | 296 if (!draw_functor_succeeded) { |
| 296 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?"; | 297 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?"; |
| 297 // Calling release on wrong thread intentionally. | 298 // Calling release on wrong thread intentionally. |
| 298 AwDrawGLInfo info; | 299 AwDrawGLInfo info; |
| 299 info.mode = AwDrawGLInfo::kModeProcess; | 300 info.mode = AwDrawGLInfo::kModeProcess; |
| 300 DrawGL(&info); | 301 DrawGL(&info); |
| 301 } | 302 } |
| 302 | 303 |
| 303 browser_view_renderer_->ReleaseHardware(); | 304 if (!offscreen_pre_raster) |
| 305 browser_view_renderer_->ReleaseHardware(); | |
|
boliu
2015/04/15 00:31:01
Then this is also skipping ReleaseHardware in deta
hush (inactive)
2015/04/15 21:35:48
Yeah. That is a problem. And it actually caused so
| |
| 304 } | 306 } |
| 305 | 307 |
| 306 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); | 308 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); |
| 307 | 309 |
| 308 { | 310 { |
| 309 base::AutoLock lock(lock_); | 311 base::AutoLock lock(lock_); |
| 310 if (renderer_manager_key_ != manager->NullKey()) { | 312 if (renderer_manager_key_ != manager->NullKey()) { |
| 311 manager->Remove(renderer_manager_key_); | 313 manager->Remove(renderer_manager_key_); |
| 312 renderer_manager_key_ = manager->NullKey(); | 314 renderer_manager_key_ = manager->NullKey(); |
| 313 } | 315 } |
| 314 } | 316 } |
| 315 | 317 |
| 316 if (hardware_initialized) { | 318 if (hardware_initialized && !offscreen_pre_raster) { |
| 317 // Flush any invoke functors that's caused by ReleaseHardware. | 319 // Flush any invoke functors that's caused by ReleaseHardware. |
| 318 browser_view_renderer_->RequestDrawGL(true); | 320 browser_view_renderer_->RequestDrawGL(true); |
| 319 } | 321 } |
| 320 } | 322 } |
| 321 | 323 |
| 322 void SharedRendererState::InitializeHardwareDrawIfNeededOnUI() { | 324 void SharedRendererState::InitializeHardwareDrawIfNeededOnUI() { |
| 323 DCHECK(ui_loop_->BelongsToCurrentThread()); | 325 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| 324 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); | 326 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); |
| 325 | 327 |
| 326 base::AutoLock lock(lock_); | 328 base::AutoLock lock(lock_); |
| 327 if (renderer_manager_key_ == manager->NullKey()) { | 329 if (renderer_manager_key_ == manager->NullKey()) { |
| 328 renderer_manager_key_ = manager->PushBack(this); | 330 renderer_manager_key_ = manager->PushBack(this); |
| 329 DeferredGpuCommandService::SetInstance(); | 331 DeferredGpuCommandService::SetInstance(); |
| 330 } | 332 } |
| 331 } | 333 } |
| 332 | 334 |
| 333 SharedRendererState::InsideHardwareReleaseReset::InsideHardwareReleaseReset( | 335 SharedRendererState::InsideHardwareReleaseReset::InsideHardwareReleaseReset( |
| 334 SharedRendererState* shared_renderer_state) | 336 SharedRendererState* shared_renderer_state) |
| 335 : shared_renderer_state_(shared_renderer_state) { | 337 : shared_renderer_state_(shared_renderer_state) { |
| 336 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); | 338 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); |
| 337 shared_renderer_state_->SetInsideHardwareRelease(true); | 339 shared_renderer_state_->SetInsideHardwareRelease(true); |
| 338 } | 340 } |
| 339 | 341 |
| 340 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { | 342 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { |
| 341 shared_renderer_state_->SetInsideHardwareRelease(false); | 343 shared_renderer_state_->SetInsideHardwareRelease(false); |
| 342 } | 344 } |
| 343 | 345 |
| 344 } // namespace android_webview | 346 } // namespace android_webview |
| OLD | NEW |