Index: android_webview/browser/hardware_renderer.cc |
diff --git a/android_webview/browser/hardware_renderer.cc b/android_webview/browser/hardware_renderer.cc |
index fdc5d70dc7a9b26fcdfef1eef1bf8d757f7d90cf..4dfe508b0534de3b322c7d33e1c00e1fe2e55be6 100644 |
--- a/android_webview/browser/hardware_renderer.cc |
+++ b/android_webview/browser/hardware_renderer.cc |
@@ -60,20 +60,40 @@ void HardwareRenderer::CommitFrame() { |
scroll_offset_ = render_thread_manager_->GetScrollOffsetOnRT(); |
std::unique_ptr<ChildFrame> child_frame = |
render_thread_manager_->PassFrameOnRT(); |
+ frame_future_ = render_thread_manager_->PassFrameFutureOnRT(); |
if (!child_frame.get()) |
return; |
- |
- last_committed_compositor_frame_sink_id_ = |
- child_frame->compositor_frame_sink_id; |
ReturnResourcesInChildFrame(); |
child_frame_ = std::move(child_frame); |
- DCHECK(child_frame_->frame.get()); |
- DCHECK(!child_frame_->frame->gl_frame_data); |
} |
void HardwareRenderer::DrawGL(AwDrawGLInfo* draw_info) { |
TRACE_EVENT0("android_webview", "HardwareRenderer::DrawGL"); |
+ if (frame_future_.get() && child_frame_.get() && !child_frame_->frame.get()) { |
+ std::unique_ptr<content::SynchronousCompositor::Frame> frame; |
+ { |
+ TRACE_EVENT0("android_webview", "GetFrame"); |
+ 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); |
+ |
+ last_committed_compositor_frame_sink_id_ = |
+ child_frame_->compositor_frame_sink_id; |
+ // DCHECK(child_frame_->frame.get()); |
+ // DCHECK(!child_frame_->frame->gl_frame_data); |
+ frame_future_ = nullptr; |
+ } |
+ |
// We need to watch if the current Android context has changed and enforce |
// a clean-up in the compositor. |
EGLContext current_context = eglGetCurrentContext(); |