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

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

Issue 2514033002: Introducing SurfaceReferenceFactory (Closed)
Patch Set: ref Created 4 years 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 <utility> 7 #include <utility>
8 8
9 #include "cc/blink/web_layer_impl.h" 9 #include "cc/blink/web_layer_impl.h"
10 #include "cc/layers/picture_image_layer.h" 10 #include "cc/layers/picture_image_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/layers/surface_layer.h"
13 #include "cc/output/context_provider.h" 13 #include "cc/output/context_provider.h"
14 #include "cc/output/copy_output_request.h" 14 #include "cc/output/copy_output_request.h"
15 #include "cc/output/copy_output_result.h" 15 #include "cc/output/copy_output_result.h"
16 #include "cc/resources/single_release_callback.h" 16 #include "cc/resources/single_release_callback.h"
17 #include "cc/surfaces/surface_embedding.h"
17 #include "content/child/thread_safe_sender.h" 18 #include "content/child/thread_safe_sender.h"
18 #include "content/common/browser_plugin/browser_plugin_messages.h" 19 #include "content/common/browser_plugin/browser_plugin_messages.h"
19 #include "content/common/content_switches_internal.h" 20 #include "content/common/content_switches_internal.h"
20 #include "content/common/frame_messages.h" 21 #include "content/common/frame_messages.h"
21 #include "content/common/gpu/client/context_provider_command_buffer.h" 22 #include "content/common/gpu/client/context_provider_command_buffer.h"
22 #include "content/public/common/content_client.h" 23 #include "content/public/common/content_client.h"
23 #include "content/public/renderer/content_renderer_client.h" 24 #include "content/public/renderer/content_renderer_client.h"
24 #include "content/renderer/browser_plugin/browser_plugin.h" 25 #include "content/renderer/browser_plugin/browser_plugin.h"
25 #include "content/renderer/browser_plugin/browser_plugin_manager.h" 26 #include "content/renderer/browser_plugin/browser_plugin_manager.h"
26 #include "content/renderer/render_frame_impl.h" 27 #include "content/renderer/render_frame_impl.h"
27 #include "content/renderer/render_frame_proxy.h" 28 #include "content/renderer/render_frame_proxy.h"
28 #include "content/renderer/render_thread_impl.h" 29 #include "content/renderer/render_thread_impl.h"
29 #include "skia/ext/image_operations.h" 30 #include "skia/ext/image_operations.h"
30 #include "third_party/WebKit/public/web/WebPluginContainer.h" 31 #include "third_party/WebKit/public/web/WebPluginContainer.h"
31 #include "third_party/WebKit/public/web/WebRemoteFrame.h" 32 #include "third_party/WebKit/public/web/WebRemoteFrame.h"
32 #include "third_party/khronos/GLES2/gl2.h" 33 #include "third_party/khronos/GLES2/gl2.h"
33 #include "third_party/skia/include/core/SkBitmap.h" 34 #include "third_party/skia/include/core/SkBitmap.h"
34 #include "third_party/skia/include/core/SkImage.h" 35 #include "third_party/skia/include/core/SkImage.h"
35 #include "ui/gfx/geometry/point_f.h" 36 #include "ui/gfx/geometry/point_f.h"
36 #include "ui/gfx/geometry/size_conversions.h" 37 #include "ui/gfx/geometry/size_conversions.h"
37 #include "ui/gfx/skia_util.h" 38 #include "ui/gfx/skia_util.h"
38 39
39 namespace content { 40 namespace content {
40 41
42 namespace {
43
44 class SurfaceEmbedding : public cc::SurfaceEmbeddingUsingSequence {
Fady Samuel 2016/12/12 16:25:07 IframeSurfaceEmbedding
45 public:
46 SurfaceEmbedding(scoped_refptr<ThreadSafeSender> sender, int routing_id)
47 : sender_(sender), routing_id_(routing_id) {}
48
49 protected:
50 ~SurfaceEmbedding() override = default;
51
52 private:
53 void RequireSequence(const cc::SurfaceId& id,
54 const cc::SurfaceSequence& seq) const override {
55 sender_->Send(new FrameHostMsg_RequireSequence(routing_id_, id, seq));
56 }
57
58 void SatisfySequence(const cc::SurfaceSequence& seq) const override {
59 sender_->Send(new FrameHostMsg_SatisfySequence(routing_id_, seq));
60 }
61 scoped_refptr<ThreadSafeSender> sender_;
62 int routing_id_;
Fady Samuel 2016/12/12 16:25:07 DISALLOW_COPY_AND_ASSIGN(IframeSurfaceEmbedding)
Fady Samuel 2016/12/12 16:25:07 const int routing_id_
63 };
64
65 class PluginSurfaceEmbedding : public cc::SurfaceEmbeddingUsingSequence {
Fady Samuel 2016/12/12 16:25:07 nit: BrowserPluginSurfaceEmbedding
66 public:
67 PluginSurfaceEmbedding(scoped_refptr<ThreadSafeSender> sender,
68 int routing_id,
69 int plugin_id)
70 : sender_(sender), routing_id_(routing_id), plugin_id_(plugin_id) {}
71
72 protected:
73 ~PluginSurfaceEmbedding() override = default;
74
75 private:
76 void SatisfySequence(const cc::SurfaceSequence& seq) const override {
77 sender_->Send(
78 new BrowserPluginHostMsg_SatisfySequence(routing_id_, plugin_id_, seq));
79 }
80 void RequireSequence(const cc::SurfaceId& id,
81 const cc::SurfaceSequence& seq) const override {
82 sender_->Send(new BrowserPluginHostMsg_RequireSequence(
83 routing_id_, plugin_id_, id, seq));
84 }
85 scoped_refptr<ThreadSafeSender> sender_;
86 int routing_id_;
Fady Samuel 2016/12/12 16:25:07 const int routing_id_;
87 int plugin_id_;
Fady Samuel 2016/12/12 16:25:07 const int browser_plugin_instance_id_; Longer, mor
Fady Samuel 2016/12/12 16:25:07 DISALLOW_COPY_AND_ASSIGN(BrowserPluginSurfaceEmbed
88 };
89
90 } // namespace
91
41 ChildFrameCompositingHelper* 92 ChildFrameCompositingHelper*
42 ChildFrameCompositingHelper::CreateForBrowserPlugin( 93 ChildFrameCompositingHelper::CreateForBrowserPlugin(
43 const base::WeakPtr<BrowserPlugin>& browser_plugin) { 94 const base::WeakPtr<BrowserPlugin>& browser_plugin) {
44 return new ChildFrameCompositingHelper( 95 return new ChildFrameCompositingHelper(
45 browser_plugin, nullptr, nullptr, 96 browser_plugin, nullptr, nullptr,
46 browser_plugin->render_frame_routing_id()); 97 browser_plugin->render_frame_routing_id());
47 } 98 }
48 99
49 ChildFrameCompositingHelper* 100 ChildFrameCompositingHelper*
50 ChildFrameCompositingHelper::CreateForRenderFrameProxy( 101 ChildFrameCompositingHelper::CreateForRenderFrameProxy(
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 177
127 crashed_layer->AddChild(sad_layer); 178 crashed_layer->AddChild(sad_layer);
128 } 179 }
129 } 180 }
130 181
131 std::unique_ptr<blink::WebLayer> layer( 182 std::unique_ptr<blink::WebLayer> layer(
132 new cc_blink::WebLayerImpl(crashed_layer)); 183 new cc_blink::WebLayerImpl(crashed_layer));
133 UpdateWebLayer(std::move(layer)); 184 UpdateWebLayer(std::move(layer));
134 } 185 }
135 186
136 // static
137 void ChildFrameCompositingHelper::SatisfyCallback(
138 scoped_refptr<ThreadSafeSender> sender,
139 int host_routing_id,
140 const cc::SurfaceSequence& sequence) {
141 // This may be called on either the main or impl thread.
142 sender->Send(new FrameHostMsg_SatisfySequence(host_routing_id, sequence));
143 }
144
145 // static
146 void ChildFrameCompositingHelper::SatisfyCallbackBrowserPlugin(
147 scoped_refptr<ThreadSafeSender> sender,
148 int host_routing_id,
149 int browser_plugin_instance_id,
150 const cc::SurfaceSequence& sequence) {
151 sender->Send(new BrowserPluginHostMsg_SatisfySequence(
152 host_routing_id, browser_plugin_instance_id, sequence));
153 }
154
155 // static
156 void ChildFrameCompositingHelper::RequireCallback(
157 scoped_refptr<ThreadSafeSender> sender,
158 int host_routing_id,
159 const cc::SurfaceId& id,
160 const cc::SurfaceSequence& sequence) {
161 // This may be called on either the main or impl thread.
162 sender->Send(new FrameHostMsg_RequireSequence(host_routing_id, id, sequence));
163 }
164
165 void ChildFrameCompositingHelper::RequireCallbackBrowserPlugin(
166 scoped_refptr<ThreadSafeSender> sender,
167 int host_routing_id,
168 int browser_plugin_instance_id,
169 const cc::SurfaceId& id,
170 const cc::SurfaceSequence& sequence) {
171 // This may be called on either the main or impl thread.
172 sender->Send(new BrowserPluginHostMsg_RequireSequence(
173 host_routing_id, browser_plugin_instance_id, id, sequence));
174 }
175
176 void ChildFrameCompositingHelper::OnSetSurface( 187 void ChildFrameCompositingHelper::OnSetSurface(
177 const cc::SurfaceId& surface_id, 188 const cc::SurfaceId& surface_id,
178 const gfx::Size& frame_size, 189 const gfx::Size& frame_size,
179 float scale_factor, 190 float scale_factor,
180 const cc::SurfaceSequence& sequence) { 191 const cc::SurfaceSequence& sequence) {
181 surface_id_ = surface_id; 192 surface_id_ = surface_id;
182 scoped_refptr<ThreadSafeSender> sender( 193 scoped_refptr<ThreadSafeSender> sender(
183 RenderThreadImpl::current()->thread_safe_sender()); 194 RenderThreadImpl::current()->thread_safe_sender());
184 cc::SurfaceLayer::SatisfyCallback satisfy_callback = 195 cc::SurfaceEmbeddingPtr surface_ref;
185 render_frame_proxy_ 196 if (render_frame_proxy_)
Fady Samuel 2016/12/12 16:25:07 Braces.
186 ? base::Bind(&ChildFrameCompositingHelper::SatisfyCallback, sender, 197 surface_ref = new SurfaceEmbedding(sender, host_routing_id_);
Fady Samuel 2016/12/12 16:25:07 It feels like we should have a single instance of
187 host_routing_id_) 198 else
188 : base::Bind( 199 surface_ref = new PluginSurfaceEmbedding(
189 &ChildFrameCompositingHelper::SatisfyCallbackBrowserPlugin, 200 sender, host_routing_id_,
190 sender, host_routing_id_, 201 browser_plugin_->browser_plugin_instance_id());
191 browser_plugin_->browser_plugin_instance_id());
192 cc::SurfaceLayer::RequireCallback require_callback =
193 render_frame_proxy_
194 ? base::Bind(&ChildFrameCompositingHelper::RequireCallback, sender,
195 host_routing_id_)
196 : base::Bind(
197 &ChildFrameCompositingHelper::RequireCallbackBrowserPlugin,
198 sender, host_routing_id_,
199 browser_plugin_->browser_plugin_instance_id());
200 scoped_refptr<cc::SurfaceLayer> surface_layer = 202 scoped_refptr<cc::SurfaceLayer> surface_layer =
201 cc::SurfaceLayer::Create(satisfy_callback, require_callback); 203 cc::SurfaceLayer::Create(std::move(surface_ref));
Fady Samuel 2016/12/12 16:25:07 A surface embedding is ref counted, right? Do we a
202 // TODO(oshima): This is a stopgap fix so that the compositor does not 204 // TODO(oshima): This is a stopgap fix so that the compositor does not
203 // scaledown the content when 2x frame data is added to 1x parent frame data. 205 // scaledown the content when 2x frame data is added to 1x parent frame data.
204 // Fix this in cc/. 206 // Fix this in cc/.
205 if (IsUseZoomForDSFEnabled()) 207 if (IsUseZoomForDSFEnabled())
206 scale_factor = 1.0f; 208 scale_factor = 1.0f;
207 209 cc::SurfaceInfo info(surface_id, scale_factor, frame_size);
208 surface_layer->SetSurfaceId(surface_id, scale_factor, frame_size); 210 surface_layer->SetSurfaceInfo(info);
209 surface_layer->SetMasksToBounds(true); 211 surface_layer->SetMasksToBounds(true);
210 std::unique_ptr<cc_blink::WebLayerImpl> layer( 212 std::unique_ptr<cc_blink::WebLayerImpl> layer(
211 new cc_blink::WebLayerImpl(surface_layer)); 213 new cc_blink::WebLayerImpl(surface_layer));
212 // TODO(lfg): Investigate if it's possible to propagate the information about 214 // TODO(lfg): Investigate if it's possible to propagate the information about
213 // the child surface's opacity. https://crbug.com/629851. 215 // the child surface's opacity. https://crbug.com/629851.
214 layer->setOpaque(false); 216 layer->setOpaque(false);
215 layer->SetContentsOpaqueIsFixed(true); 217 layer->SetContentsOpaqueIsFixed(true);
216 UpdateWebLayer(std::move(layer)); 218 UpdateWebLayer(std::move(layer));
217 219
218 UpdateVisibility(true); 220 UpdateVisibility(true);
(...skipping 13 matching lines...) Expand all
232 frame_size, scale_factor, 234 frame_size, scale_factor,
233 static_cast<cc_blink::WebLayerImpl*>(web_layer_.get())->layer()); 235 static_cast<cc_blink::WebLayerImpl*>(web_layer_.get())->layer());
234 } 236 }
235 237
236 void ChildFrameCompositingHelper::UpdateVisibility(bool visible) { 238 void ChildFrameCompositingHelper::UpdateVisibility(bool visible) {
237 if (web_layer_) 239 if (web_layer_)
238 web_layer_->setDrawsContent(visible); 240 web_layer_->setDrawsContent(visible);
239 } 241 }
240 242
241 } // namespace content 243 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698