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

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 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
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
OLDNEW
« no previous file with comments | « android_webview/browser/render_thread_manager.h ('k') | content/browser/android/synchronous_compositor_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698