Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_impl.cc |
| diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc |
| index f6281364fc7bb3cc94f32013a2882549e03f8728..efa38423c7a5e8027b0a118e533d04ac95182e7b 100644 |
| --- a/content/browser/renderer_host/render_widget_host_impl.cc |
| +++ b/content/browser/renderer_host/render_widget_host_impl.cc |
| @@ -1823,10 +1823,32 @@ bool RenderWidgetHostImpl::OnSwapCompositorFrame( |
| ViewHostMsg_SwapCompositorFrame::Param param; |
| if (!ViewHostMsg_SwapCompositorFrame::Read(&message, ¶m)) |
| return false; |
| - cc::CompositorFrame frame(std::move(std::get<1>(param))); |
| uint32_t compositor_frame_sink_id = std::get<0>(param); |
| + cc::LocalSurfaceId local_surface_id = std::get<1>(param); |
| + cc::CompositorFrame frame(std::move(std::get<2>(param))); |
| std::vector<IPC::Message> messages_to_deliver_with_frame; |
| - messages_to_deliver_with_frame.swap(std::get<2>(param)); |
| + messages_to_deliver_with_frame.swap(std::get<3>(param)); |
| + |
| + // The renderer should not send empty frames. |
| + if (frame.render_pass_list.empty()) { |
| + NOTREACHED(); |
|
piman
2017/03/20 22:51:45
nit: not NOTREACHED because it can be reached from
Saman Sami
2017/03/21 16:33:38
Done.
|
| + return false; |
| + } |
| + |
| + // The renderer must allocate a new LocalSurfaceId if frame size or device |
| + // scale factor changes. |
| + float device_scale_factor = frame.metadata.device_scale_factor; |
| + const gfx::Size& frame_size = |
| + frame.render_pass_list.back()->output_rect.size(); |
| + if (local_surface_id == last_local_surface_id_ && |
| + (frame_size != last_frame_size_ || |
| + device_scale_factor != last_device_scale_factor_)) { |
| + NOTREACHED(); |
|
piman
2017/03/20 22:51:45
nit: ditto
Saman Sami
2017/03/21 16:33:38
Done.
|
| + return false; |
| + } |
| + last_local_surface_id_ = local_surface_id; |
|
piman
2017/03/20 22:51:45
To confirm: is checking the last local_surface_id
Saman Sami
2017/03/21 02:10:25
Good question. If the renderer alternates between
Saman Sami
2017/03/21 16:33:38
I guess my point is that we cared about two consec
|
| + last_frame_size_ = frame_size; |
| + last_device_scale_factor_ = device_scale_factor; |
| if (frame.metadata.begin_frame_ack.sequence_number < |
| cc::BeginFrameArgs::kStartingFrameNumber) { |
| @@ -1859,7 +1881,8 @@ bool RenderWidgetHostImpl::OnSwapCompositorFrame( |
| // compositor frame can arrive before the navigation commit message that |
| // updates that value. |
| if (view_ && frame.metadata.content_source_id >= current_content_source_id_) { |
| - view_->OnSwapCompositorFrame(compositor_frame_sink_id, std::move(frame)); |
| + view_->OnSwapCompositorFrame(compositor_frame_sink_id, local_surface_id, |
| + std::move(frame)); |
| view_->DidReceiveRendererFrame(); |
| } else { |
| cc::ReturnedResourceArray resources; |