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

Side by Side Diff: sky/viewer/platform/weblayertreeview_impl.cc

Issue 752683002: Break Sky's dependency on cc (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 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
« no previous file with comments | « sky/viewer/platform/weblayertreeview_impl.h ('k') | sky/viewer/viewer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "sky/viewer/platform/weblayertreeview_impl.h"
6
7 #include "base/message_loop/message_loop_proxy.h"
8 #include "cc/layers/layer.h"
9 #include "cc/output/begin_frame_args.h"
10 #include "cc/scheduler/begin_frame_source.h"
11 #include "cc/trees/layer_tree_host.h"
12 #include "mojo/cc/context_provider_mojo.h"
13 #include "mojo/cc/output_surface_mojo.h"
14 #include "mojo/converters/surfaces/surfaces_type_converters.h"
15 #include "mojo/services/public/cpp/view_manager/view.h"
16 #include "sky/engine/public/web/WebSettings.h"
17 #include "sky/engine/public/web/WebView.h"
18 #include "sky/engine/public/web/WebWidget.h"
19 #include "sky/viewer/cc/web_layer_impl.h"
20 #include "third_party/skia/include/core/SkCanvas.h"
21
22 namespace sky {
23
24 WebLayerTreeViewImpl::WebLayerTreeViewImpl(
25 scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy,
26 mojo::SurfacesServicePtr surfaces_service,
27 mojo::GpuPtr gpu_service)
28 : widget_(NULL),
29 view_(NULL),
30 surfaces_service_(surfaces_service.Pass()),
31 gpu_service_(gpu_service.Pass()),
32 main_thread_compositor_task_runner_(base::MessageLoopProxy::current()),
33 weak_factory_(this) {
34 main_thread_bound_weak_ptr_ = weak_factory_.GetWeakPtr();
35 surfaces_service_->CreateSurfaceConnection(
36 base::Bind(&WebLayerTreeViewImpl::OnSurfaceConnectionCreated,
37 main_thread_bound_weak_ptr_));
38
39 cc::LayerTreeSettings settings;
40
41 // For web contents, layer transforms should scale up the contents of layers
42 // to keep content always crisp when possible.
43 settings.layer_transforms_should_scale_layer_contents = true;
44
45 cc::SharedBitmapManager* shared_bitmap_manager = NULL;
46 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = NULL;
47
48 layer_tree_host_ =
49 cc::LayerTreeHost::CreateThreaded(this,
50 shared_bitmap_manager,
51 gpu_memory_buffer_manager,
52 settings,
53 base::MessageLoopProxy::current(),
54 compositor_message_loop_proxy,
55 nullptr);
56 DCHECK(layer_tree_host_);
57 }
58
59 WebLayerTreeViewImpl::~WebLayerTreeViewImpl() {
60 layer_tree_host_.reset();
61 }
62
63 void WebLayerTreeViewImpl::PaintContents(SkCanvas* canvas,
64 const gfx::Rect& clip,
65 GraphicsContextStatus gc_status) {
66 blink::WebRect rect(clip.x(), clip.y(), clip.width(), clip.height());
67 widget_->paint(canvas, rect);
68 canvas->flush();
69 }
70
71 bool WebLayerTreeViewImpl::FillsBoundsCompletely() const {
72 // TODO(abarth): We should be able to return true when we're opaque.
73 return false;
74 }
75
76 void WebLayerTreeViewImpl::WillBeginMainFrame(int frame_id) {
77 }
78
79 void WebLayerTreeViewImpl::DidBeginMainFrame() {
80 }
81
82 void WebLayerTreeViewImpl::BeginMainFrame(const cc::BeginFrameArgs& args) {
83 VLOG(2) << "WebLayerTreeViewImpl::BeginMainFrame";
84 double frame_time_sec = (args.frame_time - base::TimeTicks()).InSecondsF();
85 double deadline_sec = (args.deadline - base::TimeTicks()).InSecondsF();
86 double interval_sec = args.interval.InSecondsF();
87 blink::WebBeginFrameArgs web_begin_frame_args(
88 frame_time_sec, deadline_sec, interval_sec);
89 widget_->beginFrame(web_begin_frame_args);
90 }
91
92 void WebLayerTreeViewImpl::set_widget(blink::WebWidget* widget) {
93 widget_ = widget;
94
95 // TODO(sky): The only reason this is here is because we need the widget to
96 // check whether the compositor is enabled.
97 if (!static_cast<blink::WebView*>(widget_)->settings()->compositorIsEnabled()) {
98 root_layer_ = cc::ContentLayer::Create(this);
99 layer_tree_host_->SetRootLayer(root_layer_);
100 }
101 }
102
103 void WebLayerTreeViewImpl::Layout() {
104 widget_->layout();
105 blink::WebSize size = widget_->size();
106
107 if (!static_cast<blink::WebView*>(widget_)->settings()->compositorIsEnabled()) {
108 root_layer_->SetBounds(gfx::Size(size.width, size.height));
109 root_layer_->SetIsDrawable(true);
110 root_layer_->SetNeedsDisplay();
111 }
112 }
113
114 void WebLayerTreeViewImpl::ApplyViewportDeltas(
115 const gfx::Vector2d& scroll_delta,
116 float page_scale,
117 float top_controls_delta) {
118 }
119
120 void WebLayerTreeViewImpl::ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
121 const gfx::Vector2d& outer_delta,
122 float page_scale,
123 float top_controls_delta){
124 }
125
126 void WebLayerTreeViewImpl::RequestNewOutputSurface(bool fallback) {
127 layer_tree_host_->SetOutputSurface(output_surface_.Pass());
128 }
129
130 void WebLayerTreeViewImpl::DidInitializeOutputSurface() {
131 }
132
133 void WebLayerTreeViewImpl::WillCommit() {
134 }
135
136 void WebLayerTreeViewImpl::DidCommit() {
137 widget_->didCommitFrameToCompositor();
138 }
139
140 void WebLayerTreeViewImpl::DidCommitAndDrawFrame() {
141 }
142
143 void WebLayerTreeViewImpl::DidCompleteSwapBuffers() {
144 }
145
146 void WebLayerTreeViewImpl::setSurfaceReady() {
147 }
148
149 void WebLayerTreeViewImpl::setRootLayer(const blink::WebLayer& layer) {
150 layer_tree_host_->SetRootLayer(
151 static_cast<const sky_viewer_cc::WebLayerImpl*>(&layer)->layer());
152 }
153
154 void WebLayerTreeViewImpl::clearRootLayer() {
155 layer_tree_host_->SetRootLayer(scoped_refptr<cc::Layer>());
156 }
157
158 void WebLayerTreeViewImpl::setViewportSize(
159 const blink::WebSize& device_viewport_size) {
160 layer_tree_host_->SetViewportSize(device_viewport_size);
161 }
162
163 blink::WebSize WebLayerTreeViewImpl::deviceViewportSize() const {
164 return layer_tree_host_->device_viewport_size();
165 }
166
167 void WebLayerTreeViewImpl::setDeviceScaleFactor(float device_scale_factor) {
168 layer_tree_host_->SetDeviceScaleFactor(device_scale_factor);
169 }
170
171 float WebLayerTreeViewImpl::deviceScaleFactor() const {
172 return layer_tree_host_->device_scale_factor();
173 }
174
175 void WebLayerTreeViewImpl::setBackgroundColor(blink::WebColor color) {
176 layer_tree_host_->set_background_color(color);
177 }
178
179 void WebLayerTreeViewImpl::setHasTransparentBackground(
180 bool has_transparent_background) {
181 layer_tree_host_->set_has_transparent_background(has_transparent_background);
182 }
183
184 void WebLayerTreeViewImpl::setOverhangBitmap(const SkBitmap& bitmap) {
185 layer_tree_host_->SetOverhangBitmap(bitmap);
186 }
187
188 void WebLayerTreeViewImpl::setVisible(bool visible) {
189 layer_tree_host_->SetVisible(visible);
190 }
191
192 void WebLayerTreeViewImpl::registerForAnimations(blink::WebLayer* layer) {
193 cc::Layer* cc_layer = static_cast<sky_viewer_cc::WebLayerImpl*>(layer)->layer( );
194 cc_layer->layer_animation_controller()->SetAnimationRegistrar(
195 layer_tree_host_->animation_registrar());
196 }
197
198 void WebLayerTreeViewImpl::registerViewportLayers(
199 const blink::WebLayer* pageScaleLayer,
200 const blink::WebLayer* innerViewportScrollLayer,
201 const blink::WebLayer* outerViewportScrollLayer) {
202 layer_tree_host_->RegisterViewportLayers(
203 static_cast<const sky_viewer_cc::WebLayerImpl*>(pageScaleLayer)->layer(),
204 static_cast<const sky_viewer_cc::WebLayerImpl*>(innerViewportScrollLayer)
205 ->layer(),
206 // The outer viewport layer will only exist when using pinch virtual
207 // viewports.
208 outerViewportScrollLayer ? static_cast<const sky_viewer_cc::WebLayerImpl*> (
209 outerViewportScrollLayer)->layer()
210 : NULL);
211 }
212
213 void WebLayerTreeViewImpl::clearViewportLayers() {
214 layer_tree_host_->RegisterViewportLayers(scoped_refptr<cc::Layer>(),
215 scoped_refptr<cc::Layer>(),
216 scoped_refptr<cc::Layer>());
217 }
218
219 void WebLayerTreeViewImpl::setNeedsAnimate() {
220 layer_tree_host_->SetNeedsAnimate();
221 }
222
223 bool WebLayerTreeViewImpl::commitRequested() const {
224 return layer_tree_host_->CommitRequested();
225 }
226
227 void WebLayerTreeViewImpl::finishAllRendering() {
228 layer_tree_host_->FinishAllRendering();
229 }
230
231 void WebLayerTreeViewImpl::OnSurfaceConnectionCreated(mojo::SurfacePtr surface,
232 uint32_t id_namespace) {
233 mojo::CommandBufferPtr cb;
234 gpu_service_->CreateOffscreenGLES2Context(GetProxy(&cb));
235 scoped_refptr<cc::ContextProvider> context_provider(
236 new mojo::ContextProviderMojo(cb.PassMessagePipe()));
237 output_surface_.reset(new mojo::OutputSurfaceMojo(
238 this, context_provider, surface.Pass(), id_namespace));
239 layer_tree_host_->SetLayerTreeHostClientReady();
240 }
241
242 void WebLayerTreeViewImpl::DidCreateSurface(cc::SurfaceId id) {
243 main_thread_compositor_task_runner_->PostTask(
244 FROM_HERE,
245 base::Bind(&WebLayerTreeViewImpl::DidCreateSurfaceOnMainThread,
246 main_thread_bound_weak_ptr_,
247 id));
248 }
249
250 void WebLayerTreeViewImpl::DidCreateSurfaceOnMainThread(cc::SurfaceId id) {
251 view_->SetSurfaceId(mojo::SurfaceId::From(id));
252 }
253
254 } // namespace sky
OLDNEW
« no previous file with comments | « sky/viewer/platform/weblayertreeview_impl.h ('k') | sky/viewer/viewer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698