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 |