| Index: cc/resources/resource_provider.cc
|
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
|
| index 787757c3b86f62847ec3ae99a27747bd0553b414..6252cfc6e6724d675ceb97479895552370d18a95 100644
|
| --- a/cc/resources/resource_provider.cc
|
| +++ b/cc/resources/resource_provider.cc
|
| @@ -7,6 +7,7 @@
|
| #include <algorithm>
|
| #include <limits>
|
|
|
| +#include "base/callback_helpers.h"
|
| #include "base/containers/hash_tables.h"
|
| #include "base/debug/alias.h"
|
| #include "base/stl_util.h"
|
| @@ -306,7 +307,8 @@ ResourceProvider::CreateResourceFromExternalTexture(
|
| }
|
|
|
| ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox(
|
| - const TextureMailbox& mailbox) {
|
| + const TextureMailbox& mailbox,
|
| + ScopedReleaseCallback release_callback) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| // Just store the information. Mailbox will be consumed in LockForRead().
|
| ResourceId id = next_id_++;
|
| @@ -326,6 +328,7 @@ ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox(
|
| resource.external = true;
|
| resource.allocated = true;
|
| resource.mailbox = mailbox;
|
| + resource.release_callback = release_callback.Leak();
|
| return id;
|
| }
|
|
|
| @@ -394,7 +397,8 @@ void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it,
|
| resource->pixels = NULL;
|
| }
|
| }
|
| - resource->mailbox.RunReleaseCallback(sync_point, lost_resource);
|
| + base::ResetAndReturn(&resource->release_callback).Run(
|
| + sync_point, lost_resource);
|
| }
|
| if (resource->pixels)
|
| delete[] resource->pixels;
|
| @@ -946,9 +950,8 @@ void ResourceProvider::ReceiveReturnsFromParent(
|
| if (it->sync_point)
|
| GLC(context3d, context3d->waitSyncPoint(it->sync_point));
|
| } else {
|
| - resource->mailbox = TextureMailbox(resource->mailbox.name(),
|
| - resource->mailbox.callback(),
|
| - it->sync_point);
|
| + resource->mailbox =
|
| + TextureMailbox(resource->mailbox.name(), it->sync_point);
|
| }
|
| if (resource->marked_for_deletion)
|
| DeleteResourceInternal(map_iterator, Normal);
|
|
|