Index: android_webview/browser/hardware_renderer.cc |
diff --git a/android_webview/browser/hardware_renderer.cc b/android_webview/browser/hardware_renderer.cc |
index 9f4cf32646f148f55ae2a39f6e5b000027ff2338..1617ec3db8084b7b916e4bb099c34c4f3d271d53 100644 |
--- a/android_webview/browser/hardware_renderer.cc |
+++ b/android_webview/browser/hardware_renderer.cc |
@@ -61,17 +61,35 @@ void HardwareRenderer::CommitFrame() { |
render_thread_manager_->PassFrameOnRT(); |
if (!child_frame.get()) |
return; |
- |
- last_committed_compositor_frame_sink_id_ = |
- child_frame->compositor_frame_sink_id; |
ReturnResourcesInChildFrame(); |
+ frame_future_ = render_thread_manager_->PassFrameFutureOnRT(); |
child_frame_ = std::move(child_frame); |
- DCHECK(child_frame_->frame.get()); |
} |
void HardwareRenderer::DrawGL(AwDrawGLInfo* draw_info) { |
TRACE_EVENT0("android_webview", "HardwareRenderer::DrawGL"); |
+ if (frame_future_) { |
+ TRACE_EVENT0("android_webview", "GetFrame"); |
+ DCHECK(child_frame_); |
+ DCHECK(!child_frame_->frame); |
+ |
+ std::unique_ptr<content::SynchronousCompositor::Frame> frame = |
+ frame_future_->getFrame(); |
+ if (frame) { |
+ child_frame_->compositor_frame_sink_id = frame->compositor_frame_sink_id; |
+ child_frame_->frame = std::move(frame->frame); |
+ } else { |
+ child_frame_.reset(); |
+ } |
+ frame_future_ = nullptr; |
+ } |
+ |
+ if (child_frame_) { |
+ last_committed_compositor_frame_sink_id_ = |
+ child_frame_->compositor_frame_sink_id; |
+ } |
+ |
// We need to watch if the current Android context has changed and enforce |
// a clean-up in the compositor. |
EGLContext current_context = eglGetCurrentContext(); |