bool Canvas2DLayerBridge::restoreSurface() { ASSERT(!m_destructionInProgress); if (m_destructionInProgress) return false; ASSERT(isAccelerated() && !m_surface); WebGraphicsContext3D* sharedContext = 0; m_layer->clearTexture(); m_contextProvider = adoptPtr(Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); if (m_contextProvider) sharedContext = m_contextProvider->context3d(); if (sharedContext && !sharedContext->isContextLost()) { GrContext* grCtx = m_contextProvider->grContext(); bool surfaceIsAccelerated; RefPtr<SkSurface> surface(createSkSurface(grCtx, m_size, m_msaaSampleCount, m_opacityMode, &surfaceIsAccelerated)); // Current paradigm does support switching from accelerated to non-accelerated, which would be tricky // due to changes to the layer tree, which can only happen at specific times during the document lifecycle. // Therefore, we can only accept the restored surface if it is accelerated. if (surface.get() && surfaceIsAccelerated) { m_surface = surface.release(); // FIXME: draw sad canvas picture into new buffer crbug.com/243842 } } return m_surface; }
bool Canvas2DLayerBridge::restoreSurface() { ASSERT(!m_destructionInProgress); if (m_destructionInProgress) return false; ASSERT(m_layer && !m_surface); WebGraphicsContext3D* sharedContext = 0; m_layer->clearTexture(); m_contextProvider = adoptPtr(Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); if (m_contextProvider) sharedContext = m_contextProvider->context3d(); if (sharedContext && !sharedContext->isContextLost()) { GrContext* grCtx = m_contextProvider->grContext(); RefPtr<SkSurface> surface(createSkSurface(grCtx, m_size, m_msaaSampleCount, m_opacityMode)); if (surface.get()) { m_surface = surface.release(); m_initialSurfaceSaveCount = m_surface->getCanvas()->getSaveCount(); // FIXME: draw sad canvas picture into new buffer crbug.com/243842 } } return m_surface; }
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; }
bool Canvas2DLayerBridge::restoreSurface() { ASSERT(!m_destructionInProgress); if (m_destructionInProgress) return false; ASSERT(m_layer && !m_isSurfaceValid); WebGraphicsContext3D* sharedContext = 0; // We must clear the mailboxes before calling m_layer->clearTexture() to prevent // re-entry via mailboxReleased from operating on defunct GrContext objects. m_mailboxes.clear(); m_layer->clearTexture(); m_contextProvider = adoptPtr(Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); if (m_contextProvider) sharedContext = m_contextProvider->context3d(); if (sharedContext && !sharedContext->isContextLost()) { IntSize size(m_canvas->getTopDevice()->width(), m_canvas->getTopDevice()->height()); RefPtr<SkSurface> surface(createSkSurface(m_contextProvider->grContext(), size, m_msaaSampleCount, m_opacityMode)); if (surface.get()) { m_surface = surface.release(); m_canvas->setSurface(m_surface.get()); m_isSurfaceValid = true; // FIXME: draw sad canvas picture into new buffer crbug.com/243842 } } return m_isSurfaceValid; }
bool Canvas2DLayerBridge::restoreSurface() { ASSERT(!m_destructionInProgress); if (m_destructionInProgress) return false; ASSERT(m_layer && !m_isSurfaceValid); WebGraphicsContext3D* sharedContext = 0; m_layer->clearTexture(); m_contextProvider = adoptPtr(Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); if (m_contextProvider) sharedContext = m_contextProvider->context3d(); if (sharedContext && !sharedContext->isContextLost()) { SkISize skSize = m_canvas->getBaseLayerSize(); IntSize size(skSize.width(), skSize.height()); RefPtr<SkSurface> surface(createSkSurface(m_contextProvider->grContext(), size, m_msaaSampleCount, m_opacityMode)); if (surface.get()) { m_surface = surface.release(); m_canvas->setSurface(m_surface.get()); m_isSurfaceValid = true; // FIXME: draw sad canvas picture into new buffer crbug.com/243842 } } return m_isSurfaceValid; }
explicit TestImage(IntSize size) : m_image(nullptr) { sk_sp<SkSurface> surface = createSkSurface(size); if (!surface) return; surface->getCanvas()->clear(SK_ColorTRANSPARENT); m_image = surface->makeImageSnapshot(); }
explicit TestImage(IntSize size) : m_image(nullptr) { RefPtr<SkSurface> surface = adoptRef(createSkSurface(size)); if (!surface) return; surface->getCanvas()->clear(SK_ColorTRANSPARENT); m_image = adoptRef(surface->newImageSnapshot()); }
PassRefPtr<Canvas2DLayerBridge> Canvas2DLayerBridge::create(const IntSize& size, OpacityMode opacityMode, int msaaSampleCount) { TRACE_EVENT_INSTANT0("test_gpu", "Canvas2DLayerBridgeCreation"); RefPtr<GraphicsContext3D> context = SharedGraphicsContext3D::get(); RefPtr<SkSurface> surface(createSkSurface(context.get(), size, msaaSampleCount)); if (!surface) return 0; RefPtr<Canvas2DLayerBridge> layerBridge; OwnPtr<SkDeferredCanvas> canvas = adoptPtr(SkDeferredCanvas::Create(surface.get())); layerBridge = adoptRef(new Canvas2DLayerBridge(context, canvas.release(), msaaSampleCount, opacityMode)); return layerBridge.release(); }
PassRefPtr<Canvas2DLayerBridge> Canvas2DLayerBridge::create(const IntSize& size, OpacityMode opacityMode, int msaaSampleCount) { TRACE_EVENT_INSTANT0("test_gpu", "Canvas2DLayerBridgeCreation", TRACE_EVENT_SCOPE_GLOBAL); OwnPtr<WebGraphicsContext3DProvider> contextProvider = adoptPtr(Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); if (!contextProvider) return nullptr; RefPtr<SkSurface> surface(createSkSurface(contextProvider->grContext(), size, msaaSampleCount, opacityMode)); if (!surface) return nullptr; RefPtr<Canvas2DLayerBridge> layerBridge; layerBridge = adoptRef(new Canvas2DLayerBridge(contextProvider.release(), surface.release(), msaaSampleCount, opacityMode)); return layerBridge.release(); }
SkSurface* Canvas2DLayerBridge::getOrCreateSurface(AccelerationHint hint) { if (!m_surface) { if (m_layer) return nullptr; // recreation will happen through restore() bool wantAccelerated = shouldAccelerate(hint); bool surfaceIsAccelerated; m_surface = createSkSurface(wantAccelerated ? m_contextProvider->grContext() : nullptr, m_size, m_msaaSampleCount, m_opacityMode, &surfaceIsAccelerated); if (m_surface && surfaceIsAccelerated && !m_layer) { m_layer = adoptPtr(Platform::current()->compositorSupport()->createExternalTextureLayer(this)); m_layer->setOpaque(m_opacityMode == Opaque); m_layer->setBlendBackgroundColor(m_opacityMode != Opaque); GraphicsLayer::registerContentsLayer(m_layer->layer()); m_layer->setNearestNeighbor(m_filterQuality == kNone_SkFilterQuality); } } return m_surface.get(); }