Chromium Code Reviews| Index: android_webview/browser/render_thread_manager.cc |
| diff --git a/android_webview/browser/render_thread_manager.cc b/android_webview/browser/render_thread_manager.cc |
| index 71327783ead520ea52553d5abe4b32461dac017a..70228b4a9870938e4db6ff96a3d1f4c5546a0394 100644 |
| --- a/android_webview/browser/render_thread_manager.cc |
| +++ b/android_webview/browser/render_thread_manager.cc |
| @@ -13,13 +13,17 @@ |
| #include "android_webview/browser/hardware_renderer.h" |
| #include "android_webview/browser/render_thread_manager_client.h" |
| #include "android_webview/browser/scoped_app_gl_state_restore.h" |
| +#include "android_webview/common/aw_switches.h" |
| #include "android_webview/public/browser/draw_gl.h" |
| #include "base/bind.h" |
| +#include "base/command_line.h" |
| #include "base/lazy_instance.h" |
| #include "base/location.h" |
| +#include "base/memory/ptr_util.h" |
| #include "base/time/time.h" |
| #include "base/trace_event/trace_event.h" |
| #include "base/trace_event/trace_event_argument.h" |
| +#include "cc/output/compositor_frame.h" |
| namespace android_webview { |
| @@ -97,6 +101,8 @@ RenderThreadManager::RenderThreadManager( |
| compositor_frame_producer_(nullptr), |
| renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()), |
| hardware_renderer_has_frame_(false), |
| + async_on_draw_hardware_(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kAsyncOnDrawHardware)), |
| inside_hardware_release_(false), |
| weak_factory_on_ui_thread_(this) { |
| DCHECK(ui_loop_->BelongsToCurrentThread()); |
| @@ -180,10 +186,31 @@ void RenderThreadManager::SetFrameOnUI(std::unique_ptr<ChildFrame> frame) { |
| child_frame_ = std::move(frame); |
| } |
| +void RenderThreadManager::SetFrameFutureOnUI( |
| + const scoped_refptr<content::SynchronousCompositor::FrameFuture>& |
| + frame_future) { |
| + frame_future_ = std::move(frame_future); |
|
boliu
2016/09/22 23:05:32
AutoLock
ojars
2016/09/28 00:17:59
Done.
|
| +} |
| + |
| std::unique_ptr<ChildFrame> RenderThreadManager::PassFrameOnRT() { |
|
boliu
2016/09/22 23:05:32
you need to repeat all this code for PassUncommitt
ojars
2016/09/28 00:17:58
Done.
|
| base::AutoLock lock(lock_); |
| hardware_renderer_has_frame_ = |
| hardware_renderer_has_frame_ || child_frame_.get(); |
| + if (async_on_draw_hardware_ && child_frame_.get() && |
| + !child_frame_->frame.get()) { |
|
boliu
2016/09/22 23:05:31
this third part of this check should be a DCHECK i
ojars
2016/09/28 00:17:58
Done.
|
| + std::unique_ptr<content::SynchronousCompositor::Frame> frame = |
| + frame_future_->getFrame(); |
| + |
| + std::unique_ptr<cc::CompositorFrame> compositor_frame = |
| + std::move(frame->frame); |
| + |
| + child_frame_ = base::MakeUnique<ChildFrame>( |
| + frame->compositor_frame_sink_id, std::move(compositor_frame), |
| + child_frame_->compositor_id, |
| + child_frame_->viewport_rect_for_tile_priority_empty, |
| + child_frame_->transform_for_tile_priority, |
| + child_frame_->offscreen_pre_raster, child_frame_->is_layer); |
| + } |
| return std::move(child_frame_); |
| } |