Chromium Code Reviews| Index: Source/platform/graphics/gpu/DrawingBuffer.cpp |
| diff --git a/Source/platform/graphics/gpu/DrawingBuffer.cpp b/Source/platform/graphics/gpu/DrawingBuffer.cpp |
| index 5c470a7d577c0d7145c986c41388acf0ab321eee..cd215dc791f5bd89c5c3ac86b7b4ff02e26ff6a0 100644 |
| --- a/Source/platform/graphics/gpu/DrawingBuffer.cpp |
| +++ b/Source/platform/graphics/gpu/DrawingBuffer.cpp |
| @@ -77,10 +77,9 @@ private: |
| Platform3DObject m_oldTextureUnitZeroId; |
| }; |
| -PassRefPtr<DrawingBuffer> DrawingBuffer::create(blink::WebGraphicsContext3D* context, const IntSize& size, PreserveDrawingBuffer preserve, PassRefPtr<ContextEvictionManager> contextEvictionManager) |
| +PassRefPtr<DrawingBuffer> DrawingBuffer::create(PassOwnPtr<blink::WebGraphicsContext3D> context, const IntSize& size, PreserveDrawingBuffer preserve, PassRefPtr<ContextEvictionManager> contextEvictionManager) |
| { |
| - ASSERT(context); |
| - Extensions3DUtil extensionsUtil(context); |
| + Extensions3DUtil extensionsUtil(context.get()); |
| bool multisampleSupported = extensionsUtil.supportsExtension("GL_CHROMIUM_framebuffer_multisample") |
| && extensionsUtil.supportsExtension("GL_OES_rgb8_rgba8"); |
| if (multisampleSupported) { |
| @@ -97,7 +96,7 @@ PassRefPtr<DrawingBuffer> DrawingBuffer::create(blink::WebGraphicsContext3D* con |
| return drawingBuffer.release(); |
| } |
| -DrawingBuffer::DrawingBuffer(blink::WebGraphicsContext3D* context, |
| +DrawingBuffer::DrawingBuffer(PassOwnPtr<blink::WebGraphicsContext3D> context, |
| bool multisampleExtensionSupported, |
| bool packedDepthStencilExtensionSupported, |
| PreserveDrawingBuffer preserve, |
| @@ -136,7 +135,7 @@ DrawingBuffer::DrawingBuffer(blink::WebGraphicsContext3D* context, |
| DrawingBuffer::~DrawingBuffer() |
| { |
| - releaseResources(); |
| + ASSERT(!m_context); |
| } |
| void DrawingBuffer::markContentsChanged() |
| @@ -158,7 +157,7 @@ void DrawingBuffer::markLayerComposited() |
| blink::WebGraphicsContext3D* DrawingBuffer::context() |
| { |
| - return m_context; |
| + return m_context.get(); |
| } |
| bool DrawingBuffer::prepareMailbox(blink::WebExternalTextureMailbox* outMailbox, blink::WebExternalBitmap* bitmap) |
| @@ -184,7 +183,7 @@ bool DrawingBuffer::prepareMailbox(blink::WebExternalTextureMailbox* outMailbox, |
| // We must restore the texture binding since creating new textures, |
| // consuming and producing mailboxes changes it. |
| - ScopedTextureUnit0BindingRestorer restorer(m_context, m_activeTextureUnit, m_texture2DBinding); |
| + ScopedTextureUnit0BindingRestorer restorer(m_context.get(), m_activeTextureUnit, m_texture2DBinding); |
| // First try to recycle an old buffer. |
| RefPtr<MailboxInfo> frontColorBufferMailbox = recycledMailbox(); |
| @@ -231,6 +230,11 @@ bool DrawingBuffer::prepareMailbox(blink::WebExternalTextureMailbox* outMailbox, |
| void DrawingBuffer::mailboxReleased(const blink::WebExternalTextureMailbox& mailbox) |
| { |
| + if (m_selfToWaitForMailboxes) { |
| + releaseSelf(mailbox); |
|
Justin Novosad
2014/02/18 18:07:33
naming nit: releaseSelfIfNeeded or releaseSelfIfFi
|
| + return; |
| + } |
| + |
| for (size_t i = 0; i < m_textureMailboxes.size(); i++) { |
| RefPtr<MailboxInfo> mailboxInfo = m_textureMailboxes[i]; |
| if (!memcmp(mailboxInfo->mailbox.name, mailbox.name, sizeof(mailbox.name))) { |
| @@ -242,6 +246,27 @@ void DrawingBuffer::mailboxReleased(const blink::WebExternalTextureMailbox& mail |
| ASSERT_NOT_REACHED(); |
| } |
| + |
| +void DrawingBuffer::releaseSelf(const blink::WebExternalTextureMailbox& mailbox) |
| +{ |
| + ASSERT(!m_textureMailboxes.isEmpty()); |
| + for (size_t i = 0; i < m_textureMailboxes.size(); i++) { |
| + RefPtr<MailboxInfo> mailboxInfo = m_textureMailboxes[i]; |
| + if (!memcmp(mailboxInfo->mailbox.name, mailbox.name, sizeof(mailboxInfo->mailbox.name))) { |
| + m_context->makeContextCurrent(); |
| + m_context->deleteTexture(mailboxInfo->textureId); |
| + m_textureMailboxes.remove(i); |
| + break; |
| + } |
| + } |
| + if (!m_textureMailboxes.isEmpty()) |
| + return; |
| + |
| + m_context.clear(); |
| + m_layer.clear(); |
| + m_selfToWaitForMailboxes.clear(); |
| +} |
| + |
| PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::recycledMailbox() |
| { |
| if (m_recycledMailboxes.isEmpty()) |
| @@ -416,8 +441,18 @@ void DrawingBuffer::releaseResources() |
| clearPlatformLayer(); |
| - for (size_t i = 0; i < m_textureMailboxes.size(); i++) |
| - m_context->deleteTexture(m_textureMailboxes[i]->textureId); |
| + for (size_t i = 0; i < m_recycledMailboxes.size(); i++) { |
| + m_context->deleteTexture(m_recycledMailboxes[i]->textureId); |
| + |
| + for (size_t j = 0; j < m_textureMailboxes.size(); j++) { |
| + RefPtr<MailboxInfo> mailboxInfo = m_textureMailboxes[j]; |
| + if (mailboxInfo->textureId == m_recycledMailboxes[i]->textureId) { |
| + ASSERT(!memcmp(mailboxInfo->mailbox.name, m_recycledMailboxes[i]->mailbox.name, sizeof(mailboxInfo->mailbox.name))); |
| + m_textureMailboxes.remove(j); |
| + break; |
| + } |
| + } |
| + } |
| if (m_multisampleColorBuffer) |
| m_context->deleteRenderbuffer(m_multisampleColorBuffer); |
| @@ -437,7 +472,7 @@ void DrawingBuffer::releaseResources() |
| if (m_fbo) |
| m_context->deleteFramebuffer(m_fbo); |
| - m_context = 0; |
| + setSize(IntSize()); |
| m_colorBuffer = 0; |
| m_frontColorBuffer = 0; |
| @@ -450,12 +485,16 @@ void DrawingBuffer::releaseResources() |
| m_contextEvictionManager.clear(); |
| m_recycledMailboxes.clear(); |
| - m_textureMailboxes.clear(); |
| - if (m_layer) { |
| + if (m_layer) |
| GraphicsLayer::unregisterContentsLayer(m_layer->layer()); |
| + |
| + if (m_textureMailboxes.isEmpty()) { |
| + m_context.clear(); |
| m_layer.clear(); |
| + return; |
| } |
| + m_selfToWaitForMailboxes = this; |
| } |
| unsigned DrawingBuffer::createColorTexture(const IntSize& size) |