Chromium Code Reviews| Index: android_webview/browser/hardware_renderer.cc |
| diff --git a/android_webview/browser/hardware_renderer.cc b/android_webview/browser/hardware_renderer.cc |
| index a4a3f806713af8981664238ac5cd0e1fc4612309..8912c1bb5ec42606dfae4e571c693d3cb9ef26b1 100644 |
| --- a/android_webview/browser/hardware_renderer.cc |
| +++ b/android_webview/browser/hardware_renderer.cc |
| @@ -73,36 +73,11 @@ HardwareRenderer::~HardwareRenderer() { |
| void HardwareRenderer::CommitFrame() { |
| TRACE_EVENT0("android_webview", "CommitFrame"); |
| scroll_offset_ = shared_renderer_state_->GetScrollOffsetOnRT(); |
| - { |
| - scoped_ptr<ChildFrame> child_frame = |
| - shared_renderer_state_->PassCompositorFrameOnRT(); |
| - if (!child_frame.get()) |
| - return; |
| - child_frame_ = child_frame.Pass(); |
| - } |
| - |
| - scoped_ptr<cc::CompositorFrame> frame = child_frame_->frame.Pass(); |
| - DCHECK(frame.get()); |
| - DCHECK(!frame->gl_frame_data); |
| - |
| - // On Android we put our browser layers in physical pixels and set our |
| - // browser CC device_scale_factor to 1, so suppress the transform between |
| - // DIP and pixels. |
| - frame->delegated_frame_data->device_scale_factor = 1.0f; |
| - |
| - gfx::Size frame_size = |
| - frame->delegated_frame_data->render_pass_list.back()->output_rect.size(); |
| - bool size_changed = frame_size != frame_size_; |
| - frame_size_ = frame_size; |
| - if (child_id_.is_null() || size_changed) { |
| - if (!child_id_.is_null()) |
| - surface_factory_->Destroy(child_id_); |
| - child_id_ = surface_id_allocator_->GenerateId(); |
| - surface_factory_->Create(child_id_); |
| - } |
| - |
| - surface_factory_->SubmitCompositorFrame(child_id_, frame.Pass(), |
| - cc::SurfaceFactory::DrawCallback()); |
| + scoped_ptr<ChildFrame> child_frame = |
| + shared_renderer_state_->PassCompositorFrameOnRT(); |
| + if (!child_frame.get()) |
| + return; |
| + child_frame_ = child_frame.Pass(); |
| } |
| void HardwareRenderer::DrawGL(bool stencil_enabled, |
| @@ -118,6 +93,35 @@ void HardwareRenderer::DrawGL(bool stencil_enabled, |
| if (last_egl_context_ != current_context) |
| DLOG(WARNING) << "EGLContextChanged"; |
| + // SurfaceFactory::SubmitCompositorFrame might call glFlush. So calling it |
| + // during "kModeSync" stage (which does not allow GL) might result in extra |
| + // kModeProcess. Instead, submit the frame in "kModeDraw" stage to avoid |
| + // unnecessary kModeProcess. |
| + if (child_frame_.get() && child_frame_->frame.get()) { |
|
boliu
2015/09/15 00:02:40
Ehh, pass the whole child_frame_ below, then you d
hush (inactive)
2015/09/15 00:50:30
Done.
|
| + scoped_ptr<cc::CompositorFrame> child_frame = child_frame_->frame.Pass(); |
| + DCHECK(!child_frame->gl_frame_data); |
| + |
| + // On Android we put our browser layers in physical pixels and set our |
| + // browser CC device_scale_factor to 1, so suppress the transform between |
| + // DIP and pixels. |
| + child_frame->delegated_frame_data->device_scale_factor = 1.0f; |
| + |
| + gfx::Size frame_size = |
| + child_frame->delegated_frame_data->render_pass_list.back() |
| + ->output_rect.size(); |
| + bool size_changed = frame_size != frame_size_; |
| + frame_size_ = frame_size; |
| + if (child_id_.is_null() || size_changed) { |
| + if (!child_id_.is_null()) |
| + surface_factory_->Destroy(child_id_); |
| + child_id_ = surface_id_allocator_->GenerateId(); |
| + surface_factory_->Create(child_id_); |
| + } |
| + |
| + surface_factory_->SubmitCompositorFrame(child_id_, child_frame.Pass(), |
| + cc::SurfaceFactory::DrawCallback()); |
| + } |
| + |
| gfx::Transform transform(gfx::Transform::kSkipInitialization); |
| transform.matrix().setColMajorf(draw_info->transform); |
| transform.Translate(scroll_offset_.x(), scroll_offset_.y()); |