Index: cc/layers/texture_layer_impl.cc |
diff --git a/cc/layers/texture_layer_impl.cc b/cc/layers/texture_layer_impl.cc |
index 851bf9a145b180431f604261739349eeb7dddfc6..bebf37157d1ec78106194dd5f71016628ba25d0f 100644 |
--- a/cc/layers/texture_layer_impl.cc |
+++ b/cc/layers/texture_layer_impl.cc |
@@ -4,6 +4,8 @@ |
#include "cc/layers/texture_layer_impl.h" |
+#include <vector> |
+ |
#include "base/strings/stringprintf.h" |
#include "cc/layers/quad_sink.h" |
#include "cc/output/renderer.h" |
@@ -36,10 +38,14 @@ TextureLayerImpl::TextureLayerImpl(LayerTreeImpl* tree_impl, |
TextureLayerImpl::~TextureLayerImpl() { FreeTextureMailbox(); } |
-void TextureLayerImpl::SetTextureMailbox(const TextureMailbox& mailbox) { |
+void TextureLayerImpl::SetTextureMailbox( |
+ const TextureMailbox& mailbox, |
+ ScopedReleaseCallback release_callback) { |
DCHECK(uses_mailbox_); |
+ DCHECK_EQ(mailbox.IsValid(), !release_callback.IsEmpty()); |
FreeTextureMailbox(); |
texture_mailbox_ = mailbox; |
+ release_callback_ = release_callback.Pass(); |
own_mailbox_ = true; |
valid_texture_copy_ = false; |
} |
@@ -60,7 +66,8 @@ void TextureLayerImpl::PushPropertiesTo(LayerImpl* layer) { |
texture_layer->set_vertex_opacity(vertex_opacity_); |
texture_layer->set_premultiplied_alpha(premultiplied_alpha_); |
if (uses_mailbox_ && own_mailbox_) { |
- texture_layer->SetTextureMailbox(texture_mailbox_); |
+ texture_layer->SetTextureMailbox(texture_mailbox_, |
+ release_callback_.Pass()); |
own_mailbox_ = false; |
} else { |
texture_layer->set_texture_id(texture_id_); |
@@ -80,7 +87,8 @@ bool TextureLayerImpl::WillDraw(DrawMode draw_mode, |
texture_mailbox_.IsSharedMemory())) { |
external_texture_resource_ = |
resource_provider->CreateResourceFromTextureMailbox( |
- texture_mailbox_); |
+ texture_mailbox_, |
+ release_callback_.Pass()); |
DCHECK(external_texture_resource_); |
texture_copy_.reset(); |
valid_texture_copy_ = false; |
@@ -229,7 +237,8 @@ void TextureLayerImpl::FreeTextureMailbox() { |
return; |
if (own_mailbox_) { |
DCHECK(!external_texture_resource_); |
- texture_mailbox_.RunReleaseCallback(texture_mailbox_.sync_point(), false); |
+ if (!release_callback_.IsEmpty()) |
+ release_callback_.RunAndReset(texture_mailbox_.sync_point(), false); |
} else if (external_texture_resource_) { |
DCHECK(!own_mailbox_); |
ResourceProvider* resource_provider = |