| 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 093491511694b133333f9365eb3a9d905d365066..9914db5ce83b44decb9fab14cf8324256ae85c9c 100644
|
| --- a/content/browser/renderer_host/render_widget_host_impl.cc
|
| +++ b/content/browser/renderer_host/render_widget_host_impl.cc
|
| @@ -1820,10 +1820,36 @@ 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()) {
|
| + DLOG(ERROR) << "Renderer sent an empty frame.";
|
| + 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_)) {
|
| + DLOG(ERROR) << "Renderer submitted frame of wrong size to its surface."
|
| + << " Expected: size=" << last_frame_size_.ToString()
|
| + << ",scale=" << last_device_scale_factor_
|
| + << " Received: size=" << frame_size.ToString()
|
| + << ",scale=" << device_scale_factor;
|
| + return false;
|
| + }
|
| + last_local_surface_id_ = local_surface_id;
|
| + last_frame_size_ = frame_size;
|
| + last_device_scale_factor_ = device_scale_factor;
|
|
|
| if (frame.metadata.begin_frame_ack.sequence_number <
|
| cc::BeginFrameArgs::kStartingFrameNumber) {
|
| @@ -1856,7 +1882,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;
|
|
|