Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(434)

Unified Diff: content/browser/renderer_host/render_widget_host_impl.cc

Issue 2728183002: RendererCompositorFrameSink should handle local surface id allocation (Closed)
Patch Set: rebase Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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, &param))
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;
« no previous file with comments | « content/browser/renderer_host/render_widget_host_impl.h ('k') | content/browser/renderer_host/render_widget_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698