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 |