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

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

Issue 2514033002: Introducing SurfaceReferenceFactory (Closed)
Patch Set: fix 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_ref.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 SurfaceRef : public cc::SurfaceRefWithSequence<SurfaceRef> {
45 public:
46 SurfaceRef(scoped_refptr<ThreadSafeSender> sender, int routing_id)
47 : sender_(sender), routing_id_(routing_id) {}
48
49 protected:
50 void RequireSequence(const cc::SurfaceSequence& seq) override {
51 sender_->Send(new FrameHostMsg_RequireSequence(routing_id_, id(), seq));
52 }
53
54 void SatisfySequence(const cc::SurfaceSequence& seq) override {
55 sender_->Send(new FrameHostMsg_SatisfySequence(routing_id_, seq));
56 }
57
58 private:
59 scoped_refptr<ThreadSafeSender> sender_;
60 int routing_id_;
Fady Samuel 2016/11/30 19:51:29 const
61 };
62
63 class PluginSurfaceRef : public cc::SurfaceRefWithSequence<PluginSurfaceRef> {
Saman Sami 2016/11/30 18:05:52 Should I merge these two classes and also pass ren
Fady Samuel 2016/11/30 19:51:29 No, that's not thread safe.
64 public:
65 PluginSurfaceRef(scoped_refptr<ThreadSafeSender> sender,
66 int routing_id,
67 int plugin_id)
68 : sender_(sender), routing_id_(routing_id), plugin_id_(plugin_id) {}
69
70 protected:
71 void SatisfySequence(const cc::SurfaceSequence& seq) override {
72 sender_->Send(
73 new BrowserPluginHostMsg_SatisfySequence(routing_id_, plugin_id_, seq));
74 }
75 void RequireSequence(const cc::SurfaceSequence& seq) override {
76 sender_->Send(new BrowserPluginHostMsg_RequireSequence(
77 routing_id_, plugin_id_, id(), seq));
78 }
79
80 private:
81 scoped_refptr<ThreadSafeSender> sender_;
82 int routing_id_;
Fady Samuel 2016/11/30 19:51:29 const int.
83 int plugin_id_;
Fady Samuel 2016/11/30 19:51:29 const int
84 };
85
86 } // namespace
87
41 ChildFrameCompositingHelper* 88 ChildFrameCompositingHelper*
42 ChildFrameCompositingHelper::CreateForBrowserPlugin( 89 ChildFrameCompositingHelper::CreateForBrowserPlugin(
43 const base::WeakPtr<BrowserPlugin>& browser_plugin) { 90 const base::WeakPtr<BrowserPlugin>& browser_plugin) {
44 return new ChildFrameCompositingHelper( 91 return new ChildFrameCompositingHelper(
45 browser_plugin, nullptr, nullptr, 92 browser_plugin, nullptr, nullptr,
46 browser_plugin->render_frame_routing_id()); 93 browser_plugin->render_frame_routing_id());
47 } 94 }
48 95
49 ChildFrameCompositingHelper* 96 ChildFrameCompositingHelper*
50 ChildFrameCompositingHelper::CreateForRenderFrameProxy( 97 ChildFrameCompositingHelper::CreateForRenderFrameProxy(
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 173
127 crashed_layer->AddChild(sad_layer); 174 crashed_layer->AddChild(sad_layer);
128 } 175 }
129 } 176 }
130 177
131 std::unique_ptr<blink::WebLayer> layer( 178 std::unique_ptr<blink::WebLayer> layer(
132 new cc_blink::WebLayerImpl(crashed_layer)); 179 new cc_blink::WebLayerImpl(crashed_layer));
133 UpdateWebLayer(std::move(layer)); 180 UpdateWebLayer(std::move(layer));
134 } 181 }
135 182
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( 183 void ChildFrameCompositingHelper::OnSetSurface(
177 const cc::SurfaceId& surface_id, 184 const cc::SurfaceId& surface_id,
178 const gfx::Size& frame_size, 185 const gfx::Size& frame_size,
179 float scale_factor, 186 float scale_factor,
180 const cc::SurfaceSequence& sequence) { 187 const cc::SurfaceSequence& sequence) {
181 surface_id_ = surface_id; 188 surface_id_ = surface_id;
182 scoped_refptr<ThreadSafeSender> sender( 189 scoped_refptr<ThreadSafeSender> sender(
183 RenderThreadImpl::current()->thread_safe_sender()); 190 RenderThreadImpl::current()->thread_safe_sender());
184 cc::SurfaceLayer::SatisfyCallback satisfy_callback = 191 scoped_refptr<cc::SurfaceLayer> surface_layer = cc::SurfaceLayer::Create();
185 render_frame_proxy_
186 ? base::Bind(&ChildFrameCompositingHelper::SatisfyCallback, sender,
187 host_routing_id_)
188 : base::Bind(
189 &ChildFrameCompositingHelper::SatisfyCallbackBrowserPlugin,
190 sender, host_routing_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 =
201 cc::SurfaceLayer::Create(satisfy_callback, require_callback);
202 // TODO(oshima): This is a stopgap fix so that the compositor does not 192 // 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. 193 // scaledown the content when 2x frame data is added to 1x parent frame data.
204 // Fix this in cc/. 194 // Fix this in cc/.
205 if (IsUseZoomForDSFEnabled()) 195 if (IsUseZoomForDSFEnabled())
206 scale_factor = 1.0f; 196 scale_factor = 1.0f;
207 197 cc::SurfaceRefPtr surface_ref;
208 surface_layer->SetSurfaceId(surface_id, scale_factor, frame_size); 198 if (render_frame_proxy_)
199 surface_ref.reset(new SurfaceRef(sender, host_routing_id_));
200 else
201 surface_ref.reset(
202 new PluginSurfaceRef(sender, host_routing_id_,
203 browser_plugin_->browser_plugin_instance_id()));
204 surface_ref->SetId(surface_id)->SetScale(scale_factor)->SetSize(frame_size);
205 surface_layer->SetSurfaceRef(std::move(surface_ref));
209 surface_layer->SetMasksToBounds(true); 206 surface_layer->SetMasksToBounds(true);
210 std::unique_ptr<cc_blink::WebLayerImpl> layer( 207 std::unique_ptr<cc_blink::WebLayerImpl> layer(
211 new cc_blink::WebLayerImpl(surface_layer)); 208 new cc_blink::WebLayerImpl(surface_layer));
212 // TODO(lfg): Investigate if it's possible to propagate the information about 209 // TODO(lfg): Investigate if it's possible to propagate the information about
213 // the child surface's opacity. https://crbug.com/629851. 210 // the child surface's opacity. https://crbug.com/629851.
214 layer->setOpaque(false); 211 layer->setOpaque(false);
215 layer->SetContentsOpaqueIsFixed(true); 212 layer->SetContentsOpaqueIsFixed(true);
216 UpdateWebLayer(std::move(layer)); 213 UpdateWebLayer(std::move(layer));
217 214
218 UpdateVisibility(true); 215 UpdateVisibility(true);
(...skipping 13 matching lines...) Expand all
232 frame_size, scale_factor, 229 frame_size, scale_factor,
233 static_cast<cc_blink::WebLayerImpl*>(web_layer_.get())->layer()); 230 static_cast<cc_blink::WebLayerImpl*>(web_layer_.get())->layer());
234 } 231 }
235 232
236 void ChildFrameCompositingHelper::UpdateVisibility(bool visible) { 233 void ChildFrameCompositingHelper::UpdateVisibility(bool visible) {
237 if (web_layer_) 234 if (web_layer_)
238 web_layer_->setDrawsContent(visible); 235 web_layer_->setDrawsContent(visible);
239 } 236 }
240 237
241 } // namespace content 238 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698