| Index: Source/platform/graphics/Canvas2DLayerBridge.cpp
|
| diff --git a/Source/platform/graphics/Canvas2DLayerBridge.cpp b/Source/platform/graphics/Canvas2DLayerBridge.cpp
|
| index 64788f59ace118c3c1f35e835860a2ff062de923..d477eefd58d6580ad19c89a2e8eb100e60be0059 100644
|
| --- a/Source/platform/graphics/Canvas2DLayerBridge.cpp
|
| +++ b/Source/platform/graphics/Canvas2DLayerBridge.cpp
|
| @@ -83,10 +83,11 @@ PassRefPtr<Canvas2DLayerBridge> Canvas2DLayerBridge::create(const IntSize& size,
|
| Canvas2DLayerBridge::Canvas2DLayerBridge(PassOwnPtr<blink::WebGraphicsContext3DProvider> contextProvider, PassOwnPtr<SkDeferredCanvas> canvas, int msaaSampleCount, OpacityMode opacityMode)
|
| : m_canvas(canvas)
|
| , m_contextProvider(contextProvider)
|
| + , m_imageBuffer(0)
|
| , m_msaaSampleCount(msaaSampleCount)
|
| , m_bytesAllocated(0)
|
| , m_didRecordDrawCommand(false)
|
| - , m_surfaceIsValid(true)
|
| + , m_isSurfaceValid(true)
|
| , m_framesPending(0)
|
| , m_framesSinceMailboxRelease(0)
|
| , m_destructionInProgress(false)
|
| @@ -135,6 +136,7 @@ void Canvas2DLayerBridge::beginDestruction()
|
| ASSERT(!m_destructionInProgress);
|
| setRateLimitingEnabled(false);
|
| m_canvas->silentFlush();
|
| + m_imageBuffer = 0;
|
| freeTransientResources();
|
| setIsHidden(true);
|
| m_destructionInProgress = true;
|
| @@ -207,7 +209,7 @@ void Canvas2DLayerBridge::prepareForDraw()
|
| {
|
| ASSERT(!m_destructionInProgress);
|
| ASSERT(m_layer);
|
| - if (!surfaceIsValid() && !recoverSurface()) {
|
| + if (!checkSurfaceValid()) {
|
| if (m_canvas) {
|
| // drop pending commands because there is no surface to draw to
|
| m_canvas->silentFlush();
|
| @@ -295,7 +297,7 @@ bool Canvas2DLayerBridge::hasReleasedMailbox() const
|
|
|
| void Canvas2DLayerBridge::freeReleasedMailbox()
|
| {
|
| - if (m_contextProvider->context3d()->isContextLost() || !m_surfaceIsValid)
|
| + if (m_contextProvider->context3d()->isContextLost() || !m_isSurfaceValid)
|
| return;
|
| MailboxInfo* mailboxInfo = releasedMailboxInfo();
|
| if (!mailboxInfo)
|
| @@ -322,24 +324,31 @@ blink::WebGraphicsContext3D* Canvas2DLayerBridge::context()
|
| {
|
| // Check on m_layer is necessary because context() may be called during
|
| // the destruction of m_layer
|
| - if (m_layer && !m_destructionInProgress && !surfaceIsValid()) {
|
| - recoverSurface(); // To ensure rate limiter is disabled if context is lost.
|
| - }
|
| + if (m_layer && !m_destructionInProgress)
|
| + checkSurfaceValid(); // To ensure rate limiter is disabled if context is lost.
|
| return m_contextProvider->context3d();
|
| }
|
|
|
| -bool Canvas2DLayerBridge::surfaceIsValid()
|
| +bool Canvas2DLayerBridge::checkSurfaceValid()
|
| {
|
| ASSERT(!m_destructionInProgress);
|
| - return !m_destructionInProgress && !m_contextProvider->context3d()->isContextLost() && m_surfaceIsValid;
|
| + if (m_destructionInProgress || !m_isSurfaceValid)
|
| + return false;
|
| + if (m_contextProvider->context3d()->isContextLost()) {
|
| + m_isSurfaceValid = false;
|
| + if (m_imageBuffer)
|
| + m_imageBuffer->notifySurfaceInvalid();
|
| + setRateLimitingEnabled(false);
|
| + }
|
| + return m_isSurfaceValid;
|
| }
|
|
|
| -bool Canvas2DLayerBridge::recoverSurface()
|
| +bool Canvas2DLayerBridge::restoreSurface()
|
| {
|
| ASSERT(!m_destructionInProgress);
|
| - ASSERT(m_layer && !surfaceIsValid());
|
| if (m_destructionInProgress)
|
| return false;
|
| + ASSERT(m_layer && !m_isSurfaceValid);
|
|
|
| blink::WebGraphicsContext3D* sharedContext = 0;
|
| // We must clear the mailboxes before calling m_layer->clearTexture() to prevent
|
| @@ -351,25 +360,17 @@ bool Canvas2DLayerBridge::recoverSurface()
|
| if (m_contextProvider)
|
| sharedContext = m_contextProvider->context3d();
|
|
|
| - if (!sharedContext || sharedContext->isContextLost()) {
|
| - m_surfaceIsValid = false;
|
| - } else {
|
| + if (sharedContext && !sharedContext->isContextLost()) {
|
| IntSize size(m_canvas->getTopDevice()->width(), m_canvas->getTopDevice()->height());
|
| RefPtr<SkSurface> surface(createSkSurface(m_contextProvider->grContext(), size, m_msaaSampleCount));
|
| if (surface.get()) {
|
| m_canvas->setSurface(surface.get());
|
| - m_surfaceIsValid = true;
|
| + m_isSurfaceValid = true;
|
| // FIXME: draw sad canvas picture into new buffer crbug.com/243842
|
| - } else {
|
| - // Surface allocation failed. Set m_surfaceIsValid to false to
|
| - // trigger subsequent retry.
|
| - m_surfaceIsValid = false;
|
| }
|
| }
|
| - if (!m_surfaceIsValid)
|
| - setRateLimitingEnabled(false);
|
|
|
| - return m_surfaceIsValid;
|
| + return m_isSurfaceValid;
|
| }
|
|
|
| bool Canvas2DLayerBridge::prepareMailbox(blink::WebExternalTextureMailbox* outMailbox, blink::WebExternalBitmap* bitmap)
|
| @@ -384,7 +385,7 @@ bool Canvas2DLayerBridge::prepareMailbox(blink::WebExternalTextureMailbox* outMa
|
| m_lastImageId = 0;
|
| return false;
|
| }
|
| - if (!surfaceIsValid() && !recoverSurface())
|
| + if (!checkSurfaceValid())
|
| return false;
|
|
|
| blink::WebGraphicsContext3D* webContext = context();
|
| @@ -510,7 +511,7 @@ void Canvas2DLayerBridge::willUse()
|
| Platform3DObject Canvas2DLayerBridge::getBackingTexture()
|
| {
|
| ASSERT(!m_destructionInProgress);
|
| - if (!surfaceIsValid() && !recoverSurface())
|
| + if (!checkSurfaceValid())
|
| return 0;
|
| willUse();
|
| m_canvas->flush();
|
|
|