| OLD | NEW |
| (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 | |
| OLD | NEW |