Index: android_webview/browser/browser_view_renderer.cc |
diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc |
index 1f0d849e1e5b60719b9b133bb0cca61acf518678..14165922ae0a3986a5dca49b4687047a66086a2c 100644 |
--- a/android_webview/browser/browser_view_renderer.cc |
+++ b/android_webview/browser/browser_view_renderer.cc |
@@ -109,7 +109,8 @@ BrowserViewRenderer::BrowserViewRenderer( |
max_page_scale_factor_(0.f), |
on_new_picture_enable_(false), |
clear_view_(false), |
- offscreen_pre_raster_(false) {} |
+ offscreen_pre_raster_(false), |
+ first_sync_frame_(false) {} |
BrowserViewRenderer::~BrowserViewRenderer() { |
DCHECK(compositor_map_.empty()); |
@@ -232,20 +233,24 @@ bool BrowserViewRenderer::OnDrawHardware() { |
gfx::Rect viewport_rect_for_tile_priority = |
ComputeViewportRectForTilePriority(); |
- if (async_on_draw_hardware_) { |
- compositor_->DemandDrawHwAsync(size_, viewport_rect_for_tile_priority, |
- transform_for_tile_priority); |
- return current_compositor_frame_consumer_->HasFrameOnUI(); |
+ scoped_refptr<content::SynchronousCompositor::FrameFuture> future; // Async. |
+ content::SynchronousCompositor::Frame frame; // Sync. |
+ bool async = async_on_draw_hardware_ && first_sync_frame_; |
dcheng
2016/10/21 06:42:56
This might be worth a comment: it's not clear to m
boliu
2016/10/21 15:15:32
renamed this to "allow_async_draw_" and added a co
|
+ if (async) { |
+ future = compositor_->DemandDrawHwAsync( |
+ size_, viewport_rect_for_tile_priority, transform_for_tile_priority); |
+ } else { |
+ frame = compositor_->DemandDrawHw(size_, viewport_rect_for_tile_priority, |
+ transform_for_tile_priority); |
} |
- content::SynchronousCompositor::Frame frame = compositor_->DemandDrawHw( |
- size_, viewport_rect_for_tile_priority, transform_for_tile_priority); |
- if (!frame.frame) { |
+ if (!frame.frame && !future) { |
dcheng
2016/10/21 06:42:56
Maybe a comment that documents what this means wou
boliu
2016/10/21 15:15:32
yeah should generally be clear to compositor folks
|
TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", |
TRACE_EVENT_SCOPE_THREAD); |
return current_compositor_frame_consumer_->HasFrameOnUI(); |
} |
+ first_sync_frame_ = true; |
std::unique_ptr<ChildFrame> child_frame = base::MakeUnique<ChildFrame>( |
frame.compositor_frame_sink_id, std::move(frame.frame), compositor_id_, |
viewport_rect_for_tile_priority.IsEmpty(), transform_for_tile_priority, |
@@ -254,29 +259,10 @@ bool BrowserViewRenderer::OnDrawHardware() { |
ReturnUnusedResource( |
current_compositor_frame_consumer_->PassUncommittedFrameOnUI()); |
current_compositor_frame_consumer_->SetFrameOnUI(std::move(child_frame), |
- nullptr); |
- |
+ future); |
dcheng
2016/10/21 06:42:56
Nit: std::move(future)
boliu
2016/10/21 15:15:32
Done.
|
return true; |
} |
-void BrowserViewRenderer::OnDrawHardwareProcessFrameFuture( |
- const scoped_refptr<content::SynchronousCompositor::FrameFuture>& |
- frame_future) { |
- gfx::Transform transform_for_tile_priority = |
- external_draw_constraints_.transform; |
- gfx::Rect viewport_rect_for_tile_priority = |
- ComputeViewportRectForTilePriority(); |
- |
- ReturnUnusedResource( |
- current_compositor_frame_consumer_->PassUncommittedFrameOnUI()); |
- current_compositor_frame_consumer_->SetFrameOnUI( |
- base::MakeUnique<ChildFrame>( |
- 0, nullptr, compositor_id_, viewport_rect_for_tile_priority.IsEmpty(), |
- transform_for_tile_priority, offscreen_pre_raster_, |
- external_draw_constraints_.is_layer), |
- frame_future); |
-} |
- |
gfx::Rect BrowserViewRenderer::ComputeViewportRectForTilePriority() { |
// If the WebView is on a layer, WebView does not know what transform is |
// applied onto the layer so global visible rect does not make sense here. |