| Index: third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
|
| diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
|
| index 046285877acd3f62b1631beea4860604e17d88e6..7129cc32c4f599cccddae76d3a5b4cf4b94165d7 100644
|
| --- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
|
| +++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
|
| @@ -82,13 +82,13 @@
|
| };
|
| #endif // USE_IOSURFACE_FOR_2D_CANVAS
|
|
|
| -static sk_sp<SkSurface> createSkSurface(GrContext* gr,
|
| - const IntSize& size,
|
| - int msaaSampleCount,
|
| - OpacityMode opacityMode,
|
| - sk_sp<SkColorSpace> colorSpace,
|
| - SkColorType colorType,
|
| - bool* surfaceIsAccelerated) {
|
| +static sk_sp<PaintSurface> createSkSurface(GrContext* gr,
|
| + const IntSize& size,
|
| + int msaaSampleCount,
|
| + OpacityMode opacityMode,
|
| + sk_sp<SkColorSpace> colorSpace,
|
| + SkColorType colorType,
|
| + bool* surfaceIsAccelerated) {
|
| if (gr)
|
| gr->resetContext();
|
|
|
| @@ -97,18 +97,18 @@
|
| SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), colorType,
|
| alphaType, colorSpace);
|
| SkSurfaceProps disableLCDProps(0, kUnknown_SkPixelGeometry);
|
| - sk_sp<SkSurface> surface;
|
| + sk_sp<PaintSurface> surface;
|
|
|
| if (gr) {
|
| *surfaceIsAccelerated = true;
|
| - surface = SkSurface::MakeRenderTarget(
|
| + surface = PaintSurface::MakeRenderTarget(
|
| gr, SkBudgeted::kNo, info, msaaSampleCount,
|
| Opaque == opacityMode ? 0 : &disableLCDProps);
|
| }
|
|
|
| if (!surface) {
|
| *surfaceIsAccelerated = false;
|
| - surface = SkSurface::MakeRaster(
|
| + surface = PaintSurface::MakeRaster(
|
| info, Opaque == opacityMode ? 0 : &disableLCDProps);
|
| }
|
|
|
| @@ -174,7 +174,7 @@
|
| DCHECK(m_isDeferralEnabled);
|
| m_recorder = WTF::wrapUnique(new PaintRecorder);
|
| PaintCanvas* canvas =
|
| - m_recorder->beginRecording(m_size.width(), m_size.height());
|
| + m_recorder->beginRecording(m_size.width(), m_size.height(), nullptr);
|
| // Always save an initial frame, to support resetting the top level matrix
|
| // and clip.
|
| canvas->save();
|
| @@ -187,11 +187,6 @@
|
|
|
| void Canvas2DLayerBridge::setLoggerForTesting(std::unique_ptr<Logger> logger) {
|
| m_logger = std::move(logger);
|
| -}
|
| -
|
| -void Canvas2DLayerBridge::ResetSurface() {
|
| - m_surfacePaintCanvas.reset();
|
| - m_surface.reset();
|
| }
|
|
|
| bool Canvas2DLayerBridge::shouldAccelerate(AccelerationHint hint) const {
|
| @@ -502,8 +497,8 @@
|
| }
|
|
|
| TRACE_EVENT0("blink", "Canvas2DLayerBridge::hibernate");
|
| - sk_sp<SkSurface> tempHibernationSurface =
|
| - SkSurface::MakeRasterN32Premul(m_size.width(), m_size.height());
|
| + sk_sp<PaintSurface> tempHibernationSurface =
|
| + PaintSurface::MakeRasterN32Premul(m_size.width(), m_size.height());
|
| if (!tempHibernationSurface) {
|
| m_logger->reportHibernationEvent(HibernationAbortedDueToAllocationFailure);
|
| return;
|
| @@ -517,12 +512,12 @@
|
| // a surface, and we have an early exit at the top of this function for when
|
| // 'this' does not already have a surface.
|
| DCHECK(!m_haveRecordedDrawCommands);
|
| - SkPaint copyPaint;
|
| + PaintFlags copyPaint;
|
| copyPaint.setBlendMode(SkBlendMode::kSrc);
|
| m_surface->draw(tempHibernationSurface->getCanvas(), 0, 0,
|
| ©Paint); // GPU readback
|
| m_hibernationImage = tempHibernationSurface->makeImageSnapshot();
|
| - ResetSurface();
|
| + m_surface.reset(); // destroy the GPU-backed buffer
|
| m_layer->clearTexture();
|
| #if USE_IOSURFACE_FOR_2D_CANVAS
|
| clearCHROMIUMImageCache();
|
| @@ -547,7 +542,7 @@
|
| }
|
| }
|
|
|
| -SkSurface* Canvas2DLayerBridge::getOrCreateSurface(AccelerationHint hint) {
|
| +PaintSurface* Canvas2DLayerBridge::getOrCreateSurface(AccelerationHint hint) {
|
| if (m_surface)
|
| return m_surface.get();
|
|
|
| @@ -568,13 +563,11 @@
|
| wantAcceleration ? m_contextProvider->grContext() : nullptr, m_size,
|
| m_msaaSampleCount, m_opacityMode, skSurfaceColorSpace(), m_colorType,
|
| &surfaceIsAccelerated);
|
| - m_surfacePaintCanvas =
|
| - WTF::wrapUnique(new PaintCanvas(m_surface->getCanvas()));
|
|
|
| if (m_surface) {
|
| // Always save an initial frame, to support resetting the top level matrix
|
| // and clip.
|
| - m_surfacePaintCanvas->save();
|
| + m_surface->getCanvas()->save();
|
| } else {
|
| reportSurfaceCreationFailure();
|
| }
|
| @@ -600,7 +593,7 @@
|
| m_logger->reportHibernationEvent(HibernationEndedWithFallbackToSW);
|
| }
|
|
|
| - SkPaint copyPaint;
|
| + PaintFlags copyPaint;
|
| copyPaint.setBlendMode(SkBlendMode::kSrc);
|
| m_surface->getCanvas()->drawImage(m_hibernationImage.get(), 0, 0,
|
| ©Paint);
|
| @@ -610,7 +603,7 @@
|
| m_imageBuffer->updateGPUMemoryUsage();
|
|
|
| if (m_imageBuffer && !m_isDeferralEnabled)
|
| - m_imageBuffer->resetCanvas(m_surfacePaintCanvas.get());
|
| + m_imageBuffer->resetCanvas(m_surface->getCanvas());
|
| }
|
|
|
| return m_surface.get();
|
| @@ -618,8 +611,8 @@
|
|
|
| PaintCanvas* Canvas2DLayerBridge::canvas() {
|
| if (!m_isDeferralEnabled) {
|
| - getOrCreateSurface();
|
| - return m_surfacePaintCanvas.get();
|
| + PaintSurface* s = getOrCreateSurface();
|
| + return s ? s->getCanvas() : nullptr;
|
| }
|
| return m_recorder->getRecordingCanvas();
|
| }
|
| @@ -651,9 +644,9 @@
|
| m_isDeferralEnabled = false;
|
| m_recorder.reset();
|
| // install the current matrix/clip stack onto the immediate canvas
|
| - getOrCreateSurface();
|
| - if (m_imageBuffer && m_surfacePaintCanvas)
|
| - m_imageBuffer->resetCanvas(m_surfacePaintCanvas.get());
|
| + PaintSurface* surface = getOrCreateSurface();
|
| + if (m_imageBuffer && surface)
|
| + m_imageBuffer->resetCanvas(surface->getCanvas());
|
| }
|
|
|
| void Canvas2DLayerBridge::setImageBuffer(ImageBuffer* imageBuffer) {
|
| @@ -673,7 +666,7 @@
|
| m_imageBuffer = nullptr;
|
| m_destructionInProgress = true;
|
| setIsHidden(true);
|
| - ResetSurface();
|
| + m_surface.reset();
|
|
|
| if (m_layer && m_accelerationMode != DisableAcceleration) {
|
| GraphicsLayer::unregisterContentsLayer(m_layer->layer());
|
| @@ -718,20 +711,20 @@
|
| }
|
| if (!isHidden() && m_softwareRenderingWhileHidden) {
|
| flushRecordingOnly();
|
| - SkPaint copyPaint;
|
| + PaintFlags copyPaint;
|
| copyPaint.setBlendMode(SkBlendMode::kSrc);
|
|
|
| - sk_sp<SkSurface> oldSurface = std::move(m_surface);
|
| - ResetSurface();
|
| + sk_sp<PaintSurface> oldSurface = std::move(m_surface);
|
| + m_surface.reset();
|
|
|
| m_softwareRenderingWhileHidden = false;
|
| - SkSurface* newSurface =
|
| + PaintSurface* newSurface =
|
| getOrCreateSurface(PreferAccelerationAfterVisibilityChange);
|
| if (newSurface) {
|
| if (oldSurface)
|
| oldSurface->draw(newSurface->getCanvas(), 0, 0, ©Paint);
|
| if (m_imageBuffer && !m_isDeferralEnabled) {
|
| - m_imageBuffer->resetCanvas(m_surfacePaintCanvas.get());
|
| + m_imageBuffer->resetCanvas(m_surface->getCanvas());
|
| }
|
| }
|
| }
|
| @@ -833,7 +826,7 @@
|
| return false;
|
| if (m_contextProvider->contextGL()->GetGraphicsResetStatusKHR() !=
|
| GL_NO_ERROR) {
|
| - ResetSurface();
|
| + m_surface.reset();
|
| for (auto mailboxInfo = m_mailboxes.begin();
|
| mailboxInfo != m_mailboxes.end(); ++mailboxInfo) {
|
| if (mailboxInfo->m_image)
|
| @@ -863,7 +856,7 @@
|
| if (sharedGL && sharedGL->GetGraphicsResetStatusKHR() == GL_NO_ERROR) {
|
| GrContext* grCtx = m_contextProvider->grContext();
|
| bool surfaceIsAccelerated;
|
| - sk_sp<SkSurface> surface(createSkSurface(
|
| + sk_sp<PaintSurface> surface(createSkSurface(
|
| grCtx, m_size, m_msaaSampleCount, m_opacityMode, skSurfaceColorSpace(),
|
| m_colorType, &surfaceIsAccelerated));
|
| if (!m_surface)
|
|
|