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 a79f97d89301400d9a0a6f46f342cb06f4b8d157..33fad4f66416fd69484580d57e6aa7c97a4af619 100644 |
--- a/android_webview/browser/browser_view_renderer.cc |
+++ b/android_webview/browser/browser_view_renderer.cc |
@@ -226,10 +226,6 @@ bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) { |
return false; |
ReturnResourceFromParent(); |
- SynchronousCompositorMemoryPolicy new_policy = CalculateDesiredMemoryPolicy(); |
- RequestMemoryPolicy(new_policy); |
- compositor_->SetMemoryPolicy(memory_policy_); |
- |
if (shared_renderer_state_->HasCompositorFrame()) { |
TRACE_EVENT_INSTANT0("android_webview", |
"EarlyOut_PreviousFrameUnconsumed", |
@@ -238,6 +234,20 @@ bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) { |
return client_->RequestDrawGL(java_canvas, false); |
} |
+ scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); |
+ if (!frame.get()) |
+ return false; |
+ |
+ shared_renderer_state_->SetCompositorFrame(frame.Pass(), false); |
+ GlobalTileManager::GetInstance()->DidUse(tile_manager_key_); |
+ return client_->RequestDrawGL(java_canvas, false); |
+} |
+ |
+scoped_ptr<cc::CompositorFrame> BrowserViewRenderer::CompositeHw() { |
+ SynchronousCompositorMemoryPolicy new_policy = CalculateDesiredMemoryPolicy(); |
+ RequestMemoryPolicy(new_policy); |
+ compositor_->SetMemoryPolicy(memory_policy_); |
+ |
parent_draw_constraints_ = shared_renderer_state_->ParentDrawConstraints(); |
gfx::Size surface_size(width_, height_); |
gfx::Rect viewport(surface_size); |
@@ -261,14 +271,9 @@ bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) { |
clip, |
viewport_rect_for_tile_priority, |
transform_for_tile_priority); |
- if (!frame.get()) |
- return false; |
- |
- GlobalTileManager::GetInstance()->DidUse(tile_manager_key_); |
- |
- shared_renderer_state_->SetCompositorFrame(frame.Pass()); |
- DidComposite(); |
- return client_->RequestDrawGL(java_canvas, false); |
+ if (frame.get()) |
+ DidComposite(); |
+ return frame.Pass(); |
} |
void BrowserViewRenderer::UpdateParentDrawConstraints() { |
@@ -710,7 +715,16 @@ void BrowserViewRenderer::FallbackTickFired() { |
DCHECK(block_invalidates_); |
fallback_tick_pending_ = false; |
if (compositor_needs_continuous_invalidate_ && compositor_) { |
- ForceFakeCompositeSW(); |
+ if (hardware_enabled_) { |
+ ReturnResourceFromParent(); |
+ ReturnUnusedResource(shared_renderer_state_->PassCompositorFrame()); |
+ scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); |
+ if (frame.get()) { |
+ shared_renderer_state_->SetCompositorFrame(frame.Pass(), true); |
+ } |
+ } else { |
+ ForceFakeCompositeSW(); |
+ } |
} else { |
// Pretend we just composited to unblock further invalidates. |
DidComposite(); |