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 c1a3419de0d08501c36c7fd81414c990d32ee03a..27a2c716a1222800c22ab39efd98275ce2bb3b11 100644 |
--- a/content/browser/frame_host/render_widget_host_view_guest.cc |
+++ b/content/browser/frame_host/render_widget_host_view_guest.cc |
@@ -6,7 +6,12 @@ |
#include "base/command_line.h" |
#include "base/logging.h" |
#include "base/message_loop/message_loop.h" |
+#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/browser_plugin/browser_plugin_guest.h" |
+#include "content/browser/compositor/surface_utils.h" |
#include "content/browser/frame_host/render_widget_host_view_guest.h" |
#include "content/browser/renderer_host/render_view_host_impl.h" |
#include "content/common/browser_plugin/browser_plugin_messages.h" |
@@ -206,10 +211,68 @@ void RenderWidgetHostViewGuest::OnSwapCompositorFrame( |
return; |
last_scroll_offset_ = frame->metadata.root_scroll_offset; |
- guest_->SwapCompositorFrame(output_surface_id, |
- host_->GetProcess()->GetID(), |
- host_->GetRoutingID(), |
- frame.Pass()); |
+ // When not using surfaces, the frame just gets proxied to |
+ // the embedder's renderer to be composited. |
+ if (!frame->delegated_frame_data || !use_surfaces_) { |
+ guest_->SwapCompositorFrame(output_surface_id, |
+ host_->GetProcess()->GetID(), |
+ host_->GetRoutingID(), |
+ frame.Pass()); |
+ return; |
+ } |
+ |
+ cc::RenderPass* root_pass = |
+ frame->delegated_frame_data->render_pass_list.back(); |
+ |
+ gfx::Size frame_size = root_pass->output_rect.size(); |
+ float scale_factor = frame->metadata.device_scale_factor; |
+ |
+ guest_->UpdateGuestSizeIfNecessary(frame_size, scale_factor); |
+ |
+ // 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_) { |
+ if (surface_factory_ && !surface_id_.is_null()) |
+ surface_factory_->Destroy(surface_id_); |
+ surface_id_ = cc::SurfaceId(); |
+ 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_ = make_scoped_ptr(new cc::SurfaceFactory(manager, this)); |
+ } |
+ |
+ if (surface_id_.is_null()) { |
+ surface_id_ = id_allocator_->GenerateId(); |
+ // wjm: Next line makes destructor unhappy ... |
+ surface_factory_->Create(surface_id_); |
+ |
+ cc::SurfaceSequence sequence = cc::SurfaceSequence( |
+ id_allocator_->id_namespace(), 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( |
+ &RenderWidgetHostViewChildFrame::SurfaceDrawn, |
+ RenderWidgetHostViewChildFrame::AsWeakPtr(), output_surface_id); |
+ ack_pending_count_++; |
+ // If this value grows very large, something is going wrong. |
+ DCHECK(ack_pending_count_ < 1000); |
+ surface_factory_->SubmitFrame(surface_id_, frame.Pass(), ack_callback); |
} |
bool RenderWidgetHostViewGuest::OnMessageReceived(const IPC::Message& msg) { |
@@ -389,11 +452,6 @@ void RenderWidgetHostViewGuest::GetScreenInfo(blink::WebScreenInfo* results) { |
embedder_view->GetScreenInfo(results); |
} |
-uint32_t RenderWidgetHostViewGuest::GetSurfaceIdNamespace() { |
- // Compositing surfaces not supported. |
- return 0; |
-} |
- |
#if defined(OS_MACOSX) |
void RenderWidgetHostViewGuest::SetActive(bool active) { |
platform_view_->SetActive(active); |