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 <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/deferred_gpu_command_service.h" | 10 #include "android_webview/browser/deferred_gpu_command_service.h" |
| 11 #include "android_webview/browser/hardware_renderer.h" | 11 #include "android_webview/browser/hardware_renderer.h" |
| 12 #include "android_webview/browser/scoped_app_gl_state_restore.h" | 12 #include "android_webview/browser/scoped_app_gl_state_restore.h" |
| 13 #include "android_webview/browser/shared_renderer_state_client.h" | 13 #include "android_webview/browser/shared_renderer_state_client.h" |
| 14 #include "android_webview/jni/SharedRendererState_jni.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" |
| 21 #include "content/public/browser/browser_thread.h" | |
| 20 | 22 |
| 21 namespace android_webview { | 23 namespace android_webview { |
| 22 | 24 |
| 23 namespace internal { | 25 namespace internal { |
| 24 | 26 |
| 25 class RequestDrawGLTracker { | 27 class RequestDrawGLTracker { |
| 26 public: | 28 public: |
| 27 RequestDrawGLTracker(); | 29 RequestDrawGLTracker(); |
| 28 bool ShouldRequestOnNonUiThread(SharedRendererState* state); | 30 bool ShouldRequestOnNonUiThread(SharedRendererState* state); |
| 29 bool ShouldRequestOnUiThread(SharedRendererState* state); | 31 bool ShouldRequestOnUiThread(SharedRendererState* state); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 80 } // namespace internal | 82 } // namespace internal |
| 81 | 83 |
| 82 namespace { | 84 namespace { |
| 83 | 85 |
| 84 base::LazyInstance<internal::RequestDrawGLTracker> g_request_draw_gl_tracker = | 86 base::LazyInstance<internal::RequestDrawGLTracker> g_request_draw_gl_tracker = |
| 85 LAZY_INSTANCE_INITIALIZER; | 87 LAZY_INSTANCE_INITIALIZER; |
| 86 | 88 |
| 87 } | 89 } |
| 88 | 90 |
| 89 SharedRendererState::SharedRendererState( | 91 SharedRendererState::SharedRendererState( |
| 90 SharedRendererStateClient* 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_(nullptr), |
| 94 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()), | 95 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()), |
| 95 hardware_renderer_has_frame_(false), | 96 hardware_renderer_has_frame_(false), |
| 96 inside_hardware_release_(false), | 97 inside_hardware_release_(false), |
| 97 weak_factory_on_ui_thread_(this) { | 98 weak_factory_on_ui_thread_(this) { |
| 98 DCHECK(ui_loop_->BelongsToCurrentThread()); | 99 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| 99 DCHECK(client_); | |
| 100 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr(); | 100 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr(); |
| 101 ResetRequestDrawGLCallback(); | 101 } |
| 102 | |
| 103 void SharedRendererState::SetClient(SharedRendererStateClient* client) { | |
| 104 DCHECK((!client_ && client) || (client_ && !client)); | |
| 105 if (client_) { | |
| 106 request_draw_gl_cancelable_closure_.Cancel(); | |
| 107 } | |
| 108 client_ = client; | |
| 109 if (client_) { | |
| 110 ResetRequestDrawGLCallback(); | |
| 111 } | |
| 102 } | 112 } |
| 103 | 113 |
| 104 SharedRendererState::~SharedRendererState() { | 114 SharedRendererState::~SharedRendererState() { |
| 105 DCHECK(ui_loop_->BelongsToCurrentThread()); | 115 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| 106 DCHECK(!hardware_renderer_.get()); | 116 DCHECK(!hardware_renderer_.get()); |
| 107 } | 117 } |
| 108 | 118 |
| 109 void SharedRendererState::ClientRequestDrawGL(bool for_idle) { | 119 void SharedRendererState::ClientRequestDrawGL(bool for_idle) { |
| 110 if (ui_loop_->BelongsToCurrentThread()) { | 120 if (ui_loop_->BelongsToCurrentThread()) { |
| 111 if (!g_request_draw_gl_tracker.Get().ShouldRequestOnUiThread(this)) | 121 if (!g_request_draw_gl_tracker.Get().ShouldRequestOnUiThread(this)) |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 134 | 144 |
| 135 void SharedRendererState::ResetRequestDrawGLCallback() { | 145 void SharedRendererState::ResetRequestDrawGLCallback() { |
| 136 DCHECK(ui_loop_->BelongsToCurrentThread()); | 146 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| 137 base::AutoLock lock(lock_); | 147 base::AutoLock lock(lock_); |
| 138 request_draw_gl_cancelable_closure_.Reset(base::Bind( | 148 request_draw_gl_cancelable_closure_.Reset(base::Bind( |
| 139 &SharedRendererState::ClientRequestDrawGLOnUI, base::Unretained(this))); | 149 &SharedRendererState::ClientRequestDrawGLOnUI, base::Unretained(this))); |
| 140 request_draw_gl_closure_ = request_draw_gl_cancelable_closure_.callback(); | 150 request_draw_gl_closure_ = request_draw_gl_cancelable_closure_.callback(); |
| 141 } | 151 } |
| 142 | 152 |
| 143 void SharedRendererState::ClientRequestDrawGLOnUI() { | 153 void SharedRendererState::ClientRequestDrawGLOnUI() { |
| 154 DCHECK(client_); | |
|
boliu
2016/04/01 03:13:39
How can you enforce this? This is not called by th
| |
| 144 DCHECK(ui_loop_->BelongsToCurrentThread()); | 155 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| 145 ResetRequestDrawGLCallback(); | 156 ResetRequestDrawGLCallback(); |
| 146 g_request_draw_gl_tracker.Get().SetQueuedFunctorOnUi(this); | 157 g_request_draw_gl_tracker.Get().SetQueuedFunctorOnUi(this); |
| 147 if (!client_->RequestDrawGL(false)) { | 158 if (!client_->RequestDrawGL(false)) { |
| 148 g_request_draw_gl_tracker.Get().ResetPending(); | 159 g_request_draw_gl_tracker.Get().ResetPending(); |
| 149 LOG(ERROR) << "Failed to request GL process. Deadlock likely"; | 160 LOG(ERROR) << "Failed to request GL process. Deadlock likely"; |
| 150 } | 161 } |
| 151 } | 162 } |
| 152 | 163 |
| 153 void SharedRendererState::UpdateParentDrawConstraintsOnUI() { | 164 void SharedRendererState::UpdateParentDrawConstraintsOnUI() { |
| 165 DCHECK(client_); | |
| 154 DCHECK(ui_loop_->BelongsToCurrentThread()); | 166 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| 155 client_->OnParentDrawConstraintsUpdated(); | 167 client_->OnParentDrawConstraintsUpdated(); |
| 156 } | 168 } |
| 157 | 169 |
| 158 void SharedRendererState::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) { | 170 void SharedRendererState::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) { |
| 159 base::AutoLock lock(lock_); | 171 base::AutoLock lock(lock_); |
| 160 scroll_offset_ = scroll_offset; | 172 scroll_offset_ = scroll_offset; |
| 161 } | 173 } |
| 162 | 174 |
| 163 gfx::Vector2d SharedRendererState::GetScrollOffsetOnRT() { | 175 gfx::Vector2d SharedRendererState::GetScrollOffsetOnRT() { |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 308 DeferredGpuCommandService::GetInstance()->PerformIdleWork(true); | 320 DeferredGpuCommandService::GetInstance()->PerformIdleWork(true); |
| 309 } | 321 } |
| 310 return; | 322 return; |
| 311 } | 323 } |
| 312 | 324 |
| 313 hardware_renderer_->DrawGL(draw_info, state_restore); | 325 hardware_renderer_->DrawGL(draw_info, state_restore); |
| 314 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false); | 326 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false); |
| 315 } | 327 } |
| 316 | 328 |
| 317 void SharedRendererState::DeleteHardwareRendererOnUI() { | 329 void SharedRendererState::DeleteHardwareRendererOnUI() { |
| 330 DCHECK(client_); | |
| 318 DCHECK(ui_loop_->BelongsToCurrentThread()); | 331 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| 319 | 332 |
| 320 InsideHardwareReleaseReset auto_inside_hardware_release_reset(this); | 333 InsideHardwareReleaseReset auto_inside_hardware_release_reset(this); |
| 321 | 334 |
| 322 client_->DetachFunctorFromView(); | 335 client_->DetachFunctorFromView(); |
| 323 | 336 |
| 324 // If the WebView gets onTrimMemory >= MODERATE twice in a row, the 2nd | 337 // If the WebView gets onTrimMemory >= MODERATE twice in a row, the 2nd |
| 325 // onTrimMemory will result in an unnecessary Render Thread DrawGL call. | 338 // onTrimMemory will result in an unnecessary Render Thread DrawGL call. |
| 326 bool hardware_initialized = HasFrameOnUI(); | 339 bool hardware_initialized = HasFrameOnUI(); |
| 327 if (hardware_initialized) { | 340 if (hardware_initialized) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 370 SharedRendererState* shared_renderer_state) | 383 SharedRendererState* shared_renderer_state) |
| 371 : shared_renderer_state_(shared_renderer_state) { | 384 : shared_renderer_state_(shared_renderer_state) { |
| 372 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); | 385 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); |
| 373 shared_renderer_state_->SetInsideHardwareRelease(true); | 386 shared_renderer_state_->SetInsideHardwareRelease(true); |
| 374 } | 387 } |
| 375 | 388 |
| 376 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { | 389 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { |
| 377 shared_renderer_state_->SetInsideHardwareRelease(false); | 390 shared_renderer_state_->SetInsideHardwareRelease(false); |
| 378 } | 391 } |
| 379 | 392 |
| 393 static void Destroy(JNIEnv* env, | |
| 394 const JavaParamRef<jclass>&, | |
| 395 jlong shared_renderer_state) { | |
| 396 delete reinterpret_cast<SharedRendererState*>(shared_renderer_state); | |
| 397 } | |
| 398 | |
| 399 bool RegisterSharedRendererState(JNIEnv* env) { | |
| 400 return RegisterNativesImpl(env); | |
| 401 } | |
| 402 | |
| 380 } // namespace android_webview | 403 } // namespace android_webview |
| OLD | NEW |