OLD | NEW |
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/pepper/pepper_compositor_host.h" | 5 #include "content/renderer/pepper/pepper_compositor_host.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/shared_memory.h" | 10 #include "base/memory/shared_memory.h" |
| 11 #include "cc/blink/web_layer_impl.h" |
11 #include "cc/layers/layer.h" | 12 #include "cc/layers/layer.h" |
12 #include "cc/layers/solid_color_layer.h" | 13 #include "cc/layers/solid_color_layer.h" |
13 #include "cc/layers/texture_layer.h" | 14 #include "cc/layers/texture_layer.h" |
14 #include "cc/resources/texture_mailbox.h" | 15 #include "cc/resources/texture_mailbox.h" |
15 #include "cc/trees/layer_tree_host.h" | 16 #include "cc/trees/layer_tree_host.h" |
16 #include "content/child/child_shared_bitmap_manager.h" | 17 #include "content/child/child_shared_bitmap_manager.h" |
17 #include "content/child/child_thread_impl.h" | 18 #include "content/child/child_thread_impl.h" |
18 #include "content/public/renderer/renderer_ppapi_host.h" | 19 #include "content/public/renderer/renderer_ppapi_host.h" |
19 #include "content/renderer/pepper/gfx_conversion.h" | 20 #include "content/renderer/pepper/gfx_conversion.h" |
20 #include "content/renderer/pepper/host_globals.h" | 21 #include "content/renderer/pepper/host_globals.h" |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 | 154 |
154 PepperCompositorHost::LayerData::~LayerData() {} | 155 PepperCompositorHost::LayerData::~LayerData() {} |
155 | 156 |
156 PepperCompositorHost::PepperCompositorHost( | 157 PepperCompositorHost::PepperCompositorHost( |
157 RendererPpapiHost* host, | 158 RendererPpapiHost* host, |
158 PP_Instance instance, | 159 PP_Instance instance, |
159 PP_Resource resource) | 160 PP_Resource resource) |
160 : ResourceHost(host->GetPpapiHost(), instance, resource), | 161 : ResourceHost(host->GetPpapiHost(), instance, resource), |
161 bound_instance_(NULL), | 162 bound_instance_(NULL), |
162 weak_factory_(this) { | 163 weak_factory_(this) { |
163 layer_ = cc::Layer::Create(); | 164 layer_ = cc::Layer::Create(cc_blink::WebLayerImpl::LayerSettings()); |
164 // TODO(penghuang): SetMasksToBounds() can be expensive if the layer is | 165 // TODO(penghuang): SetMasksToBounds() can be expensive if the layer is |
165 // transformed. Possibly better could be to explicitly clip the child layers | 166 // transformed. Possibly better could be to explicitly clip the child layers |
166 // (by modifying their bounds). | 167 // (by modifying their bounds). |
167 layer_->SetMasksToBounds(true); | 168 layer_->SetMasksToBounds(true); |
168 layer_->SetIsDrawable(true); | 169 layer_->SetIsDrawable(true); |
169 } | 170 } |
170 | 171 |
171 PepperCompositorHost::~PepperCompositorHost() { | 172 PepperCompositorHost::~PepperCompositorHost() { |
172 // Unbind from the instance when destroyed if we're still bound. | 173 // Unbind from the instance when destroyed if we're still bound. |
173 if (bound_instance_) | 174 if (bound_instance_) |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 layer->SetTransform(transform); | 241 layer->SetTransform(transform); |
241 | 242 |
242 // Consider a (0,0,0,0) rect as no clip rect. | 243 // Consider a (0,0,0,0) rect as no clip rect. |
243 if (new_layer->common.clip_rect.point.x != 0 || | 244 if (new_layer->common.clip_rect.point.x != 0 || |
244 new_layer->common.clip_rect.point.y != 0 || | 245 new_layer->common.clip_rect.point.y != 0 || |
245 new_layer->common.clip_rect.size.width != 0 || | 246 new_layer->common.clip_rect.size.width != 0 || |
246 new_layer->common.clip_rect.size.height != 0) { | 247 new_layer->common.clip_rect.size.height != 0) { |
247 scoped_refptr<cc::Layer> clip_parent = layer->parent(); | 248 scoped_refptr<cc::Layer> clip_parent = layer->parent(); |
248 if (clip_parent.get() == layer_.get()) { | 249 if (clip_parent.get() == layer_.get()) { |
249 // Create a clip parent layer, if it does not exist. | 250 // Create a clip parent layer, if it does not exist. |
250 clip_parent = cc::Layer::Create(); | 251 clip_parent = cc::Layer::Create(cc_blink::WebLayerImpl::LayerSettings()); |
251 clip_parent->SetMasksToBounds(true); | 252 clip_parent->SetMasksToBounds(true); |
252 clip_parent->SetIsDrawable(true); | 253 clip_parent->SetIsDrawable(true); |
253 layer_->ReplaceChild(layer.get(), clip_parent); | 254 layer_->ReplaceChild(layer.get(), clip_parent); |
254 clip_parent->AddChild(layer); | 255 clip_parent->AddChild(layer); |
255 } | 256 } |
256 gfx::Point position = PP_ToGfxPoint(new_layer->common.clip_rect.point); | 257 gfx::Point position = PP_ToGfxPoint(new_layer->common.clip_rect.point); |
257 clip_parent->SetPosition(position); | 258 clip_parent->SetPosition(position); |
258 clip_parent->SetBounds(PP_ToGfxSize(new_layer->common.clip_rect.size)); | 259 clip_parent->SetBounds(PP_ToGfxSize(new_layer->common.clip_rect.size)); |
259 layer->SetPosition(gfx::Point(-position.x(), -position.y())); | 260 layer->SetPosition(gfx::Point(-position.x(), -position.y())); |
260 } else if (layer->parent() != layer_.get()) { | 261 } else if (layer->parent() != layer_.get()) { |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 | 383 |
383 for (size_t i = 0; i < layers.size(); ++i) { | 384 for (size_t i = 0; i < layers.size(); ++i) { |
384 const ppapi::CompositorLayerData* pp_layer = &layers[i]; | 385 const ppapi::CompositorLayerData* pp_layer = &layers[i]; |
385 LayerData* data = i >= layers_.size() ? NULL : &layers_[i]; | 386 LayerData* data = i >= layers_.size() ? NULL : &layers_[i]; |
386 DCHECK(!data || data->cc_layer.get()); | 387 DCHECK(!data || data->cc_layer.get()); |
387 scoped_refptr<cc::Layer> cc_layer = data ? data->cc_layer : NULL; | 388 scoped_refptr<cc::Layer> cc_layer = data ? data->cc_layer : NULL; |
388 ppapi::CompositorLayerData* old_layer = data ? &data->pp_layer : NULL; | 389 ppapi::CompositorLayerData* old_layer = data ? &data->pp_layer : NULL; |
389 | 390 |
390 if (!cc_layer.get()) { | 391 if (!cc_layer.get()) { |
391 if (pp_layer->color) | 392 if (pp_layer->color) |
392 cc_layer = cc::SolidColorLayer::Create(); | 393 cc_layer = cc::SolidColorLayer::Create( |
| 394 cc_blink::WebLayerImpl::LayerSettings()); |
393 else if (pp_layer->texture || pp_layer->image) | 395 else if (pp_layer->texture || pp_layer->image) |
394 cc_layer = cc::TextureLayer::CreateForMailbox(NULL); | 396 cc_layer = cc::TextureLayer::CreateForMailbox( |
| 397 cc_blink::WebLayerImpl::LayerSettings(), NULL); |
395 layer_->AddChild(cc_layer); | 398 layer_->AddChild(cc_layer); |
396 } | 399 } |
397 | 400 |
398 UpdateLayer(cc_layer, old_layer, pp_layer, image_shms[i].Pass()); | 401 UpdateLayer(cc_layer, old_layer, pp_layer, image_shms[i].Pass()); |
399 | 402 |
400 if (old_layer) | 403 if (old_layer) |
401 *old_layer = *pp_layer; | 404 *old_layer = *pp_layer; |
402 else | 405 else |
403 layers_.push_back(LayerData(cc_layer, *pp_layer)); | 406 layers_.push_back(LayerData(cc_layer, *pp_layer)); |
404 } | 407 } |
405 | 408 |
406 // We need to force a commit for each CommitLayers() call, even if no layers | 409 // We need to force a commit for each CommitLayers() call, even if no layers |
407 // changed since the last call to CommitLayers(). This is so | 410 // changed since the last call to CommitLayers(). This is so |
408 // WiewInitiatedPaint() will always be called. | 411 // WiewInitiatedPaint() will always be called. |
409 if (layer_->layer_tree_host()) | 412 if (layer_->layer_tree_host()) |
410 layer_->layer_tree_host()->SetNeedsCommit(); | 413 layer_->layer_tree_host()->SetNeedsCommit(); |
411 | 414 |
412 // If the host is not bound to the instance, return PP_OK immediately. | 415 // If the host is not bound to the instance, return PP_OK immediately. |
413 if (!bound_instance_) | 416 if (!bound_instance_) |
414 return PP_OK; | 417 return PP_OK; |
415 | 418 |
416 commit_layers_reply_context_ = context->MakeReplyMessageContext(); | 419 commit_layers_reply_context_ = context->MakeReplyMessageContext(); |
417 return PP_OK_COMPLETIONPENDING; | 420 return PP_OK_COMPLETIONPENDING; |
418 } | 421 } |
419 | 422 |
420 } // namespace content | 423 } // namespace content |
OLD | NEW |