| 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 "components/html_viewer/web_layer_tree_view_impl.h" | |
| 6 | |
| 7 #include <stddef.h> | |
| 8 #include <utility> | |
| 9 | |
| 10 #include "base/thread_task_runner_handle.h" | |
| 11 #include "cc/blink/web_layer_impl.h" | |
| 12 #include "cc/layers/layer.h" | |
| 13 #include "cc/output/begin_frame_args.h" | |
| 14 #include "cc/scheduler/begin_frame_source.h" | |
| 15 #include "cc/trees/layer_tree_host.h" | |
| 16 #include "components/mus/public/cpp/context_provider.h" | |
| 17 #include "components/mus/public/cpp/output_surface.h" | |
| 18 #include "components/mus/public/cpp/window.h" | |
| 19 #include "mojo/converters/surfaces/surfaces_type_converters.h" | |
| 20 #include "mojo/public/c/gles2/gles2.h" | |
| 21 #include "third_party/WebKit/public/web/WebWidget.h" | |
| 22 #include "ui/gfx/buffer_types.h" | |
| 23 | |
| 24 namespace html_viewer { | |
| 25 | |
| 26 WebLayerTreeViewImpl::WebLayerTreeViewImpl( | |
| 27 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner, | |
| 28 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | |
| 29 cc::TaskGraphRunner* task_graph_runner) | |
| 30 : widget_(nullptr), | |
| 31 window_(nullptr), | |
| 32 main_thread_compositor_task_runner_(base::ThreadTaskRunnerHandle::Get()), | |
| 33 weak_factory_(this) { | |
| 34 main_thread_bound_weak_ptr_ = weak_factory_.GetWeakPtr(); | |
| 35 | |
| 36 cc::LayerTreeSettings settings; | |
| 37 | |
| 38 settings.use_image_texture_targets = std::vector<unsigned>( | |
| 39 static_cast<size_t>(gfx::BufferFormat::LAST) + 1, GL_TEXTURE_2D); | |
| 40 // TODO(jam): use multiple compositor raster threads and set gather_pixel_refs | |
| 41 // accordingly (see content). | |
| 42 | |
| 43 // For web contents, layer transforms should scale up the contents of layers | |
| 44 // to keep content always crisp when possible. | |
| 45 settings.layer_transforms_should_scale_layer_contents = true; | |
| 46 | |
| 47 // Use new animation system (cc::AnimationHost). | |
| 48 settings.use_compositor_animation_timelines = true; | |
| 49 | |
| 50 // TODO(rjkroege): Not having a shared tile transport breaks | |
| 51 // software compositing. Add bitmap transport support. | |
| 52 cc::SharedBitmapManager* shared_bitmap_manager = nullptr; | |
| 53 | |
| 54 cc::LayerTreeHost::InitParams params; | |
| 55 params.client = this; | |
| 56 params.shared_bitmap_manager = shared_bitmap_manager; | |
| 57 params.gpu_memory_buffer_manager = gpu_memory_buffer_manager; | |
| 58 params.settings = &settings; | |
| 59 params.task_graph_runner = task_graph_runner; | |
| 60 params.main_task_runner = main_thread_compositor_task_runner_; | |
| 61 | |
| 62 layer_tree_host_ = | |
| 63 cc::LayerTreeHost::CreateThreaded(compositor_task_runner, ¶ms); | |
| 64 DCHECK(layer_tree_host_); | |
| 65 } | |
| 66 | |
| 67 void WebLayerTreeViewImpl::Initialize(mus::mojom::GpuPtr gpu_service, | |
| 68 mus::Window* window, | |
| 69 blink::WebWidget* widget) { | |
| 70 window_ = window; | |
| 71 widget_ = widget; | |
| 72 if (gpu_service) { | |
| 73 mus::mojom::CommandBufferPtr cb; | |
| 74 gpu_service->CreateOffscreenGLES2Context(GetProxy(&cb)); | |
| 75 scoped_refptr<cc::ContextProvider> context_provider( | |
| 76 new mus::ContextProvider(cb.PassInterface().PassHandle())); | |
| 77 output_surface_.reset(new mus::OutputSurface( | |
| 78 context_provider, | |
| 79 window_->RequestSurface(mus::mojom::SurfaceType::DEFAULT))); | |
| 80 } | |
| 81 layer_tree_host_->SetVisible(window_->visible()); | |
| 82 } | |
| 83 | |
| 84 WebLayerTreeViewImpl::~WebLayerTreeViewImpl() { | |
| 85 // Destroy the LayerTreeHost before anything else as doing so ensures we're | |
| 86 // not accessed on the compositor thread (we are the LayerTreeHostClient). | |
| 87 layer_tree_host_.reset(); | |
| 88 } | |
| 89 | |
| 90 void WebLayerTreeViewImpl::WillBeginMainFrame() { | |
| 91 } | |
| 92 | |
| 93 void WebLayerTreeViewImpl::DidBeginMainFrame() { | |
| 94 } | |
| 95 | |
| 96 void WebLayerTreeViewImpl::BeginMainFrameNotExpectedSoon() { | |
| 97 } | |
| 98 | |
| 99 void WebLayerTreeViewImpl::BeginMainFrame(const cc::BeginFrameArgs& args) { | |
| 100 VLOG(2) << "WebLayerTreeViewImpl::BeginMainFrame"; | |
| 101 double frame_time_sec = (args.frame_time - base::TimeTicks()).InSecondsF(); | |
| 102 widget_->beginFrame(frame_time_sec); | |
| 103 layer_tree_host_->SetNeedsAnimate(); | |
| 104 } | |
| 105 | |
| 106 void WebLayerTreeViewImpl::UpdateLayerTreeHost() { | |
| 107 widget_->updateAllLifecyclePhases(); | |
| 108 } | |
| 109 | |
| 110 void WebLayerTreeViewImpl::ApplyViewportDeltas( | |
| 111 const gfx::Vector2dF& inner_delta, | |
| 112 const gfx::Vector2dF& outer_delta, | |
| 113 const gfx::Vector2dF& elastic_overscroll_delta, | |
| 114 float page_scale, | |
| 115 float top_controls_delta) { | |
| 116 widget_->applyViewportDeltas( | |
| 117 inner_delta, | |
| 118 outer_delta, | |
| 119 elastic_overscroll_delta, | |
| 120 page_scale, | |
| 121 top_controls_delta); | |
| 122 } | |
| 123 | |
| 124 void WebLayerTreeViewImpl::RequestNewOutputSurface() { | |
| 125 if (output_surface_.get()) | |
| 126 layer_tree_host_->SetOutputSurface(std::move(output_surface_)); | |
| 127 } | |
| 128 | |
| 129 void WebLayerTreeViewImpl::DidFailToInitializeOutputSurface() { | |
| 130 RequestNewOutputSurface(); | |
| 131 } | |
| 132 | |
| 133 void WebLayerTreeViewImpl::DidInitializeOutputSurface() { | |
| 134 } | |
| 135 | |
| 136 void WebLayerTreeViewImpl::WillCommit() { | |
| 137 } | |
| 138 | |
| 139 void WebLayerTreeViewImpl::DidCommit() { | |
| 140 } | |
| 141 | |
| 142 void WebLayerTreeViewImpl::DidCommitAndDrawFrame() { | |
| 143 } | |
| 144 | |
| 145 // TODO(rjkroege): Wire this up to the SubmitFrame callback to improve | |
| 146 // synchronization. | |
| 147 void WebLayerTreeViewImpl::DidCompleteSwapBuffers() { | |
| 148 } | |
| 149 | |
| 150 void WebLayerTreeViewImpl::setRootLayer(const blink::WebLayer& layer) { | |
| 151 layer_tree_host_->SetRootLayer( | |
| 152 static_cast<const cc_blink::WebLayerImpl*>(&layer)->layer()); | |
| 153 } | |
| 154 | |
| 155 void WebLayerTreeViewImpl::clearRootLayer() { | |
| 156 layer_tree_host_->SetRootLayer(scoped_refptr<cc::Layer>()); | |
| 157 } | |
| 158 | |
| 159 void WebLayerTreeViewImpl::setViewportSize( | |
| 160 const blink::WebSize& device_viewport_size) { | |
| 161 layer_tree_host_->SetViewportSize(device_viewport_size); | |
| 162 } | |
| 163 | |
| 164 void WebLayerTreeViewImpl::setDeviceScaleFactor(float device_scale_factor) { | |
| 165 layer_tree_host_->SetDeviceScaleFactor(device_scale_factor); | |
| 166 } | |
| 167 | |
| 168 float WebLayerTreeViewImpl::deviceScaleFactor() const { | |
| 169 return layer_tree_host_->device_scale_factor(); | |
| 170 } | |
| 171 | |
| 172 void WebLayerTreeViewImpl::setBackgroundColor(blink::WebColor color) { | |
| 173 layer_tree_host_->set_background_color(color); | |
| 174 } | |
| 175 | |
| 176 void WebLayerTreeViewImpl::setHasTransparentBackground( | |
| 177 bool has_transparent_background) { | |
| 178 layer_tree_host_->set_has_transparent_background(has_transparent_background); | |
| 179 } | |
| 180 | |
| 181 void WebLayerTreeViewImpl::setVisible(bool visible) { | |
| 182 layer_tree_host_->SetVisible(visible); | |
| 183 } | |
| 184 | |
| 185 void WebLayerTreeViewImpl::setPageScaleFactorAndLimits(float page_scale_factor, | |
| 186 float minimum, | |
| 187 float maximum) { | |
| 188 layer_tree_host_->SetPageScaleFactorAndLimits( | |
| 189 page_scale_factor, minimum, maximum); | |
| 190 } | |
| 191 | |
| 192 void WebLayerTreeViewImpl::registerForAnimations(blink::WebLayer* layer) { | |
| 193 cc::Layer* cc_layer = static_cast<cc_blink::WebLayerImpl*>(layer)->layer(); | |
| 194 cc_layer->RegisterForAnimations(layer_tree_host_->animation_registrar()); | |
| 195 } | |
| 196 | |
| 197 void WebLayerTreeViewImpl::registerViewportLayers( | |
| 198 const blink::WebLayer* overscrollElasticityLayer, | |
| 199 const blink::WebLayer* pageScaleLayer, | |
| 200 const blink::WebLayer* innerViewportScrollLayer, | |
| 201 const blink::WebLayer* outerViewportScrollLayer) { | |
| 202 layer_tree_host_->RegisterViewportLayers( | |
| 203 // The scroll elasticity layer will only exist when using pinch virtual | |
| 204 // viewports. | |
| 205 overscrollElasticityLayer | |
| 206 ? static_cast<const cc_blink::WebLayerImpl*>( | |
| 207 overscrollElasticityLayer) | |
| 208 ->layer() | |
| 209 : nullptr, | |
| 210 static_cast<const cc_blink::WebLayerImpl*>(pageScaleLayer)->layer(), | |
| 211 static_cast<const cc_blink::WebLayerImpl*>(innerViewportScrollLayer) | |
| 212 ->layer(), | |
| 213 // The outer viewport layer will only exist when using pinch virtual | |
| 214 // viewports. | |
| 215 outerViewportScrollLayer | |
| 216 ? static_cast<const cc_blink::WebLayerImpl*>(outerViewportScrollLayer) | |
| 217 ->layer() | |
| 218 : nullptr); | |
| 219 } | |
| 220 | |
| 221 void WebLayerTreeViewImpl::clearViewportLayers() { | |
| 222 layer_tree_host_->RegisterViewportLayers(scoped_refptr<cc::Layer>(), | |
| 223 scoped_refptr<cc::Layer>(), | |
| 224 scoped_refptr<cc::Layer>(), | |
| 225 scoped_refptr<cc::Layer>()); | |
| 226 } | |
| 227 | |
| 228 void WebLayerTreeViewImpl::startPageScaleAnimation( | |
| 229 const blink::WebPoint& destination, | |
| 230 bool use_anchor, | |
| 231 float new_page_scale, | |
| 232 double duration_sec) { | |
| 233 base::TimeDelta duration = base::TimeDelta::FromMicroseconds( | |
| 234 duration_sec * base::Time::kMicrosecondsPerSecond); | |
| 235 layer_tree_host_->StartPageScaleAnimation( | |
| 236 gfx::Vector2d(destination.x, destination.y), | |
| 237 use_anchor, | |
| 238 new_page_scale, | |
| 239 duration); | |
| 240 } | |
| 241 | |
| 242 void WebLayerTreeViewImpl::setNeedsAnimate() { | |
| 243 layer_tree_host_->SetNeedsAnimate(); | |
| 244 } | |
| 245 | |
| 246 } // namespace html_viewer | |
| OLD | NEW |