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

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: SingleReleaseCallback 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
« no previous file with comments | « cc/layers/texture_layer.h ('k') | cc/layers/texture_layer_client.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
}
}
« no previous file with comments | « cc/layers/texture_layer.h ('k') | cc/layers/texture_layer_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698