summaryrefslogtreecommitdiffstats
path: root/ui/compositor/layer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ui/compositor/layer.cc')
-rw-r--r--ui/compositor/layer.cc129
1 files changed, 86 insertions, 43 deletions
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc
index b73419a..10cbaca 100644
--- a/ui/compositor/layer.cc
+++ b/ui/compositor/layer.cc
@@ -11,8 +11,11 @@
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "cc/content_layer.h"
+#include "cc/delegated_frame_data.h"
+#include "cc/delegated_renderer_layer.h"
#include "cc/solid_color_layer.h"
#include "cc/texture_layer.h"
+#include "cc/transferable_resource.h"
#include "third_party/WebKit/Source/Platform/chromium/public/WebFilterOperation.h"
#include "third_party/WebKit/Source/Platform/chromium/public/WebFilterOperations.h"
#include "ui/base/animation/animation.h"
@@ -419,52 +422,92 @@ void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) {
cc_layer_->setContentsOpaque(fills_bounds_opaquely);
}
+void Layer::SwitchToLayer(scoped_refptr<cc::Layer> new_layer) {
+ if (texture_layer_.get())
+ texture_layer_->willModifyTexture();
+ // TODO(piman): delegated_renderer_layer_ cleanup.
+
+ cc_layer_->removeAllChildren();
+ if (parent_) {
+ DCHECK(parent_->cc_layer_);
+ parent_->cc_layer_->replaceChild(cc_layer_, new_layer);
+ }
+ cc_layer_->removeLayerAnimationEventObserver(this);
+ new_layer->setOpacity(cc_layer_->opacity());
+
+ cc_layer_= new_layer;
+ content_layer_ = NULL;
+ solid_color_layer_ = NULL;
+ texture_layer_ = NULL;
+ delegated_renderer_layer_ = NULL;
+
+ cc_layer_->addLayerAnimationEventObserver(this);
+ for (size_t i = 0; i < children_.size(); ++i) {
+ DCHECK(children_[i]->cc_layer_);
+ cc_layer_->addChild(children_[i]->cc_layer_);
+ }
+ cc_layer_->setAnchorPoint(gfx::PointF());
+ cc_layer_->setContentsOpaque(fills_bounds_opaquely_);
+ cc_layer_->setForceRenderSurface(force_render_surface_);
+ cc_layer_->setIsDrawable(IsDrawn());
+}
+
void Layer::SetExternalTexture(Texture* texture) {
DCHECK_EQ(type_, LAYER_TEXTURED);
DCHECK(!solid_color_layer_);
- layer_updated_externally_ = !!texture;
+ bool has_texture = !!texture;
+ layer_updated_externally_ = has_texture;
texture_ = texture;
- if (cc_layer_is_accelerated_ != layer_updated_externally_) {
+ if (!!texture_layer_ != has_texture) {
// Switch to a different type of layer.
- cc_layer_->removeAllChildren();
-
- scoped_refptr<cc::ContentLayer> old_content_layer;
- old_content_layer.swap(content_layer_);
- scoped_refptr<cc::TextureLayer> old_texture_layer;
- old_texture_layer.swap(texture_layer_);
-
- cc::Layer* new_layer = NULL;
- if (layer_updated_externally_) {
- texture_layer_ = cc::TextureLayer::create(this);
- texture_layer_->setFlipped(texture_->flipped());
- new_layer = texture_layer_.get();
+ if (has_texture) {
+ scoped_refptr<cc::TextureLayer> new_layer =
+ cc::TextureLayer::create(this);
+ new_layer->setFlipped(texture_->flipped());
+ SwitchToLayer(new_layer);
+ texture_layer_ = new_layer;
} else {
- old_texture_layer->willModifyTexture();
- content_layer_ = cc::ContentLayer::create(this);
- new_layer = content_layer_.get();
+ scoped_refptr<cc::ContentLayer> new_layer =
+ cc::ContentLayer::create(this);
+ SwitchToLayer(new_layer);
+ content_layer_ = new_layer;
}
- if (parent_) {
- DCHECK(parent_->cc_layer_);
- parent_->cc_layer_->replaceChild(cc_layer_, new_layer);
- }
- cc_layer_->removeLayerAnimationEventObserver(this);
- new_layer->setOpacity(cc_layer_->opacity());
- cc_layer_= new_layer;
- cc_layer_->addLayerAnimationEventObserver(this);
- cc_layer_is_accelerated_ = layer_updated_externally_;
- for (size_t i = 0; i < children_.size(); ++i) {
- DCHECK(children_[i]->cc_layer_);
- cc_layer_->addChild(children_[i]->cc_layer_);
+ RecomputeTransform();
+ }
+ RecomputeDrawsContentAndUVRect();
+}
+
+void Layer::SetDelegatedFrame(scoped_ptr<cc::DelegatedFrameData> frame,
+ gfx::Size frame_size_in_dip) {
+ DCHECK_EQ(type_, LAYER_TEXTURED);
+ bool has_frame = frame.get() && !frame->render_pass_list.empty();
+ layer_updated_externally_ = has_frame;
+ delegated_frame_size_in_dip_ = frame_size_in_dip;
+ if (!!delegated_renderer_layer_ != has_frame) {
+ if (has_frame) {
+ scoped_refptr<cc::DelegatedRendererLayer> new_layer =
+ cc::DelegatedRendererLayer::Create();
+ SwitchToLayer(new_layer);
+ delegated_renderer_layer_ = new_layer;
+ } else {
+ scoped_refptr<cc::ContentLayer> new_layer =
+ cc::ContentLayer::create(this);
+ SwitchToLayer(new_layer);
+ content_layer_ = new_layer;
}
- cc_layer_->setAnchorPoint(gfx::PointF());
- cc_layer_->setContentsOpaque(fills_bounds_opaquely_);
- cc_layer_->setForceRenderSurface(force_render_surface_);
- cc_layer_->setIsDrawable(IsDrawn());
RecomputeTransform();
}
+ if (has_frame)
+ delegated_renderer_layer_->SetFrameData(frame.Pass());
RecomputeDrawsContentAndUVRect();
}
+void Layer::TakeUnusedResourcesForChildCompositor(
+ cc::TransferableResourceArray* list) {
+ if (delegated_renderer_layer_)
+ delegated_renderer_layer_->TakeUnusedResourcesForChildCompositor(list);
+}
+
void Layer::SetColor(SkColor color) {
GetAnimator()->SetColor(color);
}
@@ -552,12 +595,12 @@ void Layer::paintContents(SkCanvas* sk_canvas,
}
unsigned Layer::prepareTexture(cc::ResourceUpdateQueue&) {
- DCHECK(layer_updated_externally_);
+ DCHECK(texture_layer_);
return texture_->PrepareTexture();
}
WebKit::WebGraphicsContext3D* Layer::context() {
- DCHECK(layer_updated_externally_);
+ DCHECK(texture_layer_);
return texture_->HostContext3D();
}
@@ -777,7 +820,6 @@ void Layer::CreateWebLayer() {
content_layer_ = cc::ContentLayer::create(this);
cc_layer_ = content_layer_.get();
}
- cc_layer_is_accelerated_ = false;
cc_layer_->setAnchorPoint(gfx::PointF());
cc_layer_->setContentsOpaque(true);
cc_layer_->setIsDrawable(type_ != LAYER_NOT_DRAWN);
@@ -804,25 +846,26 @@ void Layer::RecomputeTransform() {
void Layer::RecomputeDrawsContentAndUVRect() {
DCHECK(cc_layer_);
- if (!cc_layer_is_accelerated_) {
- cc_layer_->setBounds(ConvertSizeToPixel(this, bounds_.size()));
- } else {
+ gfx::Size size(bounds_.size());
+ if (texture_layer_.get()) {
DCHECK(texture_);
float texture_scale_factor = 1.0f / texture_->device_scale_factor();
gfx::Size texture_size = gfx::ToFlooredSize(
gfx::ScaleSize(texture_->size(), texture_scale_factor));
+ size.ClampToMax(texture_size);
- gfx::Size size(std::min(bounds().width(), texture_size.width()),
- std::min(bounds().height(), texture_size.height()));
gfx::PointF uv_top_left(0.f, 0.f);
gfx::PointF uv_bottom_right(
static_cast<float>(size.width())/texture_size.width(),
static_cast<float>(size.height())/texture_size.height());
texture_layer_->setUV(uv_top_left, uv_bottom_right);
-
- cc_layer_->setBounds(ConvertSizeToPixel(this, size));
+ } else if (delegated_renderer_layer_.get()) {
+ delegated_renderer_layer_->SetDisplaySize(
+ ConvertSizeToPixel(this, delegated_frame_size_in_dip_));
+ size.ClampToMax(delegated_frame_size_in_dip_);
}
+ cc_layer_->setBounds(ConvertSizeToPixel(this, size));
}
} // namespace ui