Index: Source/platform/graphics/gpu/DrawingBuffer.cpp |
diff --git a/Source/platform/graphics/gpu/DrawingBuffer.cpp b/Source/platform/graphics/gpu/DrawingBuffer.cpp |
index bcf1a10ae65da690d43f1828cf206946252c421a..d9c6fc734c7c977139edc4ca5927661d65590571 100644 |
--- a/Source/platform/graphics/gpu/DrawingBuffer.cpp |
+++ b/Source/platform/graphics/gpu/DrawingBuffer.cpp |
@@ -148,6 +148,7 @@ DrawingBuffer::DrawingBuffer(PassOwnPtr<blink::WebGraphicsContext3D> context, |
, m_sampleCount(0) |
, m_packAlignment(4) |
, m_destructionInProgress(false) |
+ , m_isHidden(false) |
, m_contextEvictionManager(contextEvictionManager) |
{ |
// Used by browser tests to detect the use of a DrawingBuffer. |
@@ -185,6 +186,28 @@ void DrawingBuffer::markLayerComposited() |
m_layerComposited = true; |
} |
+ |
+void DrawingBuffer::setIsHidden(bool hidden) |
+{ |
+ ASSERT(!m_destructionInProgress); |
+ bool newHiddenValue = hidden || m_destructionInProgress; |
+ if (m_isHidden == newHiddenValue) |
+ return; |
+ |
+ m_isHidden = newHiddenValue; |
+ if (m_isHidden) |
+ freeRecycledMailboxes(); |
danakj
2014/07/09 15:27:28
Have you considered sending the renderer composito
dshwang
2014/07/09 16:04:29
I've not considered yet.
Currently, WebGL can rele
danakj
2014/07/09 16:08:48
I mean if WebGL goes invisible the renderer compos
Ken Russell (switch to Gerrit)
2014/07/09 17:27:17
If the compositor releases its reference to the la
|
+} |
+ |
+void DrawingBuffer::freeRecycledMailboxes() |
+{ |
+ if (m_recycledMailboxQueue.isEmpty()) |
+ return; |
+ m_context->makeContextCurrent(); |
+ while (!m_recycledMailboxQueue.isEmpty()) |
+ deleteMailbox(m_recycledMailboxQueue.takeLast()); |
+} |
+ |
blink::WebGraphicsContext3D* DrawingBuffer::context() |
{ |
return m_context.get(); |
@@ -192,7 +215,7 @@ blink::WebGraphicsContext3D* DrawingBuffer::context() |
bool DrawingBuffer::prepareMailbox(blink::WebExternalTextureMailbox* outMailbox, blink::WebExternalBitmap* bitmap) |
{ |
- if (!m_contentsChanged) |
+ if (!m_contentsChanged || m_isHidden) |
danakj
2014/07/09 15:27:28
Does this ever happen? The compositor never produc
dshwang
2014/07/09 16:04:29
That's good point. I think so. Let me check.
|
return false; |
if (m_destructionInProgress) { |
@@ -278,8 +301,8 @@ bool DrawingBuffer::prepareMailbox(blink::WebExternalTextureMailbox* outMailbox, |
void DrawingBuffer::mailboxReleased(const blink::WebExternalTextureMailbox& mailbox) |
{ |
- if (m_destructionInProgress) { |
- mailboxReleasedWhileDestructionInProgress(mailbox); |
+ if (m_destructionInProgress || m_isHidden) { |
+ mailboxReleasedWithoutRecycling(mailbox); |
return; |
} |
@@ -296,7 +319,7 @@ void DrawingBuffer::mailboxReleased(const blink::WebExternalTextureMailbox& mail |
ASSERT_NOT_REACHED(); |
} |
-void DrawingBuffer::mailboxReleasedWhileDestructionInProgress(const blink::WebExternalTextureMailbox& mailbox) |
+void DrawingBuffer::mailboxReleasedWithoutRecycling(const blink::WebExternalTextureMailbox& mailbox) |
{ |
ASSERT(m_textureMailboxes.size()); |
m_context->makeContextCurrent(); |