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

Unified Diff: cc/layers/texture_layer.cc

Issue 23648014: cc: Move TextureMailbox::ReleaseCallback to SingleReleaseCallback. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: releasecallback: missingfiles Created 7 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: cc/layers/texture_layer.cc
diff --git a/cc/layers/texture_layer.cc b/cc/layers/texture_layer.cc
index d0ab7d9bb8f5b5e0332ede5870f0dbcced70d4e7..8f4928046dcb3703df67981b5939e6885471c271 100644
--- a/cc/layers/texture_layer.cc
+++ b/cc/layers/texture_layer.cc
@@ -5,6 +5,7 @@
#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"
@@ -51,7 +52,7 @@ void TextureLayer::ClearClient() {
layer_tree_host()->StopRateLimiter(client_->Context3d());
client_ = NULL;
if (uses_mailbox_)
- SetTextureMailbox(TextureMailbox());
+ SetTextureMailbox(TextureMailbox(), ScopedReleaseCallback());
else
SetTextureId(0);
}
@@ -130,13 +131,16 @@ void TextureLayer::SetTextureId(unsigned id) {
SetNextCommitWaitsForActivation();
}
-void TextureLayer::SetTextureMailbox(const TextureMailbox& mailbox) {
+void TextureLayer::SetTextureMailbox(const TextureMailbox& mailbox,
+ ScopedReleaseCallback release_callback) {
DCHECK(uses_mailbox_);
DCHECK(!mailbox.IsValid() || !holder_ref_ ||
!mailbox.Equals(holder_ref_->holder()->mailbox()));
+ DCHECK_EQ(mailbox.IsValid(), !release_callback.IsEmpty());
+
// 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 +202,12 @@ bool TextureLayer::Update(ResourceUpdateQueue* queue,
if (client_) {
if (uses_mailbox_) {
TextureMailbox mailbox;
+ ScopedReleaseCallback 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 {
@@ -234,13 +241,13 @@ void TextureLayer::PushPropertiesTo(LayerImpl* layer) {
texture_layer->set_blend_background_color(blend_background_color_);
if (uses_mailbox_ && needs_set_mailbox_) {
TextureMailbox texture_mailbox;
+ ScopedReleaseCallback 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_);
@@ -272,10 +279,12 @@ TextureLayer::MailboxHolder::MainThreadReference::~MainThreadReference() {
holder_->InternalRelease();
}
-TextureLayer::MailboxHolder::MailboxHolder(const TextureMailbox& mailbox)
+TextureLayer::MailboxHolder::MailboxHolder(
+ const TextureMailbox& mailbox, ScopedReleaseCallback release_callback)
: message_loop_(BlockingTaskRunner::current()),
internal_references_(0),
mailbox_(mailbox),
+ release_callback_(release_callback.Pass()),
sync_point_(mailbox.sync_point()),
is_lost_(false) {
}
@@ -285,9 +294,10 @@ TextureLayer::MailboxHolder::~MailboxHolder() {
}
scoped_ptr<TextureLayer::MailboxHolder::MainThreadReference>
-TextureLayer::MailboxHolder::Create(const TextureMailbox& mailbox) {
+TextureLayer::MailboxHolder::Create(const TextureMailbox& mailbox,
+ ScopedReleaseCallback 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) {
@@ -296,13 +306,13 @@ void TextureLayer::MailboxHolder::Return(unsigned sync_point, bool is_lost) {
is_lost_ = is_lost;
}
-TextureMailbox::ReleaseCallback
-TextureLayer::MailboxHolder::GetCallbackForImplThread() {
+ScopedReleaseCallback 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 ScopedReleaseCallback(
+ base::Bind(&MailboxHolder::ReturnAndReleaseOnImplThread, this));
}
void TextureLayer::MailboxHolder::InternalAddRef() {
@@ -312,8 +322,8 @@ 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_.RunAndReset(sync_point_, is_lost_);
+ mailbox_ = TextureMailbox();
}
}

Powered by Google App Engine
This is Rietveld 408576698