Chromium Code Reviews| Index: content/renderer/browser_plugin/browser_plugin_compositing_helper.cc |
| diff --git a/content/renderer/browser_plugin/browser_plugin_compositing_helper.cc b/content/renderer/browser_plugin/browser_plugin_compositing_helper.cc |
| index c7a4758365e34bdb17dd0b5bb3148395d7f5255f..8615f7329a2e0e4ac644a2c0274e2bf416141b6d 100644 |
| --- a/content/renderer/browser_plugin/browser_plugin_compositing_helper.cc |
| +++ b/content/renderer/browser_plugin/browser_plugin_compositing_helper.cc |
| @@ -4,6 +4,8 @@ |
| #include "content/renderer/browser_plugin/browser_plugin_compositing_helper.h" |
| +#include "cc/layers/delegated_frame_provider.h" |
| +#include "cc/layers/delegated_frame_resource_collection.h" |
| #include "cc/layers/delegated_renderer_layer.h" |
| #include "cc/layers/solid_color_layer.h" |
| #include "cc/layers/texture_layer.h" |
| @@ -68,11 +70,11 @@ void BrowserPluginCompositingHelper::DidCommitCompositorFrame() { |
| software_ack_pending_ = false; |
| } |
| - if (!delegated_layer_.get() || !ack_pending_) |
| + if (!resource_collection_.get() || !ack_pending_) |
| return; |
| cc::CompositorFrameAck ack; |
| - delegated_layer_->TakeUnusedResourcesForChildCompositor(&ack.resources); |
| + resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); |
| browser_plugin_manager_->Send( |
| new BrowserPluginHostMsg_CompositorFrameACK( |
| @@ -337,15 +339,8 @@ void BrowserPluginCompositingHelper::OnCompositorFrameSwapped( |
| } |
| DCHECK(!texture_layer_.get()); |
| - if (!delegated_layer_.get()) { |
| - delegated_layer_ = cc::DelegatedRendererLayer::Create(NULL); |
| - delegated_layer_->SetIsDrawable(true); |
| - delegated_layer_->SetContentsOpaque(true); |
| - |
| - background_layer_->AddChild(delegated_layer_); |
| - } |
| - cc::DelegatedFrameData *frame_data = frame->delegated_frame_data.get(); |
| + cc::DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); |
| if (!frame_data) |
| return; |
| @@ -354,7 +349,27 @@ void BrowserPluginCompositingHelper::OnCompositorFrameSwapped( |
| frame->metadata.device_scale_factor, |
| delegated_layer_.get()); |
| - delegated_layer_->SetFrameData(frame->delegated_frame_data.Pass()); |
| + DCHECK_NE(0u, frame_data->render_pass_list.size()); |
| + cc::RenderPass* root_pass = frame_data->render_pass_list.back(); |
| + gfx::Size frame_size = root_pass->output_rect.size(); |
| + |
| + if (!resource_collection_) { |
| + // TODO(danakj): Could return resources sooner if we gave a client here and |
| + // listened for UnusedResourcesAreAvailable(). |
| + resource_collection_.reset(new cc::DelegatedFrameResourceCollection(NULL)); |
| + } |
| + if (!frame_provider_ || frame_provider_->frame_size() != frame_size) { |
| + frame_provider_.reset(new cc::DelegatedFrameProvider( |
| + resource_collection_.get(), frame->delegated_frame_data.Pass())); |
| + delegated_layer_ = |
| + cc::DelegatedRendererLayer::Create(NULL, frame_provider_.get()); |
| + delegated_layer_->SetIsDrawable(true); |
| + delegated_layer_->SetContentsOpaque(true); |
| + background_layer_->AddChild(delegated_layer_); |
|
alexst (slow to review)
2013/10/04 23:23:56
I think if the frame_size changes, you will leak a
danakj
2013/10/04 23:26:38
Ah! Thanks. Done.
|
| + } else { |
| + frame_provider_->SetFrameData(frame->delegated_frame_data.Pass()); |
| + } |
| + |
| last_route_id_ = route_id; |
| last_output_surface_id_ = output_surface_id; |
| last_host_id_ = host_id; |