Index: ui/compositor/layer.cc |
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc |
index a2f0a95d1ae363f42eafa36b6f36e81d9a8c0bdc..3949402e4961abca80cd21a83157b9712abcf118 100644 |
--- a/ui/compositor/layer.cc |
+++ b/ui/compositor/layer.cc |
@@ -86,6 +86,7 @@ Layer::Layer(LayerType type) |
zoom_(1), |
zoom_inset_(0), |
delegate_(NULL), |
+ cc_layer_(NULL), |
scale_content_(true), |
device_scale_factor_(1.0f) { |
CreateWebLayer(); |
@@ -514,6 +515,32 @@ void Layer::SetExternalTexture(Texture* texture) { |
RecomputeDrawsContentAndUVRect(); |
} |
+void Layer::SetTextureMailbox(const cc::TextureMailbox& mailbox, |
+ float scale_factor) { |
+ DCHECK_EQ(type_, LAYER_TEXTURED); |
+ DCHECK(!solid_color_layer_); |
+ layer_updated_externally_ = true; |
+ texture_ = NULL; |
+ if (!texture_layer_ || !texture_layer_->uses_mailbox()) { |
+ scoped_refptr<cc::TextureLayer> new_layer = |
+ cc::TextureLayer::CreateForMailbox(this); |
+ new_layer->SetFlipped(false); |
+ SwitchToLayer(new_layer); |
+ texture_layer_ = new_layer; |
+ } |
+ texture_layer_->SetTextureMailbox(mailbox); |
+ mailbox_ = mailbox; |
+ mailbox_scale_factor_ = scale_factor; |
+ RecomputeDrawsContentAndUVRect(); |
+} |
+ |
+cc::TextureMailbox Layer::GetTextureMailbox(float* scale_factor) { |
+ if (scale_factor) |
+ *scale_factor = mailbox_scale_factor_; |
+ cc::TextureMailbox::ReleaseCallback callback; |
+ return mailbox_.CopyWithNewCallback(callback); |
+} |
+ |
void Layer::SetDelegatedFrame(scoped_ptr<cc::DelegatedFrameData> frame, |
gfx::Size frame_size_in_dip) { |
DCHECK_EQ(type_, LAYER_TEXTURED); |
@@ -640,7 +667,9 @@ unsigned Layer::PrepareTexture(cc::ResourceUpdateQueue* queue) { |
WebKit::WebGraphicsContext3D* Layer::Context3d() { |
DCHECK(texture_layer_.get()); |
- return texture_->HostContext3D(); |
+ if (texture_) |
+ return texture_->HostContext3D(); |
+ return NULL; |
} |
bool Layer::PrepareTextureMailbox(cc::TextureMailbox* mailbox) { |
@@ -918,11 +947,18 @@ void Layer::RecomputeDrawsContentAndUVRect() { |
DCHECK(cc_layer_); |
gfx::Size size(bounds_.size()); |
if (texture_layer_.get()) { |
- DCHECK(texture_.get()); |
- |
- float texture_scale_factor = 1.0f / texture_->device_scale_factor(); |
- gfx::Size texture_size = gfx::ToFlooredSize( |
- gfx::ScaleSize(texture_->size(), texture_scale_factor)); |
+ gfx::Size texture_size; |
+ if (!texture_layer_->uses_mailbox()) { |
+ DCHECK(texture_); |
+ float texture_scale_factor = 1.0f / texture_->device_scale_factor(); |
+ texture_size = gfx::ToFlooredSize( |
+ gfx::ScaleSize(texture_->size(), texture_scale_factor)); |
+ } else { |
+ DCHECK(mailbox_.IsSharedMemory()); |
+ float texture_scale_factor = 1.0f / mailbox_scale_factor_; |
+ texture_size = gfx::ToFlooredSize( |
+ gfx::ScaleSize(mailbox_.shared_memory_size(), texture_scale_factor)); |
+ } |
size.SetToMin(texture_size); |
gfx::PointF uv_top_left(0.f, 0.f); |