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

Unified Diff: content/browser/frame_host/render_widget_host_view_child_frame.cc

Issue 2750623002: Avoid unnecessary LocalSurfaceId allocation in RenderWidgetHostViewChildFrame/Guest (Closed)
Patch Set: Added test 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/frame_host/render_widget_host_view_child_frame.cc
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.cc b/content/browser/frame_host/render_widget_host_view_child_frame.cc
index fb68c4c376863c2c3d80cddf762989a412e65148..083f808613b3dcd76374d7da97e2f17f9e75098d 100644
--- a/content/browser/frame_host/render_widget_host_view_child_frame.cc
+++ b/content/browser/frame_host/render_widget_host_view_child_frame.cc
@@ -135,7 +135,7 @@ bool RenderWidgetHostViewChildFrame::HasFocus() const {
}
bool RenderWidgetHostViewChildFrame::IsSurfaceAvailableForCopy() const {
- return local_surface_id_.is_valid();
+ return has_frame_;
}
void RenderWidgetHostViewChildFrame::Show() {
@@ -349,41 +349,34 @@ void RenderWidgetHostViewChildFrame::DidReceiveCompositorFrameAck() {
true /* is_swap_ack */, cc::ReturnedResourceArray()));
}
-bool RenderWidgetHostViewChildFrame::ShouldCreateNewSurfaceId(
- uint32_t compositor_frame_sink_id,
- const cc::CompositorFrame& frame) {
- gfx::Size new_frame_size = frame.render_pass_list.back()->output_rect.size();
- float new_scale_factor = frame.metadata.device_scale_factor;
-
- return compositor_frame_sink_id != last_compositor_frame_sink_id_ ||
- new_frame_size != current_surface_size_ ||
- new_scale_factor != current_surface_scale_factor_;
-}
-
void RenderWidgetHostViewChildFrame::ProcessCompositorFrame(
uint32_t compositor_frame_sink_id,
cc::CompositorFrame frame) {
- if (ShouldCreateNewSurfaceId(compositor_frame_sink_id, frame)) {
- ClearCompositorSurfaceIfNecessary();
- // If the renderer changed its frame sink, reset the
- // CompositorFrameSinkSupport to avoid returning stale resources.
- if (compositor_frame_sink_id != last_compositor_frame_sink_id_) {
- ResetCompositorFrameSinkSupport();
- CreateCompositorFrameSinkSupport();
- }
+ // If the renderer changed its frame sink, reset the
+ // CompositorFrameSinkSupport to avoid returning stale resources.
+ if (compositor_frame_sink_id != last_compositor_frame_sink_id_) {
+ ResetCompositorFrameSinkSupport();
+ CreateCompositorFrameSinkSupport();
last_compositor_frame_sink_id_ = compositor_frame_sink_id;
- current_surface_size_ = frame.render_pass_list.back()->output_rect.size();
- current_surface_scale_factor_ = frame.metadata.device_scale_factor;
+ local_surface_id_ = cc::LocalSurfaceId();
}
+ gfx::Size new_frame_size = frame.render_pass_list.back()->output_rect.size();
+ float new_scale_factor = frame.metadata.device_scale_factor;
bool allocated_new_local_surface_id = false;
- if (!local_surface_id_.is_valid()) {
+ if (!local_surface_id_.is_valid() ||
+ new_frame_size != current_surface_size_ ||
+ new_scale_factor != current_surface_scale_factor_) {
local_surface_id_ = id_allocator_->GenerateId();
+ current_surface_size_ = frame.render_pass_list.back()->output_rect.size();
+ current_surface_scale_factor_ = frame.metadata.device_scale_factor;
allocated_new_local_surface_id = true;
}
support_->SubmitCompositorFrame(local_surface_id_, std::move(frame));
- if (allocated_new_local_surface_id)
+ has_frame_ = true;
+
+ if (allocated_new_local_surface_id || HasEmbedderChanged())
SendSurfaceInfoToEmbedder();
ProcessFrameSwappedCallbacks();
}
@@ -395,7 +388,7 @@ void RenderWidgetHostViewChildFrame::SendSurfaceInfoToEmbedder() {
cc::SurfaceId surface_id(frame_sink_id_, local_surface_id_);
// The renderer process will satisfy this dependency when it creates a
// SurfaceLayer.
- manager->GetSurfaceForId(surface_id)->AddDestructionDependency(sequence);
+ manager->RequireSequence(surface_id, sequence);
cc::SurfaceInfo surface_info(surface_id, current_surface_scale_factor_,
current_surface_size_);
SendSurfaceInfoToEmbedderImpl(surface_info, sequence);
@@ -675,9 +668,10 @@ RenderWidgetHostViewChildFrame::CreateBrowserAccessibilityManager(
}
void RenderWidgetHostViewChildFrame::ClearCompositorSurfaceIfNecessary() {
- if (support_)
- support_->EvictFrame();
- local_surface_id_ = cc::LocalSurfaceId();
+ if (!support_)
+ return;
+ support_->EvictFrame();
+ has_frame_ = false;
}
bool RenderWidgetHostViewChildFrame::IsChildFrameForTesting() const {
@@ -712,4 +706,8 @@ void RenderWidgetHostViewChildFrame::ResetCompositorFrameSinkSupport() {
support_.reset();
}
+bool RenderWidgetHostViewChildFrame::HasEmbedderChanged() {
+ return false;
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698