| 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/render_thread_manager.h" | 5 #include "android_webview/browser/render_thread_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "android_webview/browser/child_frame.h" | 9 #include "android_webview/browser/child_frame.h" |
| 10 #include "android_webview/browser/compositor_frame_producer.h" |
| 10 #include "android_webview/browser/deferred_gpu_command_service.h" | 11 #include "android_webview/browser/deferred_gpu_command_service.h" |
| 11 #include "android_webview/browser/hardware_renderer.h" | 12 #include "android_webview/browser/hardware_renderer.h" |
| 12 #include "android_webview/browser/render_thread_manager_client.h" | 13 #include "android_webview/browser/render_thread_manager_client.h" |
| 13 #include "android_webview/browser/scoped_app_gl_state_restore.h" | 14 #include "android_webview/browser/scoped_app_gl_state_restore.h" |
| 14 #include "android_webview/public/browser/draw_gl.h" | 15 #include "android_webview/public/browser/draw_gl.h" |
| 15 #include "base/bind.h" | 16 #include "base/bind.h" |
| 16 #include "base/lazy_instance.h" | 17 #include "base/lazy_instance.h" |
| 17 #include "base/location.h" | 18 #include "base/location.h" |
| 18 #include "base/time/time.h" | 19 #include "base/time/time.h" |
| 19 #include "base/trace_event/trace_event_argument.h" | 20 #include "base/trace_event/trace_event_argument.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 | 85 |
| 85 base::LazyInstance<internal::RequestInvokeGLTracker> | 86 base::LazyInstance<internal::RequestInvokeGLTracker> |
| 86 g_request_invoke_gl_tracker = LAZY_INSTANCE_INITIALIZER; | 87 g_request_invoke_gl_tracker = LAZY_INSTANCE_INITIALIZER; |
| 87 } | 88 } |
| 88 | 89 |
| 89 RenderThreadManager::RenderThreadManager( | 90 RenderThreadManager::RenderThreadManager( |
| 90 RenderThreadManagerClient* client, | 91 RenderThreadManagerClient* client, |
| 91 const scoped_refptr<base::SingleThreadTaskRunner>& ui_loop) | 92 const scoped_refptr<base::SingleThreadTaskRunner>& ui_loop) |
| 92 : ui_loop_(ui_loop), | 93 : ui_loop_(ui_loop), |
| 93 client_(client), | 94 client_(client), |
| 95 compositor_frame_producer_(nullptr), |
| 94 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()), | 96 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()), |
| 95 hardware_renderer_has_frame_(false), | 97 hardware_renderer_has_frame_(false), |
| 96 inside_hardware_release_(false), | 98 inside_hardware_release_(false), |
| 97 weak_factory_on_ui_thread_(this) { | 99 weak_factory_on_ui_thread_(this) { |
| 98 DCHECK(ui_loop_->BelongsToCurrentThread()); | 100 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| 99 DCHECK(client_); | 101 DCHECK(client_); |
| 100 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr(); | 102 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr(); |
| 101 ResetRequestInvokeGLCallback(); | 103 ResetRequestInvokeGLCallback(); |
| 102 } | 104 } |
| 103 | 105 |
| 104 RenderThreadManager::~RenderThreadManager() { | 106 RenderThreadManager::~RenderThreadManager() { |
| 105 DCHECK(ui_loop_->BelongsToCurrentThread()); | 107 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| 106 DCHECK(!hardware_renderer_.get()); | 108 DCHECK(!hardware_renderer_.get()); |
| 109 if (compositor_frame_producer_) { |
| 110 compositor_frame_producer_->OnCompositorFrameConsumerWillDestroy(this); |
| 111 } |
| 107 } | 112 } |
| 108 | 113 |
| 109 void RenderThreadManager::ClientRequestInvokeGL(bool for_idle) { | 114 void RenderThreadManager::ClientRequestInvokeGL(bool for_idle) { |
| 110 if (ui_loop_->BelongsToCurrentThread()) { | 115 if (ui_loop_->BelongsToCurrentThread()) { |
| 111 if (!g_request_invoke_gl_tracker.Get().ShouldRequestOnUiThread(this)) | 116 if (!g_request_invoke_gl_tracker.Get().ShouldRequestOnUiThread(this)) |
| 112 return; | 117 return; |
| 113 ClientRequestInvokeGLOnUI(); | 118 ClientRequestInvokeGLOnUI(); |
| 114 } else { | 119 } else { |
| 115 if (!g_request_invoke_gl_tracker.Get().ShouldRequestOnNonUiThread(this)) | 120 if (!g_request_invoke_gl_tracker.Get().ShouldRequestOnNonUiThread(this)) |
| 116 return; | 121 return; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 145 ResetRequestInvokeGLCallback(); | 150 ResetRequestInvokeGLCallback(); |
| 146 g_request_invoke_gl_tracker.Get().SetQueuedFunctorOnUi(this); | 151 g_request_invoke_gl_tracker.Get().SetQueuedFunctorOnUi(this); |
| 147 if (!client_->RequestInvokeGL(false)) { | 152 if (!client_->RequestInvokeGL(false)) { |
| 148 g_request_invoke_gl_tracker.Get().ResetPending(); | 153 g_request_invoke_gl_tracker.Get().ResetPending(); |
| 149 LOG(ERROR) << "Failed to request GL process. Deadlock likely"; | 154 LOG(ERROR) << "Failed to request GL process. Deadlock likely"; |
| 150 } | 155 } |
| 151 } | 156 } |
| 152 | 157 |
| 153 void RenderThreadManager::UpdateParentDrawConstraintsOnUI() { | 158 void RenderThreadManager::UpdateParentDrawConstraintsOnUI() { |
| 154 DCHECK(ui_loop_->BelongsToCurrentThread()); | 159 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| 155 client_->OnParentDrawConstraintsUpdated(); | 160 if (compositor_frame_producer_) { |
| 161 compositor_frame_producer_->OnParentDrawConstraintsUpdated(this); |
| 162 } |
| 156 } | 163 } |
| 157 | 164 |
| 158 void RenderThreadManager::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) { | 165 void RenderThreadManager::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) { |
| 159 base::AutoLock lock(lock_); | 166 base::AutoLock lock(lock_); |
| 160 scroll_offset_ = scroll_offset; | 167 scroll_offset_ = scroll_offset; |
| 161 } | 168 } |
| 162 | 169 |
| 163 gfx::Vector2d RenderThreadManager::GetScrollOffsetOnRT() { | 170 gfx::Vector2d RenderThreadManager::GetScrollOffsetOnRT() { |
| 164 base::AutoLock lock(lock_); | 171 base::AutoLock lock(lock_); |
| 165 return scroll_offset_; | 172 return scroll_offset_; |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 renderer_manager_key_ = manager->NullKey(); | 353 renderer_manager_key_ = manager->NullKey(); |
| 347 } | 354 } |
| 348 } | 355 } |
| 349 | 356 |
| 350 if (hardware_initialized) { | 357 if (hardware_initialized) { |
| 351 // Flush any invoke functors that's caused by ReleaseHardware. | 358 // Flush any invoke functors that's caused by ReleaseHardware. |
| 352 client_->RequestInvokeGL(true); | 359 client_->RequestInvokeGL(true); |
| 353 } | 360 } |
| 354 } | 361 } |
| 355 | 362 |
| 363 void RenderThreadManager::SetCompositorFrameProducer( |
| 364 CompositorFrameProducer* compositor_frame_producer) { |
| 365 compositor_frame_producer_ = compositor_frame_producer; |
| 366 } |
| 367 |
| 368 void RenderThreadManager::OnCompositorFrameProducerWillDestroy() { |
| 369 compositor_frame_producer_ = nullptr; |
| 370 } |
| 371 |
| 356 bool RenderThreadManager::HasFrameOnUI() const { | 372 bool RenderThreadManager::HasFrameOnUI() const { |
| 357 base::AutoLock lock(lock_); | 373 base::AutoLock lock(lock_); |
| 358 return hardware_renderer_has_frame_ || child_frame_.get(); | 374 return hardware_renderer_has_frame_ || child_frame_.get(); |
| 359 } | 375 } |
| 360 | 376 |
| 361 bool RenderThreadManager::HasFrameForHardwareRendererOnRT() const { | 377 bool RenderThreadManager::HasFrameForHardwareRendererOnRT() const { |
| 362 base::AutoLock lock(lock_); | 378 base::AutoLock lock(lock_); |
| 363 return !!child_frame_; | 379 return !!child_frame_; |
| 364 } | 380 } |
| 365 | 381 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 378 : render_thread_manager_(render_thread_manager) { | 394 : render_thread_manager_(render_thread_manager) { |
| 379 DCHECK(!render_thread_manager_->IsInsideHardwareRelease()); | 395 DCHECK(!render_thread_manager_->IsInsideHardwareRelease()); |
| 380 render_thread_manager_->SetInsideHardwareRelease(true); | 396 render_thread_manager_->SetInsideHardwareRelease(true); |
| 381 } | 397 } |
| 382 | 398 |
| 383 RenderThreadManager::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { | 399 RenderThreadManager::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { |
| 384 render_thread_manager_->SetInsideHardwareRelease(false); | 400 render_thread_manager_->SetInsideHardwareRelease(false); |
| 385 } | 401 } |
| 386 | 402 |
| 387 } // namespace android_webview | 403 } // namespace android_webview |
| OLD | NEW |