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 |