Index: cc/texture_layer_impl.cc |
diff --git a/cc/texture_layer_impl.cc b/cc/texture_layer_impl.cc |
index 433ce34256e7260b5bdf10b9c573d56420e729d2..c22b7a35d024a6ddf9d4e49a7a1deda5a348ee97 100644 |
--- a/cc/texture_layer_impl.cc |
+++ b/cc/texture_layer_impl.cc |
@@ -5,19 +5,25 @@ |
#include "cc/texture_layer_impl.h" |
#include "base/stringprintf.h" |
+#include "cc/layer_tree_impl.h" |
+#include "cc/mailbox_release_client.h" |
#include "cc/quad_sink.h" |
#include "cc/renderer.h" |
#include "cc/texture_draw_quad.h" |
+#include <public/WebGraphicsContext3D.h> |
danakj
2012/12/20 02:16:19
use "third_party/WebKit/..."
alexst (slow to review)
2012/12/21 14:15:21
Goes away with base::bind
On 2012/12/20 02:16:19,
|
+ |
namespace cc { |
-TextureLayerImpl::TextureLayerImpl(LayerTreeImpl* treeImpl, int id) |
+TextureLayerImpl::TextureLayerImpl(LayerTreeImpl* treeImpl, int id, MailboxReleaseClient* client) |
: LayerImpl(treeImpl, id) |
, m_textureId(0) |
, m_externalTextureResource(0) |
, m_premultipliedAlpha(true) |
, m_flipped(true) |
, m_uvRect(0, 0, 1, 1) |
+ , m_newMailboxPending(false) |
+ , m_mailboxClient(client) |
{ |
m_vertexOpacity[0] = 1.0f; |
m_vertexOpacity[1] = 1.0f; |
@@ -29,8 +35,21 @@ TextureLayerImpl::~TextureLayerImpl() |
{ |
piman
2012/12/20 02:14:21
You probably need to do more here, for the case wh
alexst (slow to review)
2012/12/21 14:15:21
Done.
|
} |
+void TextureLayerImpl::setTextureMailbox(const std::string& mailboxName) |
+{ |
+ // Same mailbox name was commited, nothing to do |
+ if (m_lastMailbox.compare(mailboxName) == 0) |
+ return; |
+ m_newMailbox = mailboxName; |
+ m_newMailboxPending = true; |
+} |
+ |
void TextureLayerImpl::willDraw(ResourceProvider* resourceProvider) |
{ |
+ if (m_mailboxClient) { |
+ handleMailboxResources(resourceProvider); |
+ return; |
+ } |
if (!m_textureId) |
return; |
DCHECK(!m_externalTextureResource); |
@@ -59,6 +78,8 @@ void TextureLayerImpl::appendQuads(QuadSink& quadSink, AppendQuadsData& appendQu |
void TextureLayerImpl::didDraw(ResourceProvider* resourceProvider) |
{ |
+ if (m_mailboxClient) |
+ return; |
if (!m_externalTextureResource) |
return; |
// FIXME: the following assert will not be true when sending resources to a |
@@ -94,4 +115,26 @@ const char* TextureLayerImpl::layerTypeAsString() const |
return "TextureLayer"; |
} |
+void TextureLayerImpl::handleMailboxResources(ResourceProvider* resourceProvider) |
+{ |
+ if (!m_newMailboxPending) |
+ return; |
+ |
+ if (m_externalTextureResource) { |
+ DCHECK(!resourceProvider->inUseByConsumer(m_externalTextureResource)); |
+ resourceProvider->deleteResource(m_externalTextureResource); |
+ m_externalTextureResource = 0; |
+ WebKit::WebGraphicsContext3D* context = |
+ layerTreeImpl()->resource_provider()->graphicsContext3D(); |
+ |
+ m_mailboxClient->mailboxReleased(m_lastMailbox, context->insertSyncPoint()); |
piman
2012/12/20 02:14:21
We need to be clear about which thread the client
alexst (slow to review)
2012/12/21 14:15:21
That's one of the things I wanted to discuss.
Lik
|
+ } |
+ if (m_newMailbox.size()) { |
+ m_externalTextureResource = resourceProvider->createResourceFromTextureMailbox(m_newMailbox); |
+ m_newMailboxPending = false; |
+ } |
+ m_lastMailbox = m_newMailbox; |
+ m_newMailbox.clear(); |
+} |
+ |
} // namespace cc |