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()); |