Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(764)

Side by Side Diff: android_webview/browser/render_thread_manager.cc

Issue 2347563003: Added FrameFuture class (Closed)
Patch Set: Code review Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 void RenderThreadManager::GetSynchronousCompositorFrame() {
boliu 2016/09/28 00:36:01 this can be a static method, ie it doesn't need to
ojars 2016/09/28 22:44:18 Done.
194 DCHECK(!child_frame_->frame.get());
195 std::unique_ptr<content::SynchronousCompositor::Frame> frame =
196 frame_future_->getFrame();
197 std::unique_ptr<cc::CompositorFrame> compositor_frame =
198 std::move(frame->frame);
199 child_frame_ = base::MakeUnique<ChildFrame>(
200 frame->compositor_frame_sink_id, std::move(compositor_frame),
201 child_frame_->compositor_id,
202 child_frame_->viewport_rect_for_tile_priority_empty,
203 child_frame_->transform_for_tile_priority,
204 child_frame_->offscreen_pre_raster, child_frame_->is_layer);
181 } 205 }
182 206
183 std::unique_ptr<ChildFrame> RenderThreadManager::PassFrameOnRT() { 207 std::unique_ptr<ChildFrame> RenderThreadManager::PassFrameOnRT() {
184 base::AutoLock lock(lock_); 208 base::AutoLock lock(lock_);
185 hardware_renderer_has_frame_ = 209 hardware_renderer_has_frame_ =
186 hardware_renderer_has_frame_ || child_frame_.get(); 210 hardware_renderer_has_frame_ || child_frame_.get();
211 if (async_on_draw_hardware_ && child_frame_.get()) {
212 GetSynchronousCompositorFrame();
213 }
187 return std::move(child_frame_); 214 return std::move(child_frame_);
188 } 215 }
189 216
190 std::unique_ptr<ChildFrame> RenderThreadManager::PassUncommittedFrameOnUI() { 217 std::unique_ptr<ChildFrame> RenderThreadManager::PassUncommittedFrameOnUI() {
191 base::AutoLock lock(lock_); 218 base::AutoLock lock(lock_);
219 if (async_on_draw_hardware_ && child_frame_.get()) {
220 GetSynchronousCompositorFrame();
221 }
192 return std::move(child_frame_); 222 return std::move(child_frame_);
193 } 223 }
194 224
195 void RenderThreadManager::PostExternalDrawConstraintsToChildCompositorOnRT( 225 void RenderThreadManager::PostExternalDrawConstraintsToChildCompositorOnRT(
196 const ParentCompositorDrawConstraints& parent_draw_constraints) { 226 const ParentCompositorDrawConstraints& parent_draw_constraints) {
197 { 227 {
198 base::AutoLock lock(lock_); 228 base::AutoLock lock(lock_);
199 parent_draw_constraints_ = parent_draw_constraints; 229 parent_draw_constraints_ = parent_draw_constraints;
200 } 230 }
201 231
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 : render_thread_manager_(render_thread_manager) { 429 : render_thread_manager_(render_thread_manager) {
400 DCHECK(!render_thread_manager_->IsInsideHardwareRelease()); 430 DCHECK(!render_thread_manager_->IsInsideHardwareRelease());
401 render_thread_manager_->SetInsideHardwareRelease(true); 431 render_thread_manager_->SetInsideHardwareRelease(true);
402 } 432 }
403 433
404 RenderThreadManager::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { 434 RenderThreadManager::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() {
405 render_thread_manager_->SetInsideHardwareRelease(false); 435 render_thread_manager_->SetInsideHardwareRelease(false);
406 } 436 }
407 437
408 } // namespace android_webview 438 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698