Index: content/browser/frame_host/render_widget_host_view_guest.cc |
diff --git a/content/browser/frame_host/render_widget_host_view_guest.cc b/content/browser/frame_host/render_widget_host_view_guest.cc |
index 129703549c77496c49a0c91577ff40800aada989..b1c48b08274311915793172a235024a645241403 100644 |
--- a/content/browser/frame_host/render_widget_host_view_guest.cc |
+++ b/content/browser/frame_host/render_widget_host_view_guest.cc |
@@ -115,7 +115,7 @@ void RenderWidgetHostViewGuest::Show() { |
// the renderer. |
if (!surface_id_.is_null()) { |
cc::SurfaceSequence sequence = cc::SurfaceSequence( |
- id_allocator_->client_id(), next_surface_sequence_++); |
+ surface_id_.client_id(), next_surface_sequence_++); |
GetSurfaceManager() |
->GetSurfaceForId(surface_id_) |
->AddDestructionDependency(sequence); |
@@ -258,6 +258,7 @@ void RenderWidgetHostViewGuest::SetTooltipText( |
void RenderWidgetHostViewGuest::OnSwapCompositorFrame( |
uint32_t output_surface_id, |
+ const cc::SurfaceId& surface_id, |
cc::CompositorFrame frame) { |
TRACE_EVENT0("content", "RenderWidgetHostViewGuest::OnSwapCompositorFrame"); |
@@ -268,40 +269,41 @@ void RenderWidgetHostViewGuest::OnSwapCompositorFrame( |
gfx::Size frame_size = root_pass->output_rect.size(); |
float scale_factor = frame.metadata.device_scale_factor; |
+ current_surface_scale_factor_ = scale_factor; |
+ current_surface_size_ = frame_size; |
// Check whether we need to recreate the cc::Surface, which means the child |
// frame renderer has changed its output surface, or size, or scale factor. |
- if (output_surface_id != last_output_surface_id_ && surface_factory_) { |
- surface_factory_->Destroy(surface_id_); |
- surface_factory_.reset(); |
- } |
if (output_surface_id != last_output_surface_id_ || |
- frame_size != current_surface_size_ || |
- scale_factor != current_surface_scale_factor_ || |
guest_->has_attached_since_surface_set()) { |
- ClearCompositorSurfaceIfNecessary(); |
+ if (surface_factory_) |
+ surface_factory_->DestroyAll(); |
last_output_surface_id_ = output_surface_id; |
- current_surface_size_ = frame_size; |
- current_surface_scale_factor_ = scale_factor; |
} |
if (!surface_factory_) { |
cc::SurfaceManager* manager = GetSurfaceManager(); |
- surface_factory_ = base::WrapUnique(new cc::SurfaceFactory(manager, this)); |
+ surface_factory_ = base::WrapUnique( |
+ new cc::SurfaceFactory(surface_id_.client_id(), manager, this)); |
} |
- if (surface_id_.is_null()) { |
- surface_id_ = id_allocator_->GenerateId(); |
- surface_factory_->Create(surface_id_); |
+ if (surface_id_ != surface_id) { |
+ if (!surface_id_.is_null()) |
+ surface_factory_->Destroy(surface_id_); |
- cc::SurfaceSequence sequence = cc::SurfaceSequence( |
- id_allocator_->client_id(), next_surface_sequence_++); |
- // The renderer process will satisfy this dependency when it creates a |
- // SurfaceLayer. |
- cc::SurfaceManager* manager = GetSurfaceManager(); |
- manager->GetSurfaceForId(surface_id_)->AddDestructionDependency(sequence); |
- guest_->SetChildFrameSurface(surface_id_, frame_size, scale_factor, |
- sequence); |
+ surface_id_ = surface_id; |
+ if (!surface_id.is_null()) { |
+ surface_factory_->Create(surface_id); |
+ |
+ cc::SurfaceSequence sequence = cc::SurfaceSequence( |
+ surface_id_.client_id(), next_surface_sequence_++); |
+ // The renderer process will satisfy this dependency when it creates a |
+ // SurfaceLayer. |
+ cc::SurfaceManager* manager = GetSurfaceManager(); |
+ manager->GetSurfaceForId(surface_id_)->AddDestructionDependency(sequence); |
+ guest_->SetChildFrameSurface(surface_id_, frame_size, scale_factor, |
+ sequence); |
+ } |
} |
cc::SurfaceFactory::DrawCallback ack_callback = base::Bind( |