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

Side by Side Diff: content/renderer/child_frame_compositing_helper.cc

Issue 1094113003: Allow out-of-process iframes to render to compositing surfaces. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed typo Created 5 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/child_frame_compositing_helper.h" 5 #include "content/renderer/child_frame_compositing_helper.h"
6 6
7 #include "cc/blink/web_layer_impl.h" 7 #include "cc/blink/web_layer_impl.h"
8 #include "cc/layers/delegated_frame_provider.h" 8 #include "cc/layers/delegated_frame_provider.h"
9 #include "cc/layers/delegated_frame_resource_collection.h" 9 #include "cc/layers/delegated_frame_resource_collection.h"
10 #include "cc/layers/delegated_renderer_layer.h" 10 #include "cc/layers/delegated_renderer_layer.h"
11 #include "cc/layers/solid_color_layer.h" 11 #include "cc/layers/solid_color_layer.h"
12 #include "cc/layers/surface_layer.h"
12 #include "cc/output/context_provider.h" 13 #include "cc/output/context_provider.h"
13 #include "cc/output/copy_output_request.h" 14 #include "cc/output/copy_output_request.h"
14 #include "cc/output/copy_output_result.h" 15 #include "cc/output/copy_output_result.h"
15 #include "cc/resources/single_release_callback.h" 16 #include "cc/resources/single_release_callback.h"
16 #include "content/common/browser_plugin/browser_plugin_messages.h" 17 #include "content/common/browser_plugin/browser_plugin_messages.h"
17 #include "content/common/frame_messages.h" 18 #include "content/common/frame_messages.h"
18 #include "content/common/gpu/client/context_provider_command_buffer.h" 19 #include "content/common/gpu/client/context_provider_command_buffer.h"
19 #include "content/renderer/browser_plugin/browser_plugin.h" 20 #include "content/renderer/browser_plugin/browser_plugin.h"
20 #include "content/renderer/browser_plugin/browser_plugin_manager.h" 21 #include "content/renderer/browser_plugin/browser_plugin_manager.h"
21 #include "content/renderer/render_frame_impl.h" 22 #include "content/renderer/render_frame_impl.h"
22 #include "content/renderer/render_frame_proxy.h" 23 #include "content/renderer/render_frame_proxy.h"
23 #include "content/renderer/render_thread_impl.h" 24 #include "content/renderer/render_thread_impl.h"
24 #include "skia/ext/image_operations.h" 25 #include "skia/ext/image_operations.h"
25 #include "third_party/WebKit/public/web/WebFrame.h" 26 #include "third_party/WebKit/public/web/WebFrame.h"
26 #include "third_party/WebKit/public/web/WebPluginContainer.h" 27 #include "third_party/WebKit/public/web/WebPluginContainer.h"
27 #include "third_party/khronos/GLES2/gl2.h" 28 #include "third_party/khronos/GLES2/gl2.h"
28 #include "ui/gfx/geometry/size_conversions.h" 29 #include "ui/gfx/geometry/size_conversions.h"
29 #include "ui/gfx/skia_util.h" 30 #include "ui/gfx/skia_util.h"
30 31
31 namespace content { 32 namespace content {
32 33
33 ChildFrameCompositingHelper* 34 ChildFrameCompositingHelper*
34 ChildFrameCompositingHelper::CreateForBrowserPlugin( 35 ChildFrameCompositingHelper::CreateForBrowserPlugin(
35 const base::WeakPtr<BrowserPlugin>& browser_plugin) { 36 const base::WeakPtr<BrowserPlugin>& browser_plugin) {
36 return new ChildFrameCompositingHelper( 37 return new ChildFrameCompositingHelper(
37 browser_plugin, NULL, NULL, browser_plugin->render_frame_routing_id()); 38 browser_plugin, nullptr, nullptr,
39 browser_plugin->render_frame_routing_id());
38 } 40 }
39 41
40 ChildFrameCompositingHelper* 42 ChildFrameCompositingHelper*
41 ChildFrameCompositingHelper::CreateForRenderFrameProxy( 43 ChildFrameCompositingHelper::CreateForRenderFrameProxy(
42 RenderFrameProxy* render_frame_proxy) { 44 RenderFrameProxy* render_frame_proxy) {
43 return new ChildFrameCompositingHelper(base::WeakPtr<BrowserPlugin>(), 45 return new ChildFrameCompositingHelper(base::WeakPtr<BrowserPlugin>(),
44 render_frame_proxy->web_frame(), 46 render_frame_proxy->web_frame(),
45 render_frame_proxy, 47 render_frame_proxy,
46 render_frame_proxy->routing_id()); 48 render_frame_proxy->routing_id());
47 } 49 }
48 50
49 ChildFrameCompositingHelper::ChildFrameCompositingHelper( 51 ChildFrameCompositingHelper::ChildFrameCompositingHelper(
50 const base::WeakPtr<BrowserPlugin>& browser_plugin, 52 const base::WeakPtr<BrowserPlugin>& browser_plugin,
51 blink::WebFrame* frame, 53 blink::WebFrame* frame,
52 RenderFrameProxy* render_frame_proxy, 54 RenderFrameProxy* render_frame_proxy,
53 int host_routing_id) 55 int host_routing_id)
54 : host_routing_id_(host_routing_id), 56 : host_routing_id_(host_routing_id),
55 last_route_id_(0), 57 last_route_id_(0),
56 last_output_surface_id_(0), 58 last_output_surface_id_(0),
57 last_host_id_(0), 59 last_host_id_(0),
58 ack_pending_(true), 60 ack_pending_(true),
59 opaque_(true), 61 opaque_(true),
60 browser_plugin_(browser_plugin), 62 browser_plugin_(browser_plugin),
61 render_frame_proxy_(render_frame_proxy), 63 render_frame_proxy_(render_frame_proxy),
62 frame_(frame) {} 64 frame_(frame) {}
63 65
64 ChildFrameCompositingHelper::~ChildFrameCompositingHelper() { 66 ChildFrameCompositingHelper::~ChildFrameCompositingHelper() {
65 if (resource_collection_.get()) 67 if (resource_collection_.get())
66 resource_collection_->SetClient(NULL); 68 resource_collection_->SetClient(nullptr);
67 } 69 }
68 70
69 BrowserPluginManager* ChildFrameCompositingHelper::GetBrowserPluginManager() { 71 BrowserPluginManager* ChildFrameCompositingHelper::GetBrowserPluginManager() {
70 if (!browser_plugin_) 72 if (!browser_plugin_)
71 return NULL; 73 return nullptr;
72 74
73 return BrowserPluginManager::Get(); 75 return BrowserPluginManager::Get();
74 } 76 }
75 77
76 blink::WebPluginContainer* ChildFrameCompositingHelper::GetContainer() { 78 blink::WebPluginContainer* ChildFrameCompositingHelper::GetContainer() {
77 if (!browser_plugin_) 79 if (!browser_plugin_)
78 return NULL; 80 return nullptr;
79 81
80 return browser_plugin_->container(); 82 return browser_plugin_->container();
81 } 83 }
82 84
83 int ChildFrameCompositingHelper::GetInstanceID() { 85 int ChildFrameCompositingHelper::GetInstanceID() {
84 if (!browser_plugin_) 86 if (!browser_plugin_)
85 return 0; 87 return 0;
86 88
87 return browser_plugin_->browser_plugin_instance_id(); 89 return browser_plugin_->browser_plugin_instance_id();
88 } 90 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 130
129 SendCompositorFrameSwappedACKToBrowser(params); 131 SendCompositorFrameSwappedACKToBrowser(params);
130 132
131 ack_pending_ = false; 133 ack_pending_ = false;
132 } 134 }
133 135
134 void ChildFrameCompositingHelper::EnableCompositing(bool enable) { 136 void ChildFrameCompositingHelper::EnableCompositing(bool enable) {
135 if (enable && !background_layer_.get()) { 137 if (enable && !background_layer_.get()) {
136 background_layer_ = cc::SolidColorLayer::Create(); 138 background_layer_ = cc::SolidColorLayer::Create();
137 background_layer_->SetMasksToBounds(true); 139 background_layer_->SetMasksToBounds(true);
138 background_layer_->SetBackgroundColor( 140 background_layer_->SetBackgroundColor(SkColorSetARGBInline(255, 0, 128, 0));
139 SkColorSetARGBInline(255, 255, 255, 255));
140 web_layer_.reset(new cc_blink::WebLayerImpl(background_layer_)); 141 web_layer_.reset(new cc_blink::WebLayerImpl(background_layer_));
141 } 142 }
142 143
143 if (GetContainer()) { 144 if (GetContainer()) {
144 GetContainer()->setWebLayer(enable ? web_layer_.get() : NULL); 145 GetContainer()->setWebLayer(enable ? web_layer_.get() : nullptr);
145 } else if (frame_) { 146 } else if (frame_) {
146 frame_->setRemoteWebLayer(enable ? web_layer_.get() : NULL); 147 frame_->setRemoteWebLayer(enable ? web_layer_.get() : nullptr);
147 } 148 }
148 } 149 }
149 150
150 void ChildFrameCompositingHelper::CheckSizeAndAdjustLayerProperties( 151 void ChildFrameCompositingHelper::CheckSizeAndAdjustLayerProperties(
151 const gfx::Size& new_size, 152 const gfx::Size& new_size,
152 float device_scale_factor, 153 float device_scale_factor,
153 cc::Layer* layer) { 154 cc::Layer* layer) {
154 if (buffer_size_ != new_size) { 155 if (buffer_size_ != new_size) {
155 buffer_size_ = new_size; 156 buffer_size_ = new_size;
156 // The container size is in DIP, so is the layer size. 157 // The container size is in DIP, so is the layer size.
157 // Buffer size is in physical pixels, so we need to adjust 158 // Buffer size is in physical pixels, so we need to adjust
158 // it by the device scale factor. 159 // it by the device scale factor.
159 gfx::Size device_scale_adjusted_size = gfx::ToFlooredSize( 160 gfx::Size device_scale_adjusted_size = gfx::ToFlooredSize(
160 gfx::ScaleSize(buffer_size_, 1.0f / device_scale_factor)); 161 gfx::ScaleSize(buffer_size_, 1.0f / device_scale_factor));
161 layer->SetBounds(device_scale_adjusted_size); 162 layer->SetBounds(device_scale_adjusted_size);
162 } 163 }
163 164
164 // Manually manage background layer for transparent webview. 165 // Manually manage background layer for transparent webview.
165 if (!opaque_) 166 if (!opaque_)
166 background_layer_->SetIsDrawable(false); 167 background_layer_->SetIsDrawable(false);
167 } 168 }
168 169
169 void ChildFrameCompositingHelper::OnContainerDestroy() { 170 void ChildFrameCompositingHelper::OnContainerDestroy() {
170 // If we have a pending ACK, then ACK now so we don't lose frames in the 171 // If we have a pending ACK, then ACK now so we don't lose frames in the
171 // future. 172 // future.
172 DidCommitCompositorFrame(); 173 DidCommitCompositorFrame();
173 174
174 if (GetContainer()) 175 if (GetContainer())
175 GetContainer()->setWebLayer(NULL); 176 GetContainer()->setWebLayer(nullptr);
176 177
177 if (resource_collection_.get()) 178 if (resource_collection_.get())
178 resource_collection_->SetClient(NULL); 179 resource_collection_->SetClient(nullptr);
179 180
180 ack_pending_ = false; 181 ack_pending_ = false;
181 resource_collection_ = NULL; 182 resource_collection_ = nullptr;
182 frame_provider_ = NULL; 183 frame_provider_ = nullptr;
183 delegated_layer_ = NULL; 184 delegated_layer_ = nullptr;
184 background_layer_ = NULL; 185 background_layer_ = nullptr;
186 surface_layer_ = nullptr;
185 web_layer_.reset(); 187 web_layer_.reset();
186 } 188 }
187 189
188 void ChildFrameCompositingHelper::ChildFrameGone() { 190 void ChildFrameCompositingHelper::ChildFrameGone() {
189 background_layer_->SetBackgroundColor(SkColorSetARGBInline(255, 0, 128, 0)); 191 background_layer_->SetBackgroundColor(SkColorSetARGBInline(255, 0, 128, 0));
190 background_layer_->RemoveAllChildren(); 192 background_layer_->RemoveAllChildren();
191 background_layer_->SetIsDrawable(true); 193 background_layer_->SetIsDrawable(true);
192 background_layer_->SetContentsOpaque(true); 194 background_layer_->SetContentsOpaque(true);
193 } 195 }
194 196
195 void ChildFrameCompositingHelper::OnCompositorFrameSwapped( 197 void ChildFrameCompositingHelper::OnCompositorFrameSwapped(
196 scoped_ptr<cc::CompositorFrame> frame, 198 scoped_ptr<cc::CompositorFrame> frame,
197 int route_id, 199 int route_id,
198 uint32 output_surface_id, 200 uint32 output_surface_id,
199 int host_id, 201 int host_id,
200 base::SharedMemoryHandle handle) { 202 base::SharedMemoryHandle handle) {
201 cc::DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); 203 cc::DelegatedFrameData* frame_data = frame->delegated_frame_data.get();
204
205 // Surface IDs and compositor frames should never be received
206 // interchangeably.
207 DCHECK(!surface_layer_.get());
208
202 // Do nothing if we are getting destroyed or have no frame data. 209 // Do nothing if we are getting destroyed or have no frame data.
203 if (!frame_data || !background_layer_.get()) 210 if (!frame_data || !background_layer_.get())
204 return; 211 return;
205 212
206 DCHECK(!frame_data->render_pass_list.empty()); 213 DCHECK(!frame_data->render_pass_list.empty());
207 cc::RenderPass* root_pass = frame_data->render_pass_list.back(); 214 cc::RenderPass* root_pass = frame_data->render_pass_list.back();
208 gfx::Size frame_size = root_pass->output_rect.size(); 215 gfx::Size frame_size = root_pass->output_rect.size();
209 216
210 if (last_route_id_ != route_id || 217 if (last_route_id_ != route_id ||
211 last_output_surface_id_ != output_surface_id || 218 last_output_surface_id_ != output_surface_id ||
212 last_host_id_ != host_id) { 219 last_host_id_ != host_id) {
213 // Resource ids are scoped by the output surface. 220 // Resource ids are scoped by the output surface.
214 // If the originating output surface doesn't match the last one, it 221 // If the originating output surface doesn't match the last one, it
215 // indicates the guest's output surface may have been recreated, in which 222 // indicates the guest's output surface may have been recreated, in which
216 // case we should recreate the DelegatedRendererLayer, to avoid matching 223 // case we should recreate the DelegatedRendererLayer, to avoid matching
217 // resources from the old one with resources from the new one which would 224 // resources from the old one with resources from the new one which would
218 // have the same id. 225 // have the same id.
219 frame_provider_ = NULL; 226 frame_provider_ = nullptr;
220 227
221 // Drop the cc::DelegatedFrameResourceCollection so that we will not return 228 // Drop the cc::DelegatedFrameResourceCollection so that we will not return
222 // any resources from the old output surface with the new output surface id. 229 // any resources from the old output surface with the new output surface id.
223 if (resource_collection_.get()) { 230 if (resource_collection_.get()) {
224 resource_collection_->SetClient(NULL); 231 resource_collection_->SetClient(nullptr);
225 232
226 if (resource_collection_->LoseAllResources()) 233 if (resource_collection_->LoseAllResources())
227 SendReturnedDelegatedResources(); 234 SendReturnedDelegatedResources();
228 resource_collection_ = NULL; 235 resource_collection_ = nullptr;
229 } 236 }
230 last_output_surface_id_ = output_surface_id; 237 last_output_surface_id_ = output_surface_id;
231 last_route_id_ = route_id; 238 last_route_id_ = route_id;
232 last_host_id_ = host_id; 239 last_host_id_ = host_id;
233 } 240 }
234 if (!resource_collection_.get()) { 241 if (!resource_collection_.get()) {
235 resource_collection_ = new cc::DelegatedFrameResourceCollection; 242 resource_collection_ = new cc::DelegatedFrameResourceCollection;
236 resource_collection_->SetClient(this); 243 resource_collection_->SetClient(this);
237 } 244 }
238 if (!frame_provider_.get() || frame_provider_->frame_size() != frame_size) { 245 if (!frame_provider_.get() || frame_provider_->frame_size() != frame_size) {
(...skipping 12 matching lines...) Expand all
251 } 258 }
252 259
253 CheckSizeAndAdjustLayerProperties( 260 CheckSizeAndAdjustLayerProperties(
254 frame_data->render_pass_list.back()->output_rect.size(), 261 frame_data->render_pass_list.back()->output_rect.size(),
255 frame->metadata.device_scale_factor, 262 frame->metadata.device_scale_factor,
256 delegated_layer_.get()); 263 delegated_layer_.get());
257 264
258 ack_pending_ = true; 265 ack_pending_ = true;
259 } 266 }
260 267
268 // static
269 void ChildFrameCompositingHelper::SatisfyCallback(
270 ChildFrameCompositingHelper* helper,
271 cc::SurfaceSequence sequence) {
272 if (helper->render_frame_proxy_) {
273 helper->render_frame_proxy_->Send(
274 new FrameHostMsg_SatisfySequence(helper->host_routing_id_, sequence));
275 }
276 }
277
278 // static
279 void ChildFrameCompositingHelper::RequireCallback(
280 ChildFrameCompositingHelper* helper,
281 cc::SurfaceId id,
282 cc::SurfaceSequence sequence) {
283 if (helper->render_frame_proxy_) {
284 helper->render_frame_proxy_->Send(new FrameHostMsg_RequireSequence(
285 helper->host_routing_id_, id, sequence));
286 }
287 }
288
289 void ChildFrameCompositingHelper::OnSetSurface(
290 const cc::SurfaceId& surface_id,
291 const gfx::Size& frame_size,
292 float scale_factor,
293 const cc::SurfaceSequence& sequence) {
294 // Surface IDs and compositor frames should never be received
295 // interchangably.
296 DCHECK(!delegated_layer_.get());
297
298 // Do nothing if we are getting destroyed.
299 if (!background_layer_.get())
300 return;
301
302 if (!surface_layer_.get()) {
303 cc::SurfaceLayer::SatisfyCallback satisfy_callback = base::Bind(
jbauman 2015/05/01 23:58:10 I think we'll need to plumb down this renderer's s
kenrb 2015/05/05 16:24:38 I see what you mean. Would this be another paramet
304 &ChildFrameCompositingHelper::SatisfyCallback, base::Unretained(this));
305 cc::SurfaceLayer::RequireCallback require_callback = base::Bind(
306 &ChildFrameCompositingHelper::RequireCallback, base::Unretained(this));
307 surface_layer_ =
308 cc::SurfaceLayer::Create(satisfy_callback, require_callback);
309 }
310 surface_layer_->SetSurfaceId(surface_id, scale_factor, frame_size);
311 UpdateVisibility(true);
312 SetContentsOpaque(opaque_);
313 background_layer_->AddChild(surface_layer_);
314
315 // The RWHV creates a destruction dependency on the surface that needs to be
316 // satisfied.
317 render_frame_proxy_->Send(
318 new FrameHostMsg_SatisfySequence(host_routing_id_, sequence));
319
320 CheckSizeAndAdjustLayerProperties(frame_size, scale_factor,
321 surface_layer_.get());
322 }
323
261 void ChildFrameCompositingHelper::UpdateVisibility(bool visible) { 324 void ChildFrameCompositingHelper::UpdateVisibility(bool visible) {
262 if (delegated_layer_.get()) 325 if (delegated_layer_.get())
263 delegated_layer_->SetIsDrawable(visible); 326 delegated_layer_->SetIsDrawable(visible);
327 if (surface_layer_.get())
328 surface_layer_->SetIsDrawable(visible);
264 } 329 }
265 330
266 void ChildFrameCompositingHelper::UnusedResourcesAreAvailable() { 331 void ChildFrameCompositingHelper::UnusedResourcesAreAvailable() {
267 if (ack_pending_) 332 if (ack_pending_)
268 return; 333 return;
269 334
270 SendReturnedDelegatedResources(); 335 SendReturnedDelegatedResources();
271 } 336 }
272 337
273 void ChildFrameCompositingHelper::SendReturnedDelegatedResources() { 338 void ChildFrameCompositingHelper::SendReturnedDelegatedResources() {
274 FrameHostMsg_ReclaimCompositorResources_Params params; 339 FrameHostMsg_ReclaimCompositorResources_Params params;
275 if (resource_collection_.get()) 340 if (resource_collection_.get())
276 resource_collection_->TakeUnusedResourcesForChildCompositor( 341 resource_collection_->TakeUnusedResourcesForChildCompositor(
277 &params.ack.resources); 342 &params.ack.resources);
278 DCHECK(!params.ack.resources.empty()); 343 DCHECK(!params.ack.resources.empty());
279 344
280 params.route_id = last_route_id_; 345 params.route_id = last_route_id_;
281 params.output_surface_id = last_output_surface_id_; 346 params.output_surface_id = last_output_surface_id_;
282 params.renderer_host_id = last_host_id_; 347 params.renderer_host_id = last_host_id_;
283 SendReclaimCompositorResourcesToBrowser(params); 348 SendReclaimCompositorResourcesToBrowser(params);
284 } 349 }
285 350
286 void ChildFrameCompositingHelper::SetContentsOpaque(bool opaque) { 351 void ChildFrameCompositingHelper::SetContentsOpaque(bool opaque) {
287 opaque_ = opaque; 352 opaque_ = opaque;
288 if (delegated_layer_.get()) 353 if (delegated_layer_.get())
289 delegated_layer_->SetContentsOpaque(opaque_); 354 delegated_layer_->SetContentsOpaque(opaque_);
355 if (surface_layer_.get())
356 surface_layer_->SetContentsOpaque(opaque_);
290 } 357 }
291 358
292 } // namespace content 359 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698