void Canvas2DLayerBridge::skippedPendingDrawCommands() { // Stop triggering the rate limiter if SkDeferredCanvas is detecting // and optimizing overdraw. setRateLimitingEnabled(false); flushedDrawCommands(); }
bool Canvas2DLayerBridge::isValid() { ASSERT(m_layer); if (m_destructionInProgress) return false; if (m_context->webContext()->isContextLost() || !m_surfaceIsValid) { // Attempt to recover. m_layer->clearTexture(); m_mailboxes.clear(); RefPtr<GraphicsContext3D> sharedContext = SharedGraphicsContext3D::get(); if (!sharedContext || sharedContext->webContext()->isContextLost()) { m_surfaceIsValid = false; } else { m_context = sharedContext; IntSize size(m_canvas->getTopDevice()->width(), m_canvas->getTopDevice()->height()); RefPtr<SkSurface> surface(createSkSurface(m_context.get(), size, m_msaaSampleCount)); if (surface.get()) { m_canvas->setSurface(surface.get()); m_surfaceIsValid = 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; }
void Canvas2DLayerBridge::skipQueuedDrawCommands() { if (m_haveRecordedDrawCommands) { adoptRef(m_recorder->endRecording()); startRecording(); m_haveRecordedDrawCommands = false; } // Stop triggering the rate limiter if SkDeferredCanvas is detecting // and optimizing overdraw. setRateLimitingEnabled(false); }
void Canvas2DLayerBridge::finalizeFrame(const FloatRect &dirtyRect) { ASSERT(!m_destructionInProgress); m_layer->layer()->invalidateRect(enclosingIntRect(dirtyRect)); m_framesPending++; if (m_framesPending > 1) { // Turn on the rate limiter if this layer tends to accumulate a // non-discardable multi-frame backlog of draw commands. setRateLimitingEnabled(true); } if (m_rateLimitingEnabled) { flush(); } }
bool Canvas2DLayerBridge::checkSurfaceValid() { ASSERT(!m_destructionInProgress); if (m_destructionInProgress || !m_isSurfaceValid) return false; if (m_contextProvider->context3d()->isContextLost()) { m_isSurfaceValid = false; m_surface.clear(); if (m_imageBuffer) m_imageBuffer->notifySurfaceInvalid(); setRateLimitingEnabled(false); } return m_isSurfaceValid; }
void Canvas2DLayerBridge::limitPendingFrames() { if (m_didRecordDrawCommand) { m_framesPending++; m_didRecordDrawCommand = false; if (m_framesPending > 1) { // Turn on the rate limiter if this layer tends to accumulate a // non-discardable multi-frame backlog of draw commands. setRateLimitingEnabled(true); } if (m_rateLimitingEnabled) { flush(); } } }
bool Canvas2DLayerBridge::checkSurfaceValid() { ASSERT(!m_destructionInProgress); if (m_destructionInProgress || !m_surface) return false; if (m_contextProvider->context3d()->isContextLost()) { m_surface.clear(); for (auto mailboxInfo = m_mailboxes.begin(); mailboxInfo != m_mailboxes.end(); ++mailboxInfo) { if (mailboxInfo->m_image) mailboxInfo->m_image.clear(); } if (m_imageBuffer) m_imageBuffer->notifySurfaceInvalid(); setRateLimitingEnabled(false); } return m_surface; }
void Canvas2DLayerBridge::beginDestruction() { ASSERT(!m_destructionInProgress); setRateLimitingEnabled(false); m_recorder.clear(); m_imageBuffer = nullptr; m_destructionInProgress = true; setIsHidden(true); GraphicsLayer::unregisterContentsLayer(m_layer->layer()); m_surface.clear(); m_layer->clearTexture(); // Orphaning the layer is required to trigger the recration of a new layer // in the case where destruction is caused by a canvas resize. Test: // virtual/gpu/fast/canvas/canvas-resize-after-paint-without-layout.html m_layer->layer()->removeFromParent(); // To anyone who ever hits this assert: Please update crbug.com/344666 // with repro steps. ASSERT(!m_bytesAllocated); }
void Canvas2DLayerBridge::limitPendingFrames() { ASSERT(!m_destructionInProgress); if (isHidden()) { freeTransientResources(); return; } if (m_didRecordDrawCommand) { m_framesPending++; m_didRecordDrawCommand = false; if (m_framesPending > 1) { // Turn on the rate limiter if this layer tends to accumulate a // non-discardable multi-frame backlog of draw commands. setRateLimitingEnabled(true); } if (m_rateLimitingEnabled) { flush(); } } }