| 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/compositor_frame_producer.h" |
| 11 #include "android_webview/browser/compositor_id.h" | 11 #include "android_webview/browser/compositor_id.h" |
| 12 #include "android_webview/browser/deferred_gpu_command_service.h" | 12 #include "android_webview/browser/deferred_gpu_command_service.h" |
| 13 #include "android_webview/browser/hardware_renderer.h" | 13 #include "android_webview/browser/hardware_renderer.h" |
| 14 #include "android_webview/browser/render_thread_manager_client.h" | 14 #include "android_webview/browser/render_thread_manager_client.h" |
| 15 #include "android_webview/browser/scoped_app_gl_state_restore.h" | 15 #include "android_webview/browser/scoped_app_gl_state_restore.h" |
| 16 #include "android_webview/common/aw_switches.h" |
| 16 #include "android_webview/public/browser/draw_gl.h" | 17 #include "android_webview/public/browser/draw_gl.h" |
| 17 #include "base/bind.h" | 18 #include "base/bind.h" |
| 19 #include "base/command_line.h" |
| 18 #include "base/lazy_instance.h" | 20 #include "base/lazy_instance.h" |
| 19 #include "base/location.h" | 21 #include "base/location.h" |
| 22 #include "base/memory/ptr_util.h" |
| 20 #include "base/time/time.h" | 23 #include "base/time/time.h" |
| 21 #include "base/trace_event/trace_event.h" | 24 #include "base/trace_event/trace_event.h" |
| 22 #include "base/trace_event/trace_event_argument.h" | 25 #include "base/trace_event/trace_event_argument.h" |
| 26 #include "cc/output/compositor_frame.h" |
| 23 | 27 |
| 24 namespace android_webview { | 28 namespace android_webview { |
| 25 | 29 |
| 26 namespace internal { | 30 namespace internal { |
| 27 | 31 |
| 28 class RequestInvokeGLTracker { | 32 class RequestInvokeGLTracker { |
| 29 public: | 33 public: |
| 30 RequestInvokeGLTracker(); | 34 RequestInvokeGLTracker(); |
| 31 bool ShouldRequestOnNonUiThread(RenderThreadManager* state); | 35 bool ShouldRequestOnNonUiThread(RenderThreadManager* state); |
| 32 bool ShouldRequestOnUiThread(RenderThreadManager* state); | 36 bool ShouldRequestOnUiThread(RenderThreadManager* state); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 } | 94 } |
| 91 | 95 |
| 92 RenderThreadManager::RenderThreadManager( | 96 RenderThreadManager::RenderThreadManager( |
| 93 RenderThreadManagerClient* client, | 97 RenderThreadManagerClient* client, |
| 94 const scoped_refptr<base::SingleThreadTaskRunner>& ui_loop) | 98 const scoped_refptr<base::SingleThreadTaskRunner>& ui_loop) |
| 95 : ui_loop_(ui_loop), | 99 : ui_loop_(ui_loop), |
| 96 client_(client), | 100 client_(client), |
| 97 compositor_frame_producer_(nullptr), | 101 compositor_frame_producer_(nullptr), |
| 98 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()), | 102 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()), |
| 99 hardware_renderer_has_frame_(false), | 103 hardware_renderer_has_frame_(false), |
| 104 async_on_draw_hardware_(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 105 switches::kAsyncOnDrawHardware)), |
| 100 inside_hardware_release_(false), | 106 inside_hardware_release_(false), |
| 101 weak_factory_on_ui_thread_(this) { | 107 weak_factory_on_ui_thread_(this) { |
| 102 DCHECK(ui_loop_->BelongsToCurrentThread()); | 108 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| 103 DCHECK(client_); | 109 DCHECK(client_); |
| 104 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr(); | 110 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr(); |
| 105 ResetRequestInvokeGLCallback(); | 111 ResetRequestInvokeGLCallback(); |
| 106 } | 112 } |
| 107 | 113 |
| 108 RenderThreadManager::~RenderThreadManager() { | 114 RenderThreadManager::~RenderThreadManager() { |
| 109 DCHECK(ui_loop_->BelongsToCurrentThread()); | 115 DCHECK(ui_loop_->BelongsToCurrentThread()); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 void RenderThreadManager::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) { | 173 void RenderThreadManager::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) { |
| 168 base::AutoLock lock(lock_); | 174 base::AutoLock lock(lock_); |
| 169 scroll_offset_ = scroll_offset; | 175 scroll_offset_ = scroll_offset; |
| 170 } | 176 } |
| 171 | 177 |
| 172 gfx::Vector2d RenderThreadManager::GetScrollOffsetOnRT() { | 178 gfx::Vector2d RenderThreadManager::GetScrollOffsetOnRT() { |
| 173 base::AutoLock lock(lock_); | 179 base::AutoLock lock(lock_); |
| 174 return scroll_offset_; | 180 return scroll_offset_; |
| 175 } | 181 } |
| 176 | 182 |
| 177 void RenderThreadManager::SetFrameOnUI(std::unique_ptr<ChildFrame> frame) { | 183 void RenderThreadManager::SetFrameOnUI( |
| 184 std::unique_ptr<ChildFrame> frame, |
| 185 const scoped_refptr<content::SynchronousCompositor::FrameFuture>& |
| 186 frame_future) { |
| 178 base::AutoLock lock(lock_); | 187 base::AutoLock lock(lock_); |
| 179 DCHECK(!child_frame_.get()); | 188 DCHECK(!child_frame_.get()); |
| 180 child_frame_ = std::move(frame); | 189 child_frame_ = std::move(frame); |
| 190 frame_future_ = std::move(frame_future); |
| 191 } |
| 192 |
| 193 std::unique_ptr<ChildFrame> RenderThreadManager::GetSynchronousCompositorFrame( |
| 194 scoped_refptr<content::SynchronousCompositor::FrameFuture> frame_future, |
| 195 std::unique_ptr<ChildFrame> child_frame) { |
| 196 DCHECK(!child_frame->frame.get()); |
| 197 std::unique_ptr<content::SynchronousCompositor::Frame> frame = |
| 198 frame_future->getFrame(); |
| 199 std::unique_ptr<cc::CompositorFrame> compositor_frame = |
| 200 std::move(frame->frame); |
| 201 return base::MakeUnique<ChildFrame>( |
| 202 frame->compositor_frame_sink_id, std::move(compositor_frame), |
| 203 child_frame->compositor_id, |
| 204 child_frame->viewport_rect_for_tile_priority_empty, |
| 205 child_frame->transform_for_tile_priority, |
| 206 child_frame->offscreen_pre_raster, child_frame->is_layer); |
| 181 } | 207 } |
| 182 | 208 |
| 183 std::unique_ptr<ChildFrame> RenderThreadManager::PassFrameOnRT() { | 209 std::unique_ptr<ChildFrame> RenderThreadManager::PassFrameOnRT() { |
| 184 base::AutoLock lock(lock_); | 210 base::AutoLock lock(lock_); |
| 185 hardware_renderer_has_frame_ = | 211 hardware_renderer_has_frame_ = |
| 186 hardware_renderer_has_frame_ || child_frame_.get(); | 212 hardware_renderer_has_frame_ || child_frame_.get(); |
| 213 if (async_on_draw_hardware_ && child_frame_.get()) { |
| 214 return GetSynchronousCompositorFrame(std::move(frame_future_), |
| 215 std::move(child_frame_)); |
| 216 } |
| 187 return std::move(child_frame_); | 217 return std::move(child_frame_); |
| 188 } | 218 } |
| 189 | 219 |
| 190 std::unique_ptr<ChildFrame> RenderThreadManager::PassUncommittedFrameOnUI() { | 220 std::unique_ptr<ChildFrame> RenderThreadManager::PassUncommittedFrameOnUI() { |
| 191 base::AutoLock lock(lock_); | 221 base::AutoLock lock(lock_); |
| 222 if (async_on_draw_hardware_ && child_frame_.get()) { |
| 223 return GetSynchronousCompositorFrame(std::move(frame_future_), |
| 224 std::move(child_frame_)); |
| 225 } |
| 192 return std::move(child_frame_); | 226 return std::move(child_frame_); |
| 193 } | 227 } |
| 194 | 228 |
| 195 void RenderThreadManager::PostExternalDrawConstraintsToChildCompositorOnRT( | 229 void RenderThreadManager::PostExternalDrawConstraintsToChildCompositorOnRT( |
| 196 const ParentCompositorDrawConstraints& parent_draw_constraints) { | 230 const ParentCompositorDrawConstraints& parent_draw_constraints) { |
| 197 { | 231 { |
| 198 base::AutoLock lock(lock_); | 232 base::AutoLock lock(lock_); |
| 199 parent_draw_constraints_ = parent_draw_constraints; | 233 parent_draw_constraints_ = parent_draw_constraints; |
| 200 } | 234 } |
| 201 | 235 |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 389 : render_thread_manager_(render_thread_manager) { | 423 : render_thread_manager_(render_thread_manager) { |
| 390 DCHECK(!render_thread_manager_->IsInsideHardwareRelease()); | 424 DCHECK(!render_thread_manager_->IsInsideHardwareRelease()); |
| 391 render_thread_manager_->SetInsideHardwareRelease(true); | 425 render_thread_manager_->SetInsideHardwareRelease(true); |
| 392 } | 426 } |
| 393 | 427 |
| 394 RenderThreadManager::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { | 428 RenderThreadManager::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { |
| 395 render_thread_manager_->SetInsideHardwareRelease(false); | 429 render_thread_manager_->SetInsideHardwareRelease(false); |
| 396 } | 430 } |
| 397 | 431 |
| 398 } // namespace android_webview | 432 } // namespace android_webview |
| OLD | NEW |