| Index: cc/resource_provider.cc
|
| diff --git a/cc/resource_provider.cc b/cc/resource_provider.cc
|
| index 2cbafaeec119556cfaf526801b5852be4bd0e4e4..21552241d75f1db5b1540e5ab59aee3ab63163a9 100644
|
| --- a/cc/resource_provider.cc
|
| +++ b/cc/resource_provider.cc
|
| @@ -66,6 +66,10 @@ ResourceProvider::Resource::Resource()
|
| {
|
| }
|
|
|
| +ResourceProvider::Resource::~Resource()
|
| +{
|
| +}
|
| +
|
| ResourceProvider::Resource::Resource(unsigned textureId, const gfx::Size& size, GLenum format, GLenum filter)
|
| : glId(textureId)
|
| , glPixelBufferId(0)
|
| @@ -234,6 +238,28 @@ ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
|
| return id;
|
| }
|
|
|
| +ResourceProvider::ResourceId ResourceProvider::createResourceFromTextureMailbox(const std::string& mailbox, const base::Callback<void(unsigned)>& releaseCallback)
|
| +{
|
| + DCHECK(m_threadChecker.CalledOnValidThread());
|
| +
|
| + // FIXME: As an optimization, delay consuming the mailbox
|
| + // and creating the texture ID until lockForRead.
|
| + const int8* name = reinterpret_cast<const int8*>(mailbox.data());
|
| + WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
|
| + DCHECK(context3d);
|
| + unsigned textureId = context3d->createTexture();
|
| + GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId));
|
| + GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, name));
|
| +
|
| + ResourceId id = m_nextId++;
|
| + Resource resource(textureId, gfx::Size(), 0, GL_LINEAR);
|
| + resource.external = true;
|
| + resource.mailbox.setName(name);
|
| + resource.mailboxReleaseCallback = releaseCallback;
|
| + m_resources[id] = resource;
|
| + return id;
|
| +}
|
| +
|
| void ResourceProvider::deleteResource(ResourceId id)
|
| {
|
| DCHECK(m_threadChecker.CalledOnValidThread());
|
| @@ -269,6 +295,17 @@ void ResourceProvider::deleteResourceInternal(ResourceMap::iterator it)
|
| DCHECK(context3d);
|
| GLC(context3d, context3d->deleteBuffer(resource->glPixelBufferId));
|
| }
|
| + if (!resource->mailbox.isZero() && resource->external) {
|
| + WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
|
| + DCHECK(context3d);
|
| + GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->glId));
|
| + GLC(context3d, context3d->produceTextureCHROMIUM(GL_TEXTURE_2D, resource->mailbox.name));
|
| + GLC(context3d, context3d->deleteTexture(resource->glId));
|
| + if (!resource->mailboxReleaseCallback.is_null()) {
|
| + unsigned syncPoint = context3d->insertSyncPoint();
|
| + resource->mailboxReleaseCallback.Run(syncPoint);
|
| + }
|
| + }
|
| if (resource->pixels)
|
| delete[] resource->pixels;
|
| if (resource->pixelBuffer)
|
| @@ -684,7 +721,7 @@ bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI
|
| Resource* source = &it->second;
|
| DCHECK(!source->lockedForWrite);
|
| DCHECK(!source->lockForReadCount);
|
| - DCHECK(!source->external);
|
| + DCHECK(!source->external || (source->external && !source->mailbox.isZero()));
|
| if (source->exported)
|
| return false;
|
| resource->id = id;
|
|
|