Chromium Code Reviews| 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 0c6bc7dfc596be8f20b7b401f2c0f0d4648e4ff0..e4c4cb813dde806f244b902d0ba492b1670efc43 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 |
| @@ -18,7 +18,6 @@ |
| #include "cc/surfaces/surface.h" |
| #include "cc/surfaces/surface_factory.h" |
| #include "cc/surfaces/surface_manager.h" |
| -#include "cc/surfaces/surface_sequence.h" |
| #include "content/browser/accessibility/browser_accessibility_manager.h" |
| #include "content/browser/browser_plugin/browser_plugin_guest.h" |
| #include "content/browser/compositor/surface_utils.h" |
| @@ -374,35 +373,29 @@ void RenderWidgetHostViewChildFrame::SurfaceDrawn( |
| ack_pending_count_--; |
| } |
| -void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame( |
| +bool RenderWidgetHostViewChildFrame::ShouldRecreateSurface( |
|
Fady Samuel
2017/01/18 01:03:43
I think ShouldCreateNewSurfaceId better captures w
Saman Sami
2017/01/18 18:15:53
Done.
|
| uint32_t compositor_frame_sink_id, |
| - cc::CompositorFrame frame) { |
| - TRACE_EVENT0("content", |
| - "RenderWidgetHostViewChildFrame::OnSwapCompositorFrame"); |
| + 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; |
| - last_scroll_offset_ = frame.metadata.root_scroll_offset; |
| - |
| - if (!frame_connector_) |
| - return; |
| - |
| - cc::RenderPass* root_pass = frame.render_pass_list.back().get(); |
| - |
| - gfx::Size frame_size = root_pass->output_rect.size(); |
| - float 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_; |
| +} |
| - // Check whether we need to recreate the cc::Surface, which means the child |
| - // frame renderer has changed its frame sink, or size, or scale factor. |
| - if (compositor_frame_sink_id != last_compositor_frame_sink_id_ || |
| - frame_size != current_surface_size_ || |
| - scale_factor != current_surface_scale_factor_) { |
| +void RenderWidgetHostViewChildFrame::ProcessCompositorFrame( |
| + uint32_t compositor_frame_sink_id, |
| + cc::CompositorFrame frame) { |
| + if (ShouldRecreateSurface(compositor_frame_sink_id, frame)) { |
| ClearCompositorSurfaceIfNecessary(); |
| // If the renderer changed its frame sink, reset the surface factory to |
| // avoid returning stale resources. |
| if (compositor_frame_sink_id != last_compositor_frame_sink_id_) |
| surface_factory_->Reset(); |
| last_compositor_frame_sink_id_ = compositor_frame_sink_id; |
| - current_surface_size_ = frame_size; |
| - current_surface_scale_factor_ = scale_factor; |
| + current_surface_size_ = frame.render_pass_list.back()->output_rect.size(); |
| + current_surface_scale_factor_ = frame.metadata.device_scale_factor; |
| } |
| bool allocated_new_local_frame_id = false; |
| @@ -419,22 +412,41 @@ void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame( |
| DCHECK_LT(ack_pending_count_, 1000U); |
| surface_factory_->SubmitCompositorFrame(local_frame_id_, std::move(frame), |
| ack_callback); |
| - |
| - if (allocated_new_local_frame_id) { |
| - cc::SurfaceSequence sequence = |
| - cc::SurfaceSequence(frame_sink_id_, next_surface_sequence_++); |
| - // The renderer process will satisfy this dependency when it creates a |
| - // SurfaceLayer. |
| - cc::SurfaceManager* manager = GetSurfaceManager(); |
| - manager->GetSurfaceForId(cc::SurfaceId(frame_sink_id_, local_frame_id_)) |
| - ->AddDestructionDependency(sequence); |
| - frame_connector_->SetChildFrameSurface( |
| - cc::SurfaceId(frame_sink_id_, local_frame_id_), frame_size, |
| - scale_factor, sequence); |
| - } |
| + if (allocated_new_local_frame_id) |
| + SendSurfaceInfoToChild(); |
| ProcessFrameSwappedCallbacks(); |
| } |
| +void RenderWidgetHostViewChildFrame::SendSurfaceInfoToChild() { |
|
Fady Samuel
2017/01/18 01:03:43
This should be called SendSurfaceInfoToEmbedder
Saman Sami
2017/01/18 18:15:53
Done.
|
| + cc::SurfaceSequence sequence = |
| + cc::SurfaceSequence(frame_sink_id_, next_surface_sequence_++); |
| + cc::SurfaceManager* manager = GetSurfaceManager(); |
| + cc::SurfaceId surface_id(frame_sink_id_, local_frame_id_); |
| + // The renderer process will satisfy this dependency when it creates a |
| + // SurfaceLayer. |
| + manager->GetSurfaceForId(surface_id)->AddDestructionDependency(sequence); |
| + cc::SurfaceInfo surface_info(surface_id, current_surface_scale_factor_, |
| + current_surface_size_); |
| + SendSurfaceInfoToChild(surface_info, sequence); |
| +} |
| + |
| +void RenderWidgetHostViewChildFrame::SendSurfaceInfoToChild( |
|
Fady Samuel
2017/01/18 01:03:43
SendSurfaceInfoToEmbedder
Saman Sami
2017/01/18 18:15:53
Done.
|
| + const cc::SurfaceInfo& surface_info, |
| + const cc::SurfaceSequence& sequence) { |
| + frame_connector_->SetChildFrameSurface(surface_info, sequence); |
| +} |
| + |
| +void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame( |
| + uint32_t compositor_frame_sink_id, |
| + cc::CompositorFrame frame) { |
| + TRACE_EVENT0("content", |
| + "RenderWidgetHostViewChildFrame::OnSwapCompositorFrame"); |
| + last_scroll_offset_ = frame.metadata.root_scroll_offset; |
| + if (!frame_connector_) |
| + return; |
| + ProcessCompositorFrame(compositor_frame_sink_id, std::move(frame)); |
| +} |
| + |
| void RenderWidgetHostViewChildFrame::ProcessFrameSwappedCallbacks() { |
| // We only use callbacks once, therefore we make a new list for registration |
| // before we start, and discard the old list entries when we are done. |