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

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

Issue 2514033002: Introducing SurfaceReferenceFactory (Closed)
Patch Set: up 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/sequence_surface_reference_factory.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 IframeSurfaceReferenceFactory
45 : public cc::SequenceSurfaceReferenceFactory {
46 public:
47 IframeSurfaceReferenceFactory(scoped_refptr<ThreadSafeSender> sender,
48 int routing_id)
49 : sender_(sender), routing_id_(routing_id) {}
50
51 protected:
52 ~IframeSurfaceReferenceFactory() override = default;
53
54 private:
55 void RequireSequence(const cc::SurfaceId& surface_id,
56 const cc::SurfaceSequence& sequence) const override {
57 sender_->Send(
58 new FrameHostMsg_RequireSequence(routing_id_, surface_id, sequence));
59 }
60 void SatisfySequence(const cc::SurfaceSequence& sequence) const override {
61 sender_->Send(new FrameHostMsg_SatisfySequence(routing_id_, sequence));
62 }
63
64 const scoped_refptr<ThreadSafeSender> sender_;
65 const int routing_id_;
66
67 DISALLOW_COPY_AND_ASSIGN(IframeSurfaceReferenceFactory);
68 };
69
70 class BrowserPluginSurfaceReferenceFactory
71 : public cc::SequenceSurfaceReferenceFactory {
72 public:
73 BrowserPluginSurfaceReferenceFactory(scoped_refptr<ThreadSafeSender> sender,
74 int routing_id,
75 int browser_plugin_instance_id)
76 : sender_(sender),
77 routing_id_(routing_id),
78 browser_plugin_instance_id_(browser_plugin_instance_id) {}
79
80 protected:
81 ~BrowserPluginSurfaceReferenceFactory() override = default;
82
83 private:
84 void SatisfySequence(const cc::SurfaceSequence& seq) const override {
85 sender_->Send(new BrowserPluginHostMsg_SatisfySequence(
86 routing_id_, browser_plugin_instance_id_, seq));
87 }
88 void RequireSequence(const cc::SurfaceId& surface_id,
89 const cc::SurfaceSequence& sequence) const override {
90 sender_->Send(new BrowserPluginHostMsg_RequireSequence(
91 routing_id_, browser_plugin_instance_id_, surface_id, sequence));
92 }
93
94 const scoped_refptr<ThreadSafeSender> sender_;
95 const int routing_id_;
96 const int browser_plugin_instance_id_;
97
98 DISALLOW_COPY_AND_ASSIGN(BrowserPluginSurfaceReferenceFactory);
99 };
100
101 } // namespace
102
41 ChildFrameCompositingHelper* 103 ChildFrameCompositingHelper*
42 ChildFrameCompositingHelper::CreateForBrowserPlugin( 104 ChildFrameCompositingHelper::CreateForBrowserPlugin(
43 const base::WeakPtr<BrowserPlugin>& browser_plugin) { 105 const base::WeakPtr<BrowserPlugin>& browser_plugin) {
44 return new ChildFrameCompositingHelper( 106 return new ChildFrameCompositingHelper(
45 browser_plugin, nullptr, nullptr, 107 browser_plugin, nullptr, nullptr,
46 browser_plugin->render_frame_routing_id()); 108 browser_plugin->render_frame_routing_id());
47 } 109 }
48 110
49 ChildFrameCompositingHelper* 111 ChildFrameCompositingHelper*
50 ChildFrameCompositingHelper::CreateForRenderFrameProxy( 112 ChildFrameCompositingHelper::CreateForRenderFrameProxy(
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 188
127 crashed_layer->AddChild(sad_layer); 189 crashed_layer->AddChild(sad_layer);
128 } 190 }
129 } 191 }
130 192
131 std::unique_ptr<blink::WebLayer> layer( 193 std::unique_ptr<blink::WebLayer> layer(
132 new cc_blink::WebLayerImpl(crashed_layer)); 194 new cc_blink::WebLayerImpl(crashed_layer));
133 UpdateWebLayer(std::move(layer)); 195 UpdateWebLayer(std::move(layer));
134 } 196 }
135 197
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( 198 void ChildFrameCompositingHelper::OnSetSurface(
177 const cc::SurfaceId& surface_id, 199 const cc::SurfaceId& surface_id,
178 const gfx::Size& frame_size, 200 const gfx::Size& frame_size,
179 float scale_factor, 201 float scale_factor,
180 const cc::SurfaceSequence& sequence) { 202 const cc::SurfaceSequence& sequence) {
181 surface_id_ = surface_id; 203 surface_id_ = surface_id;
182 scoped_refptr<ThreadSafeSender> sender( 204 scoped_refptr<ThreadSafeSender> sender(
183 RenderThreadImpl::current()->thread_safe_sender()); 205 RenderThreadImpl::current()->thread_safe_sender());
184 cc::SurfaceLayer::SatisfyCallback satisfy_callback = 206 scoped_refptr<cc::SurfaceReferenceFactory> ref_factory;
Fady Samuel 2016/12/12 23:35:46 What if ChildFrameCompositingHelper has-a SurfaceR
185 render_frame_proxy_ 207 if (render_frame_proxy_) {
186 ? base::Bind(&ChildFrameCompositingHelper::SatisfyCallback, sender, 208 ref_factory = new IframeSurfaceReferenceFactory(sender, host_routing_id_);
187 host_routing_id_) 209 } else {
188 : base::Bind( 210 ref_factory = new BrowserPluginSurfaceReferenceFactory(
189 &ChildFrameCompositingHelper::SatisfyCallbackBrowserPlugin, 211 sender, host_routing_id_,
190 sender, host_routing_id_, 212 browser_plugin_->browser_plugin_instance_id());
191 browser_plugin_->browser_plugin_instance_id()); 213 }
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 = 214 scoped_refptr<cc::SurfaceLayer> surface_layer =
201 cc::SurfaceLayer::Create(satisfy_callback, require_callback); 215 cc::SurfaceLayer::Create(std::move(ref_factory));
202 // TODO(oshima): This is a stopgap fix so that the compositor does not 216 // 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. 217 // scaledown the content when 2x frame data is added to 1x parent frame data.
204 // Fix this in cc/. 218 // Fix this in cc/.
205 if (IsUseZoomForDSFEnabled()) 219 if (IsUseZoomForDSFEnabled())
206 scale_factor = 1.0f; 220 scale_factor = 1.0f;
207 221 cc::SurfaceInfo info(surface_id, scale_factor, frame_size);
208 surface_layer->SetSurfaceId(surface_id, scale_factor, frame_size); 222 surface_layer->SetSurfaceInfo(info);
209 surface_layer->SetMasksToBounds(true); 223 surface_layer->SetMasksToBounds(true);
210 std::unique_ptr<cc_blink::WebLayerImpl> layer( 224 std::unique_ptr<cc_blink::WebLayerImpl> layer(
211 new cc_blink::WebLayerImpl(surface_layer)); 225 new cc_blink::WebLayerImpl(surface_layer));
212 // TODO(lfg): Investigate if it's possible to propagate the information about 226 // TODO(lfg): Investigate if it's possible to propagate the information about
213 // the child surface's opacity. https://crbug.com/629851. 227 // the child surface's opacity. https://crbug.com/629851.
214 layer->setOpaque(false); 228 layer->setOpaque(false);
215 layer->SetContentsOpaqueIsFixed(true); 229 layer->SetContentsOpaqueIsFixed(true);
216 UpdateWebLayer(std::move(layer)); 230 UpdateWebLayer(std::move(layer));
217 231
218 UpdateVisibility(true); 232 UpdateVisibility(true);
(...skipping 13 matching lines...) Expand all
232 frame_size, scale_factor, 246 frame_size, scale_factor,
233 static_cast<cc_blink::WebLayerImpl*>(web_layer_.get())->layer()); 247 static_cast<cc_blink::WebLayerImpl*>(web_layer_.get())->layer());
234 } 248 }
235 249
236 void ChildFrameCompositingHelper::UpdateVisibility(bool visible) { 250 void ChildFrameCompositingHelper::UpdateVisibility(bool visible) {
237 if (web_layer_) 251 if (web_layer_)
238 web_layer_->setDrawsContent(visible); 252 web_layer_->setDrawsContent(visible);
239 } 253 }
240 254
241 } // namespace content 255 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698