| Index: cc/texture_layer_impl.cc
|
| diff --git a/cc/texture_layer_impl.cc b/cc/texture_layer_impl.cc
|
| index 433ce34256e7260b5bdf10b9c573d56420e729d2..1d546164ba2c0827c23c85174b3cf9c1ad17120b 100644
|
| --- a/cc/texture_layer_impl.cc
|
| +++ b/cc/texture_layer_impl.cc
|
| @@ -5,19 +5,22 @@
|
| #include "cc/texture_layer_impl.h"
|
|
|
| #include "base/stringprintf.h"
|
| +#include "cc/layer_tree_impl.h"
|
| #include "cc/quad_sink.h"
|
| #include "cc/renderer.h"
|
| #include "cc/texture_draw_quad.h"
|
|
|
| namespace cc {
|
|
|
| -TextureLayerImpl::TextureLayerImpl(LayerTreeImpl* treeImpl, int id)
|
| +TextureLayerImpl::TextureLayerImpl(LayerTreeImpl* treeImpl, int id, bool usesMailbox)
|
| : LayerImpl(treeImpl, id)
|
| , m_textureId(0)
|
| , m_externalTextureResource(0)
|
| , m_premultipliedAlpha(true)
|
| , m_flipped(true)
|
| , m_uvRect(0, 0, 1, 1)
|
| + , m_hasPendingMailbox(false)
|
| + , m_usesMailbox(usesMailbox)
|
| {
|
| m_vertexOpacity[0] = 1.0f;
|
| m_vertexOpacity[1] = 1.0f;
|
| @@ -27,14 +30,50 @@ TextureLayerImpl::TextureLayerImpl(LayerTreeImpl* treeImpl, int id)
|
|
|
| TextureLayerImpl::~TextureLayerImpl()
|
| {
|
| + if (m_externalTextureResource) {
|
| + DCHECK(m_usesMailbox);
|
| + ResourceProvider* provider = layerTreeImpl()->resource_provider();
|
| + provider->deleteResource(m_externalTextureResource);
|
| + }
|
| + if (m_hasPendingMailbox && !m_pendingMailboxName.empty())
|
| + m_pendingMailboxReleaseCallback.Run(0);
|
| +}
|
| +
|
| +void TextureLayerImpl::setTextureMailbox(const std::string& mailboxName, const base::Callback<void(unsigned)>& releaseCallback)
|
| +{
|
| + DCHECK(m_usesMailbox);
|
| + // Same mailbox name was commited, nothing to do.
|
| + if (m_pendingMailboxName.compare(mailboxName) == 0)
|
| + return;
|
| + // Two commits without a draw, ack the previous mailbox.
|
| + if (m_hasPendingMailbox && !m_pendingMailboxReleaseCallback.is_null())
|
| + m_pendingMailboxReleaseCallback.Run(0);
|
| +
|
| + m_pendingMailboxName = mailboxName;
|
| + m_hasPendingMailbox = true;
|
| + m_pendingMailboxReleaseCallback = releaseCallback;
|
| }
|
|
|
| void TextureLayerImpl::willDraw(ResourceProvider* resourceProvider)
|
| {
|
| - if (!m_textureId)
|
| + if (!m_usesMailbox) {
|
| + if (!m_textureId)
|
| + return;
|
| + DCHECK(!m_externalTextureResource);
|
| + m_externalTextureResource = resourceProvider->createResourceFromExternalTexture(m_textureId);
|
| return;
|
| - DCHECK(!m_externalTextureResource);
|
| - m_externalTextureResource = resourceProvider->createResourceFromExternalTexture(m_textureId);
|
| + }
|
| +
|
| + if (!m_hasPendingMailbox)
|
| + return;
|
| +
|
| + if (m_externalTextureResource) {
|
| + resourceProvider->deleteResource(m_externalTextureResource);
|
| + m_externalTextureResource = 0;
|
| + }
|
| + if (!m_pendingMailboxName.empty())
|
| + m_externalTextureResource = resourceProvider->createResourceFromTextureMailbox(m_pendingMailboxName, m_pendingMailboxReleaseCallback);
|
| + m_hasPendingMailbox = false;
|
| }
|
|
|
| void TextureLayerImpl::appendQuads(QuadSink& quadSink, AppendQuadsData& appendQuadsData)
|
| @@ -59,6 +98,8 @@ void TextureLayerImpl::appendQuads(QuadSink& quadSink, AppendQuadsData& appendQu
|
|
|
| void TextureLayerImpl::didDraw(ResourceProvider* resourceProvider)
|
| {
|
| + if (m_usesMailbox)
|
| + return;
|
| if (!m_externalTextureResource)
|
| return;
|
| // FIXME: the following assert will not be true when sending resources to a
|
|
|