Index: cc/layers/texture_layer.cc |
diff --git a/cc/layers/texture_layer.cc b/cc/layers/texture_layer.cc |
index d4a13140eeb6a7ccc28788c4feedc3b482bc0c4f..340526e18cdb6cb7632bde6e4bfc5f0504352e32 100644 |
--- a/cc/layers/texture_layer.cc |
+++ b/cc/layers/texture_layer.cc |
@@ -5,10 +5,12 @@ |
#include "cc/layers/texture_layer.h" |
#include "base/bind.h" |
+#include "base/callback_helpers.h" |
#include "base/location.h" |
#include "base/synchronization/lock.h" |
#include "cc/layers/texture_layer_client.h" |
#include "cc/layers/texture_layer_impl.h" |
+#include "cc/resources/single_release_callback.h" |
#include "cc/trees/blocking_task_runner.h" |
#include "cc/trees/layer_tree_host.h" |
#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h" |
@@ -51,7 +53,7 @@ void TextureLayer::ClearClient() { |
layer_tree_host()->StopRateLimiter(client_->Context3d()); |
client_ = NULL; |
if (uses_mailbox_) |
- SetTextureMailbox(TextureMailbox()); |
+ SetTextureMailbox(TextureMailbox(), scoped_ptr<SingleReleaseCallback>()); |
else |
SetTextureId(0); |
} |
@@ -130,13 +132,17 @@ void TextureLayer::SetTextureId(unsigned id) { |
SetNextCommitWaitsForActivation(); |
} |
-void TextureLayer::SetTextureMailbox(const TextureMailbox& mailbox) { |
+void TextureLayer::SetTextureMailbox( |
+ const TextureMailbox& mailbox, |
+ scoped_ptr<SingleReleaseCallback> release_callback) { |
DCHECK(uses_mailbox_); |
DCHECK(!mailbox.IsValid() || !holder_ref_ || |
!mailbox.Equals(holder_ref_->holder()->mailbox())); |
+ DCHECK_EQ(mailbox.IsValid(), !!release_callback); |
+ |
// If we never commited the mailbox, we need to release it here. |
if (mailbox.IsValid()) |
- holder_ref_ = MailboxHolder::Create(mailbox); |
+ holder_ref_ = MailboxHolder::Create(mailbox, release_callback.Pass()); |
else |
holder_ref_.reset(); |
needs_set_mailbox_ = true; |
@@ -198,9 +204,12 @@ bool TextureLayer::Update(ResourceUpdateQueue* queue, |
if (client_) { |
if (uses_mailbox_) { |
TextureMailbox mailbox; |
+ scoped_ptr<SingleReleaseCallback> release_callback; |
if (client_->PrepareTextureMailbox( |
- &mailbox, layer_tree_host()->UsingSharedMemoryResources())) { |
- SetTextureMailbox(mailbox); |
+ &mailbox, |
+ &release_callback, |
+ layer_tree_host()->UsingSharedMemoryResources())) { |
+ SetTextureMailbox(mailbox, release_callback.Pass()); |
updated = true; |
} |
} else { |
@@ -235,13 +244,13 @@ void TextureLayer::PushPropertiesTo(LayerImpl* layer) { |
texture_layer->set_blend_background_color(blend_background_color_); |
if (uses_mailbox_ && needs_set_mailbox_) { |
TextureMailbox texture_mailbox; |
+ scoped_ptr<SingleReleaseCallback> release_callback; |
if (holder_ref_) { |
MailboxHolder* holder = holder_ref_->holder(); |
- TextureMailbox::ReleaseCallback callback = |
- holder->GetCallbackForImplThread(); |
- texture_mailbox = holder->mailbox().CopyWithNewCallback(callback); |
+ texture_mailbox = holder->mailbox(); |
+ release_callback = holder->GetCallbackForImplThread(); |
} |
- texture_layer->SetTextureMailbox(texture_mailbox); |
+ texture_layer->SetTextureMailbox(texture_mailbox, release_callback.Pass()); |
needs_set_mailbox_ = false; |
} else { |
texture_layer->set_texture_id(texture_id_); |
@@ -273,10 +282,13 @@ TextureLayer::MailboxHolder::MainThreadReference::~MainThreadReference() { |
holder_->InternalRelease(); |
} |
-TextureLayer::MailboxHolder::MailboxHolder(const TextureMailbox& mailbox) |
+TextureLayer::MailboxHolder::MailboxHolder( |
+ const TextureMailbox& mailbox, |
+ scoped_ptr<SingleReleaseCallback> release_callback) |
: message_loop_(BlockingTaskRunner::current()), |
internal_references_(0), |
mailbox_(mailbox), |
+ release_callback_(release_callback.Pass()), |
sync_point_(mailbox.sync_point()), |
is_lost_(false) { |
} |
@@ -286,9 +298,11 @@ TextureLayer::MailboxHolder::~MailboxHolder() { |
} |
scoped_ptr<TextureLayer::MailboxHolder::MainThreadReference> |
-TextureLayer::MailboxHolder::Create(const TextureMailbox& mailbox) { |
+TextureLayer::MailboxHolder::Create( |
+ const TextureMailbox& mailbox, |
+ scoped_ptr<SingleReleaseCallback> release_callback) { |
return scoped_ptr<MainThreadReference>(new MainThreadReference( |
- new MailboxHolder(mailbox))); |
+ new MailboxHolder(mailbox, release_callback.Pass()))); |
} |
void TextureLayer::MailboxHolder::Return(unsigned sync_point, bool is_lost) { |
@@ -297,13 +311,14 @@ void TextureLayer::MailboxHolder::Return(unsigned sync_point, bool is_lost) { |
is_lost_ = is_lost; |
} |
-TextureMailbox::ReleaseCallback |
+scoped_ptr<SingleReleaseCallback> |
TextureLayer::MailboxHolder::GetCallbackForImplThread() { |
// We can't call GetCallbackForImplThread if we released the main thread |
// reference. |
DCHECK_GT(internal_references_, 0u); |
InternalAddRef(); |
- return base::Bind(&MailboxHolder::ReturnAndReleaseOnImplThread, this); |
+ return SingleReleaseCallback::Create( |
+ base::Bind(&MailboxHolder::ReturnAndReleaseOnImplThread, this)); |
} |
void TextureLayer::MailboxHolder::InternalAddRef() { |
@@ -313,8 +328,9 @@ void TextureLayer::MailboxHolder::InternalAddRef() { |
void TextureLayer::MailboxHolder::InternalRelease() { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
if (!--internal_references_) { |
- mailbox_.RunReleaseCallback(sync_point_, is_lost_); |
- DCHECK(mailbox_.callback().is_null()); |
+ release_callback_->Run(sync_point_, is_lost_); |
+ mailbox_ = TextureMailbox(); |
+ release_callback_.reset(); |
} |
} |