Chromium Code Reviews| Index: cc/texture_layer_impl.cc |
| diff --git a/cc/texture_layer_impl.cc b/cc/texture_layer_impl.cc |
| index 433ce34256e7260b5bdf10b9c573d56420e729d2..2a6447d43d316c877f68338ee2522d5ade026cd1 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,51 @@ 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) { |
| + DCHECK(!resourceProvider->inUseByConsumer(m_externalTextureResource)); |
|
piman
2013/01/08 02:01:52
This check may not be true with ubercomp (because
alexst (slow to review)
2013/01/08 02:46:27
Done.
|
| + 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 +99,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 |