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(); |
| 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(); |
| 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 |
356 bool RenderThreadManager::HasFrameOnUI() const { | 368 bool RenderThreadManager::HasFrameOnUI() const { |
357 base::AutoLock lock(lock_); | 369 base::AutoLock lock(lock_); |
358 return hardware_renderer_has_frame_ || child_frame_.get(); | 370 return hardware_renderer_has_frame_ || child_frame_.get(); |
359 } | 371 } |
360 | 372 |
361 bool RenderThreadManager::HasFrameForHardwareRendererOnRT() const { | 373 bool RenderThreadManager::HasFrameForHardwareRendererOnRT() const { |
362 base::AutoLock lock(lock_); | 374 base::AutoLock lock(lock_); |
363 return !!child_frame_; | 375 return !!child_frame_; |
364 } | 376 } |
365 | 377 |
(...skipping 12 matching lines...) Expand all Loading... |
378 : render_thread_manager_(render_thread_manager) { | 390 : render_thread_manager_(render_thread_manager) { |
379 DCHECK(!render_thread_manager_->IsInsideHardwareRelease()); | 391 DCHECK(!render_thread_manager_->IsInsideHardwareRelease()); |
380 render_thread_manager_->SetInsideHardwareRelease(true); | 392 render_thread_manager_->SetInsideHardwareRelease(true); |
381 } | 393 } |
382 | 394 |
383 RenderThreadManager::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { | 395 RenderThreadManager::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { |
384 render_thread_manager_->SetInsideHardwareRelease(false); | 396 render_thread_manager_->SetInsideHardwareRelease(false); |
385 } | 397 } |
386 | 398 |
387 } // namespace android_webview | 399 } // namespace android_webview |
OLD | NEW |