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

Side by Side Diff: content/renderer/pepper/pepper_compositor_host.cc

Issue 1101823002: CC Animations: Make LayerAnimationController creation optional (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Plumb LayerSettings parameter for cc::Layer construction. Created 5 years, 7 months 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/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"
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 if (!(*image_shm)->Map(desc.stride * desc.size.height)) { 138 if (!(*image_shm)->Map(desc.stride * desc.size.height)) {
139 image_shm->reset(); 139 image_shm->reset();
140 return PP_ERROR_NOMEMORY; 140 return PP_ERROR_NOMEMORY;
141 } 141 }
142 return PP_OK; 142 return PP_OK;
143 } 143 }
144 144
145 return PP_ERROR_BADARGUMENT; 145 return PP_ERROR_BADARGUMENT;
146 } 146 }
147 147
148 cc::LayerSettings g_pepper_layer_settings;
149
148 } // namespace 150 } // namespace
149 151
150 PepperCompositorHost::LayerData::LayerData( 152 PepperCompositorHost::LayerData::LayerData(
151 const scoped_refptr<cc::Layer>& cc, 153 const scoped_refptr<cc::Layer>& cc,
152 const ppapi::CompositorLayerData& pp) : cc_layer(cc), pp_layer(pp) {} 154 const ppapi::CompositorLayerData& pp) : cc_layer(cc), pp_layer(pp) {}
153 155
154 PepperCompositorHost::LayerData::~LayerData() {} 156 PepperCompositorHost::LayerData::~LayerData() {}
155 157
156 PepperCompositorHost::PepperCompositorHost( 158 PepperCompositorHost::PepperCompositorHost(
157 RendererPpapiHost* host, 159 RendererPpapiHost* host,
158 PP_Instance instance, 160 PP_Instance instance,
159 PP_Resource resource) 161 PP_Resource resource)
160 : ResourceHost(host->GetPpapiHost(), instance, resource), 162 : ResourceHost(host->GetPpapiHost(), instance, resource),
161 bound_instance_(NULL), 163 bound_instance_(NULL),
162 weak_factory_(this) { 164 weak_factory_(this) {
163 layer_ = cc::Layer::Create(); 165 layer_ = cc::Layer::Create(PepperLayerSettings());
164 // TODO(penghuang): SetMasksToBounds() can be expensive if the layer is 166 // TODO(penghuang): SetMasksToBounds() can be expensive if the layer is
165 // transformed. Possibly better could be to explicitly clip the child layers 167 // transformed. Possibly better could be to explicitly clip the child layers
166 // (by modifying their bounds). 168 // (by modifying their bounds).
167 layer_->SetMasksToBounds(true); 169 layer_->SetMasksToBounds(true);
168 layer_->SetIsDrawable(true); 170 layer_->SetIsDrawable(true);
169 } 171 }
170 172
171 PepperCompositorHost::~PepperCompositorHost() { 173 PepperCompositorHost::~PepperCompositorHost() {
172 // Unbind from the instance when destroyed if we're still bound. 174 // Unbind from the instance when destroyed if we're still bound.
173 if (bound_instance_) 175 if (bound_instance_)
174 bound_instance_->BindGraphics(bound_instance_->pp_instance(), 0); 176 bound_instance_->BindGraphics(bound_instance_->pp_instance(), 0);
175 } 177 }
176 178
179 // static
180 const cc::LayerSettings& PepperCompositorHost::PepperLayerSettings() {
181 return g_pepper_layer_settings;
182 }
183
184 // static
185 void PepperCompositorHost::SetPepperLayerSettings(
186 const cc::LayerSettings& settings) {
187 g_pepper_layer_settings = settings;
188 }
189
177 bool PepperCompositorHost::BindToInstance( 190 bool PepperCompositorHost::BindToInstance(
178 PepperPluginInstanceImpl* new_instance) { 191 PepperPluginInstanceImpl* new_instance) {
179 if (new_instance && new_instance->pp_instance() != pp_instance()) 192 if (new_instance && new_instance->pp_instance() != pp_instance())
180 return false; // Can't bind other instance's contexts. 193 return false; // Can't bind other instance's contexts.
181 if (bound_instance_ == new_instance) 194 if (bound_instance_ == new_instance)
182 return true; // Rebinding the same device, nothing to do. 195 return true; // Rebinding the same device, nothing to do.
183 if (bound_instance_ && new_instance) 196 if (bound_instance_ && new_instance)
184 return false; // Can't change a bound device. 197 return false; // Can't change a bound device.
185 bound_instance_ = new_instance; 198 bound_instance_ = new_instance;
186 if (!bound_instance_) 199 if (!bound_instance_)
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 layer->SetTransform(transform); 253 layer->SetTransform(transform);
241 254
242 // Consider a (0,0,0,0) rect as no clip rect. 255 // Consider a (0,0,0,0) rect as no clip rect.
243 if (new_layer->common.clip_rect.point.x != 0 || 256 if (new_layer->common.clip_rect.point.x != 0 ||
244 new_layer->common.clip_rect.point.y != 0 || 257 new_layer->common.clip_rect.point.y != 0 ||
245 new_layer->common.clip_rect.size.width != 0 || 258 new_layer->common.clip_rect.size.width != 0 ||
246 new_layer->common.clip_rect.size.height != 0) { 259 new_layer->common.clip_rect.size.height != 0) {
247 scoped_refptr<cc::Layer> clip_parent = layer->parent(); 260 scoped_refptr<cc::Layer> clip_parent = layer->parent();
248 if (clip_parent.get() == layer_.get()) { 261 if (clip_parent.get() == layer_.get()) {
249 // Create a clip parent layer, if it does not exist. 262 // Create a clip parent layer, if it does not exist.
250 clip_parent = cc::Layer::Create(); 263 clip_parent = cc::Layer::Create(PepperLayerSettings());
251 clip_parent->SetMasksToBounds(true); 264 clip_parent->SetMasksToBounds(true);
252 clip_parent->SetIsDrawable(true); 265 clip_parent->SetIsDrawable(true);
253 layer_->ReplaceChild(layer.get(), clip_parent); 266 layer_->ReplaceChild(layer.get(), clip_parent);
254 clip_parent->AddChild(layer); 267 clip_parent->AddChild(layer);
255 } 268 }
256 gfx::Point position = PP_ToGfxPoint(new_layer->common.clip_rect.point); 269 gfx::Point position = PP_ToGfxPoint(new_layer->common.clip_rect.point);
257 clip_parent->SetPosition(position); 270 clip_parent->SetPosition(position);
258 clip_parent->SetBounds(PP_ToGfxSize(new_layer->common.clip_rect.size)); 271 clip_parent->SetBounds(PP_ToGfxSize(new_layer->common.clip_rect.size));
259 layer->SetPosition(gfx::Point(-position.x(), -position.y())); 272 layer->SetPosition(gfx::Point(-position.x(), -position.y()));
260 } else if (layer->parent() != layer_.get()) { 273 } else if (layer->parent() != layer_.get()) {
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 395
383 for (size_t i = 0; i < layers.size(); ++i) { 396 for (size_t i = 0; i < layers.size(); ++i) {
384 const ppapi::CompositorLayerData* pp_layer = &layers[i]; 397 const ppapi::CompositorLayerData* pp_layer = &layers[i];
385 LayerData* data = i >= layers_.size() ? NULL : &layers_[i]; 398 LayerData* data = i >= layers_.size() ? NULL : &layers_[i];
386 DCHECK(!data || data->cc_layer.get()); 399 DCHECK(!data || data->cc_layer.get());
387 scoped_refptr<cc::Layer> cc_layer = data ? data->cc_layer : NULL; 400 scoped_refptr<cc::Layer> cc_layer = data ? data->cc_layer : NULL;
388 ppapi::CompositorLayerData* old_layer = data ? &data->pp_layer : NULL; 401 ppapi::CompositorLayerData* old_layer = data ? &data->pp_layer : NULL;
389 402
390 if (!cc_layer.get()) { 403 if (!cc_layer.get()) {
391 if (pp_layer->color) 404 if (pp_layer->color)
392 cc_layer = cc::SolidColorLayer::Create(); 405 cc_layer = cc::SolidColorLayer::Create(PepperLayerSettings());
393 else if (pp_layer->texture || pp_layer->image) 406 else if (pp_layer->texture || pp_layer->image)
394 cc_layer = cc::TextureLayer::CreateForMailbox(NULL); 407 cc_layer =
408 cc::TextureLayer::CreateForMailbox(PepperLayerSettings(), NULL);
395 layer_->AddChild(cc_layer); 409 layer_->AddChild(cc_layer);
396 } 410 }
397 411
398 UpdateLayer(cc_layer, old_layer, pp_layer, image_shms[i].Pass()); 412 UpdateLayer(cc_layer, old_layer, pp_layer, image_shms[i].Pass());
399 413
400 if (old_layer) 414 if (old_layer)
401 *old_layer = *pp_layer; 415 *old_layer = *pp_layer;
402 else 416 else
403 layers_.push_back(LayerData(cc_layer, *pp_layer)); 417 layers_.push_back(LayerData(cc_layer, *pp_layer));
404 } 418 }
405 419
406 // We need to force a commit for each CommitLayers() call, even if no layers 420 // 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 421 // changed since the last call to CommitLayers(). This is so
408 // WiewInitiatedPaint() will always be called. 422 // WiewInitiatedPaint() will always be called.
409 if (layer_->layer_tree_host()) 423 if (layer_->layer_tree_host())
410 layer_->layer_tree_host()->SetNeedsCommit(); 424 layer_->layer_tree_host()->SetNeedsCommit();
411 425
412 // If the host is not bound to the instance, return PP_OK immediately. 426 // If the host is not bound to the instance, return PP_OK immediately.
413 if (!bound_instance_) 427 if (!bound_instance_)
414 return PP_OK; 428 return PP_OK;
415 429
416 commit_layers_reply_context_ = context->MakeReplyMessageContext(); 430 commit_layers_reply_context_ = context->MakeReplyMessageContext();
417 return PP_OK_COMPLETIONPENDING; 431 return PP_OK_COMPLETIONPENDING;
418 } 432 }
419 433
420 } // namespace content 434 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698