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..94a7da455b1d17f7b098b6e71bf918d82f2b403e 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), |
+ allow_async_draw_(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_ && allow_async_draw_; |
+ 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) { |
TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", |
TRACE_EVENT_SCOPE_THREAD); |
return current_compositor_frame_consumer_->HasFrameOnUI(); |
} |
+ allow_async_draw_ = 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); |
- |
+ std::move(future)); |
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. |